diff --git a/mozilla/chrome/src/nsChromeRegistry.cpp b/mozilla/chrome/src/nsChromeRegistry.cpp index 0a85098c2e7..d835f17b805 100644 --- a/mozilla/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/chrome/src/nsChromeRegistry.cpp @@ -882,7 +882,8 @@ static void FlushSkinBindingsForWindow(nsIDOMWindowInternal* aWindow) // XXXbsmedberg: move this to nsIWindowMediator NS_IMETHODIMP nsChromeRegistry::RefreshSkins() { - nsCOMPtr cssLoader(do_CreateInstance(kCSSLoaderCID)); + nsCOMPtr cssLoader = + do_CreateInstance(kCSSLoaderCID); if (!cssLoader) return NS_OK; @@ -945,7 +946,7 @@ static PRBool IsChromeURI(nsIURI* aURI) // XXXbsmedberg: move this to windowmediator nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, - nsICSSLoader* aCSSLoader) + nsICSSLoader_1_9_0_BRANCH* aCSSLoader) { // Deal with our subframes first. nsCOMPtr frames; @@ -991,7 +992,8 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, if (IsChromeURI(uri)) { // Reload the sheet. nsCOMPtr newSheet; - rv = aCSSLoader->LoadSheetSync(uri, PR_TRUE, getter_AddRefs(newSheet)); + rv = aCSSLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, + getter_AddRefs(newSheet)); if (NS_FAILED(rv)) return rv; if (newSheet) { rv = newAgentSheets.AppendObject(newSheet) ? NS_OK : NS_ERROR_FAILURE; diff --git a/mozilla/chrome/src/nsChromeRegistry.h b/mozilla/chrome/src/nsChromeRegistry.h index 0fa15c93812..f1a3840e854 100644 --- a/mozilla/chrome/src/nsChromeRegistry.h +++ b/mozilla/chrome/src/nsChromeRegistry.h @@ -57,7 +57,7 @@ struct PRFileDesc; class nsIAtom; -class nsICSSLoader; +class nsICSSLoader_1_9_0_BRANCH; class nsICSSStyleSheet; class nsIDOMWindowInternal; class nsILocalFile; @@ -116,7 +116,7 @@ protected: private: static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow, - nsICSSLoader* aCSSLoader); + nsICSSLoader_1_9_0_BRANCH* aCSSLoader); static nsresult GetProviderAndPath(nsIURL* aChromeURL, nsACString& aProvider, nsACString& aPath); diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index aee41edf9c6..f793d98dcb8 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -2528,7 +2528,8 @@ nsDocument::AddCatalogStyleSheet(nsIStyleSheet* aSheet) void nsDocument::EnsureCatalogStyleSheet(const char *aStyleSheetURI) { - nsICSSLoader* cssLoader = CSSLoader(); + nsCOMPtr cssLoader = + do_QueryInterface(CSSLoader()); PRBool enabled; if (NS_SUCCEEDED(cssLoader->GetEnabled(&enabled)) && enabled) { PRInt32 sheetCount = GetNumberOfCatalogStyleSheets(); @@ -2549,7 +2550,7 @@ nsDocument::EnsureCatalogStyleSheet(const char *aStyleSheetURI) NS_NewURI(getter_AddRefs(uri), aStyleSheetURI); if (uri) { nsCOMPtr sheet; - cssLoader->LoadSheetSync(uri, PR_TRUE, getter_AddRefs(sheet)); + cssLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, getter_AddRefs(sheet)); if (sheet) { BeginUpdate(UPDATE_STYLE); AddCatalogStyleSheet(sheet); diff --git a/mozilla/content/xbl/src/nsXBLResourceLoader.cpp b/mozilla/content/xbl/src/nsXBLResourceLoader.cpp index b349a569cff..e3f131391d0 100644 --- a/mozilla/content/xbl/src/nsXBLResourceLoader.cpp +++ b/mozilla/content/xbl/src/nsXBLResourceLoader.cpp @@ -58,6 +58,7 @@ #include "nsXBLPrototypeBinding.h" #include "nsCSSRuleProcessor.h" #include "nsContentUtils.h" +#include "nsIScriptSecurityManager.h" NS_IMPL_CYCLE_COLLECTION_CLASS(nsXBLResourceLoader) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXBLResourceLoader) @@ -147,13 +148,18 @@ nsXBLResourceLoader::LoadResources(PRBool* aResult) nsresult rv; if (NS_SUCCEEDED(url->SchemeIs("chrome", &chrome)) && chrome) { - nsCOMPtr sheet; - rv = cssLoader->LoadSheetSync(url, getter_AddRefs(sheet)); - NS_ASSERTION(NS_SUCCEEDED(rv), "Load failed!!!"); - if (NS_SUCCEEDED(rv)) - { - rv = StyleSheetLoaded(sheet, PR_FALSE, NS_OK); - NS_ASSERTION(NS_SUCCEEDED(rv), "Processing the style sheet failed!!!"); + rv = nsContentUtils::GetSecurityManager()-> + CheckLoadURIWithPrincipal(docPrincipal, url, + nsIScriptSecurityManager::ALLOW_CHROME); + if (NS_SUCCEEDED(rv)) { + nsCOMPtr sheet; + rv = cssLoader->LoadSheetSync(url, getter_AddRefs(sheet)); + NS_ASSERTION(NS_SUCCEEDED(rv), "Load failed!!!"); + if (NS_SUCCEEDED(rv)) + { + rv = StyleSheetLoaded(sheet, PR_FALSE, NS_OK); + NS_ASSERTION(NS_SUCCEEDED(rv), "Processing the style sheet failed!!!"); + } } } else diff --git a/mozilla/content/xbl/src/nsXBLService.cpp b/mozilla/content/xbl/src/nsXBLService.cpp index 7a6d9c7ebab..4210df864ca 100644 --- a/mozilla/content/xbl/src/nsXBLService.cpp +++ b/mozilla/content/xbl/src/nsXBLService.cpp @@ -1004,6 +1004,15 @@ nsXBLService::GetBinding(nsIContent* aBoundElement, nsIURI* aURI, return NS_OK; } +static PRBool SchemeIs(nsIURI* aURI, const char* aScheme) +{ + nsCOMPtr baseURI = NS_GetInnermostURI(aURI); + NS_ENSURE_TRUE(baseURI, PR_FALSE); + + PRBool isScheme = PR_FALSE; + return NS_SUCCEEDED(baseURI->SchemeIs(aScheme, &isScheme)) && isScheme; +} + NS_IMETHODIMP nsXBLService::LoadBindingDocumentInfo(nsIContent* aBoundElement, nsIDocument* aBoundDocument, @@ -1033,6 +1042,21 @@ nsXBLService::LoadBindingDocumentInfo(nsIContent* aBoundElement, nsIContentPolicy::TYPE_XBL, aBoundDocument); NS_ENSURE_SUCCESS(rv, rv); + + // Also make sure that we're same-origin with the bound document + // except if the stylesheet has the system principal. + PRBool isSystem; + rv = nsContentUtils::GetSecurityManager()-> + IsSystemPrincipal(aOriginPrincipal, &isSystem); + NS_ENSURE_SUCCESS(rv, rv); + + if (!isSystem && + !(gAllowDataURIs && SchemeIs(aBindingURI, "data")) && + !SchemeIs(aBindingURI, "chrome")) { + rv = aBoundDocument->NodePrincipal()->CheckMayLoad(aBindingURI, + PR_TRUE); + NS_ENSURE_SUCCESS(rv, rv); + } } *aResult = nsnull; diff --git a/mozilla/content/xml/document/src/nsXMLContentSink.cpp b/mozilla/content/xml/document/src/nsXMLContentSink.cpp index b2bf3d09e75..4e9aaa47870 100644 --- a/mozilla/content/xml/document/src/nsXMLContentSink.cpp +++ b/mozilla/content/xml/document/src/nsXMLContentSink.cpp @@ -1288,7 +1288,9 @@ nsXMLContentSink::HandleDoctypeDecl(const nsAString & aSubset, nsCOMPtr uri(do_QueryInterface(aCatalogData)); if (uri) { nsCOMPtr sheet; - mCSSLoader->LoadSheetSync(uri, PR_TRUE, getter_AddRefs(sheet)); + nsCOMPtr cssLoader = + do_QueryInterface(mCSSLoader); + cssLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, getter_AddRefs(sheet)); #ifdef NS_DEBUG nsCAutoString uriStr; diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp index beedb9dbe24..5d90c937631 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp +++ b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp @@ -3599,6 +3599,8 @@ nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL) nsCOMPtr cssLoader; nsresult rv = GetCSSLoader(aURL, getter_AddRefs(cssLoader)); NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr cssLoaderBranch = + do_QueryInterface(cssLoader); nsCOMPtr uaURI; rv = NS_NewURI(getter_AddRefs(uaURI), aURL); @@ -3609,7 +3611,8 @@ nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL) // synchronously, of course.. nsCOMPtr sheet; // Editor override style sheets may want to style Gecko anonymous boxes - rv = cssLoader->LoadSheetSync(uaURI, PR_TRUE, getter_AddRefs(sheet)); + rv = cssLoaderBranch->LoadSheetSync(uaURI, PR_TRUE, PR_TRUE, + getter_AddRefs(sheet)); // Synchronous loads should ALWAYS return completed if (!sheet) diff --git a/mozilla/layout/base/nsStyleSheetService.cpp b/mozilla/layout/base/nsStyleSheetService.cpp index 33cdc5a1dbe..ee05b052cfc 100644 --- a/mozilla/layout/base/nsStyleSheetService.cpp +++ b/mozilla/layout/base/nsStyleSheetService.cpp @@ -168,11 +168,11 @@ nsStyleSheetService::LoadAndRegisterSheetInternal(nsIURI *aSheetURI, NS_ENSURE_ARG(aSheetType == AGENT_SHEET || aSheetType == USER_SHEET); NS_ENSURE_ARG_POINTER(aSheetURI); - nsCOMPtr loader = do_CreateInstance(kCSSLoaderCID); + nsCOMPtr loader = do_CreateInstance(kCSSLoaderCID); nsCOMPtr sheet; // Allow UA sheets, but not user sheets, to use unsafe rules nsresult rv = loader->LoadSheetSync(aSheetURI, aSheetType == AGENT_SHEET, - getter_AddRefs(sheet)); + PR_TRUE, getter_AddRefs(sheet)); NS_ENSURE_SUCCESS(rv, rv); if (!mSheets[aSheetType].AppendObject(sheet)) { diff --git a/mozilla/layout/build/nsContentDLF.cpp b/mozilla/layout/build/nsContentDLF.cpp index 070589e4c9f..91c52572ef7 100644 --- a/mozilla/layout/build/nsContentDLF.cpp +++ b/mozilla/layout/build/nsContentDLF.cpp @@ -623,11 +623,11 @@ nsContentDLF::EnsureUAStyleSheet() #endif return rv; } - nsCOMPtr cssLoader; + nsCOMPtr cssLoader; NS_NewCSSLoader(getter_AddRefs(cssLoader)); if (!cssLoader) return NS_ERROR_OUT_OF_MEMORY; - rv = cssLoader->LoadSheetSync(uri, PR_TRUE, &gUAStyleSheet); + rv = cssLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, &gUAStyleSheet); #ifdef DEBUG if (NS_FAILED(rv)) printf("*** open of %s failed: error=%x\n", UA_CSS_URL, rv); diff --git a/mozilla/layout/style/nsCSSLoader.cpp b/mozilla/layout/style/nsCSSLoader.cpp index b92f5bdf419..272c20ba400 100644 --- a/mozilla/layout/style/nsCSSLoader.cpp +++ b/mozilla/layout/style/nsCSSLoader.cpp @@ -164,11 +164,11 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, mMustNotify(PR_FALSE), mWasAlternate(aIsAlternate), mAllowUnsafeRules(PR_FALSE), + mUseSystemPrincipal(PR_FALSE), mOwningElement(aOwningElement), mObserver(aObserver), mLoaderPrincipal(aLoaderPrincipal) { - NS_PRECONDITION(mLoader, "Must have a loader!"); NS_ADDREF(mLoader); } @@ -193,11 +193,11 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, mMustNotify(PR_FALSE), mWasAlternate(PR_FALSE), mAllowUnsafeRules(PR_FALSE), + mUseSystemPrincipal(PR_FALSE), mOwningElement(nsnull), mObserver(aObserver), mLoaderPrincipal(aLoaderPrincipal) { - NS_PRECONDITION(mLoader, "Must have a loader!"); NS_ADDREF(mLoader); if (mParentData) { @@ -205,8 +205,12 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, mSyncLoad = mParentData->mSyncLoad; mIsNonDocumentSheet = mParentData->mIsNonDocumentSheet; mAllowUnsafeRules = mParentData->mAllowUnsafeRules; + mUseSystemPrincipal = mParentData->mUseSystemPrincipal; ++(mParentData->mPendingChildren); } + + NS_POSTCONDITION(!mUseSystemPrincipal || mSyncLoad, + "Shouldn't use system principal for async loads"); } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, @@ -214,6 +218,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsICSSStyleSheet* aSheet, PRBool aSyncLoad, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, nsICSSLoaderObserver* aObserver, nsIPrincipal* aLoaderPrincipal) : mLoader(aLoader), @@ -230,13 +235,16 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, mMustNotify(PR_FALSE), mWasAlternate(PR_FALSE), mAllowUnsafeRules(aAllowUnsafeRules), + mUseSystemPrincipal(aUseSystemPrincipal), mOwningElement(nsnull), mObserver(aObserver), mLoaderPrincipal(aLoaderPrincipal) { - NS_PRECONDITION(mLoader, "Must have a loader!"); NS_ADDREF(mLoader); + + NS_POSTCONDITION(!mUseSystemPrincipal || mSyncLoad, + "Shouldn't use system principal for async loads"); } SheetLoadData::~SheetLoadData() @@ -280,7 +288,7 @@ CSSLoaderImpl::~CSSLoaderImpl(void) // they're all done. } -NS_IMPL_ISUPPORTS1(CSSLoaderImpl, nsICSSLoader) +NS_IMPL_ISUPPORTS2(CSSLoaderImpl, nsICSSLoader, nsICSSLoader_1_9_0_BRANCH) void CSSLoaderImpl::Shutdown() @@ -1275,6 +1283,8 @@ CSSLoaderImpl::LoadSheet(SheetLoadData* aLoadData, StyleSheetState aSheetState) NS_PRECONDITION(aLoadData->mURI, "Need a URI to load"); NS_PRECONDITION(aLoadData->mSheet, "Need a sheet to load into"); NS_PRECONDITION(aSheetState != eSheetComplete, "Why bother?"); + NS_PRECONDITION(!aLoadData->mUseSystemPrincipal || aLoadData->mSyncLoad, + "Shouldn't use system principal for async loads"); NS_ASSERTION(mLoadingDatas.IsInitialized(), "mLoadingDatas should be initialized by now."); LOG_URI(" Load from: '%s'", aLoadData->mURI); @@ -1308,10 +1318,16 @@ CSSLoaderImpl::LoadSheet(SheetLoadData* aLoadData, StyleSheetState aSheetState) NS_ASSERTION(channel, "NS_OpenURI lied?"); - // Get the principal for this channel + // Get the principal for this sheet nsCOMPtr principal; - rv = nsContentUtils::GetSecurityManager()-> - GetChannelPrincipal(channel, getter_AddRefs(principal)); + if (aLoadData->mUseSystemPrincipal) { + rv = nsContentUtils::GetSecurityManager()-> + GetSystemPrincipal(getter_AddRefs(principal)); + } else { + rv = nsContentUtils::GetSecurityManager()-> + GetChannelPrincipal(channel, getter_AddRefs(principal)); + } + if (NS_FAILED(rv)) { LOG_ERROR((" Failed to get a principal for the sheet")); SheetComplete(aLoadData, rv); @@ -1961,9 +1977,18 @@ CSSLoaderImpl::LoadChildSheet(nsICSSStyleSheet* aParentSheet, NS_IMETHODIMP CSSLoaderImpl::LoadSheetSync(nsIURI* aURL, PRBool aAllowUnsafeRules, nsICSSStyleSheet** aSheet) +{ + return LoadSheetSync(aURL, aAllowUnsafeRules, PR_FALSE, aSheet); +} + +NS_IMETHODIMP +CSSLoaderImpl::LoadSheetSync(nsIURI* aURL, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, + nsICSSStyleSheet** aSheet) { LOG(("CSSLoaderImpl::LoadSheetSync")); - return InternalLoadNonDocumentSheet(aURL, aAllowUnsafeRules, nsnull, + return InternalLoadNonDocumentSheet(aURL, aAllowUnsafeRules, + aUseSystemPrincipal, nsnull, aSheet, nsnull); } @@ -1975,7 +2000,8 @@ CSSLoaderImpl::LoadSheet(nsIURI* aURL, { LOG(("CSSLoaderImpl::LoadSheet(aURL, aObserver, aSheet) api call")); NS_PRECONDITION(aSheet, "aSheet is null"); - return InternalLoadNonDocumentSheet(aURL, PR_FALSE, aOriginPrincipal, + return InternalLoadNonDocumentSheet(aURL, PR_FALSE, PR_FALSE, + aOriginPrincipal, aSheet, aObserver); } @@ -1985,19 +2011,23 @@ CSSLoaderImpl::LoadSheet(nsIURI* aURL, nsICSSLoaderObserver* aObserver) { LOG(("CSSLoaderImpl::LoadSheet(aURL, aObserver) api call")); - return InternalLoadNonDocumentSheet(aURL, PR_FALSE, aOriginPrincipal, + return InternalLoadNonDocumentSheet(aURL, PR_FALSE, PR_FALSE, + aOriginPrincipal, nsnull, aObserver); } nsresult CSSLoaderImpl::InternalLoadNonDocumentSheet(nsIURI* aURL, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, nsIPrincipal* aOriginPrincipal, nsICSSStyleSheet** aSheet, nsICSSLoaderObserver* aObserver) { NS_PRECONDITION(aURL, "Must have a URI to load"); NS_PRECONDITION(aSheet || aObserver, "Sheet and observer can't both be null"); + NS_PRECONDITION(!aUseSystemPrincipal || !aObserver, + "Shouldn't load system-principal sheets async"); NS_ASSERTION(mParsingDatas.Count() == 0, "We're in the middle of a parse?"); LOG_URI(" Non-document sheet uri: '%s'", aURL); @@ -2041,7 +2071,7 @@ CSSLoaderImpl::InternalLoadNonDocumentSheet(nsIURI* aURL, SheetLoadData* data = new SheetLoadData(this, aURL, sheet, syncLoad, aAllowUnsafeRules, - aObserver, aOriginPrincipal); + aUseSystemPrincipal, aObserver, aOriginPrincipal); if (!data) { sheet->SetComplete(); @@ -2143,6 +2173,15 @@ nsresult NS_NewCSSLoader(nsICSSLoader** aLoader) return CallQueryInterface(it, aLoader); } +nsresult NS_NewCSSLoader(nsICSSLoader_1_9_0_BRANCH** aLoader) +{ + CSSLoaderImpl* it = new CSSLoaderImpl(); + + NS_ENSURE_TRUE(it, NS_ERROR_OUT_OF_MEMORY); + + return CallQueryInterface(it, aLoader); +} + PR_STATIC_CALLBACK(PLDHashOperator) StopLoadingSheetCallback(nsURIAndPrincipalHashKey* aKey, SheetLoadData*& aData, diff --git a/mozilla/layout/style/nsCSSLoader.h b/mozilla/layout/style/nsCSSLoader.h index dc3c6605f39..0b3105ccfe7 100644 --- a/mozilla/layout/style/nsCSSLoader.h +++ b/mozilla/layout/style/nsCSSLoader.h @@ -135,6 +135,7 @@ public: nsICSSStyleSheet* aSheet, PRBool aSyncLoad, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, nsICSSLoaderObserver* aObserver, nsIPrincipal* aLoaderPrincipal); @@ -207,6 +208,11 @@ public: // mAllowUnsafeRules is true if we should allow unsafe rules to be parsed // in the loaded sheet. PRPackedBool mAllowUnsafeRules : 1; + + // mUseSystemPrincipal is true if the system principal should be used for + // this sheet, no matter what the channel principal is. Only true for sync + // loads. + PRPackedBool mUseSystemPrincipal : 1; // This is the element that imported the sheet. Needed to get the // charset set on it. @@ -293,7 +299,7 @@ enum StyleSheetState { * Loader Declaration * **********************/ -class CSSLoaderImpl : public nsICSSLoader +class CSSLoaderImpl : public nsICSSLoader_1_9_0_BRANCH { public: CSSLoaderImpl(void); @@ -341,6 +347,10 @@ public: NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aAllowUnsafeRules, nsICSSStyleSheet** aSheet); + NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, + nsICSSStyleSheet** aSheet); + NS_IMETHOD LoadSheet(nsIURI* aURL, nsIPrincipal* aOriginPrincipal, nsICSSLoaderObserver* aObserver, @@ -415,6 +425,7 @@ private: nsresult InternalLoadNonDocumentSheet(nsIURI* aURL, PRBool aAllowUnsafeRules, + PRBool aUseSystemPrincipal, nsIPrincipal* aOriginPrincipal, nsICSSStyleSheet** aSheet, nsICSSLoaderObserver* aObserver); diff --git a/mozilla/layout/style/nsICSSLoader.h b/mozilla/layout/style/nsICSSLoader.h index da14a664b11..c8941d81b5c 100644 --- a/mozilla/layout/style/nsICSSLoader.h +++ b/mozilla/layout/style/nsICSSLoader.h @@ -162,29 +162,8 @@ public: nsICSSImportRule* aRule) = 0; /** - * Synchronously load and return the stylesheet at aURL. Any child sheets - * will also be loaded synchronously. Note that synchronous loads over some - * protocols may involve spinning up a new event loop, so use of this method - * does NOT guarantee not receiving any events before the sheet loads. This - * method can be used to load sheets not associated with a document. - * - * @param aURL the URL of the sheet to load - * @param [out] aSheet the loaded, complete sheet. - * @param aEnableUnsafeRules whether unsafe rules are enabled for this - * sheet load - * Unsafe rules are rules that can violate key Gecko invariants if misused. - * In particular, most anonymous box pseudoelements must be very carefully - * styled or we will have severe problems. Therefore unsafe rules should - * never be enabled for stylesheets controlled by untrusted sites; preferably - * unsafe rules should only be enabled for agent sheets. - * - * NOTE: At the moment, this method assumes the sheet will be UTF-8, but - * ideally it would allow arbitrary encodings. Callers should NOT depend on - * non-UTF8 sheets being treated as UTF-8 by this method. - * - * NOTE: A successful return from this method doesn't indicate anything about - * whether the data could be parsed as CSS and doesn't indicate anything - * about the status of child sheets of the returned sheet. + * As the nsICSSLoader_1_9_0_BRANCH method, but assumes + * aUseSystemPrincipal false. */ NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aEnableUnsafeRules, nsICSSStyleSheet** aSheet) = 0; @@ -277,10 +256,64 @@ public: NS_DEFINE_STATIC_IID_ACCESSOR(nsICSSLoader, NS_ICSS_LOADER_IID) +#define NS_ICSS_LOADER_1_9_0_BRANCH_IID \ +{ 0xdda6894b, 0x8129, 0x4bb1, \ + { 0xa5, 0x66, 0xdb, 0x90, 0x81, 0x8e, 0x6a, 0x27 } } + +class nsICSSLoader_1_9_0_BRANCH : public nsICSSLoader { +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICSS_LOADER_1_9_0_BRANCH_IID) + + /** + * Synchronously load and return the stylesheet at aURL. Any child sheets + * will also be loaded synchronously. Note that synchronous loads over some + * protocols may involve spinning up a new event loop, so use of this method + * does NOT guarantee not receiving any events before the sheet loads. This + * method can be used to load sheets not associated with a document. + * + * @param aURL the URL of the sheet to load + * @param aEnableUnsafeRules whether unsafe rules are enabled for this + * sheet load + * Unsafe rules are rules that can violate key Gecko invariants if misused. + * In particular, most anonymous box pseudoelements must be very carefully + * styled or we will have severe problems. Therefore unsafe rules should + * never be enabled for stylesheets controlled by untrusted sites; preferably + * unsafe rules should only be enabled for agent sheets. + * @param aUseSystemPrincipal if true, give the resulting sheet the system + * principal no matter where it's being loaded from. + * @param [out] aSheet the loaded, complete sheet. + * + * NOTE: At the moment, this method assumes the sheet will be UTF-8, but + * ideally it would allow arbitrary encodings. Callers should NOT depend on + * non-UTF8 sheets being treated as UTF-8 by this method. + * + * NOTE: A successful return from this method doesn't indicate anything about + * whether the data could be parsed as CSS and doesn't indicate anything + * about the status of child sheets of the returned sheet. + */ + NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aEnableUnsafeRules, + PRBool aUseSystemPrincipal, + nsICSSStyleSheet** aSheet) = 0; + + // Stupid C++ method hiding stuff + NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aEnableUnsafeRules, + nsICSSStyleSheet** aSheet) = 0; + + nsresult LoadSheetSync(nsIURI* aURL, nsICSSStyleSheet** aSheet) { + return nsICSSLoader::LoadSheetSync(aURL, aSheet); + } +}; + +NS_DEFINE_STATIC_IID_ACCESSOR(nsICSSLoader_1_9_0_BRANCH, + NS_ICSS_LOADER_1_9_0_BRANCH_IID) + nsresult NS_NewCSSLoader(nsIDocument* aDocument, nsICSSLoader** aLoader); nsresult NS_NewCSSLoader(nsICSSLoader** aLoader); +nsresult +NS_NewCSSLoader(nsICSSLoader_1_9_0_BRANCH** aLoader); + #endif /* nsICSSLoader_h___ */ diff --git a/mozilla/layout/style/nsLayoutStylesheetCache.cpp b/mozilla/layout/style/nsLayoutStylesheetCache.cpp index 814c1b1c903..38f318cbf40 100644 --- a/mozilla/layout/style/nsLayoutStylesheetCache.cpp +++ b/mozilla/layout/style/nsLayoutStylesheetCache.cpp @@ -223,12 +223,13 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr &aSh NS_NewCSSLoader(&gCSSLoader); if (gCSSLoader) { - gCSSLoader->LoadSheetSync(aURI, aEnableUnsafeRules, getter_AddRefs(aSheet)); + gCSSLoader->LoadSheetSync(aURI, aEnableUnsafeRules, PR_TRUE, + getter_AddRefs(aSheet)); } } nsLayoutStylesheetCache* nsLayoutStylesheetCache::gStyleCache = nsnull; -nsICSSLoader* +nsICSSLoader_1_9_0_BRANCH* nsLayoutStylesheetCache::gCSSLoader = nsnull; diff --git a/mozilla/layout/style/nsLayoutStylesheetCache.h b/mozilla/layout/style/nsLayoutStylesheetCache.h index 1ebb26fde83..eaf46242905 100644 --- a/mozilla/layout/style/nsLayoutStylesheetCache.h +++ b/mozilla/layout/style/nsLayoutStylesheetCache.h @@ -44,6 +44,7 @@ class nsIFile; class nsICSSLoader; +class nsICSSLoader_1_9_0_BRANCH; class nsLayoutStylesheetCache : public nsIObserver @@ -69,7 +70,7 @@ private: PRBool aEnableUnsafeRules); static nsLayoutStylesheetCache* gStyleCache; - static nsICSSLoader* gCSSLoader; + static nsICSSLoader_1_9_0_BRANCH* gCSSLoader; nsCOMPtr mScrollbarsSheet; nsCOMPtr mFormsSheet; nsCOMPtr mUserContentSheet; diff --git a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp index da599df3836..05d268936d5 100644 --- a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp @@ -3007,7 +3007,8 @@ nsresult nsChromeRegistry::LoadStyleSheetWithURL(nsIURI* aURL, PRBool aEnableUns NS_ENSURE_SUCCESS(rv, rv); } - return mCSSLoader->LoadSheetSync(aURL, aEnableUnsafeRules, aSheet); + return mCSSLoader->LoadSheetSync(aURL, aEnableUnsafeRules, + aEnableUnsafeRules, aSheet); } nsresult nsChromeRegistry::LoadInstallDataSource() diff --git a/mozilla/rdf/chrome/src/nsChromeRegistry.h b/mozilla/rdf/chrome/src/nsChromeRegistry.h index 0b706f42753..e1736f1a910 100644 --- a/mozilla/rdf/chrome/src/nsChromeRegistry.h +++ b/mozilla/rdf/chrome/src/nsChromeRegistry.h @@ -260,7 +260,7 @@ protected: nsCOMPtr mDisabled; nsCOMPtr mXPCNativeWrappers; - nsCOMPtr mCSSLoader; + nsCOMPtr mCSSLoader; nsCOMPtr mOverrideJAR; nsCString mOverrideJARURL;