From a4ca9058c6fb2787a4e8d103d5962491514a4e09 Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Fri, 10 Sep 2004 06:45:59 +0000 Subject: [PATCH] Separate concept of stylesheet URI into base URI (for resolving relative links) and sheet URI (for everything else), since they can differ for style elements (and inline style and style set from script, but that's for the next patch). Some other things (relating to external stylesheets, where it doesn't make a difference) that probably should use the sheet URL are left as the base URL for now because I didn't want to change too much at once. b=255538 r+sr=bzbarsky git-svn-id: svn://10.0.0.236/trunk@162059 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/chrome/src/nsChromeRegistry.cpp | 4 +- mozilla/content/base/public/nsIStyleSheet.h | 3 +- .../content/base/src/nsStyleLinkElement.cpp | 2 +- .../content/html/style/public/nsICSSParser.h | 3 +- .../html/style/public/nsICSSStyleSheet.h | 10 +-- .../content/html/style/src/nsCSSLoader.cpp | 24 ++++--- .../content/html/style/src/nsCSSParser.cpp | 46 +++++++------- .../content/html/style/src/nsCSSStyleRule.cpp | 8 +-- .../html/style/src/nsCSSStyleSheet.cpp | 62 +++++++------------ .../content/html/style/src/nsCSSStyleSheet.h | 8 ++- .../html/style/src/nsHTMLCSSStyleSheet.cpp | 15 ++++- .../html/style/src/nsHTMLStyleSheet.cpp | 14 ++++- .../content/html/style/src/nsHTMLStyleSheet.h | 3 +- .../xbl/src/nsXBLPrototypeResources.cpp | 2 +- .../xml/document/src/nsXMLContentSink.cpp | 2 +- .../xul/document/src/nsXULPrototypeCache.cpp | 4 +- .../editor/libeditor/html/nsHTMLEditor.cpp | 2 +- mozilla/layout/base/nsPresShell.cpp | 2 +- mozilla/layout/html/base/src/nsPresShell.cpp | 2 +- .../layout/mathml/base/src/nsMathMLFrame.cpp | 2 +- mozilla/layout/style/nsCSSLoader.cpp | 24 ++++--- mozilla/layout/style/nsCSSParser.cpp | 46 +++++++------- mozilla/layout/style/nsCSSStyleRule.cpp | 8 +-- mozilla/layout/style/nsCSSStyleSheet.cpp | 62 +++++++------------ mozilla/layout/style/nsCSSStyleSheet.h | 8 ++- mozilla/layout/style/nsHTMLCSSStyleSheet.cpp | 15 ++++- mozilla/layout/style/nsHTMLStyleSheet.cpp | 14 ++++- mozilla/layout/style/nsHTMLStyleSheet.h | 3 +- mozilla/layout/style/nsICSSParser.h | 3 +- mozilla/layout/style/nsICSSStyleSheet.h | 10 +-- mozilla/layout/style/nsIStyleSheet.h | 3 +- mozilla/rdf/chrome/src/nsChromeRegistry.cpp | 4 +- 32 files changed, 221 insertions(+), 197 deletions(-) diff --git a/mozilla/chrome/src/nsChromeRegistry.cpp b/mozilla/chrome/src/nsChromeRegistry.cpp index 28f4f2afcda..fb415090a22 100644 --- a/mozilla/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/chrome/src/nsChromeRegistry.cpp @@ -1401,7 +1401,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow) nsIStyleSheet *sheet = agentSheets[l]; nsCOMPtr uri; - rv = sheet->GetURL(*getter_AddRefs(uri)); + rv = sheet->GetSheetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; if (IsChromeURI(uri)) { @@ -1446,7 +1446,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow) for (i = 0; i < count; i++) { nsCOMPtr sheet = oldSheets[i]; nsCOMPtr uri; - rv = sheet->GetURL(*getter_AddRefs(uri)); + rv = sheet->GetSheetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; if (IsChromeURI(uri)) { diff --git a/mozilla/content/base/public/nsIStyleSheet.h b/mozilla/content/base/public/nsIStyleSheet.h index 2deca98e518..b90f5a00d57 100644 --- a/mozilla/content/base/public/nsIStyleSheet.h +++ b/mozilla/content/base/public/nsIStyleSheet.h @@ -68,7 +68,8 @@ public: NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTYLE_SHEET_IID) // basic style sheet data - NS_IMETHOD GetURL(nsIURI*& aURL) const = 0; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURI) const = 0; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURI) const = 0; NS_IMETHOD GetTitle(nsString& aTitle) const = 0; NS_IMETHOD GetType(nsString& aType) const = 0; NS_IMETHOD GetMediumCount(PRInt32& aCount) const = 0; diff --git a/mozilla/content/base/src/nsStyleLinkElement.cpp b/mozilla/content/base/src/nsStyleLinkElement.cpp index 8f109ca35d9..51cfe0f795d 100644 --- a/mozilla/content/base/src/nsStyleLinkElement.cpp +++ b/mozilla/content/base/src/nsStyleLinkElement.cpp @@ -231,7 +231,7 @@ nsStyleLinkElement::UpdateStyleSheet(nsIDocument *aOldDocument, if (mStyleSheet && !isInline && uri) { nsCOMPtr oldURI; - mStyleSheet->GetURL(*getter_AddRefs(oldURI)); + mStyleSheet->GetBaseURI(getter_AddRefs(oldURI)); if (oldURI) { PRBool equal; nsresult rv = oldURI->Equals(uri, &equal); diff --git a/mozilla/content/html/style/public/nsICSSParser.h b/mozilla/content/html/style/public/nsICSSParser.h index 9c30e0aa5f4..ee76faaf732 100644 --- a/mozilla/content/html/style/public/nsICSSParser.h +++ b/mozilla/content/html/style/public/nsICSSParser.h @@ -81,7 +81,8 @@ public: NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader) = 0; NS_IMETHOD Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURL, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult) = 0; diff --git a/mozilla/content/html/style/public/nsICSSStyleSheet.h b/mozilla/content/html/style/public/nsICSSStyleSheet.h index 17e4d8b0a27..f39166a9a1f 100644 --- a/mozilla/content/html/style/public/nsICSSStyleSheet.h +++ b/mozilla/content/html/style/public/nsICSSStyleSheet.h @@ -78,11 +78,11 @@ public: NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const = 0; /** - * SetURL must be called on all sheets before parsing into them. - * SetURL may only be called while the sheet is 1) incomplete and 2) + * SetURIs must be called on all sheets before parsing into them. + * SetURIs may only be called while the sheet is 1) incomplete and 2) * has no rules in it */ - NS_IMETHOD SetURL(nsIURI* aURL) = 0; + NS_IMETHOD SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI) = 0; NS_IMETHOD SetTitle(const nsAString& aTitle) = 0; NS_IMETHOD AppendMedium(nsIAtom* aMedium) = 0; NS_IMETHOD ClearMedia(void) = 0; @@ -107,10 +107,6 @@ public: NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0; }; -// XXX for backwards compatibility and convenience -nsresult -NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL); - nsresult NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult); diff --git a/mozilla/content/html/style/src/nsCSSLoader.cpp b/mozilla/content/html/style/src/nsCSSLoader.cpp index c6c36bc63b0..fdd02bee3dc 100644 --- a/mozilla/content/html/style/src/nsCSSLoader.cpp +++ b/mozilla/content/html/style/src/nsCSSLoader.cpp @@ -723,7 +723,7 @@ SheetLoadData::GetReferrerURI() { nsIURI* uri = nsnull; if (mParentData) - mParentData->mSheet->GetURL(uri); + mParentData->mSheet->GetSheetURI(&uri); if (!uri && mLoader->mDocument) NS_IF_ADDREF(uri = mLoader->mDocument->GetDocumentURI()); return uri; @@ -844,7 +844,7 @@ SheetLoadData::OnStreamComplete(nsIUnicharStreamLoader* aLoader, if (channelURI) { // Enough to set the URI on mSheet, since any sibling datas we have share // the same mInner as mSheet and will thus get the same URI. - mSheet->SetURL(channelURI); + mSheet->SetURIs(channelURI, channelURI); } PRBool completed; @@ -1086,16 +1086,19 @@ CSSLoaderImpl::CreateSheet(nsIURI* aURI, if (!*aSheet) { aSheetState = eSheetNeedsParser; - nsCOMPtr sheetURI = aURI; - if (!sheetURI) { + nsIURI *sheetURI = aURI; + nsCOMPtr baseURI = aURI; + if (!aURI) { // Inline style. Use the document's base URL so that @import in // the inline sheet picks up the right base. NS_ASSERTION(aLinkingContent, "Inline stylesheet without linking content?"); - sheetURI = aLinkingContent->GetBaseURI(); + baseURI = aLinkingContent->GetBaseURI(); + sheetURI = aLinkingContent->GetDocument()->GetDocumentURI(); } - rv = NS_NewCSSStyleSheet(aSheet, sheetURI); + rv = NS_NewCSSStyleSheet(aSheet); NS_ENSURE_SUCCESS(rv, rv); + (*aSheet)->SetURIs(sheetURI, baseURI); } NS_ASSERTION(*aSheet, "We should have a sheet by now!"); @@ -1475,9 +1478,10 @@ CSSLoaderImpl::ParseSheet(nsIUnicharInputStream* aStream, nsCOMPtr dummySheet; // Push our load data on the stack so any kids can pick it up mParsingDatas.AppendElement(aLoadData); - nsCOMPtr uri; - aLoadData->mSheet->GetURL(*getter_AddRefs(uri)); - rv = parser->Parse(aStream, uri, aLoadData->mLineNumber, + nsCOMPtr sheetURI, baseURI; + aLoadData->mSheet->GetSheetURI(getter_AddRefs(sheetURI)); + aLoadData->mSheet->GetBaseURI(getter_AddRefs(baseURI)); + rv = parser->Parse(aStream, sheetURI, baseURI, aLoadData->mLineNumber, *getter_AddRefs(dummySheet)); mParsingDatas.RemoveElementAt(mParsingDatas.Count() - 1); RecycleParser(parser); @@ -1779,7 +1783,7 @@ CSSLoaderImpl::LoadChildSheet(nsICSSStyleSheet* aParentSheet, // Check whether we should even load nsCOMPtr sheetURI; - nsresult rv = aParentSheet->GetURL(*getter_AddRefs(sheetURI)); + nsresult rv = aParentSheet->GetSheetURI(getter_AddRefs(sheetURI)); if (NS_FAILED(rv) || !sheetURI) return NS_ERROR_FAILURE; nsCOMPtr owningNode; diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index fd4e766ee15..30e042f2194 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -106,7 +106,8 @@ public: NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader); NS_IMETHOD Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURI, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult); @@ -134,8 +135,8 @@ public: void AppendRule(nsICSSRule* aRule); protected: - nsresult InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, - PRUint32 aLineNumber); + nsresult InitScanner(nsIUnicharInputStream* aInput, nsIURI* aSheetURI, + PRUint32 aLineNumber, nsIURI* aBaseURI); nsresult ReleaseScanner(void); PRBool GetToken(nsresult& aErrorCode, PRBool aSkipWS); @@ -317,7 +318,7 @@ protected: nsCSSScanner* mScanner; // The URI to be used as a base for relative URIs. - nsCOMPtr mURL; + nsCOMPtr mBaseURL; // The sheet we're parsing into nsCOMPtr mSheet; @@ -508,8 +509,8 @@ CSSParserImpl::SetChildLoader(nsICSSLoader* aChildLoader) } nsresult -CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, - PRUint32 aLineNumber) +CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aSheetURI, + PRUint32 aLineNumber, nsIURI* aBaseURI) { NS_ASSERTION(! mScanner, "already have scanner"); @@ -517,8 +518,8 @@ CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, if (! mScanner) { return NS_ERROR_OUT_OF_MEMORY; } - mScanner->Init(aInput, aURI, aLineNumber); - mURL = aURI; + mScanner->Init(aInput, aSheetURI, aLineNumber); + mBaseURL = aBaseURI; mHavePushBack = PR_FALSE; @@ -532,28 +533,30 @@ CSSParserImpl::ReleaseScanner(void) delete mScanner; mScanner = nsnull; } - mURL = nsnull; + mBaseURL = nsnull; return NS_OK; } NS_IMETHODIMP CSSParserImpl::Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURI, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult) { - NS_ASSERTION(nsnull != aInputURL, "need base URL"); + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); if (! mSheet) { - NS_NewCSSStyleSheet(getter_AddRefs(mSheet), aInputURL); + NS_NewCSSStyleSheet(getter_AddRefs(mSheet)); + mSheet->SetURIs(aSheetURI, aBaseURI); } #ifdef DEBUG else { nsCOMPtr uri; mSheet->GetURL(*getter_AddRefs(uri)); PRBool equal; - aInputURL->Equals(uri, &equal); + aBaseURI->Equals(uri, &equal); NS_ASSERTION(equal, "Sheet URI does not match passed URI"); } #endif @@ -564,7 +567,7 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput, nsresult errorCode = NS_OK; - nsresult result = InitScanner(aInput, aInputURL, aLineNumber); + nsresult result = InitScanner(aInput, aSheetURI, aLineNumber, aBaseURI); if (! NS_SUCCEEDED(result)) { return result; } @@ -643,7 +646,7 @@ CSSParserImpl::ParseStyleAttribute(const nsAString& aAttributeValue, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs NS_RELEASE(input); if (! NS_SUCCEEDED(rv)) { return rv; @@ -708,7 +711,7 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsAString& aBuffer, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs NS_RELEASE(input); if (! NS_SUCCEEDED(rv)) { return rv; @@ -766,7 +769,7 @@ CSSParserImpl::ParseRule(const nsAString& aRule, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs if (NS_FAILED(rv)) { return rv; } @@ -825,7 +828,7 @@ CSSParserImpl::ParseProperty(const nsCSSProperty aPropID, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs if (NS_FAILED(rv)) { return rv; } @@ -1190,7 +1193,7 @@ PRBool CSSParserImpl::ProcessImport(nsresult& aErrorCode, if (mChildLoader) { nsCOMPtr url; // XXX should pass a charset! - aErrorCode = NS_NewURI(getter_AddRefs(url), aURLSpec, nsnull, mURL); + aErrorCode = NS_NewURI(getter_AddRefs(url), aURLSpec, nsnull, mBaseURL); if (NS_FAILED(aErrorCode)) { // import url is bad @@ -3792,11 +3795,12 @@ PRBool CSSParserImpl::ParseURL(nsresult& aErrorCode, nsCSSValue& aValue) // Translate url into an absolute url if the url is relative to // the style sheet. nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), tk->mIdent, nsnull, mURL); + NS_NewURI(getter_AddRefs(uri), tk->mIdent, nsnull, mBaseURL); if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) { // Set a null value on failure. Most failure cases should be // NS_ERROR_MALFORMED_URI. - nsCSSValue::URL *url = new nsCSSValue::URL(uri, tk->mIdent.get(), mURL); + nsCSSValue::URL *url = + new nsCSSValue::URL(uri, tk->mIdent.get(), mBaseURL); if (!url || !url->mString) { aErrorCode = NS_ERROR_OUT_OF_MEMORY; delete url; diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index d94047c0b23..7dfa4450f1c 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -901,7 +901,7 @@ public: virtual void DropReference(void); virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate); - virtual nsresult GetCSSParsingEnvironment(nsIURI** aURI, + virtual nsresult GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); virtual nsresult DeclarationChanged(); @@ -1003,12 +1003,12 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsCSSDeclaration **aDecl, * being initialized. */ nsresult -DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, +DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser) { // null out the out params since some of them may not get initialized below - *aURI = nsnull; + *aBaseURI = nsnull; *aCSSLoader = nsnull; *aCSSParser = nsnull; nsresult result; @@ -1016,7 +1016,7 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, if (mRule) { mRule->GetStyleSheet(*getter_AddRefs(sheet)); if (sheet) { - sheet->GetURL(*aURI); + sheet->GetBaseURI(aBaseURI); nsCOMPtr document; sheet->GetOwningDocument(*getter_AddRefs(document)); if (document) { diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp index a174218bfea..73fea8a71b6 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp @@ -1249,7 +1249,8 @@ CloneRuleInto(nsISupports* aRule, void* aArray) nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy, nsICSSStyleSheet* aParentSheet) : mSheets(), - mURL(aCopy.mURL), + mSheetURI(aCopy.mSheetURI), + mBaseURI(aCopy.mBaseURI), mNameSpace(nsnull), mComplete(aCopy.mComplete) { @@ -1516,11 +1517,9 @@ nsCSSStyleSheet::DropRuleProcessor(nsCSSRuleProcessor* aProcessor) NS_IMETHODIMP -nsCSSStyleSheet::SetURL(nsIURI* aURL) +nsCSSStyleSheet::SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI) { - NS_PRECONDITION(aURL, "null ptr"); - if (! aURL) - return NS_ERROR_NULL_POINTER; + NS_PRECONDITION(aSheetURI && aBaseURI, "null ptr"); if (! mInner) { return NS_ERROR_OUT_OF_MEMORY; @@ -1529,14 +1528,22 @@ nsCSSStyleSheet::SetURL(nsIURI* aURL) NS_ASSERTION(!mInner->mOrderedRules && !mInner->mComplete, "Can't call SetURL on sheets that are complete or have rules"); - mInner->mURL = aURL; + mInner->mSheetURI = aSheetURI; + mInner->mBaseURI = aBaseURI; return NS_OK; } NS_IMETHODIMP -nsCSSStyleSheet::GetURL(nsIURI*& aURL) const +nsCSSStyleSheet::GetSheetURI(nsIURI** aSheetURI) const { - NS_IF_ADDREF(aURL = (mInner ? mInner->mURL.get() : nsnull)); + NS_IF_ADDREF(*aSheetURI = (mInner ? mInner->mSheetURI.get() : nsnull)); + return NS_OK; +} + +NS_IMETHODIMP +nsCSSStyleSheet::GetBaseURI(nsIURI** aBaseURI) const +{ + NS_IF_ADDREF(*aBaseURI = (mInner ? mInner->mBaseURI.get() : nsnull)); return NS_OK; } @@ -1724,7 +1731,7 @@ nsCSSStyleSheet::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleShe { NS_PRECONDITION(nsnull != aURL, "null arg"); - if (!mInner || !mInner->mURL) { + if (!mInner || !mInner->mSheetURI) { // We're not yet far enough along in our load to know what our URL is (we // may still get redirected and such). Assert (caller should really not be // calling this on us at this stage) and return. @@ -1734,7 +1741,7 @@ nsCSSStyleSheet::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleShe } // first check ourself out - nsresult rv = mInner->mURL->Equals(aURL, &aContains); + nsresult rv = mInner->mSheetURI->Equals(aURL, &aContains); if (NS_FAILED(rv)) aContains = PR_FALSE; if (aContains) { @@ -2099,7 +2106,7 @@ void nsCSSStyleSheet::List(FILE* out, PRInt32 aIndent) const fputs("CSS Style Sheet: ", out); nsCAutoString urlSpec; - nsresult rv = mInner->mURL->GetSpec(urlSpec); + nsresult rv = mInner->mSheetURI->GetSpec(urlSpec); if (NS_SUCCEEDED(rv) && !urlSpec.IsEmpty()) { fputs(urlSpec.get(), out); } @@ -2247,8 +2254,9 @@ nsCSSStyleSheet::GetHref(nsAString& aHref) { nsCAutoString str; - if (mInner && mInner->mURL) { - mInner->mURL->GetSpec(str); + // XXXldb The DOM spec says that this should be null for inline style sheets. + if (mInner && mInner->mSheetURI) { + mInner->mSheetURI->GetSpec(str); } CopyUTF8toUTF16(str, aHref); @@ -2330,7 +2338,7 @@ nsCSSStyleSheet::GetCssRules(nsIDOMCSSRuleList** aCssRules) // Get the security manager and do the same-origin check rv = nsContentUtils::GetSecurityManager()->CheckSameOrigin(cx, - mInner->mURL); + mInner->mSheetURI); if (NS_FAILED(rv)) { return rv; } @@ -2403,7 +2411,7 @@ nsCSSStyleSheet::InsertRule(const nsAString& aRule, mozAutoDocUpdate updateBatch(mDocument, UPDATE_STYLE, PR_TRUE); nsCOMPtr rules; - result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rules)); + result = css->ParseRule(aRule, mInner->mBaseURI, getter_AddRefs(rules)); if (NS_FAILED(result)) return result; @@ -2647,7 +2655,7 @@ nsCSSStyleSheet::InsertRuleIntoGroup(const nsAString & aRule, nsICSSGroupRule* a NS_ENSURE_SUCCESS(result, result); nsCOMPtr rules; - result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rules)); + result = css->ParseRule(aRule, mInner->mBaseURI, getter_AddRefs(rules)); NS_ENSURE_SUCCESS(result, result); PRUint32 rulecount = 0; @@ -2739,31 +2747,9 @@ nsCSSStyleSheet::StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) return NS_OK; } -// XXX for backwards compatibility and convenience -nsresult -NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL) -{ - nsICSSStyleSheet* sheet; - nsresult rv; - if (NS_FAILED(rv = NS_NewCSSStyleSheet(&sheet))) - return rv; - - if (NS_FAILED(rv = sheet->SetURL(aURL))) { - NS_RELEASE(sheet); - return rv; - } - - *aInstancePtrResult = sheet; - return NS_OK; -} - nsresult NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult) { - if (aInstancePtrResult == nsnull) { - return NS_ERROR_NULL_POINTER; - } - nsCSSStyleSheet *it = new nsCSSStyleSheet(); if (nsnull == it) { diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.h b/mozilla/content/html/style/src/nsCSSStyleSheet.h index 3c6a2924623..91095d9f6fd 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.h +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.h @@ -70,7 +70,8 @@ public: virtual void RebuildNameSpaces(); nsAutoVoidArray mSheets; - nsCOMPtr mURL; + nsCOMPtr mSheetURI; // for error reports, etc. + nsCOMPtr mBaseURI; // for resolving relative URIs nsISupportsArray* mOrderedRules; nsCOMPtr mNameSpace; PRPackedBool mComplete; @@ -96,7 +97,8 @@ public: NS_DECL_ISUPPORTS // nsIStyleSheet interface - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURI) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURI) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; @@ -129,7 +131,7 @@ public: NS_IMETHOD ReplaceRuleInGroup(nsICSSGroupRule* aGroup, nsICSSRule* aOld, nsICSSRule* aNew); NS_IMETHOD StyleSheetCount(PRInt32& aCount) const; NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const; - NS_IMETHOD SetURL(nsIURI* aURL); + NS_IMETHOD SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI); NS_IMETHOD SetTitle(const nsAString& aTitle); NS_IMETHOD AppendMedium(nsIAtom* aMedium); NS_IMETHOD ClearMedia(); diff --git a/mozilla/content/html/style/src/nsHTMLCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsHTMLCSSStyleSheet.cpp index 0ade20aeea4..8205eb0ba12 100644 --- a/mozilla/content/html/style/src/nsHTMLCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsHTMLCSSStyleSheet.cpp @@ -348,7 +348,8 @@ public: // basic style sheet data NS_IMETHOD Init(nsIURI* aURL, nsIDocument* aDocument); NS_IMETHOD Reset(nsIURI* aURL); - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURL) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURL) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; @@ -530,10 +531,18 @@ HTMLCSSStyleSheetImpl::Reset(nsIURI* aURL) } NS_IMETHODIMP -HTMLCSSStyleSheetImpl::GetURL(nsIURI*& aURL) const +HTMLCSSStyleSheetImpl::GetSheetURI(nsIURI** aSheetURL) const { NS_IF_ADDREF(mURL); - aURL = mURL; + *aSheetURL = mURL; + return NS_OK; +} + +NS_IMETHODIMP +HTMLCSSStyleSheetImpl::GetBaseURI(nsIURI** aBaseURL) const +{ + NS_IF_ADDREF(mURL); + *aBaseURL = mURL; return NS_OK; } diff --git a/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp b/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp index 2ffa87386f4..6f3f9abba87 100644 --- a/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp @@ -658,10 +658,18 @@ nsHTMLStyleSheet::RulesMatching(PseudoRuleProcessorData* aData) // nsIStyleSheet api NS_IMETHODIMP -nsHTMLStyleSheet::GetURL(nsIURI*& aURL) const +nsHTMLStyleSheet::GetSheetURI(nsIURI** aSheetURI) const { - aURL = mURL; - NS_IF_ADDREF(aURL); + *aSheetURI = mURL; + NS_IF_ADDREF(*aSheetURI); + return NS_OK; +} + +NS_IMETHODIMP +nsHTMLStyleSheet::GetBaseURI(nsIURI** aBaseURI) const +{ + *aBaseURI = mURL; + NS_IF_ADDREF(*aBaseURI); return NS_OK; } diff --git a/mozilla/content/html/style/src/nsHTMLStyleSheet.h b/mozilla/content/html/style/src/nsHTMLStyleSheet.h index bb25a89484c..5b309902852 100644 --- a/mozilla/content/html/style/src/nsHTMLStyleSheet.h +++ b/mozilla/content/html/style/src/nsHTMLStyleSheet.h @@ -54,7 +54,8 @@ public: NS_DECL_ISUPPORTS // nsIStyleSheet api - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURL) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURL) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; diff --git a/mozilla/content/xbl/src/nsXBLPrototypeResources.cpp b/mozilla/content/xbl/src/nsXBLPrototypeResources.cpp index a739eabeaa0..4e5087368e8 100644 --- a/mozilla/content/xbl/src/nsXBLPrototypeResources.cpp +++ b/mozilla/content/xbl/src/nsXBLPrototypeResources.cpp @@ -128,7 +128,7 @@ nsXBLPrototypeResources::FlushSkinSheets() nsICSSStyleSheet* oldSheet = oldSheets[i]; nsCOMPtr uri; - oldSheet->GetURL(*getter_AddRefs(uri)); + oldSheet->GetSheetURI(getter_AddRefs(uri)); nsCOMPtr newSheet; if (IsChromeURI(uri)) { diff --git a/mozilla/content/xml/document/src/nsXMLContentSink.cpp b/mozilla/content/xml/document/src/nsXMLContentSink.cpp index 479438c9b23..2de11d54a65 100644 --- a/mozilla/content/xml/document/src/nsXMLContentSink.cpp +++ b/mozilla/content/xml/document/src/nsXMLContentSink.cpp @@ -873,7 +873,7 @@ NS_NewMathMLElement(nsIContent** aResult, nsINodeInfo* aNodeInfo) NS_ASSERTION(sheet, "unexpected null stylesheet in the document"); if (sheet) { nsCOMPtr uri; - sheet->GetURL(*getter_AddRefs(uri)); + sheet->GetSheetURI(getter_AddRefs(uri)); nsCAutoString uriStr; uri->GetSpec(uriStr); if (uriStr.Equals(kMathMLStyleSheetURI)) { diff --git a/mozilla/content/xul/document/src/nsXULPrototypeCache.cpp b/mozilla/content/xul/document/src/nsXULPrototypeCache.cpp index e84561280dc..fdef981bbe5 100644 --- a/mozilla/content/xul/document/src/nsXULPrototypeCache.cpp +++ b/mozilla/content/xul/document/src/nsXULPrototypeCache.cpp @@ -334,7 +334,7 @@ nsXULPrototypeCache::PutStyleSheet(nsICSSStyleSheet* aStyleSheet) { nsresult rv; nsCOMPtr uri; - rv = aStyleSheet->GetURL(*getter_AddRefs(uri)); + rv = aStyleSheet->GetSheetURI(getter_AddRefs(uri)); if (NS_SUCCEEDED(rv)) mStyleSheetTable.Put(uri, aStyleSheet); @@ -435,7 +435,7 @@ PR_STATIC_CALLBACK(PLDHashOperator) FlushSkinSheets(nsIURI* aKey, nsCOMPtr& aSheet, void* aClosure) { nsCOMPtr uri; - aSheet->GetURL(*getter_AddRefs(uri)); + aSheet->GetSheetURI(getter_AddRefs(uri)); nsCAutoString str; uri->GetPath(str); diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp index 82e3f1d7120..887248e929f 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp +++ b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp @@ -4297,7 +4297,7 @@ nsHTMLEditor::StyleSheetLoaded(nsICSSStyleSheet* aSheet, PRBool aNotify) // Get the URI, then url spec from the sheet nsCOMPtr sheet = do_QueryInterface(aSheet); nsCOMPtr uri; - rv = sheet->GetURL(*getter_AddRefs(uri)); + rv = sheet->GetSheetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp index f64b1ec6b74..0632c52c450 100644 --- a/mozilla/layout/base/nsPresShell.cpp +++ b/mozilla/layout/base/nsPresShell.cpp @@ -2223,7 +2223,7 @@ nsresult PresShell::CreatePreferenceStyleSheet(void) result = NS_NewURI(getter_AddRefs(uri), "about:PreferenceStyleSheet", nsnull); if (NS_SUCCEEDED(result)) { NS_ASSERTION(uri, "null but no error"); - result = mPrefStyleSheet->SetURL(uri); + result = mPrefStyleSheet->SetURIs(uri, uri); if (NS_SUCCEEDED(result)) { mPrefStyleSheet->SetComplete(); nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet)); diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp index f64b1ec6b74..0632c52c450 100644 --- a/mozilla/layout/html/base/src/nsPresShell.cpp +++ b/mozilla/layout/html/base/src/nsPresShell.cpp @@ -2223,7 +2223,7 @@ nsresult PresShell::CreatePreferenceStyleSheet(void) result = NS_NewURI(getter_AddRefs(uri), "about:PreferenceStyleSheet", nsnull); if (NS_SUCCEEDED(result)) { NS_ASSERTION(uri, "null but no error"); - result = mPrefStyleSheet->SetURL(uri); + result = mPrefStyleSheet->SetURIs(uri, uri); if (NS_SUCCEEDED(result)) { mPrefStyleSheet->SetComplete(); nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet)); diff --git a/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp index e78e9efcd1e..43b6ee212ed 100644 --- a/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp +++ b/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp @@ -548,7 +548,7 @@ GetMathMLAttributeStyleSheet(nsPresContext* aPresContext, nsCOMPtr cssSheet(do_CreateInstance(kCSSStyleSheetCID)); if (!cssSheet) return; - cssSheet->SetURL(uri); + cssSheet->SetURIs(uri, uri); nsCOMPtr domSheet(do_QueryInterface(cssSheet)); if (domSheet) { PRUint32 index; diff --git a/mozilla/layout/style/nsCSSLoader.cpp b/mozilla/layout/style/nsCSSLoader.cpp index c6c36bc63b0..fdd02bee3dc 100644 --- a/mozilla/layout/style/nsCSSLoader.cpp +++ b/mozilla/layout/style/nsCSSLoader.cpp @@ -723,7 +723,7 @@ SheetLoadData::GetReferrerURI() { nsIURI* uri = nsnull; if (mParentData) - mParentData->mSheet->GetURL(uri); + mParentData->mSheet->GetSheetURI(&uri); if (!uri && mLoader->mDocument) NS_IF_ADDREF(uri = mLoader->mDocument->GetDocumentURI()); return uri; @@ -844,7 +844,7 @@ SheetLoadData::OnStreamComplete(nsIUnicharStreamLoader* aLoader, if (channelURI) { // Enough to set the URI on mSheet, since any sibling datas we have share // the same mInner as mSheet and will thus get the same URI. - mSheet->SetURL(channelURI); + mSheet->SetURIs(channelURI, channelURI); } PRBool completed; @@ -1086,16 +1086,19 @@ CSSLoaderImpl::CreateSheet(nsIURI* aURI, if (!*aSheet) { aSheetState = eSheetNeedsParser; - nsCOMPtr sheetURI = aURI; - if (!sheetURI) { + nsIURI *sheetURI = aURI; + nsCOMPtr baseURI = aURI; + if (!aURI) { // Inline style. Use the document's base URL so that @import in // the inline sheet picks up the right base. NS_ASSERTION(aLinkingContent, "Inline stylesheet without linking content?"); - sheetURI = aLinkingContent->GetBaseURI(); + baseURI = aLinkingContent->GetBaseURI(); + sheetURI = aLinkingContent->GetDocument()->GetDocumentURI(); } - rv = NS_NewCSSStyleSheet(aSheet, sheetURI); + rv = NS_NewCSSStyleSheet(aSheet); NS_ENSURE_SUCCESS(rv, rv); + (*aSheet)->SetURIs(sheetURI, baseURI); } NS_ASSERTION(*aSheet, "We should have a sheet by now!"); @@ -1475,9 +1478,10 @@ CSSLoaderImpl::ParseSheet(nsIUnicharInputStream* aStream, nsCOMPtr dummySheet; // Push our load data on the stack so any kids can pick it up mParsingDatas.AppendElement(aLoadData); - nsCOMPtr uri; - aLoadData->mSheet->GetURL(*getter_AddRefs(uri)); - rv = parser->Parse(aStream, uri, aLoadData->mLineNumber, + nsCOMPtr sheetURI, baseURI; + aLoadData->mSheet->GetSheetURI(getter_AddRefs(sheetURI)); + aLoadData->mSheet->GetBaseURI(getter_AddRefs(baseURI)); + rv = parser->Parse(aStream, sheetURI, baseURI, aLoadData->mLineNumber, *getter_AddRefs(dummySheet)); mParsingDatas.RemoveElementAt(mParsingDatas.Count() - 1); RecycleParser(parser); @@ -1779,7 +1783,7 @@ CSSLoaderImpl::LoadChildSheet(nsICSSStyleSheet* aParentSheet, // Check whether we should even load nsCOMPtr sheetURI; - nsresult rv = aParentSheet->GetURL(*getter_AddRefs(sheetURI)); + nsresult rv = aParentSheet->GetSheetURI(getter_AddRefs(sheetURI)); if (NS_FAILED(rv) || !sheetURI) return NS_ERROR_FAILURE; nsCOMPtr owningNode; diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index fd4e766ee15..30e042f2194 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -106,7 +106,8 @@ public: NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader); NS_IMETHOD Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURI, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult); @@ -134,8 +135,8 @@ public: void AppendRule(nsICSSRule* aRule); protected: - nsresult InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, - PRUint32 aLineNumber); + nsresult InitScanner(nsIUnicharInputStream* aInput, nsIURI* aSheetURI, + PRUint32 aLineNumber, nsIURI* aBaseURI); nsresult ReleaseScanner(void); PRBool GetToken(nsresult& aErrorCode, PRBool aSkipWS); @@ -317,7 +318,7 @@ protected: nsCSSScanner* mScanner; // The URI to be used as a base for relative URIs. - nsCOMPtr mURL; + nsCOMPtr mBaseURL; // The sheet we're parsing into nsCOMPtr mSheet; @@ -508,8 +509,8 @@ CSSParserImpl::SetChildLoader(nsICSSLoader* aChildLoader) } nsresult -CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, - PRUint32 aLineNumber) +CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aSheetURI, + PRUint32 aLineNumber, nsIURI* aBaseURI) { NS_ASSERTION(! mScanner, "already have scanner"); @@ -517,8 +518,8 @@ CSSParserImpl::InitScanner(nsIUnicharInputStream* aInput, nsIURI* aURI, if (! mScanner) { return NS_ERROR_OUT_OF_MEMORY; } - mScanner->Init(aInput, aURI, aLineNumber); - mURL = aURI; + mScanner->Init(aInput, aSheetURI, aLineNumber); + mBaseURL = aBaseURI; mHavePushBack = PR_FALSE; @@ -532,28 +533,30 @@ CSSParserImpl::ReleaseScanner(void) delete mScanner; mScanner = nsnull; } - mURL = nsnull; + mBaseURL = nsnull; return NS_OK; } NS_IMETHODIMP CSSParserImpl::Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURI, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult) { - NS_ASSERTION(nsnull != aInputURL, "need base URL"); + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); if (! mSheet) { - NS_NewCSSStyleSheet(getter_AddRefs(mSheet), aInputURL); + NS_NewCSSStyleSheet(getter_AddRefs(mSheet)); + mSheet->SetURIs(aSheetURI, aBaseURI); } #ifdef DEBUG else { nsCOMPtr uri; mSheet->GetURL(*getter_AddRefs(uri)); PRBool equal; - aInputURL->Equals(uri, &equal); + aBaseURI->Equals(uri, &equal); NS_ASSERTION(equal, "Sheet URI does not match passed URI"); } #endif @@ -564,7 +567,7 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput, nsresult errorCode = NS_OK; - nsresult result = InitScanner(aInput, aInputURL, aLineNumber); + nsresult result = InitScanner(aInput, aSheetURI, aLineNumber, aBaseURI); if (! NS_SUCCEEDED(result)) { return result; } @@ -643,7 +646,7 @@ CSSParserImpl::ParseStyleAttribute(const nsAString& aAttributeValue, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs NS_RELEASE(input); if (! NS_SUCCEEDED(rv)) { return rv; @@ -708,7 +711,7 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsAString& aBuffer, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs NS_RELEASE(input); if (! NS_SUCCEEDED(rv)) { return rv; @@ -766,7 +769,7 @@ CSSParserImpl::ParseRule(const nsAString& aRule, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs if (NS_FAILED(rv)) { return rv; } @@ -825,7 +828,7 @@ CSSParserImpl::ParseProperty(const nsCSSProperty aPropID, return rv; } - rv = InitScanner(input, aBaseURL, 1); // XXX line number + rv = InitScanner(input, aBaseURL, 1, aBaseURL); // XXX line number & URLs if (NS_FAILED(rv)) { return rv; } @@ -1190,7 +1193,7 @@ PRBool CSSParserImpl::ProcessImport(nsresult& aErrorCode, if (mChildLoader) { nsCOMPtr url; // XXX should pass a charset! - aErrorCode = NS_NewURI(getter_AddRefs(url), aURLSpec, nsnull, mURL); + aErrorCode = NS_NewURI(getter_AddRefs(url), aURLSpec, nsnull, mBaseURL); if (NS_FAILED(aErrorCode)) { // import url is bad @@ -3792,11 +3795,12 @@ PRBool CSSParserImpl::ParseURL(nsresult& aErrorCode, nsCSSValue& aValue) // Translate url into an absolute url if the url is relative to // the style sheet. nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), tk->mIdent, nsnull, mURL); + NS_NewURI(getter_AddRefs(uri), tk->mIdent, nsnull, mBaseURL); if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) { // Set a null value on failure. Most failure cases should be // NS_ERROR_MALFORMED_URI. - nsCSSValue::URL *url = new nsCSSValue::URL(uri, tk->mIdent.get(), mURL); + nsCSSValue::URL *url = + new nsCSSValue::URL(uri, tk->mIdent.get(), mBaseURL); if (!url || !url->mString) { aErrorCode = NS_ERROR_OUT_OF_MEMORY; delete url; diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index d94047c0b23..7dfa4450f1c 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -901,7 +901,7 @@ public: virtual void DropReference(void); virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate); - virtual nsresult GetCSSParsingEnvironment(nsIURI** aURI, + virtual nsresult GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); virtual nsresult DeclarationChanged(); @@ -1003,12 +1003,12 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsCSSDeclaration **aDecl, * being initialized. */ nsresult -DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, +DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser) { // null out the out params since some of them may not get initialized below - *aURI = nsnull; + *aBaseURI = nsnull; *aCSSLoader = nsnull; *aCSSParser = nsnull; nsresult result; @@ -1016,7 +1016,7 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, if (mRule) { mRule->GetStyleSheet(*getter_AddRefs(sheet)); if (sheet) { - sheet->GetURL(*aURI); + sheet->GetBaseURI(aBaseURI); nsCOMPtr document; sheet->GetOwningDocument(*getter_AddRefs(document)); if (document) { diff --git a/mozilla/layout/style/nsCSSStyleSheet.cpp b/mozilla/layout/style/nsCSSStyleSheet.cpp index a174218bfea..73fea8a71b6 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsCSSStyleSheet.cpp @@ -1249,7 +1249,8 @@ CloneRuleInto(nsISupports* aRule, void* aArray) nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy, nsICSSStyleSheet* aParentSheet) : mSheets(), - mURL(aCopy.mURL), + mSheetURI(aCopy.mSheetURI), + mBaseURI(aCopy.mBaseURI), mNameSpace(nsnull), mComplete(aCopy.mComplete) { @@ -1516,11 +1517,9 @@ nsCSSStyleSheet::DropRuleProcessor(nsCSSRuleProcessor* aProcessor) NS_IMETHODIMP -nsCSSStyleSheet::SetURL(nsIURI* aURL) +nsCSSStyleSheet::SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI) { - NS_PRECONDITION(aURL, "null ptr"); - if (! aURL) - return NS_ERROR_NULL_POINTER; + NS_PRECONDITION(aSheetURI && aBaseURI, "null ptr"); if (! mInner) { return NS_ERROR_OUT_OF_MEMORY; @@ -1529,14 +1528,22 @@ nsCSSStyleSheet::SetURL(nsIURI* aURL) NS_ASSERTION(!mInner->mOrderedRules && !mInner->mComplete, "Can't call SetURL on sheets that are complete or have rules"); - mInner->mURL = aURL; + mInner->mSheetURI = aSheetURI; + mInner->mBaseURI = aBaseURI; return NS_OK; } NS_IMETHODIMP -nsCSSStyleSheet::GetURL(nsIURI*& aURL) const +nsCSSStyleSheet::GetSheetURI(nsIURI** aSheetURI) const { - NS_IF_ADDREF(aURL = (mInner ? mInner->mURL.get() : nsnull)); + NS_IF_ADDREF(*aSheetURI = (mInner ? mInner->mSheetURI.get() : nsnull)); + return NS_OK; +} + +NS_IMETHODIMP +nsCSSStyleSheet::GetBaseURI(nsIURI** aBaseURI) const +{ + NS_IF_ADDREF(*aBaseURI = (mInner ? mInner->mBaseURI.get() : nsnull)); return NS_OK; } @@ -1724,7 +1731,7 @@ nsCSSStyleSheet::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleShe { NS_PRECONDITION(nsnull != aURL, "null arg"); - if (!mInner || !mInner->mURL) { + if (!mInner || !mInner->mSheetURI) { // We're not yet far enough along in our load to know what our URL is (we // may still get redirected and such). Assert (caller should really not be // calling this on us at this stage) and return. @@ -1734,7 +1741,7 @@ nsCSSStyleSheet::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleShe } // first check ourself out - nsresult rv = mInner->mURL->Equals(aURL, &aContains); + nsresult rv = mInner->mSheetURI->Equals(aURL, &aContains); if (NS_FAILED(rv)) aContains = PR_FALSE; if (aContains) { @@ -2099,7 +2106,7 @@ void nsCSSStyleSheet::List(FILE* out, PRInt32 aIndent) const fputs("CSS Style Sheet: ", out); nsCAutoString urlSpec; - nsresult rv = mInner->mURL->GetSpec(urlSpec); + nsresult rv = mInner->mSheetURI->GetSpec(urlSpec); if (NS_SUCCEEDED(rv) && !urlSpec.IsEmpty()) { fputs(urlSpec.get(), out); } @@ -2247,8 +2254,9 @@ nsCSSStyleSheet::GetHref(nsAString& aHref) { nsCAutoString str; - if (mInner && mInner->mURL) { - mInner->mURL->GetSpec(str); + // XXXldb The DOM spec says that this should be null for inline style sheets. + if (mInner && mInner->mSheetURI) { + mInner->mSheetURI->GetSpec(str); } CopyUTF8toUTF16(str, aHref); @@ -2330,7 +2338,7 @@ nsCSSStyleSheet::GetCssRules(nsIDOMCSSRuleList** aCssRules) // Get the security manager and do the same-origin check rv = nsContentUtils::GetSecurityManager()->CheckSameOrigin(cx, - mInner->mURL); + mInner->mSheetURI); if (NS_FAILED(rv)) { return rv; } @@ -2403,7 +2411,7 @@ nsCSSStyleSheet::InsertRule(const nsAString& aRule, mozAutoDocUpdate updateBatch(mDocument, UPDATE_STYLE, PR_TRUE); nsCOMPtr rules; - result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rules)); + result = css->ParseRule(aRule, mInner->mBaseURI, getter_AddRefs(rules)); if (NS_FAILED(result)) return result; @@ -2647,7 +2655,7 @@ nsCSSStyleSheet::InsertRuleIntoGroup(const nsAString & aRule, nsICSSGroupRule* a NS_ENSURE_SUCCESS(result, result); nsCOMPtr rules; - result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rules)); + result = css->ParseRule(aRule, mInner->mBaseURI, getter_AddRefs(rules)); NS_ENSURE_SUCCESS(result, result); PRUint32 rulecount = 0; @@ -2739,31 +2747,9 @@ nsCSSStyleSheet::StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) return NS_OK; } -// XXX for backwards compatibility and convenience -nsresult -NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL) -{ - nsICSSStyleSheet* sheet; - nsresult rv; - if (NS_FAILED(rv = NS_NewCSSStyleSheet(&sheet))) - return rv; - - if (NS_FAILED(rv = sheet->SetURL(aURL))) { - NS_RELEASE(sheet); - return rv; - } - - *aInstancePtrResult = sheet; - return NS_OK; -} - nsresult NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult) { - if (aInstancePtrResult == nsnull) { - return NS_ERROR_NULL_POINTER; - } - nsCSSStyleSheet *it = new nsCSSStyleSheet(); if (nsnull == it) { diff --git a/mozilla/layout/style/nsCSSStyleSheet.h b/mozilla/layout/style/nsCSSStyleSheet.h index 3c6a2924623..91095d9f6fd 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.h +++ b/mozilla/layout/style/nsCSSStyleSheet.h @@ -70,7 +70,8 @@ public: virtual void RebuildNameSpaces(); nsAutoVoidArray mSheets; - nsCOMPtr mURL; + nsCOMPtr mSheetURI; // for error reports, etc. + nsCOMPtr mBaseURI; // for resolving relative URIs nsISupportsArray* mOrderedRules; nsCOMPtr mNameSpace; PRPackedBool mComplete; @@ -96,7 +97,8 @@ public: NS_DECL_ISUPPORTS // nsIStyleSheet interface - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURI) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURI) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; @@ -129,7 +131,7 @@ public: NS_IMETHOD ReplaceRuleInGroup(nsICSSGroupRule* aGroup, nsICSSRule* aOld, nsICSSRule* aNew); NS_IMETHOD StyleSheetCount(PRInt32& aCount) const; NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const; - NS_IMETHOD SetURL(nsIURI* aURL); + NS_IMETHOD SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI); NS_IMETHOD SetTitle(const nsAString& aTitle); NS_IMETHOD AppendMedium(nsIAtom* aMedium); NS_IMETHOD ClearMedia(); diff --git a/mozilla/layout/style/nsHTMLCSSStyleSheet.cpp b/mozilla/layout/style/nsHTMLCSSStyleSheet.cpp index 0ade20aeea4..8205eb0ba12 100644 --- a/mozilla/layout/style/nsHTMLCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsHTMLCSSStyleSheet.cpp @@ -348,7 +348,8 @@ public: // basic style sheet data NS_IMETHOD Init(nsIURI* aURL, nsIDocument* aDocument); NS_IMETHOD Reset(nsIURI* aURL); - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURL) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURL) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; @@ -530,10 +531,18 @@ HTMLCSSStyleSheetImpl::Reset(nsIURI* aURL) } NS_IMETHODIMP -HTMLCSSStyleSheetImpl::GetURL(nsIURI*& aURL) const +HTMLCSSStyleSheetImpl::GetSheetURI(nsIURI** aSheetURL) const { NS_IF_ADDREF(mURL); - aURL = mURL; + *aSheetURL = mURL; + return NS_OK; +} + +NS_IMETHODIMP +HTMLCSSStyleSheetImpl::GetBaseURI(nsIURI** aBaseURL) const +{ + NS_IF_ADDREF(mURL); + *aBaseURL = mURL; return NS_OK; } diff --git a/mozilla/layout/style/nsHTMLStyleSheet.cpp b/mozilla/layout/style/nsHTMLStyleSheet.cpp index 2ffa87386f4..6f3f9abba87 100644 --- a/mozilla/layout/style/nsHTMLStyleSheet.cpp +++ b/mozilla/layout/style/nsHTMLStyleSheet.cpp @@ -658,10 +658,18 @@ nsHTMLStyleSheet::RulesMatching(PseudoRuleProcessorData* aData) // nsIStyleSheet api NS_IMETHODIMP -nsHTMLStyleSheet::GetURL(nsIURI*& aURL) const +nsHTMLStyleSheet::GetSheetURI(nsIURI** aSheetURI) const { - aURL = mURL; - NS_IF_ADDREF(aURL); + *aSheetURI = mURL; + NS_IF_ADDREF(*aSheetURI); + return NS_OK; +} + +NS_IMETHODIMP +nsHTMLStyleSheet::GetBaseURI(nsIURI** aBaseURI) const +{ + *aBaseURI = mURL; + NS_IF_ADDREF(*aBaseURI); return NS_OK; } diff --git a/mozilla/layout/style/nsHTMLStyleSheet.h b/mozilla/layout/style/nsHTMLStyleSheet.h index bb25a89484c..5b309902852 100644 --- a/mozilla/layout/style/nsHTMLStyleSheet.h +++ b/mozilla/layout/style/nsHTMLStyleSheet.h @@ -54,7 +54,8 @@ public: NS_DECL_ISUPPORTS // nsIStyleSheet api - NS_IMETHOD GetURL(nsIURI*& aURL) const; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURL) const; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURL) const; NS_IMETHOD GetTitle(nsString& aTitle) const; NS_IMETHOD GetType(nsString& aType) const; NS_IMETHOD GetMediumCount(PRInt32& aCount) const; diff --git a/mozilla/layout/style/nsICSSParser.h b/mozilla/layout/style/nsICSSParser.h index 9c30e0aa5f4..ee76faaf732 100644 --- a/mozilla/layout/style/nsICSSParser.h +++ b/mozilla/layout/style/nsICSSParser.h @@ -81,7 +81,8 @@ public: NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader) = 0; NS_IMETHOD Parse(nsIUnicharInputStream* aInput, - nsIURI* aInputURL, + nsIURI* aSheetURL, + nsIURI* aBaseURI, PRUint32 aLineNumber, nsICSSStyleSheet*& aResult) = 0; diff --git a/mozilla/layout/style/nsICSSStyleSheet.h b/mozilla/layout/style/nsICSSStyleSheet.h index 17e4d8b0a27..f39166a9a1f 100644 --- a/mozilla/layout/style/nsICSSStyleSheet.h +++ b/mozilla/layout/style/nsICSSStyleSheet.h @@ -78,11 +78,11 @@ public: NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const = 0; /** - * SetURL must be called on all sheets before parsing into them. - * SetURL may only be called while the sheet is 1) incomplete and 2) + * SetURIs must be called on all sheets before parsing into them. + * SetURIs may only be called while the sheet is 1) incomplete and 2) * has no rules in it */ - NS_IMETHOD SetURL(nsIURI* aURL) = 0; + NS_IMETHOD SetURIs(nsIURI* aSheetURI, nsIURI* aBaseURI) = 0; NS_IMETHOD SetTitle(const nsAString& aTitle) = 0; NS_IMETHOD AppendMedium(nsIAtom* aMedium) = 0; NS_IMETHOD ClearMedia(void) = 0; @@ -107,10 +107,6 @@ public: NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0; }; -// XXX for backwards compatibility and convenience -nsresult -NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL); - nsresult NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult); diff --git a/mozilla/layout/style/nsIStyleSheet.h b/mozilla/layout/style/nsIStyleSheet.h index 2deca98e518..b90f5a00d57 100644 --- a/mozilla/layout/style/nsIStyleSheet.h +++ b/mozilla/layout/style/nsIStyleSheet.h @@ -68,7 +68,8 @@ public: NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTYLE_SHEET_IID) // basic style sheet data - NS_IMETHOD GetURL(nsIURI*& aURL) const = 0; + NS_IMETHOD GetSheetURI(nsIURI** aSheetURI) const = 0; + NS_IMETHOD GetBaseURI(nsIURI** aBaseURI) const = 0; NS_IMETHOD GetTitle(nsString& aTitle) const = 0; NS_IMETHOD GetType(nsString& aType) const = 0; NS_IMETHOD GetMediumCount(PRInt32& aCount) const = 0; diff --git a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp index 7c2576f05bc..856cb06e0a7 100644 --- a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp @@ -1422,7 +1422,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow) nsIStyleSheet *sheet = agentSheets[l]; nsCOMPtr uri; - rv = sheet->GetURL(*getter_AddRefs(uri)); + rv = sheet->GetSheetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; if (IsChromeURI(uri)) { @@ -1467,7 +1467,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow) for (i = 0; i < count; i++) { nsCOMPtr sheet = oldSheets[i]; nsCOMPtr uri; - rv = sheet->GetURL(*getter_AddRefs(uri)); + rv = sheet->GetSheetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; if (IsChromeURI(uri)) {