From 797cd22ff42f1a6bbc04f2663a409b2c20050564 Mon Sep 17 00:00:00 2001
From: "hyatt%netscape.com" <hyatt%netscape.com>
Date: Sat, 15 Jan 2000 05:31:45 +0000
Subject: [PATCH] Landing XBL scrollbars.

---
 content/xbl/src/nsXBLService.cpp              |  6 ++++-
 content/xml/content/src/nsXMLElement.cpp      | 22 +++++++++++++++++++
 content/xml/content/src/nsXMLElement.h        |  8 +++++++
 layout/xbl/src/nsXBLService.cpp               |  6 ++++-
 .../xml/content/src/nsGenericXMLElement.cpp   |  5 +++++
 layout/xml/content/src/nsXMLElement.cpp       | 22 +++++++++++++++++++
 layout/xml/content/src/nsXMLElement.h         |  8 +++++++
 xpfe/global/resources/skin/MANIFEST_CHROME    |  1 +
 xpfe/global/resources/skin/Makefile.in        |  4 +++-
 xpfe/global/resources/skin/makefile.win       |  1 +
 xpfe/global/resources/skin/xul.css            |  4 ++++
 11 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/content/xbl/src/nsXBLService.cpp b/content/xbl/src/nsXBLService.cpp
index 0677d432cdb1..053b47c4e394 100644
--- a/content/xbl/src/nsXBLService.cpp
+++ b/content/xbl/src/nsXBLService.cpp
@@ -12,6 +12,7 @@
 #include "nsNetUtil.h"
 #include "plstr.h"
 #include "nsIContent.h"
+#include "nsIDOMElement.h"
 #include "nsIBindableContent.h"
 #include "nsIDocument.h"
 #include "nsIXMLContentSink.h"
@@ -270,7 +271,10 @@ nsXBLService::GetContentList(nsIContent* aContent, nsISupportsArray** aResult)
         content->ChildAt(i, *getter_AddRefs(anonymousChild));
         if (!(*aResult)) 
           NS_NewISupportsArray(aResult); // This call addrefs the array.
-        (*aResult)->AppendElement(anonymousChild);
+
+        nsCOMPtr<nsIDOMElement> element = do_QueryInterface(anonymousChild);
+        if (element) // Don't let the extra text frames get generated.
+          (*aResult)->AppendElement(anonymousChild);
       }
     }
 
diff --git a/content/xml/content/src/nsXMLElement.cpp b/content/xml/content/src/nsXMLElement.cpp
index a47be193dfe5..7d7fd85f1ece 100644
--- a/content/xml/content/src/nsXMLElement.cpp
+++ b/content/xml/content/src/nsXMLElement.cpp
@@ -32,6 +32,8 @@
 #include "nsINameSpaceManager.h"
 #include "nsIURL.h"
 
+#include "nsIXBLBinding.h"
+
 //static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
 static NS_DEFINE_IID(kIXMLContentIID, NS_IXMLCONTENT_IID);
 
@@ -88,6 +90,12 @@ nsXMLElement::QueryInterface(REFNSIID aIID,
     NS_ADDREF_THIS();
     return NS_OK;
   }
+  else if (aIID.Equals(nsIBindableContent::GetIID())) {
+    nsIBindableContent* tmp = this;
+    *aInstancePtr = (void*) tmp;
+    NS_ADDREF_THIS();
+    return NS_OK;
+  }
   
   return NS_NOINTERFACE;
 }
@@ -213,3 +221,17 @@ nsXMLElement::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
   return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
 }
 
+NS_IMETHODIMP
+nsXMLElement::SetBinding(nsIXBLBinding* aBinding) 
+{
+  mBinding = aBinding; // nsCOMPtr handles addrefing.
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsXMLElement::GetBinding(nsIXBLBinding** aResult)
+{
+  *aResult = mBinding;
+  NS_IF_ADDREF(*aResult);
+  return NS_OK;
+}
\ No newline at end of file
diff --git a/content/xml/content/src/nsXMLElement.h b/content/xml/content/src/nsXMLElement.h
index f8ffe196bf18..474e7cc1a167 100644
--- a/content/xml/content/src/nsXMLElement.h
+++ b/content/xml/content/src/nsXMLElement.h
@@ -23,12 +23,14 @@
 #ifndef nsXMLElement_h___
 #define nsXMLElement_h___
 
+#include "nsCOMPtr.h"
 #include "nsIDOMElement.h"
 #include "nsIScriptObjectOwner.h"
 #include "nsIDOMEventReceiver.h"
 #include "nsIXMLContent.h"
 #include "nsIJSScriptObject.h"
 #include "nsGenericXMLElement.h"
+#include "nsIBindableContent.h"
 
 class nsIDocument;
 class nsIAtom;
@@ -39,6 +41,7 @@ class nsXMLElement : public nsIDOMElement,
 		     public nsIScriptObjectOwner,
 		     public nsIDOMEventReceiver,
 		     public nsIXMLContent,
+         public nsIBindableContent,
 		     public nsIJSScriptObject
 {
 public:
@@ -196,6 +199,10 @@ public:
     return mInner.SetNameSpaceID(aNameSpaceId);
   }
 
+  // nsIBindableContent
+  NS_IMETHOD SetBinding(nsIXBLBinding* aBinding);
+  NS_IMETHOD GetBinding(nsIXBLBinding** aResult);
+
   // nsIDOMEventReceiver
   NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
 
@@ -229,6 +236,7 @@ protected:
   nsGenericXMLElement mInner;
   PRBool mIsLink;
   PRUint32 mContentID;
+  nsCOMPtr<nsIXBLBinding> mBinding;
 };
 
 #endif // nsXMLElement_h___
diff --git a/layout/xbl/src/nsXBLService.cpp b/layout/xbl/src/nsXBLService.cpp
index 0677d432cdb1..053b47c4e394 100644
--- a/layout/xbl/src/nsXBLService.cpp
+++ b/layout/xbl/src/nsXBLService.cpp
@@ -12,6 +12,7 @@
 #include "nsNetUtil.h"
 #include "plstr.h"
 #include "nsIContent.h"
+#include "nsIDOMElement.h"
 #include "nsIBindableContent.h"
 #include "nsIDocument.h"
 #include "nsIXMLContentSink.h"
@@ -270,7 +271,10 @@ nsXBLService::GetContentList(nsIContent* aContent, nsISupportsArray** aResult)
         content->ChildAt(i, *getter_AddRefs(anonymousChild));
         if (!(*aResult)) 
           NS_NewISupportsArray(aResult); // This call addrefs the array.
-        (*aResult)->AppendElement(anonymousChild);
+
+        nsCOMPtr<nsIDOMElement> element = do_QueryInterface(anonymousChild);
+        if (element) // Don't let the extra text frames get generated.
+          (*aResult)->AppendElement(anonymousChild);
       }
     }
 
diff --git a/layout/xml/content/src/nsGenericXMLElement.cpp b/layout/xml/content/src/nsGenericXMLElement.cpp
index 18777d128aa7..1658518ce6cd 100644
--- a/layout/xml/content/src/nsGenericXMLElement.cpp
+++ b/layout/xml/content/src/nsGenericXMLElement.cpp
@@ -76,6 +76,11 @@ nsGenericXMLElement::CopyInnerTo(nsIContent* aSrcContent,
   if (NS_OK == result) {
     aDst->mNameSpacePrefix = mNameSpacePrefix;
     NS_IF_ADDREF(mNameSpacePrefix);
+
+    aDst->mNameSpace = mNameSpace;
+    NS_IF_ADDREF(mNameSpace);
+
+    aDst->mNameSpaceID = mNameSpaceID;
   }
   return NS_OK;
 }
diff --git a/layout/xml/content/src/nsXMLElement.cpp b/layout/xml/content/src/nsXMLElement.cpp
index a47be193dfe5..7d7fd85f1ece 100644
--- a/layout/xml/content/src/nsXMLElement.cpp
+++ b/layout/xml/content/src/nsXMLElement.cpp
@@ -32,6 +32,8 @@
 #include "nsINameSpaceManager.h"
 #include "nsIURL.h"
 
+#include "nsIXBLBinding.h"
+
 //static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
 static NS_DEFINE_IID(kIXMLContentIID, NS_IXMLCONTENT_IID);
 
@@ -88,6 +90,12 @@ nsXMLElement::QueryInterface(REFNSIID aIID,
     NS_ADDREF_THIS();
     return NS_OK;
   }
+  else if (aIID.Equals(nsIBindableContent::GetIID())) {
+    nsIBindableContent* tmp = this;
+    *aInstancePtr = (void*) tmp;
+    NS_ADDREF_THIS();
+    return NS_OK;
+  }
   
   return NS_NOINTERFACE;
 }
@@ -213,3 +221,17 @@ nsXMLElement::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
   return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
 }
 
+NS_IMETHODIMP
+nsXMLElement::SetBinding(nsIXBLBinding* aBinding) 
+{
+  mBinding = aBinding; // nsCOMPtr handles addrefing.
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsXMLElement::GetBinding(nsIXBLBinding** aResult)
+{
+  *aResult = mBinding;
+  NS_IF_ADDREF(*aResult);
+  return NS_OK;
+}
\ No newline at end of file
diff --git a/layout/xml/content/src/nsXMLElement.h b/layout/xml/content/src/nsXMLElement.h
index f8ffe196bf18..474e7cc1a167 100644
--- a/layout/xml/content/src/nsXMLElement.h
+++ b/layout/xml/content/src/nsXMLElement.h
@@ -23,12 +23,14 @@
 #ifndef nsXMLElement_h___
 #define nsXMLElement_h___
 
+#include "nsCOMPtr.h"
 #include "nsIDOMElement.h"
 #include "nsIScriptObjectOwner.h"
 #include "nsIDOMEventReceiver.h"
 #include "nsIXMLContent.h"
 #include "nsIJSScriptObject.h"
 #include "nsGenericXMLElement.h"
+#include "nsIBindableContent.h"
 
 class nsIDocument;
 class nsIAtom;
@@ -39,6 +41,7 @@ class nsXMLElement : public nsIDOMElement,
 		     public nsIScriptObjectOwner,
 		     public nsIDOMEventReceiver,
 		     public nsIXMLContent,
+         public nsIBindableContent,
 		     public nsIJSScriptObject
 {
 public:
@@ -196,6 +199,10 @@ public:
     return mInner.SetNameSpaceID(aNameSpaceId);
   }
 
+  // nsIBindableContent
+  NS_IMETHOD SetBinding(nsIXBLBinding* aBinding);
+  NS_IMETHOD GetBinding(nsIXBLBinding** aResult);
+
   // nsIDOMEventReceiver
   NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
 
@@ -229,6 +236,7 @@ protected:
   nsGenericXMLElement mInner;
   PRBool mIsLink;
   PRUint32 mContentID;
+  nsCOMPtr<nsIXBLBinding> mBinding;
 };
 
 #endif // nsXMLElement_h___
diff --git a/xpfe/global/resources/skin/MANIFEST_CHROME b/xpfe/global/resources/skin/MANIFEST_CHROME
index 176a637a885f..363a5dae6c6f 100644
--- a/xpfe/global/resources/skin/MANIFEST_CHROME
+++ b/xpfe/global/resources/skin/MANIFEST_CHROME
@@ -1 +1,2 @@
 xul.css
+xulBindings.xml
diff --git a/xpfe/global/resources/skin/Makefile.in b/xpfe/global/resources/skin/Makefile.in
index e05563d73946..324435fe64f1 100644
--- a/xpfe/global/resources/skin/Makefile.in
+++ b/xpfe/global/resources/skin/Makefile.in
@@ -107,7 +107,9 @@ EXPORT_RESOURCE_CONTENT = \
     $(srcdir)/wizardOverlay.css \
 		$(NULL)
 
-EXPORT_CHROME	= $(srcdir)/xul.css
+EXPORT_CHROME	= $(srcdir)/xul.css \
+                $(srcdir)/xulBindings.xml \
+                $(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
diff --git a/xpfe/global/resources/skin/makefile.win b/xpfe/global/resources/skin/makefile.win
index 198e7661b103..785c71d68d2e 100644
--- a/xpfe/global/resources/skin/makefile.win
+++ b/xpfe/global/resources/skin/makefile.win
@@ -29,6 +29,7 @@ DISTXUL=$(DIST)\bin\chrome
 install::
 	$(MAKE_INSTALL) tasksOverlay.css $(DISTBROWSER)
 	$(MAKE_INSTALL) xul.css $(DISTXUL)
+  $(MAKE_INSTALL) xulBindings.xml $(DISTXUL)
 	$(MAKE_INSTALL) global.css $(DISTBROWSER)
 	$(MAKE_INSTALL) lessCols.gif $(DISTBROWSER)
 	$(MAKE_INSTALL) lessCols_mo.gif $(DISTBROWSER)
diff --git a/xpfe/global/resources/skin/xul.css b/xpfe/global/resources/skin/xul.css
index acdf95ac2efa..e77a1dbac86d 100644
--- a/xpfe/global/resources/skin/xul.css
+++ b/xpfe/global/resources/skin/xul.css
@@ -233,6 +233,10 @@ tabcontrol {
 
 /********* XP Scrollbar *********/
 
+scrollbar {
+   behavior: url("resource:/chrome/xulBindings.xml#scrollbar");
+}
+
 thumb {
    display: block;
    user-focus: ignore;