Bug 1290276 Part 2 - Pass bound element to Loader through LoadResources(). draft
authorTing-Yu Lin <tlin@mozilla.com>
Mon, 05 Jun 2017 14:30:52 +0800
changeset 590806 2e2aeba528f2c262dfa0ee42f39124db6be1da20
parent 590805 79f8b11b9536993c80c1f2a75459f40e61e1c437
child 590807 d8db84c5e5db239d10d869e591c3e9e20fe4c74e
push id62831
push userbmo:tlin@mozilla.com
push dateThu, 08 Jun 2017 03:44:02 +0000
bugs1290276
milestone55.0a1
Bug 1290276 Part 2 - Pass bound element to Loader through LoadResources(). We'll need the bound element to get PresContext in a later patch. MozReview-Commit-ID: 2Gcb0yKgbTH
dom/xbl/nsXBLPrototypeBinding.cpp
dom/xbl/nsXBLPrototypeBinding.h
dom/xbl/nsXBLPrototypeResources.cpp
dom/xbl/nsXBLPrototypeResources.h
dom/xbl/nsXBLResourceLoader.cpp
dom/xbl/nsXBLResourceLoader.h
dom/xbl/nsXBLService.cpp
--- a/dom/xbl/nsXBLPrototypeBinding.cpp
+++ b/dom/xbl/nsXBLPrototypeBinding.cpp
@@ -225,20 +225,20 @@ nsXBLPrototypeBinding::SetBindingElement
 
 bool
 nsXBLPrototypeBinding::GetAllowScripts() const
 {
   return mXBLDocInfoWeak->GetScriptAccess();
 }
 
 bool
-nsXBLPrototypeBinding::LoadResources()
+nsXBLPrototypeBinding::LoadResources(nsIContent* aBoundElement)
 {
   if (mResources) {
-    return mResources->LoadResources();
+    return mResources->LoadResources(aBoundElement);
   }
 
   return true;
 }
 
 nsresult
 nsXBLPrototypeBinding::AddResource(nsIAtom* aResourceType, const nsAString& aSrc)
 {
--- a/dom/xbl/nsXBLPrototypeBinding.h
+++ b/dom/xbl/nsXBLPrototypeBinding.h
@@ -53,17 +53,19 @@ public:
   // binding URIs.
   bool CompareBindingURI(nsIURI* aURI) const;
 
   bool GetAllowScripts() const;
 
   nsresult BindingAttached(nsIContent* aBoundElement);
   nsresult BindingDetached(nsIContent* aBoundElement);
 
-  bool LoadResources();
+  // aBoundElement is passed in here because we need to get owner document
+  // and PresContext in nsXBLResourceLoader::LoadResources().
+  bool LoadResources(nsIContent* aBoundElement);
   nsresult AddResource(nsIAtom* aResourceType, const nsAString& aSrc);
 
   bool InheritsStyle() const { return mInheritStyle; }
   void SetInheritsStyle(bool aInheritStyle) { mInheritStyle = aInheritStyle; }
 
   nsXBLPrototypeHandler* GetPrototypeHandlers() { return mPrototypeHandler; }
   void SetPrototypeHandlers(nsXBLPrototypeHandler* aHandler) { mPrototypeHandler = aHandler; }
 
--- a/dom/xbl/nsXBLPrototypeResources.cpp
+++ b/dom/xbl/nsXBLPrototypeResources.cpp
@@ -43,20 +43,20 @@ nsXBLPrototypeResources::~nsXBLPrototype
 void
 nsXBLPrototypeResources::AddResource(nsIAtom* aResourceType, const nsAString& aSrc)
 {
   if (mLoader)
     mLoader->AddResource(aResourceType, aSrc);
 }
 
 bool
-nsXBLPrototypeResources::LoadResources()
+nsXBLPrototypeResources::LoadResources(nsIContent* aBoundElement)
 {
   if (mLoader) {
-    return mLoader->LoadResources();
+    return mLoader->LoadResources(aBoundElement);
   }
 
   return true; // All resources loaded.
 }
 
 void
 nsXBLPrototypeResources::AddResourceListener(nsIContent* aBoundElement)
 {
--- a/dom/xbl/nsXBLPrototypeResources.h
+++ b/dom/xbl/nsXBLPrototypeResources.h
@@ -24,17 +24,17 @@ class CSSStyleSheet;
 // The XBLPrototypeResources class
 
 class nsXBLPrototypeResources
 {
 public:
   explicit nsXBLPrototypeResources(nsXBLPrototypeBinding* aBinding);
   ~nsXBLPrototypeResources();
 
-  bool LoadResources();
+  bool LoadResources(nsIContent* aBoundElement);
   void AddResource(nsIAtom* aResourceType, const nsAString& aSrc);
   void AddResourceListener(nsIContent* aElement);
   nsresult FlushSkinSheets();
 
   nsresult Write(nsIObjectOutputStream* aStream);
 
   void Traverse(nsCycleCollectionTraversalCallback &cb);
   void Unlink();
--- a/dom/xbl/nsXBLResourceLoader.cpp
+++ b/dom/xbl/nsXBLResourceLoader.cpp
@@ -77,31 +77,37 @@ nsXBLResourceLoader::nsXBLResourceLoader
 }
 
 nsXBLResourceLoader::~nsXBLResourceLoader()
 {
   delete mResourceList;
 }
 
 bool
-nsXBLResourceLoader::LoadResources()
+nsXBLResourceLoader::LoadResources(nsIContent* aBoundElement)
 {
   mInLoadResourcesFunc = true;
 
   if (mLoadingResources) {
     mInLoadResourcesFunc = false;
     return mPendingSheets == 0;
   }
 
   mLoadingResources = true;
 
   // Declare our loaders.
   nsCOMPtr<nsIDocument> doc = mBinding->XBLDocumentInfo()->GetDocument();
+  nsIDocument* boundDoc = aBoundElement->OwnerDoc();
 
   mozilla::css::Loader* cssLoader = doc->CSSLoader();
+  MOZ_ASSERT(cssLoader->GetDocument() &&
+             cssLoader->GetDocument()->GetStyleBackendType()
+               == boundDoc->GetStyleBackendType(),
+             "The style backends of the loader and bound document are mismatched!");
+
   nsIURI *docURL = doc->GetDocumentURI();
   nsIPrincipal* docPrincipal = doc->NodePrincipal();
 
   nsCOMPtr<nsIURI> url;
 
   for (nsXBLResource* curr = mResourceList; curr; curr = curr->mNext) {
     if (curr->mSrc.IsEmpty())
       continue;
--- a/dom/xbl/nsXBLResourceLoader.h
+++ b/dom/xbl/nsXBLResourceLoader.h
@@ -29,17 +29,17 @@ public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_CLASS(nsXBLResourceLoader)
 
   // nsICSSLoaderObserver
   NS_IMETHOD StyleSheetLoaded(mozilla::StyleSheet* aSheet,
                               bool aWasAlternate,
                               nsresult aStatus) override;
 
-  bool LoadResources();
+  bool LoadResources(nsIContent* aBoundElement);
   void AddResource(nsIAtom* aResourceType, const nsAString& aSrc);
   void AddResourceListener(nsIContent* aElement);
 
   nsXBLResourceLoader(nsXBLPrototypeBinding* aBinding,
                       nsXBLPrototypeResources* aResources);
 
   void NotifyBoundElements();
 
--- a/dom/xbl/nsXBLService.cpp
+++ b/dom/xbl/nsXBLService.cpp
@@ -785,17 +785,17 @@ nsXBLService::GetBinding(nsIContent* aBo
 
   aDontExtendURIs.AppendElement(protoBinding->BindingURI());
   nsCOMPtr<nsIURI> altBindingURI = protoBinding->AlternateBindingURI();
   if (altBindingURI) {
     aDontExtendURIs.AppendElement(altBindingURI);
   }
 
   // Our prototype binding must have all its resources loaded.
-  bool ready = protoBinding->LoadResources();
+  bool ready = protoBinding->LoadResources(aBoundElement);
   if (!ready) {
     // Add our bound element to the protos list of elts that should
     // be notified when the stylesheets and scripts finish loading.
     protoBinding->AddResourceListener(aBoundElement);
     return NS_ERROR_FAILURE; // The binding isn't ready yet.
   }
 
   rv = protoBinding->ResolveBaseBinding();