diff options
Diffstat (limited to 'WebCore/css/CSSImportRule.cpp')
-rw-r--r-- | WebCore/css/CSSImportRule.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/WebCore/css/CSSImportRule.cpp b/WebCore/css/CSSImportRule.cpp index 8534adf..7ad5456 100644 --- a/WebCore/css/CSSImportRule.cpp +++ b/WebCore/css/CSSImportRule.cpp @@ -25,6 +25,7 @@ #include "CachedCSSStyleSheet.h" #include "DocLoader.h" #include "Document.h" +#include "SecurityOrigin.h" #include "Settings.h" #include <wtf/StdLibExtras.h> @@ -53,22 +54,41 @@ CSSImportRule::~CSSImportRule() m_cachedSheet->removeClient(this); } -void CSSImportRule::setCSSStyleSheet(const String& url, const String& charset, const CachedCSSStyleSheet* sheet) +void CSSImportRule::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet) { if (m_styleSheet) m_styleSheet->setParent(0); - m_styleSheet = CSSStyleSheet::create(this, url, charset); + m_styleSheet = CSSStyleSheet::create(this, href, baseURL, charset); + bool crossOriginCSS = false; + bool validMIMEType = false; CSSStyleSheet* parent = parentStyleSheet(); bool strict = !parent || parent->useStrictParsing(); - String sheetText = sheet->sheetText(strict); + bool enforceMIMEType = strict; + bool needsSiteSpecificQuirks = parent && parent->doc() && parent->doc()->settings() && parent->doc()->settings()->needsSiteSpecificQuirks(); + +#if defined(BUILDING_ON_TIGER) || defined(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, strict); - if (strict && parent && parent->doc() && parent->doc()->settings() && parent->doc()->settings()->needsSiteSpecificQuirks()) { + if (!parent || !parent->doc() || !parent->doc()->securityOrigin()->canRequest(baseURL)) + crossOriginCSS = true; + + if (crossOriginCSS && !validMIMEType && !m_styleSheet->hasSyntacticallyValidCSSHeader()) + m_styleSheet = CSSStyleSheet::create(this, href, baseURL, charset); + + if (strict && 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")); - if (url.endsWith(slashKHTMLFixesDotCss) && sheetText == mediaWikiKHTMLFixesStyleSheet) { + if (baseURL.string().endsWith(slashKHTMLFixesDotCss) && sheetText == mediaWikiKHTMLFixesStyleSheet) { ASSERT(m_styleSheet->length() == 1); ExceptionCode ec; m_styleSheet->deleteRule(0, ec); @@ -97,15 +117,16 @@ void CSSImportRule::insertedIntoParent() return; String absHref = m_strHref; - if (!parentSheet->href().isNull()) + if (!parentSheet->putativeBaseURL().isNull()) // use parent styleheet's URL as the base URL - absHref = KURL(KURL(ParsedURLString, parentSheet->href()), m_strHref).string(); + absHref = KURL(parentSheet->putativeBaseURL(), m_strHref).string(); // Check for a cycle in our import chain. If we encounter a stylesheet // in our parent chain with the same URL, then just bail. StyleBase* root = this; for (StyleBase* curr = parent(); curr; curr = curr->parent()) { - if (curr->isCSSStyleSheet() && absHref == static_cast<CSSStyleSheet*>(curr)->href()) + // FIXME: This is wrong if the putativeBaseURL was updated via document::updateBaseURL. + if (curr->isCSSStyleSheet() && absHref == static_cast<CSSStyleSheet*>(curr)->putativeBaseURL().string()) return; root = curr; } |