|
阅读:4694回复: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; |
|