猫头猪
狐狸大王
狐狸大王
  • UID163
  • 注册日期2004-11-25
  • 最后登录2005-12-04
  • 发帖数595
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
阅读:4088回复:0

Madfox 补丁解析--通过id/name访问frame

楼主#
更多 发布于:2005-04-01 10:43
虽然是非标准,但是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;
游客

返回顶部