Bug 416942. Give user and ua sheets the system principal. r+sr=sicking
git-svn-id: svn://10.0.0.236/trunk@256566 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
d1e4653cda
commit
93c4cc49f1
@ -882,7 +882,8 @@ static void FlushSkinBindingsForWindow(nsIDOMWindowInternal* aWindow)
|
||||
// XXXbsmedberg: move this to nsIWindowMediator
|
||||
NS_IMETHODIMP nsChromeRegistry::RefreshSkins()
|
||||
{
|
||||
nsCOMPtr<nsICSSLoader> cssLoader(do_CreateInstance(kCSSLoaderCID));
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> 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<nsIDOMWindowCollection> frames;
|
||||
@ -991,7 +992,8 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow,
|
||||
if (IsChromeURI(uri)) {
|
||||
// Reload the sheet.
|
||||
nsCOMPtr<nsICSSStyleSheet> 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;
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -2528,7 +2528,8 @@ nsDocument::AddCatalogStyleSheet(nsIStyleSheet* aSheet)
|
||||
void
|
||||
nsDocument::EnsureCatalogStyleSheet(const char *aStyleSheetURI)
|
||||
{
|
||||
nsICSSLoader* cssLoader = CSSLoader();
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> 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<nsICSSStyleSheet> 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);
|
||||
|
||||
@ -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<nsICSSStyleSheet> 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<nsICSSStyleSheet> 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
|
||||
|
||||
@ -1004,6 +1004,15 @@ nsXBLService::GetBinding(nsIContent* aBoundElement, nsIURI* aURI,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static PRBool SchemeIs(nsIURI* aURI, const char* aScheme)
|
||||
{
|
||||
nsCOMPtr<nsIURI> 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;
|
||||
|
||||
@ -1288,7 +1288,9 @@ nsXMLContentSink::HandleDoctypeDecl(const nsAString & aSubset,
|
||||
nsCOMPtr<nsIURI> uri(do_QueryInterface(aCatalogData));
|
||||
if (uri) {
|
||||
nsCOMPtr<nsICSSStyleSheet> sheet;
|
||||
mCSSLoader->LoadSheetSync(uri, PR_TRUE, getter_AddRefs(sheet));
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> cssLoader =
|
||||
do_QueryInterface(mCSSLoader);
|
||||
cssLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, getter_AddRefs(sheet));
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
nsCAutoString uriStr;
|
||||
|
||||
@ -3599,6 +3599,8 @@ nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL)
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsresult rv = GetCSSLoader(aURL, getter_AddRefs(cssLoader));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> cssLoaderBranch =
|
||||
do_QueryInterface(cssLoader);
|
||||
|
||||
nsCOMPtr<nsIURI> uaURI;
|
||||
rv = NS_NewURI(getter_AddRefs(uaURI), aURL);
|
||||
@ -3609,7 +3611,8 @@ nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL)
|
||||
// synchronously, of course..
|
||||
nsCOMPtr<nsICSSStyleSheet> 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)
|
||||
|
||||
@ -168,11 +168,11 @@ nsStyleSheetService::LoadAndRegisterSheetInternal(nsIURI *aSheetURI,
|
||||
NS_ENSURE_ARG(aSheetType == AGENT_SHEET || aSheetType == USER_SHEET);
|
||||
NS_ENSURE_ARG_POINTER(aSheetURI);
|
||||
|
||||
nsCOMPtr<nsICSSLoader> loader = do_CreateInstance(kCSSLoaderCID);
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> loader = do_CreateInstance(kCSSLoaderCID);
|
||||
nsCOMPtr<nsICSSStyleSheet> 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)) {
|
||||
|
||||
@ -623,11 +623,11 @@ nsContentDLF::EnsureUAStyleSheet()
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> 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);
|
||||
|
||||
@ -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<nsIPrincipal> 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,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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___ */
|
||||
|
||||
@ -223,12 +223,13 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &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;
|
||||
|
||||
@ -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<nsICSSStyleSheet> mScrollbarsSheet;
|
||||
nsCOMPtr<nsICSSStyleSheet> mFormsSheet;
|
||||
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -260,7 +260,7 @@ protected:
|
||||
nsCOMPtr<nsIRDFResource> mDisabled;
|
||||
nsCOMPtr<nsIRDFResource> mXPCNativeWrappers;
|
||||
|
||||
nsCOMPtr<nsICSSLoader> mCSSLoader;
|
||||
nsCOMPtr<nsICSSLoader_1_9_0_BRANCH> mCSSLoader;
|
||||
nsCOMPtr<nsIZipReader> mOverrideJAR;
|
||||
nsCString mOverrideJARURL;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user