зеркало из https://github.com/mozilla/pjs.git
Bug 533048. Don't do extra work for link targeting in nsDocShellTreeOwner. r=jst
This commit is contained in:
Родитель
62f12d76fb
Коммит
35d57e6517
|
@ -241,37 +241,27 @@ nsDocShellTreeOwner::FindItemWithName(const PRUnichar* aName,
|
|||
return NS_OK;
|
||||
// _main is an IE target which should be case-insensitive but isn't
|
||||
// see bug 217886 for details
|
||||
// XXXbz what if our browser isn't targetable? We need to handle that somehow.
|
||||
if(name.LowerCaseEqualsLiteral("_content") || name.EqualsLiteral("_main")) {
|
||||
*aFoundItem = mWebBrowser->mDocShellAsItem;
|
||||
NS_IF_ADDREF(*aFoundItem);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// first, is it us?
|
||||
{
|
||||
nsCOMPtr<nsIDOMWindow> domWindow;
|
||||
mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));
|
||||
if (domWindow) {
|
||||
nsAutoString ourName;
|
||||
domWindow->GetName(ourName);
|
||||
if (name.Equals(ourName, nsCaseInsensitiveStringComparator())) {
|
||||
*aFoundItem = mWebBrowser->mDocShellAsItem;
|
||||
NS_IF_ADDREF(*aFoundItem);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// next, check our children
|
||||
rv = FindChildWithName(aName, PR_TRUE, aRequestor, aOriginalRequestor,
|
||||
aFoundItem);
|
||||
if(NS_FAILED(rv) || *aFoundItem)
|
||||
if (!SameCOMIdentity(aRequestor, mWebBrowser->mDocShellAsItem)) {
|
||||
// This isn't a request coming up from our kid, so check with said kid
|
||||
nsISupports* thisSupports = static_cast<nsIDocShellTreeOwner*>(this);
|
||||
rv =
|
||||
mWebBrowser->mDocShellAsItem->FindItemWithName(aName, thisSupports,
|
||||
aOriginalRequestor, aFoundItem);
|
||||
if (NS_FAILED(rv) || *aFoundItem) {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
// next, if we have a parent and it isn't the requestor, ask it
|
||||
nsCOMPtr<nsIDocShellTreeOwner> reqAsTreeOwner(do_QueryInterface(aRequestor));
|
||||
|
||||
if(mTreeOwner) {
|
||||
nsCOMPtr<nsIDocShellTreeOwner> reqAsTreeOwner(do_QueryInterface(aRequestor));
|
||||
if (mTreeOwner != reqAsTreeOwner)
|
||||
return mTreeOwner->FindItemWithName(aName, mWebBrowser->mDocShellAsItem,
|
||||
aOriginalRequestor, aFoundItem);
|
||||
|
@ -283,47 +273,6 @@ nsDocShellTreeOwner::FindItemWithName(const PRUnichar* aName,
|
|||
aFoundItem);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDocShellTreeOwner::FindChildWithName(const PRUnichar *aName, PRBool aRecurse,
|
||||
nsIDocShellTreeItem* aRequestor,
|
||||
nsIDocShellTreeItem* aOriginalRequestor,
|
||||
nsIDocShellTreeItem **aFoundItem)
|
||||
{
|
||||
if (!mWebBrowser)
|
||||
return NS_OK;
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
nsCOMPtr<nsIDOMWindow> domWindow;
|
||||
mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));
|
||||
if (!domWindow)
|
||||
return NS_OK;
|
||||
|
||||
nsCOMPtr<nsIDOMWindowCollection> frames;
|
||||
domWindow->GetFrames(getter_AddRefs(frames));
|
||||
if (!frames)
|
||||
return NS_OK;
|
||||
|
||||
PRUint32 ctr, count;
|
||||
frames->GetLength(&count);
|
||||
for (ctr = 0; ctr < count; ctr++) {
|
||||
nsCOMPtr<nsIDOMWindow> frame;
|
||||
frames->Item(ctr, getter_AddRefs(frame));
|
||||
nsCOMPtr<nsPIDOMWindow> w(do_QueryInterface(frame));
|
||||
if (w) {
|
||||
nsCOMPtr<nsIDocShellTreeItem> item = do_QueryInterface(w->GetDocShell());
|
||||
if (item && item != aRequestor) {
|
||||
rv = item->FindItemWithName(aName, mWebBrowser->mDocShellAsItem,
|
||||
aOriginalRequestor, aFoundItem);
|
||||
if (NS_FAILED(rv) || *aFoundItem)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDocShellTreeOwner::FindItemWithNameAcrossWindows(const PRUnichar* aName,
|
||||
nsIDocShellTreeItem* aRequestor,
|
||||
|
|
|
@ -123,10 +123,6 @@ protected:
|
|||
NS_IMETHOD AddChromeListeners();
|
||||
NS_IMETHOD RemoveChromeListeners();
|
||||
|
||||
nsresult FindChildWithName(const PRUnichar *aName,
|
||||
PRBool aRecurse, nsIDocShellTreeItem* aRequestor,
|
||||
nsIDocShellTreeItem* aOriginalRequestor,
|
||||
nsIDocShellTreeItem **aFoundItem);
|
||||
nsresult FindItemWithNameAcrossWindows(const PRUnichar* aName,
|
||||
nsIDocShellTreeItem* aRequestor,
|
||||
nsIDocShellTreeItem* aOriginalRequestor,
|
||||
|
|
Загрузка…
Ссылка в новой задаче