From ee4bb498aa907922fa094c467ebdd7fe5d15fdbe Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Fri, 19 Oct 2001 13:50:30 +0000 Subject: [PATCH] Clean up handling of quirk doctypes and case-sensitivity in the CSSOM. Mostly just uses the nodeinfo more and combines some redundant code into helpers. Bug 95336, bug 10622, bug 102815 git-svn-id: svn://10.0.0.236/trunk@105769 18797224-902f-48f8-a5cc-f745e15eee43 --- .../content/base/public/nsINameSpaceManager.h | 1 + .../html/content/src/nsGenericHTMLElement.cpp | 133 ++++++++++-------- .../content/html/style/src/nsCSSStyleRule.cpp | 105 ++++++++------ .../html/style/src/nsCSSStyleSheet.cpp | 17 ++- mozilla/layout/style/nsCSSStyleRule.cpp | 105 ++++++++------ mozilla/layout/style/nsCSSStyleSheet.cpp | 17 ++- 6 files changed, 225 insertions(+), 153 deletions(-) diff --git a/mozilla/content/base/public/nsINameSpaceManager.h b/mozilla/content/base/public/nsINameSpaceManager.h index 1d2d6255a63..6cb301402b8 100644 --- a/mozilla/content/base/public/nsINameSpaceManager.h +++ b/mozilla/content/base/public/nsINameSpaceManager.h @@ -56,6 +56,7 @@ class nsIElementFactory; #define kNameSpaceID_XLink 4 #define kNameSpaceID_HTML2 5 // This is not a real namespace #define kNameSpaceID_XSLT 6 +#define kNameSpaceID_XHTML kNameSpaceID_HTML // 'html' is by definition bound to the namespace name "urn:w3-org-ns:HTML" XXX ??? // 'xml' is by definition bound to the namespace name "urn:Connolly:input:required" XXX diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp index 7631dbea1a1..606bbf570d6 100644 --- a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp +++ b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp @@ -145,6 +145,10 @@ public: virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, PRBool aAllocate); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl); + virtual nsresult GetCSSParsingEnvironment(nsIContent* aContent, + nsIURI** aBaseURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser); virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue); virtual nsresult ParseDeclaration(const nsAReadableString& aDecl, @@ -293,6 +297,58 @@ nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl) return result; } +/* + * This is a utility function. It will only fail if it can't get a + * parser. This means it can return NS_OK without aURI or aCSSLoader + * being initialized + */ +nsresult +nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIContent* aContent, + nsIURI** aBaseURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser) +{ + NS_ASSERTION(aContent, "Something is severely broken -- there should be an nsIContent here!"); + // null out the out params since some of them may not get initialized below + *aBaseURI = nsnull; + *aCSSLoader = nsnull; + *aCSSParser = nsnull; + + nsCOMPtr nodeInfo; + nsresult result = aContent->GetNodeInfo(*getter_AddRefs(nodeInfo)); + if (NS_FAILED(result)) { + return result; + } + nsCOMPtr doc; + result = nodeInfo->GetDocument(*getter_AddRefs(doc)); + if (NS_FAILED(result)) { + return result; + } + + if (doc) { + doc->GetBaseURL(*aBaseURI); + nsCOMPtr htmlContainer(do_QueryInterface(doc)); + if (htmlContainer) { + htmlContainer->GetCSSLoader(*aCSSLoader); + } + NS_ASSERTION(*aCSSLoader, "Document with no CSS loader!"); + } + if (*aCSSLoader) { + result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser); + } else { + result = NS_NewCSSParser(aCSSParser); + } + if (NS_FAILED(result)) { + return result; + } + + // look up our namespace. If we're XHTML, we need to be case-sensitive + // Otherwise, we should not be + (*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML)); + + return NS_OK; +} + nsresult nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue) @@ -314,21 +370,10 @@ nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropN return result; } - if (doc) { - doc->GetBaseURL(*getter_AddRefs(baseURI)); - - nsCOMPtr htmlContainer(do_QueryInterface(doc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); - } + result = GetCSSParsingEnvironment(mContent, + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); if (NS_FAILED(result)) { return result; } @@ -339,21 +384,6 @@ nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropN doc->AttributeWillChange(mContent, kNameSpaceID_None, nsHTMLAtoms::style); } - nsCOMPtr nodeInfo; - mContent->GetNodeInfo(*getter_AddRefs(nodeInfo)); - if (nodeInfo) { - nsCOMPtr doc; - nodeInfo->GetDocument(*getter_AddRefs(doc)); - if (doc) { - nsCOMPtr htmlDoc(do_QueryInterface(doc)); - if (htmlDoc) { - nsDTDMode mode; - htmlDoc->GetDTDMode(mode); - cssParser->SetQuirkMode(eDTDMode_strict != mode); - } - } - } - result = cssParser->ParseProperty(aPropName, aPropValue, baseURI, decl, &hint); if (doc) { doc->AttributeChanged(mContent, kNameSpaceID_None, @@ -384,21 +414,13 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsAReadableString& aDecl, nsCOMPtr doc; result = mContent->GetDocument(*getter_AddRefs(doc)); - if (doc) { - doc->GetBaseURL(*getter_AddRefs(baseURI)); - - nsCOMPtr htmlContainer(do_QueryInterface(doc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); + if (NS_FAILED(result)) { + return result; } + result = GetCSSParsingEnvironment(mContent, + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); if (NS_SUCCEEDED(result)) { PRInt32 hint; @@ -428,21 +450,6 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsAReadableString& aDecl, } } - nsCOMPtr nodeInfo; - mContent->GetNodeInfo(*getter_AddRefs(nodeInfo)); - if (nodeInfo) { - nsCOMPtr doc; - nodeInfo->GetDocument(*getter_AddRefs(doc)); - if (doc) { - nsCOMPtr htmlDoc(do_QueryInterface(doc)); - if (htmlDoc) { - nsDTDMode mode; - htmlDoc->GetDTDMode(mode); - cssParser->SetQuirkMode(eDTDMode_strict != mode); - } - } - } - result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, aParseOnlyOneDecl, &hint); if (result == NS_CSS_PARSER_DROP_DECLARATION) { @@ -3500,6 +3507,14 @@ nsGenericHTMLElement::ParseStyleAttribute(const nsAReadableString& aValue, nsHTM } else { result = NS_NewCSSParser(getter_AddRefs(cssParser)); + if (cssParser) { + // look up our namespace. If we're XHTML, we need to be case-sensitive + // Otherwise, we should not be. + nsCOMPtr nodeInfo; + result = GetNodeInfo(*getter_AddRefs(nodeInfo)); + NS_ENSURE_SUCCESS(result, result); + cssParser->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML)); + } } if (cssParser) { nsCOMPtr docURL; diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index 5c097c9bccc..cac6a4da61f 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -1067,6 +1067,12 @@ public: virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, PRBool aAllocate); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl); + virtual nsresult GetCSSParsingEnvironment(nsICSSStyleRule* aRule, + nsICSSStyleSheet** aSheet, + nsIDocument** aDocument, + nsIURI** aURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser); virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue); virtual nsresult ParseDeclaration(const nsAReadableString& aDecl, @@ -1153,6 +1159,49 @@ DOMCSSDeclarationImpl::SetCSSDeclaration(nsICSSDeclaration *aDecl) return NS_OK; } +/* + * This is a utility function. It will only fail if it can't get a + * parser. This means it can return NS_OK without all of aSheet, + * aDocument, aURI, aCSSLoader being initialized + */ +nsresult +DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsICSSStyleRule* aRule, + nsICSSStyleSheet** aSheet, + nsIDocument** aDocument, + nsIURI** aURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser) +{ + // null out the out params since some of them may not get initialized below + *aSheet = nsnull; + *aDocument = nsnull; + *aURI = nsnull; + *aCSSLoader = nsnull; + *aCSSParser = nsnull; + nsresult result; + nsCOMPtr sheet; + if (aRule) { + aRule->GetStyleSheet(*getter_AddRefs(sheet)); + if (sheet) { + CallQueryInterface(sheet, aSheet); + sheet->GetOwningDocument(*aDocument); + sheet->GetURL(*aURI); + } + } + nsCOMPtr htmlContainer(do_QueryInterface(*aDocument)); + if (htmlContainer) { + htmlContainer->GetCSSLoader(*aCSSLoader); + } + NS_ASSERTION(*aCSSLoader || !*aDocument, "Document with no CSS loader!"); + if (*aCSSLoader) { + result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser); + } else { + result = NS_NewCSSParser(aCSSParser); + } + + return result; +} + nsresult DOMCSSDeclarationImpl::ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue) @@ -1167,30 +1216,17 @@ DOMCSSDeclarationImpl::ParsePropertyValue(const nsAReadableString& aPropName, nsCOMPtr baseURI; nsCOMPtr cssSheet; nsCOMPtr owningDoc; - nsCOMPtr sheet; - if (mRule) { - mRule->GetStyleSheet(*getter_AddRefs(sheet)); - if (sheet) { - sheet->GetURL(*getter_AddRefs(baseURI)); - sheet->GetOwningDocument(*getter_AddRefs(owningDoc)); - cssSheet = do_QueryInterface(sheet); - if (owningDoc) { - nsCOMPtr htmlContainer(do_QueryInterface(owningDoc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - } - } - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); - } + result = GetCSSParsingEnvironment(mRule, + getter_AddRefs(cssSheet), + getter_AddRefs(owningDoc), + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); + if (NS_FAILED(result)) { return result; } + PRInt32 hint; if (owningDoc) { owningDoc->BeginUpdate(); @@ -1227,27 +1263,12 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsAReadableString& aDecl, nsCOMPtr cssSheet; nsCOMPtr owningDoc; - nsCOMPtr sheet; - if (mRule) { - mRule->GetStyleSheet(*getter_AddRefs(sheet)); - if (sheet) { - sheet->GetURL(*getter_AddRefs(baseURI)); - sheet->GetOwningDocument(*getter_AddRefs(owningDoc)); - cssSheet = do_QueryInterface(sheet); - if (owningDoc) { - nsCOMPtr htmlContainer(do_QueryInterface(owningDoc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - } - } - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); - } + result = GetCSSParsingEnvironment(mRule, + getter_AddRefs(cssSheet), + getter_AddRefs(owningDoc), + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); if (NS_SUCCEEDED(result)) { nsCOMPtr declClone; diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp index 5b3dc693ce5..4f118997e6e 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp @@ -2794,16 +2794,19 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, if (htmlContainer) { htmlContainer->GetCSSLoader(*getter_AddRefs(loader)); } + NS_ASSERTION(loader || !mDocument, "Document with no CSS loader!"); if (loader) { result = loader->GetParserFor(this, getter_AddRefs(css)); } else { result = NS_NewCSSParser(getter_AddRefs(css)); - css->SetStyleSheet(this); + if (css) { + css->SetStyleSheet(this); + } } if (NS_FAILED(result)) return result; - + if (mDocument) { result = mDocument->BeginUpdate(); if (NS_FAILED(result)) @@ -2881,6 +2884,8 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, result = mInner->mOrderedRules->InsertElementsAt(rules, aIndex); NS_ENSURE_SUCCESS(result, result); + DidDirty(); + nsCOMPtr cssRule; PRUint32 counter; for (counter = 0; counter < rulecount; counter++) { @@ -2923,8 +2928,6 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, } } - DidDirty(); - if (mDocument) { result = mDocument->EndUpdate(); NS_ENSURE_SUCCESS(result, result); @@ -3046,12 +3049,16 @@ CSSStyleSheetImpl::InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRul if (htmlContainer) { htmlContainer->GetCSSLoader(*getter_AddRefs(loader)); } + NS_ASSERTION(loader || !mDocument, "Document with no CSS loader!"); + if (loader) { result = loader->GetParserFor(this, getter_AddRefs(css)); } else { result = NS_NewCSSParser(getter_AddRefs(css)); - css->SetStyleSheet(this); + if (css) { + css->SetStyleSheet(this); + } } NS_ENSURE_SUCCESS(result, result); diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index 5c097c9bccc..cac6a4da61f 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -1067,6 +1067,12 @@ public: virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, PRBool aAllocate); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl); + virtual nsresult GetCSSParsingEnvironment(nsICSSStyleRule* aRule, + nsICSSStyleSheet** aSheet, + nsIDocument** aDocument, + nsIURI** aURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser); virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue); virtual nsresult ParseDeclaration(const nsAReadableString& aDecl, @@ -1153,6 +1159,49 @@ DOMCSSDeclarationImpl::SetCSSDeclaration(nsICSSDeclaration *aDecl) return NS_OK; } +/* + * This is a utility function. It will only fail if it can't get a + * parser. This means it can return NS_OK without all of aSheet, + * aDocument, aURI, aCSSLoader being initialized + */ +nsresult +DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsICSSStyleRule* aRule, + nsICSSStyleSheet** aSheet, + nsIDocument** aDocument, + nsIURI** aURI, + nsICSSLoader** aCSSLoader, + nsICSSParser** aCSSParser) +{ + // null out the out params since some of them may not get initialized below + *aSheet = nsnull; + *aDocument = nsnull; + *aURI = nsnull; + *aCSSLoader = nsnull; + *aCSSParser = nsnull; + nsresult result; + nsCOMPtr sheet; + if (aRule) { + aRule->GetStyleSheet(*getter_AddRefs(sheet)); + if (sheet) { + CallQueryInterface(sheet, aSheet); + sheet->GetOwningDocument(*aDocument); + sheet->GetURL(*aURI); + } + } + nsCOMPtr htmlContainer(do_QueryInterface(*aDocument)); + if (htmlContainer) { + htmlContainer->GetCSSLoader(*aCSSLoader); + } + NS_ASSERTION(*aCSSLoader || !*aDocument, "Document with no CSS loader!"); + if (*aCSSLoader) { + result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser); + } else { + result = NS_NewCSSParser(aCSSParser); + } + + return result; +} + nsresult DOMCSSDeclarationImpl::ParsePropertyValue(const nsAReadableString& aPropName, const nsAReadableString& aPropValue) @@ -1167,30 +1216,17 @@ DOMCSSDeclarationImpl::ParsePropertyValue(const nsAReadableString& aPropName, nsCOMPtr baseURI; nsCOMPtr cssSheet; nsCOMPtr owningDoc; - nsCOMPtr sheet; - if (mRule) { - mRule->GetStyleSheet(*getter_AddRefs(sheet)); - if (sheet) { - sheet->GetURL(*getter_AddRefs(baseURI)); - sheet->GetOwningDocument(*getter_AddRefs(owningDoc)); - cssSheet = do_QueryInterface(sheet); - if (owningDoc) { - nsCOMPtr htmlContainer(do_QueryInterface(owningDoc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - } - } - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); - } + result = GetCSSParsingEnvironment(mRule, + getter_AddRefs(cssSheet), + getter_AddRefs(owningDoc), + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); + if (NS_FAILED(result)) { return result; } + PRInt32 hint; if (owningDoc) { owningDoc->BeginUpdate(); @@ -1227,27 +1263,12 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsAReadableString& aDecl, nsCOMPtr cssSheet; nsCOMPtr owningDoc; - nsCOMPtr sheet; - if (mRule) { - mRule->GetStyleSheet(*getter_AddRefs(sheet)); - if (sheet) { - sheet->GetURL(*getter_AddRefs(baseURI)); - sheet->GetOwningDocument(*getter_AddRefs(owningDoc)); - cssSheet = do_QueryInterface(sheet); - if (owningDoc) { - nsCOMPtr htmlContainer(do_QueryInterface(owningDoc)); - if (htmlContainer) { - htmlContainer->GetCSSLoader(*getter_AddRefs(cssLoader)); - } - } - } - } - if (cssLoader) { - result = cssLoader->GetParserFor(nsnull, getter_AddRefs(cssParser)); - } - else { - result = NS_NewCSSParser(getter_AddRefs(cssParser)); - } + result = GetCSSParsingEnvironment(mRule, + getter_AddRefs(cssSheet), + getter_AddRefs(owningDoc), + getter_AddRefs(baseURI), + getter_AddRefs(cssLoader), + getter_AddRefs(cssParser)); if (NS_SUCCEEDED(result)) { nsCOMPtr declClone; diff --git a/mozilla/layout/style/nsCSSStyleSheet.cpp b/mozilla/layout/style/nsCSSStyleSheet.cpp index 5b3dc693ce5..4f118997e6e 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsCSSStyleSheet.cpp @@ -2794,16 +2794,19 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, if (htmlContainer) { htmlContainer->GetCSSLoader(*getter_AddRefs(loader)); } + NS_ASSERTION(loader || !mDocument, "Document with no CSS loader!"); if (loader) { result = loader->GetParserFor(this, getter_AddRefs(css)); } else { result = NS_NewCSSParser(getter_AddRefs(css)); - css->SetStyleSheet(this); + if (css) { + css->SetStyleSheet(this); + } } if (NS_FAILED(result)) return result; - + if (mDocument) { result = mDocument->BeginUpdate(); if (NS_FAILED(result)) @@ -2881,6 +2884,8 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, result = mInner->mOrderedRules->InsertElementsAt(rules, aIndex); NS_ENSURE_SUCCESS(result, result); + DidDirty(); + nsCOMPtr cssRule; PRUint32 counter; for (counter = 0; counter < rulecount; counter++) { @@ -2923,8 +2928,6 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule, } } - DidDirty(); - if (mDocument) { result = mDocument->EndUpdate(); NS_ENSURE_SUCCESS(result, result); @@ -3046,12 +3049,16 @@ CSSStyleSheetImpl::InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRul if (htmlContainer) { htmlContainer->GetCSSLoader(*getter_AddRefs(loader)); } + NS_ASSERTION(loader || !mDocument, "Document with no CSS loader!"); + if (loader) { result = loader->GetParserFor(this, getter_AddRefs(css)); } else { result = NS_NewCSSParser(getter_AddRefs(css)); - css->SetStyleSheet(this); + if (css) { + css->SetStyleSheet(this); + } } NS_ENSURE_SUCCESS(result, result);