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
--- 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();