Consolidate external stylesheet quirks handling to StyleSheetInternal
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Apr 2012 09:17:18 +0000 (09:17 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Apr 2012 09:17:18 +0000 (09:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=84632

Reviewed by Andreas Kling.

Move the repeated code from StyleImportRule and HTMLLinkElement to StyleSheetInternal::parseUserStyleSheet.

Remove a BUILDING_ON_LEOPARD-only quirk.

* css/CSSImportRule.cpp:
(WebCore::StyleRuleImport::setCSSStyleSheet):
* css/CSSParser.cpp:
(WebCore):
(WebCore::CSSParserContext::CSSParserContext):

    Add new settings bits to the CSSParserContext. These are used for external stylesheet parsing quirks.

* css/CSSParserMode.h:
(CSSParserContext):
* css/CSSStyleSheet.cpp:
(WebCore::StyleSheetInternal::parseUserStyleSheet):
(WebCore::StyleSheetInternal::parseString):
(WebCore):
(WebCore::StyleSheetInternal::parseStringAtLine):
* css/CSSStyleSheet.h:
(WebCore):
(StyleSheetInternal):
* html/HTMLLinkElement.cpp:
(WebCore::HTMLLinkElement::setCSSStyleSheet):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@115016 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/css/CSSImportRule.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSParserMode.h
Source/WebCore/css/CSSStyleSheet.cpp
Source/WebCore/css/CSSStyleSheet.h
Source/WebCore/html/HTMLLinkElement.cpp

index 7e55a85..3eeb035 100644 (file)
@@ -1,3 +1,35 @@
+2012-04-23  Antti Koivisto  <antti@apple.com>
+
+        Consolidate external stylesheet quirks handling to StyleSheetInternal
+        https://bugs.webkit.org/show_bug.cgi?id=84632
+
+        Reviewed by Andreas Kling.
+
+        Move the repeated code from StyleImportRule and HTMLLinkElement to StyleSheetInternal::parseUserStyleSheet.
+        
+        Remove a BUILDING_ON_LEOPARD-only quirk.
+
+        * css/CSSImportRule.cpp:
+        (WebCore::StyleRuleImport::setCSSStyleSheet):
+        * css/CSSParser.cpp:
+        (WebCore):
+        (WebCore::CSSParserContext::CSSParserContext):
+        
+            Add new settings bits to the CSSParserContext. These are used for external stylesheet parsing quirks.
+
+        * css/CSSParserMode.h:
+        (CSSParserContext):
+        * css/CSSStyleSheet.cpp:
+        (WebCore::StyleSheetInternal::parseUserStyleSheet):
+        (WebCore::StyleSheetInternal::parseString):
+        (WebCore):
+        (WebCore::StyleSheetInternal::parseStringAtLine):
+        * css/CSSStyleSheet.h:
+        (WebCore):
+        (StyleSheetInternal):
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::setCSSStyleSheet):
+
 2012-04-24  Yael Aharon  <yael.aharon@nokia.com>
 
         [Qt] Move notification icon download out of WebCore
index f2912f4..17cae84 100644 (file)
@@ -59,53 +59,19 @@ StyleRuleImport::~StyleRuleImport()
         m_cachedSheet->removeClient(&m_styleSheetClient);
 }
 
-void StyleRuleImport::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet)
+void StyleRuleImport::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* cachedStyleSheet)
 {
     if (m_styleSheet)
         m_styleSheet->clearOwnerRule();
     m_styleSheet = StyleSheetInternal::create(this, href, baseURL, charset);
 
-    bool crossOriginCSS = false;
-    bool validMIMEType = false;
-    CSSParserMode cssParserMode = m_parentStyleSheet ? m_parentStyleSheet->parserContext().mode : CSSStrictMode;
-    bool enforceMIMEType = isStrictParserMode(cssParserMode);
     Document* document = m_parentStyleSheet ? m_parentStyleSheet->findDocument() : 0;
-    bool needsSiteSpecificQuirks = document && document->settings() && document->settings()->needsSiteSpecificQuirks();
-
-#ifdef BUILDING_ON_LEOPARD
-    if (enforceMIMEType && needsSiteSpecificQuirks) {
-        // Covers both http and https, with or without "www."
-        if (baseURL.string().contains("mcafee.com/japan/", false))
-            enforceMIMEType = false;
-    }
-#endif
-
-    String sheetText = sheet->sheetText(enforceMIMEType, &validMIMEType);
-    m_styleSheet->parseString(sheetText);
-
-    if (!document || !document->securityOrigin()->canRequest(baseURL))
-        crossOriginCSS = true;
-
-    if (crossOriginCSS && !validMIMEType && !m_styleSheet->hasSyntacticallyValidCSSHeader())
-        m_styleSheet = StyleSheetInternal::create(this, href, baseURL, charset);
-
-    if (isStrictParserMode(cssParserMode) && needsSiteSpecificQuirks) {
-        // Work around <https://bugs.webkit.org/show_bug.cgi?id=28350>.
-        DEFINE_STATIC_LOCAL(const String, slashKHTMLFixesDotCss, ("/KHTMLFixes.css"));
-        DEFINE_STATIC_LOCAL(const String, mediaWikiKHTMLFixesStyleSheet, ("/* KHTML fix stylesheet */\n/* work around the horizontal scrollbars */\n#column-content { margin-left: 0; }\n\n"));
-        // There are two variants of KHTMLFixes.css. One is equal to mediaWikiKHTMLFixesStyleSheet,
-        // while the other lacks the second trailing newline.
-        if (baseURL.string().endsWith(slashKHTMLFixesDotCss) && !sheetText.isNull() && mediaWikiKHTMLFixesStyleSheet.startsWith(sheetText)
-                && sheetText.length() >= mediaWikiKHTMLFixesStyleSheet.length() - 1) {
-            ASSERT(m_styleSheet->childRules().size() == 1);
-            m_styleSheet->clearRules();
-        }
-    }
+    m_styleSheet->parseUserStyleSheet(cachedStyleSheet, document ? document->securityOrigin() : 0);
 
     m_loading = false;
 
     if (m_parentStyleSheet) {
-        m_parentStyleSheet->notifyLoadedSheet(sheet);
+        m_parentStyleSheet->notifyLoadedSheet(cachedStyleSheet);
         m_parentStyleSheet->checkLoaded();
     }
 }
index 09cf536..d80b881 100644 (file)
@@ -180,12 +180,14 @@ const CSSParserContext& strictCSSParserContext()
     DEFINE_STATIC_LOCAL(CSSParserContext, strictContext, (CSSStrictMode));
     return strictContext;
 }
-    
+
 CSSParserContext::CSSParserContext(CSSParserMode mode)
     : mode(mode)
     , isHTMLDocument(false)
     , isCSSCustomFilterEnabled(false)
     , isCSSRegionsEnabled(false)
+    , needsSiteSpecificQuirks(false)
+    , enforcesCSSMIMETypeInNoQuirksMode(true)
 {
 }
 
@@ -195,6 +197,8 @@ CSSParserContext::CSSParserContext(Document* document)
     , isHTMLDocument(document->isHTMLDocument())
     , isCSSCustomFilterEnabled(document->settings() ? document->settings()->isCSSCustomFilterEnabled() : false)
     , isCSSRegionsEnabled(document->cssRegionsEnabled())
+    , needsSiteSpecificQuirks(document->settings() ? document->settings()->needsSiteSpecificQuirks() : false)
+    , enforcesCSSMIMETypeInNoQuirksMode(!document->settings() || document->settings()->enforceCSSMIMETypeInNoQuirksMode())
 {
 }
 
index e286a46..999645d 100644 (file)
@@ -64,6 +64,8 @@ struct CSSParserContext {
     bool isHTMLDocument;
     bool isCSSCustomFilterEnabled;
     bool isCSSRegionsEnabled;
+    bool needsSiteSpecificQuirks;
+    bool enforcesCSSMIMETypeInNoQuirksMode;
 };
 
 const CSSParserContext& strictCSSParserContext();
index 1d686e5..b15909e 100644 (file)
@@ -266,15 +266,49 @@ const AtomicString& StyleSheetInternal::determineNamespace(const AtomicString& p
     return nullAtom; // Assume we won't match any namespaces.
 }
 
-bool StyleSheetInternal::parseString(const String &string)
+void StyleSheetInternal::parseUserStyleSheet(const CachedCSSStyleSheet* cachedStyleSheet, const SecurityOrigin* securityOrigin)
 {
-    return parseStringAtLine(string, 0);
+    // Check to see if we should enforce the MIME type of the CSS resource in strict mode.
+    // Running in iWeb 2 is one example of where we don't want to - <rdar://problem/6099748>
+    bool enforceMIMEType = isStrictParserMode(m_parserContext.mode) && m_parserContext.enforcesCSSMIMETypeInNoQuirksMode;
+    bool hasValidMIMEType = false;
+    String sheetText = cachedStyleSheet->sheetText(enforceMIMEType, &hasValidMIMEType);
+
+    CSSParser p(parserContext());
+    p.parseSheet(this, sheetText, 0);
+
+    // If we're loading a stylesheet cross-origin, and the MIME type is not standard, require the CSS
+    // to at least start with a syntactically valid CSS rule.
+    // This prevents an attacker playing games by injecting CSS strings into HTML, XML, JSON, etc. etc.
+    if (!hasValidMIMEType && !hasSyntacticallyValidCSSHeader()) {
+        bool isCrossOriginCSS = !securityOrigin || !securityOrigin->canRequest(finalURL());
+        if (isCrossOriginCSS) {
+            clearRules();
+            return;
+        }
+    }
+    if (m_parserContext.needsSiteSpecificQuirks && isStrictParserMode(m_parserContext.mode)) {
+        // Work around <https://bugs.webkit.org/show_bug.cgi?id=28350>.
+        DEFINE_STATIC_LOCAL(const String, slashKHTMLFixesDotCss, ("/KHTMLFixes.css"));
+        DEFINE_STATIC_LOCAL(const String, mediaWikiKHTMLFixesStyleSheet, ("/* KHTML fix stylesheet */\n/* work around the horizontal scrollbars */\n#column-content { margin-left: 0; }\n\n"));
+        // There are two variants of KHTMLFixes.css. One is equal to mediaWikiKHTMLFixesStyleSheet,
+        // while the other lacks the second trailing newline.
+        if (finalURL().string().endsWith(slashKHTMLFixesDotCss) && !sheetText.isNull() && mediaWikiKHTMLFixesStyleSheet.startsWith(sheetText)
+            && sheetText.length() >= mediaWikiKHTMLFixesStyleSheet.length() - 1)
+            clearRules();
+    }
 }
 
-bool StyleSheetInternal::parseStringAtLine(const String& string, int startLineNumber)
+bool StyleSheetInternal::parseString(const String& sheetText)
+{
+    return parseStringAtLine(sheetText, 0);
+}
+
+bool StyleSheetInternal::parseStringAtLine(const String& sheetText, int startLineNumber)
 {
     CSSParser p(parserContext());
-    p.parseSheet(this, string, startLineNumber);
+    p.parseSheet(this, sheetText, startLineNumber);
+
     return true;
 }
 
index 37ed86f..104b2d8 100644 (file)
@@ -36,6 +36,7 @@ class CachedCSSStyleSheet;
 class CachedResourceLoader;
 class Document;
 class MediaQuerySet;
+class SecurityOrigin;
 class StyleRuleBase;
 class StyleRuleImport;
 struct CSSNamespace;
@@ -74,8 +75,8 @@ public:
 
     void styleSheetChanged();
 
+    void parseUserStyleSheet(const CachedCSSStyleSheet*, const SecurityOrigin*);
     bool parseString(const String&);
-
     bool parseStringAtLine(const String&, int startLineNumber);
 
     bool isLoading() const;
index 461925e..e22a1e6 100644 (file)
@@ -287,7 +287,7 @@ void HTMLLinkElement::finishParsingChildren()
     HTMLElement::finishParsingChildren();
 }
 
-void HTMLLinkElement::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet)
+void HTMLLinkElement::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* cachedStyleSheet)
 {
     if (!inDocument()) {
         ASSERT(!m_sheet);
@@ -296,60 +296,16 @@ void HTMLLinkElement::setCSSStyleSheet(const String& href, const KURL& baseURL,
 
     RefPtr<StyleSheetInternal> styleSheet = StyleSheetInternal::create(this, href, baseURL, charset);
 
-    bool strictParsing = !document()->inQuirksMode();
-    bool enforceMIMEType = strictParsing;
-    bool crossOriginCSS = false;
-    bool validMIMEType = false;
-    bool needsSiteSpecificQuirks = document()->page() && document()->page()->settings()->needsSiteSpecificQuirks();
-
-    // Check to see if we should enforce the MIME type of the CSS resource in strict mode.
-    // Running in iWeb 2 is one example of where we don't want to - <rdar://problem/6099748>
-    if (enforceMIMEType && document()->page() && !document()->page()->settings()->enforceCSSMIMETypeInNoQuirksMode())
-        enforceMIMEType = false;
-
-#ifdef BUILDING_ON_LEOPARD
-    if (enforceMIMEType && needsSiteSpecificQuirks) {
-        // Covers both http and https, with or without "www."
-        if (baseURL.string().contains("mcafee.com/japan/", false))
-            enforceMIMEType = false;
-    }
-#endif
-
-    String sheetText = sheet->sheetText(enforceMIMEType, &validMIMEType);
-    styleSheet->parseString(sheetText);
-
-    // If we're loading a stylesheet cross-origin, and the MIME type is not
-    // standard, require the CSS to at least start with a syntactically
-    // valid CSS rule.
-    // This prevents an attacker playing games by injecting CSS strings into
-    // HTML, XML, JSON, etc. etc.
-    if (!document()->securityOrigin()->canRequest(baseURL))
-        crossOriginCSS = true;
-
-    if (crossOriginCSS && !validMIMEType && !styleSheet->hasSyntacticallyValidCSSHeader())
-        styleSheet = StyleSheetInternal::create(this, href, baseURL, charset);
-
-    if (strictParsing && needsSiteSpecificQuirks) {
-        // Work around <https://bugs.webkit.org/show_bug.cgi?id=28350>.
-        DEFINE_STATIC_LOCAL(const String, slashKHTMLFixesDotCss, ("/KHTMLFixes.css"));
-        DEFINE_STATIC_LOCAL(const String, mediaWikiKHTMLFixesStyleSheet, ("/* KHTML fix stylesheet */\n/* work around the horizontal scrollbars */\n#column-content { margin-left: 0; }\n\n"));
-        // There are two variants of KHTMLFixes.css. One is equal to mediaWikiKHTMLFixesStyleSheet,
-        // while the other lacks the second trailing newline.
-        if (baseURL.string().endsWith(slashKHTMLFixesDotCss) && !sheetText.isNull() && mediaWikiKHTMLFixesStyleSheet.startsWith(sheetText)
-                && sheetText.length() >= mediaWikiKHTMLFixesStyleSheet.length() - 1) {
-            ASSERT(styleSheet->ruleCount() == 1);
-            styleSheet->clearRules();
-        }
-    }
-    m_sheet = CSSStyleSheet::create(styleSheet);
-
-    styleSheet->setTitle(title());
+    styleSheet->parseUserStyleSheet(cachedStyleSheet, document()->securityOrigin());
 
     RefPtr<MediaQuerySet> media = MediaQuerySet::createAllowingDescriptionSyntax(m_media);
     styleSheet->setMediaQueries(media.release());
+    styleSheet->setTitle(title());
+
+    m_sheet = CSSStyleSheet::create(styleSheet);
 
     m_loading = false;
-    styleSheet->notifyLoadedSheet(sheet);
+    styleSheet->notifyLoadedSheet(cachedStyleSheet);
     styleSheet->checkLoaded();
 }