阅读:4325回复:0
Madfox 补丁解析--通过id/name访问frame
虽然是非标准,但是Firefox本来就支持通过id或者name来访问frame。但是实现有些问题,它只能要么通过id要么通过name来访问,如果id和name不一样,就会有问题。
这个补丁将id和name区分开,不要求id必须等于name才能正常访问。做法是增加了一个id属性,而不是象以前一样把name和id混在一起。如果你想看看一个网页元素有多少属性,可以看看DOM Inspector。 Index: content/base/src/nsFrameLoader.cpp =================================================================== --- content/base/src/nsFrameLoader.cpp (revision 6) +++ content/base/src/nsFrameLoader.cpp (revision 7) @@ -438,6 +438,13 @@ docShellAsItem->SetName(frameName.get()); } + nsAutoString frameId; + mOwnerContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::id, frameId); + + if (!frameId.IsEmpty()) { + docShellAsItem->SetId(frameId.get()); + } + // If our container is a web-shell, inform it that it has a new // child. If it's not a web-shell then some things will not operate // properly. Index: embedding/browser/webBrowser/nsWebBrowser.cpp =================================================================== --- embedding/browser/webBrowser/nsWebBrowser.cpp (revision 6) +++ embedding/browser/webBrowser/nsWebBrowser.cpp (revision 7) @@ -630,6 +630,18 @@ return NS_OK; } +NS_IMETHODIMP nsWebBrowser::GetId(PRUnichar** aName) +{ + // Not implemented + return NS_OK; +} + +NS_IMETHODIMP nsWebBrowser::SetId(const PRUnichar* aName) +{ + // Not implemented + return NS_OK; +} + //***************************************************************************** // nsWebBrowser::nsIWebNavigation //***************************************************************************** Index: docshell/base/nsDocShell.cpp =================================================================== --- docshell/base/nsDocShell.cpp (revision 6) +++ docshell/base/nsDocShell.cpp (revision 7) @@ -1690,11 +1690,26 @@ } NS_IMETHODIMP +nsDocShell::GetId(PRUnichar ** aId) +{ + NS_ENSURE_ARG_POINTER(aId); + *aId = ToNewUnicode(mId); + return NS_OK; +} + +NS_IMETHODIMP +nsDocShell::SetId(const PRUnichar * aId) +{ + mId = aId; // this does a copy of aId + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::NameEquals(const PRUnichar *aName, PRBool *_retval) { NS_ENSURE_ARG_POINTER(aName); NS_ENSURE_ARG_POINTER(_retval); - *_retval = mName.Equals(aName); + *_retval = mName.Equals(aName)||mId.Equals(aName); return NS_OK; } Index: docshell/base/nsIDocShellTreeItem.idl =================================================================== --- docshell/base/nsIDocShellTreeItem.idl (revision 6) +++ docshell/base/nsIDocShellTreeItem.idl (revision 7) @@ -49,6 +49,11 @@ */ boolean nameEquals(in wstring name); + /* + id of the DocShellTreeItem + */ + attribute wstring id; + /* Definitions for the item types. */ Index: docshell/base/nsDocShell.h =================================================================== --- docshell/base/nsDocShell.h (revision 6) +++ docshell/base/nsDocShell.h (revision 7) @@ -330,6 +330,7 @@ protected: nsString mName; + nsString mId; nsString mTitle; nsVoidArray mChildren; nsCOMPtr<nsISupportsArray> mRefreshURIList; |
|