Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Sep 2006 21:14:44 +0000 (21:14 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Sep 2006 21:14:44 +0000 (21:14 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=11011
        External CSS is parsed as iso-8859-1 even though the main document is utf-8

        Test: fast/encoding/css-charset-default.xhtml

        * loader/CachedResourceClient.h:
        (WebCore::CachedResourceClient::setCSSStyleSheet):
        (WebCore::CachedResourceClient::setXSLStyleSheet):
        Divided setStyleSheet into setCSSStyleSheet and setXSLStyleSheet. The former
        takes an additional charset parameter, to be passed to CSSStyleSheet constructor.

        * css/CSSImportRule.cpp:
        (WebCore::CSSImportRule::setCSSStyleSheet):
        (WebCore::CSSImportRule::insertedIntoParent): Default to parent stylesheet's charset.
        * css/CSSImportRule.h:

        * css/CSSStyleSheet.cpp:
        (WebCore::CSSStyleSheet::CSSStyleSheet):
        * css/CSSStyleSheet.h:
        Added an m_charset member to be used when loading child stylesheets. Removed an unused m_implicit
        member. Changed some String parameters to const String&.

        * css/StyleSheet.cpp:
        (WebCore::StyleSheet::StyleSheet):
        * css/StyleSheet.h:
        Changed some String parameters to const String&. Removed an unused (even unimplemented) constructor.

        * css/StyleSheetList.cpp:
        (WebCore::StyleSheetList::length):
        (WebCore::StyleSheetList::item):
        * css/StyleSheetList.h:
        Special-casing implicit stylesheets seemed to be dead code, removed.

        * dom/Document.cpp:
        (WebCore::Document::setCSSStyleSheet):
        (WebCore::Document::recalcStyleSelector):
        * dom/Document.h:
        Renamed setStyleSheet() to setCSSStyleSheet().

        * dom/ProcessingInstruction.cpp:
        (WebCore::ProcessingInstruction::checkStyleSheet): Pass a correct charset to requestCSSStyleSheet().
        (WebCore::ProcessingInstruction::setCSSStyleSheet):
        (WebCore::ProcessingInstruction::setXSLStyleSheet):
        (WebCore::ProcessingInstruction::parseStyleSheet):
        * dom/ProcessingInstruction.h:

        * html/HTMLLinkElement.cpp:
        (WebCore::HTMLLinkElement::process): Default to document encoding if a charset attribute
        is not specified.
        (WebCore::HTMLLinkElement::setCSSStyleSheet):
        * html/HTMLLinkElement.h:

        * html/HTMLStyleElement.cpp:
        (WebCore::HTMLStyleElement::childrenChanged):
        * ksvg2/svg/SVGStyleElement.cpp:
        (WebCore::SVGStyleElement::childrenChanged):
        Inherit URL and charset from the document.

        * loader/Cache.cpp:
        (WebCore::Cache::requestCSSStyleSheet):
        * loader/Cache.h:
        Adjust for setStyleSheet() renaming.

        * loader/CachedCSSStyleSheet.h: Removed an unused constructor.
        * loader/CachedCSSStyleSheet.cpp:
        (WebCore::CachedCSSStyleSheet::ref):
        (WebCore::CachedCSSStyleSheet::deref):
        (WebCore::CachedCSSStyleSheet::checkNotify):
        Pass the encoding to setCSSStyleSheet().

        * loader/CachedXSLStyleSheet.cpp:
        (WebCore::CachedXSLStyleSheet::ref):
        (WebCore::CachedXSLStyleSheet::checkNotify):
        * loader/DocLoader.cpp:
        (WebCore::DocLoader::requestCSSStyleSheet):
        * loader/DocLoader.h:
        * page/Frame.cpp:
        (WebCore::UserStyleSheetLoader::UserStyleSheetLoader):
        (WebCore::UserStyleSheetLoader::setCSSStyleSheet):
        * xml/XSLImportRule.cpp:
        (WebCore::XSLImportRule::setXSLStyleSheet):
        (WebCore::XSLImportRule::loadSheet):
        * xml/XSLImportRule.h:
        Adjust for setStyleSheet() renaming.

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

34 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/encoding/css-charset-default-expected.txt [new file with mode: 0644]
LayoutTests/fast/encoding/css-charset-default.xhtml [new file with mode: 0644]
LayoutTests/fast/encoding/css-charset-import.css [new file with mode: 0644]
LayoutTests/fast/encoding/css-charset-inherit-iso-8859-5.css [new file with mode: 0644]
LayoutTests/fast/encoding/css-charset-inherit-koi-8.css [new file with mode: 0644]
WebCore/ChangeLog
WebCore/css/CSSImportRule.cpp
WebCore/css/CSSImportRule.h
WebCore/css/CSSStyleSheet.cpp
WebCore/css/CSSStyleSheet.h
WebCore/css/StyleSheet.cpp
WebCore/css/StyleSheet.h
WebCore/css/StyleSheetList.cpp
WebCore/css/StyleSheetList.h
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/dom/ProcessingInstruction.cpp
WebCore/dom/ProcessingInstruction.h
WebCore/html/HTMLLinkElement.cpp
WebCore/html/HTMLLinkElement.h
WebCore/html/HTMLStyleElement.cpp
WebCore/ksvg2/svg/SVGStyleElement.cpp
WebCore/loader/Cache.cpp
WebCore/loader/Cache.h
WebCore/loader/CachedCSSStyleSheet.cpp
WebCore/loader/CachedCSSStyleSheet.h
WebCore/loader/CachedResourceClient.h
WebCore/loader/CachedXSLStyleSheet.cpp
WebCore/loader/DocLoader.cpp
WebCore/loader/DocLoader.h
WebCore/page/Frame.cpp
WebCore/xml/XSLImportRule.cpp
WebCore/xml/XSLImportRule.h

index 29f9439b4339c2d8caff942cb19c77ad8b6a9149..980373f8fbacd07b89fb0fe7e19fc38ba5b73789 100644 (file)
@@ -1,3 +1,16 @@
+2006-09-30  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        Test for http://bugs.webkit.org/show_bug.cgi?id=11011
+        External CSS is parsed as iso-8859-1 even though the main document is utf-8
+
+        * fast/encoding/css-charset-default-expected.txt: Added.
+        * fast/encoding/css-charset-default.xhtml: Added.
+        * fast/encoding/css-charset-import.css: Added.
+        * fast/encoding/css-charset-inherit-iso-8859-5.css: Added.
+        * fast/encoding/css-charset-inherit-koi-8.css: Added.
+
 2006-09-30  Rob Buis  <buis@kde.org>
 
         Reviewed by eseidel.
diff --git a/LayoutTests/fast/encoding/css-charset-default-expected.txt b/LayoutTests/fast/encoding/css-charset-default-expected.txt
new file mode 100644 (file)
index 0000000..a9515aa
--- /dev/null
@@ -0,0 +1,11 @@
+Test for bug 11011: External CSS is parsed as iso-8859-1 even though the main document is utf-8.
+
+Stylesheet 1 (inherit document charset using xml-stylesheet processing instruction): SUССЕSS
+
+Stylesheet 2 (inherit document charset using link): SUССЕSS
+
+Stylesheet 3 (inherit referring stylesheet charset): SUССЕSS
+
+Stylesheet 4 (inherit referring inline stylesheet charset): SUССЕSS
+
+
diff --git a/LayoutTests/fast/encoding/css-charset-default.xhtml b/LayoutTests/fast/encoding/css-charset-default.xhtml
new file mode 100644 (file)
index 0000000..24432f2
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="iso-8859-5"?>
+<?xml-stylesheet href="css-charset-inherit-iso-8859-5.css?1" type="text/css"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title>CSS Default charset</title>
+    <link rel="stylesheet" type="text/css" href="css-charset-inherit-iso-8859-5.css?2"/>
+    <link rel="stylesheet" type="text/css" href="css-charset-import.css"/>
+    <style type="text/css">
+        @import "css-charset-inherit-iso-8859-5.css?4";
+    </style>
+</head>
+<body onload="test()">
+<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=11011">bug 11011</a>:
+External CSS is parsed as iso-8859-1 even though the main document is utf-8.</p>
+
+<p id="res1">Stylesheet 1 (inherit document charset using xml-stylesheet processing instruction): </p>
+<p id="res2">Stylesheet 2 (inherit document charset using link): </p>
+<p id="res3">Stylesheet 3 (inherit referring stylesheet charset): </p>
+<p id="res4">Stylesheet 4 (inherit referring inline stylesheet charset): </p>
+
+<script type="text/javascript">
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function test() {
+  try {
+    document.getElementById("res1").innerHTML += document.styleSheets[0].cssRules[0].style.content;
+
+    document.getElementById("res2").innerHTML += document.styleSheets[1].cssRules[0].style.content;
+    
+    document.getElementById("res3").innerHTML += document.styleSheets[2].cssRules[1].styleSheet.cssRules[0].style.content;
+
+    document.getElementById("res4").innerHTML += document.styleSheets[3].cssRules[0].styleSheet.cssRules[0].style.content;
+  } catch (ex) {
+    alert(ex.toString());
+  }
+}
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/encoding/css-charset-import.css b/LayoutTests/fast/encoding/css-charset-import.css
new file mode 100644 (file)
index 0000000..4b792b5
--- /dev/null
@@ -0,0 +1,2 @@
+@charset "koi8-r";
+@import "css-charset-inherit-koi-8.css";
diff --git a/LayoutTests/fast/encoding/css-charset-inherit-iso-8859-5.css b/LayoutTests/fast/encoding/css-charset-inherit-iso-8859-5.css
new file mode 100644 (file)
index 0000000..9cedea6
--- /dev/null
@@ -0,0 +1,2 @@
+/* iso-8859-5 encoding */
+#dummy:before { content: "SUÁÁµSS"; }
diff --git a/LayoutTests/fast/encoding/css-charset-inherit-koi-8.css b/LayoutTests/fast/encoding/css-charset-inherit-koi-8.css
new file mode 100644 (file)
index 0000000..3411620
--- /dev/null
@@ -0,0 +1,2 @@
+/* koi-8 encoding */
+#dummy:before { content: "SUóóåSS"; }
index 13f401e3e1942f267ef4933c9db1df70390cf4d2..05d7862b2e935e77dd21e0d031655e05a559048e 100644 (file)
@@ -1,3 +1,92 @@
+2006-09-30  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11011
+        External CSS is parsed as iso-8859-1 even though the main document is utf-8
+
+        Test: fast/encoding/css-charset-default.xhtml
+
+        * loader/CachedResourceClient.h:
+        (WebCore::CachedResourceClient::setCSSStyleSheet):
+        (WebCore::CachedResourceClient::setXSLStyleSheet):
+        Divided setStyleSheet into setCSSStyleSheet and setXSLStyleSheet. The former
+        takes an additional charset parameter, to be passed to CSSStyleSheet constructor.
+
+        * css/CSSImportRule.cpp:
+        (WebCore::CSSImportRule::setCSSStyleSheet):
+        (WebCore::CSSImportRule::insertedIntoParent): Default to parent stylesheet's charset.
+        * css/CSSImportRule.h:
+
+        * css/CSSStyleSheet.cpp:
+        (WebCore::CSSStyleSheet::CSSStyleSheet):
+        * css/CSSStyleSheet.h:
+        Added an m_charset member to be used when loading child stylesheets. Removed an unused m_implicit
+        member. Changed some String parameters to const String&.
+
+        * css/StyleSheet.cpp:
+        (WebCore::StyleSheet::StyleSheet):
+        * css/StyleSheet.h:
+        Changed some String parameters to const String&. Removed an unused (even unimplemented) constructor.
+
+        * css/StyleSheetList.cpp:
+        (WebCore::StyleSheetList::length):
+        (WebCore::StyleSheetList::item):
+        * css/StyleSheetList.h:
+        Special-casing implicit stylesheets seemed to be dead code, removed.
+
+        * dom/Document.cpp:
+        (WebCore::Document::setCSSStyleSheet):
+        (WebCore::Document::recalcStyleSelector):
+        * dom/Document.h:
+        Renamed setStyleSheet() to setCSSStyleSheet().
+
+        * dom/ProcessingInstruction.cpp:
+        (WebCore::ProcessingInstruction::checkStyleSheet): Pass a correct charset to requestCSSStyleSheet().
+        (WebCore::ProcessingInstruction::setCSSStyleSheet):
+        (WebCore::ProcessingInstruction::setXSLStyleSheet):
+        (WebCore::ProcessingInstruction::parseStyleSheet):
+        * dom/ProcessingInstruction.h:
+
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::process): Default to document encoding if a charset attribute 
+        is not specified.
+        (WebCore::HTMLLinkElement::setCSSStyleSheet):
+        * html/HTMLLinkElement.h:
+
+        * html/HTMLStyleElement.cpp:
+        (WebCore::HTMLStyleElement::childrenChanged):
+        * ksvg2/svg/SVGStyleElement.cpp:
+        (WebCore::SVGStyleElement::childrenChanged):
+        Inherit URL and charset from the document.
+
+        * loader/Cache.cpp:
+        (WebCore::Cache::requestCSSStyleSheet):
+        * loader/Cache.h:
+        Adjust for setStyleSheet() renaming.
+
+        * loader/CachedCSSStyleSheet.h: Removed an unused constructor.
+        * loader/CachedCSSStyleSheet.cpp:
+        (WebCore::CachedCSSStyleSheet::ref):
+        (WebCore::CachedCSSStyleSheet::deref):
+        (WebCore::CachedCSSStyleSheet::checkNotify):
+        Pass the encoding to setCSSStyleSheet().
+
+        * loader/CachedXSLStyleSheet.cpp:
+        (WebCore::CachedXSLStyleSheet::ref):
+        (WebCore::CachedXSLStyleSheet::checkNotify):
+        * loader/DocLoader.cpp:
+        (WebCore::DocLoader::requestCSSStyleSheet):
+        * loader/DocLoader.h:
+        * page/Frame.cpp:
+        (WebCore::UserStyleSheetLoader::UserStyleSheetLoader):
+        (WebCore::UserStyleSheetLoader::setCSSStyleSheet):
+        * xml/XSLImportRule.cpp:
+        (WebCore::XSLImportRule::setXSLStyleSheet):
+        (WebCore::XSLImportRule::loadSheet):
+        * xml/XSLImportRule.h:
+        Adjust for setStyleSheet() renaming.
+
 2006-09-30  Rob Buis  <buis@kde.org>
 
         Reviewed by eseidel.
index a521fd510a5d780e6d99894e04a8adcedc06ceed..2c442d2bc644318636b1e72e951851ff3c786850 100644 (file)
@@ -56,11 +56,11 @@ CSSImportRule::~CSSImportRule()
         m_cachedSheet->deref(this);
 }
 
-void CSSImportRule::setStyleSheet(const String &url, const String &sheet)
+void CSSImportRule::setCSSStyleSheet(const String &url, const String& charset, const String &sheet)
 {
     if (m_styleSheet)
         m_styleSheet->setParent(0);
-    m_styleSheet = new CSSStyleSheet(this, url);
+    m_styleSheet = new CSSStyleSheet(this, url, charset);
 
     CSSStyleSheet *parent = parentStyleSheet();
     m_styleSheet->parseString(sheet, !parent || parent->useStrictParsing());
@@ -98,8 +98,7 @@ void CSSImportRule::insertedIntoParent()
         if (absHref == parent->baseURL())
             return;
     
-    // ### pass correct charset here!!
-    m_cachedSheet = docLoader->requestStyleSheet(absHref, String());
+    m_cachedSheet = docLoader->requestCSSStyleSheet(absHref, parentSheet->charset());
     if (m_cachedSheet) {
         m_loading = true;
         m_cachedSheet->ref(this);
index ff781fa77499949bfb7c215883b0007a08cf9139..572d71c3b91f31d115870e31aa557f60d323bbe9 100644 (file)
@@ -49,7 +49,7 @@ public:
     bool isLoading() const;
 
     // from CachedResourceClient
-    virtual void setStyleSheet(const String& url, const String& sheet);
+    virtual void setCSSStyleSheet(const String& url, const String& charset, const String& sheet);
 
     virtual void insertedIntoParent();
 
index c33ab982009e41b7270af69ce985b7591ea136ba..97b0d198a08443a983407796ff2d3dd114c72ad8 100644 (file)
 
 namespace WebCore {
 
-CSSStyleSheet::CSSStyleSheet(CSSStyleSheet* parentSheet, String href)
+CSSStyleSheet::CSSStyleSheet(CSSStyleSheet* parentSheet, const String& href, const String& charset)
     : StyleSheet(parentSheet, href)
     , m_doc(parentSheet ? parentSheet->doc() : 0)
-    , m_implicit(false)
     , m_namespaces(0)
+    , m_charset(charset)
 {
 }
 
-CSSStyleSheet::CSSStyleSheet(Node *parentNode, String href, bool _implicit)
+CSSStyleSheet::CSSStyleSheet(Node *parentNode, const String& href, const String& charset)
     : StyleSheet(parentNode, href)
     , m_doc(parentNode->document())
-    , m_implicit(_implicit) 
     , m_namespaces(0)
+    , m_charset(charset)
 {
 }
 
-CSSStyleSheet::CSSStyleSheet(CSSRule *ownerRule, String href)
+CSSStyleSheet::CSSStyleSheet(CSSRule *ownerRule, const String& href, const String& charset)
     : StyleSheet(ownerRule, href)
     , m_doc(0)
-    , m_implicit(false)
     , m_namespaces(0)
+    , m_charset(charset)
 {
 }
 
index 77abcd100db6de9567cbb176d500d68943a6e024..e875b6a844e21e89519ba23573031c8c8f0ce795 100644 (file)
@@ -39,9 +39,9 @@ typedef int ExceptionCode;
 class CSSStyleSheet : public StyleSheet
 {
 public:
-    CSSStyleSheet(Node* parentNode, String href = String(), bool _implicit = false);
-    CSSStyleSheet(CSSStyleSheet* parentSheet, String href = String());
-    CSSStyleSheet(CSSRule* ownerRule, String href = String());
+    CSSStyleSheet(Node* parentNode, const String& href = String(), const String& charset = String());
+    CSSStyleSheet(CSSStyleSheet* parentSheet, const String& href = String(), const String& charset = String());
+    CSSStyleSheet(CSSRule* ownerRule, const String& href = String(), const String& charset = String());
     
     ~CSSStyleSheet();
     
@@ -68,12 +68,12 @@ public:
     virtual void checkLoaded();
     DocLoader* docLoader();
     Document* doc() { return m_doc; }
-    bool implicit() { return m_implicit; }
+    const String& charset() const { return m_charset; }
 
 protected:
     Document* m_doc;
-    bool m_implicit;
     CSSNamespace* m_namespaces;
+    String m_charset;
 };
 
 } // namespace
index 0aafe64bc6ce7c21fa6c480c406c411e6cf2154e..98027560fa2cae5499a6502311aeb02f47251154 100644 (file)
@@ -26,7 +26,7 @@
 
 namespace WebCore {
 
-StyleSheet::StyleSheet(StyleSheet* parentSheet, String href)
+StyleSheet::StyleSheet(StyleSheet* parentSheet, const String& href)
     : StyleList(parentSheet)
     , m_parentNode(0)
     , m_strHref(href)
@@ -35,7 +35,7 @@ StyleSheet::StyleSheet(StyleSheet* parentSheet, String href)
 }
 
 
-StyleSheet::StyleSheet(Node* parentNode, String href)
+StyleSheet::StyleSheet(Node* parentNode, const String& href)
     : StyleList(0)
     , m_parentNode(parentNode)
     , m_strHref(href)
@@ -43,7 +43,7 @@ StyleSheet::StyleSheet(Node* parentNode, String href)
 {
 }
 
-StyleSheet::StyleSheet(StyleBase* owner, String href)
+StyleSheet::StyleSheet(StyleBase* owner, const String& href)
     : StyleList(owner)
     , m_parentNode(0)
     , m_strHref(href)
index 4f09c7590d5946793ed56d8b63cccb6d40180ee6..d89f57faaa5657d572ca07e652d39a207d135f3f 100644 (file)
@@ -34,10 +34,9 @@ class MediaList;
 
 class StyleSheet : public StyleList {
 public:
-    StyleSheet(Node* ownerNode, String href = String());
-    StyleSheet(StyleSheet* parentSheet, String href = String());
-    StyleSheet(StyleBase* owner, String href = String());
-    StyleSheet(CachedCSSStyleSheet*, String href = String());
+    StyleSheet(Node* ownerNode, const String& href = String());
+    StyleSheet(StyleSheet* parentSheet, const String& href = String());
+    StyleSheet(StyleBase* owner, const String& href = String());
     virtual ~StyleSheet();
 
     virtual bool isStyleSheet() const { return true; }
index c2fe36003417331ade4a5de22e18f372ef165157..bf50321ec674b1cda67f95e59d99b1d42a152709 100644 (file)
@@ -48,28 +48,12 @@ void StyleSheetList::remove(StyleSheet* s)
 
 unsigned StyleSheetList::length() const
 {
-    // hack so implicit BODY stylesheets don't get counted here
-    unsigned l = 0;
-    DeprecatedPtrListIterator<StyleSheet> it(styleSheets);
-    for (; it.current(); ++it) {
-        if (!it.current()->isCSSStyleSheet() || !static_cast<CSSStyleSheet*>(it.current())->implicit())
-            l++;
-    }
-    return l;
+    return styleSheets.count();
 }
 
-StyleSheet *StyleSheetList::item (unsigned index)
+StyleSheet* StyleSheetList::item(unsigned index)
 {
-    unsigned l = 0;
-    DeprecatedPtrListIterator<StyleSheet> it(styleSheets);
-    for (; it.current(); ++it) {
-        if (!it.current()->isCSSStyleSheet() || !static_cast<CSSStyleSheet*>(it.current())->implicit()) {
-            if (l == index)
-                return it.current();
-            l++;
-        }
-    }
-    return 0;
+    return index < length() ? styleSheets.at(index) : 0;
 }
 
 }
index 12ea677c4c604e626ffeb1c9750e30c7ff34362d..f7e47b62d16730abbbde5b7b6ffbd02d98782e4d 100644 (file)
@@ -35,7 +35,6 @@ class StyleSheetList : public Shared<StyleSheetList>
 public:
     ~StyleSheetList();
 
-    // the following two ignore implicit stylesheets
     unsigned length() const;
     StyleSheet* item(unsigned index);
 
index 4580430aa37a3830c6884a7253340897b22f4e85..8377f1dd17a359bc55202eb24c84d2f4b1172893 100644 (file)
@@ -1374,9 +1374,9 @@ void Document::setURL(const DeprecatedString& url)
         m_styleSelector->setEncodedURL(m_url);
 }
 
-void Document::setStyleSheet(const String &url, const String &sheet)
+void Document::setCSSStyleSheet(const String &url, const String& charset, const String &sheet)
 {
-    m_sheet = new CSSStyleSheet(this, url);
+    m_sheet = new CSSStyleSheet(this, url, charset);
     m_sheet->parseString(sheet);
     m_loadingSheet = false;
 
@@ -1855,7 +1855,7 @@ void Document::recalcStyleSelector()
 
                     CSSStyleSheet *cssSheet = new CSSStyleSheet(this);
                     cssSheet->parseString(sheetText);
-                    pi->setStyleSheet(cssSheet);
+                    pi->setCSSStyleSheet(cssSheet);
                     sheet = cssSheet;
                 }
             }
index cd465e84d55155d59d73d39c035775ad39c36378..91da5b020a6a623bcb8b86a2baad002b58966939 100644 (file)
@@ -331,7 +331,7 @@ public:
     String completeURL(const String&);
 
     // from cachedObjectClient
-    virtual void setStyleSheet(const String& url, const String& sheetStr);
+    virtual void setCSSStyleSheet(const String& url, const String& charset, const String& sheetStr);
     void setUserStyleSheet(const String& sheet);
     const String& userStyleSheet() const { return m_usersheet; }
     void setPrintStyleSheet(const String& sheet) { m_printSheet = sheet; }
index d3086a0b6cead591903f68908c8fcba23b3577b2..dea24482b450ccd740b141aa873049c4c5e689da 100644 (file)
@@ -28,6 +28,7 @@
 #include "Document.h"
 #include "DocLoader.h"
 #include "ExceptionCode.h"
+#include "Frame.h"
 #include "XSLStyleSheet.h"
 #include "XMLTokenizer.h" // for parseAttributes()
 
@@ -146,8 +147,7 @@ bool ProcessingInstruction::checkStyleSheet()
             }
             else
             {
-                // ### some validation on the URL?
-                // ### FIXME charset
+                // FIXME: some validation on the URL?
                 if (document()->frame()) {
                     m_loading = true;
                     document()->addPendingSheet();
@@ -158,7 +158,13 @@ bool ProcessingInstruction::checkStyleSheet()
                         m_cachedSheet = document()->docLoader()->requestXSLStyleSheet(document()->completeURL(href));
                     else
 #endif
-                    m_cachedSheet = document()->docLoader()->requestStyleSheet(document()->completeURL(href), String());
+                    {
+                        String charset = attrs.get("charset");
+                        if (charset.isEmpty())
+                            charset = document()->frame()->encoding();
+
+                        m_cachedSheet = document()->docLoader()->requestCSSStyleSheet(document()->completeURL(href), charset);
+                    }
                     if (m_cachedSheet)
                         m_cachedSheet->ref( this );
 #if XSLT_SUPPORT
@@ -188,14 +194,24 @@ void ProcessingInstruction::sheetLoaded()
         document()->stylesheetLoaded();
 }
 
-void ProcessingInstruction::setStyleSheet(const String &url, const String &sheet)
+void ProcessingInstruction::setCSSStyleSheet(const String &url, const String& charset, const String &sheet)
 {
+    ASSERT(!m_isXSL);
+    m_sheet = new CSSStyleSheet(this, url, charset);
+    parseStyleSheet(sheet);
+}
+
 #if XSLT_SUPPORT
-    if (m_isXSL)
-        m_sheet = new XSLStyleSheet(this, url);
-    else
+void ProcessingInstruction::setXSLStyleSheet(const String &url, const String &sheet)
+{
+    ASSERT(m_isXSL);
+    m_sheet = new XSLStyleSheet(this, url);
+    parseStyleSheet(sheet);
+}
 #endif
-        m_sheet = new CSSStyleSheet(this, url);
+
+void ProcessingInstruction::parseStyleSheet(const String &sheet)
+{
     m_sheet->parseString(sheet);
     if (m_cachedSheet)
         m_cachedSheet->deref(this);
@@ -218,8 +234,10 @@ String ProcessingInstruction::toString() const
     return result;
 }
 
-void ProcessingInstruction::setStyleSheet(StyleSheet* sheet)
+void ProcessingInstruction::setCSSStyleSheet(CSSStyleSheet* sheet)
 {
+    ASSERT(!m_cachedSheet);
+    ASSERT(!m_loading);
     m_sheet = sheet;
 }
 
index ae1b9c3ccd5b000cf1bea28a2c8960efa080b76f..4e57ee7ee403cb94b91819e43eac430b454b6766 100644 (file)
@@ -30,6 +30,7 @@
 namespace WebCore {
 
 class StyleSheet;
+class CSSStyleSheet;
 
 class ProcessingInstruction : public ContainerNode, private CachedResourceClient
 {
@@ -55,8 +56,11 @@ public:
     String localHref() const { return m_localHref.get(); }
     StyleSheet* sheet() const { return m_sheet.get(); }
     bool checkStyleSheet();
-    virtual void setStyleSheet(const String& URL, const String& sheet);
-    void setStyleSheet(StyleSheet*);
+    virtual void setCSSStyleSheet(const String& URL, const String& charset, const String& sheet);
+#if XSLT_SUPPORT
+    virtual void setXSLStyleSheet(const String& URL, const String& sheet);
+#endif
+    void setCSSStyleSheet(CSSStyleSheet*);
     bool isLoading() const;
     void sheetLoaded();
     virtual String toString() const;
@@ -66,6 +70,8 @@ public:
 #endif
 
 private:
+    void parseStyleSheet(const String& sheet);
+
     RefPtr<StringImpl> m_target;
     RefPtr<StringImpl> m_data;
     RefPtr<StringImpl> m_localHref;
index 05a6ba5eb106524d949daa40f118da0cdff7a198..470c6ab0d401797fdf903c462c34508920a23f04 100644 (file)
@@ -176,7 +176,10 @@ void HTMLLinkElement::process()
             if (!isAlternate())
                 document()->addPendingSheet();
             
-            DeprecatedString chset = getAttribute(charsetAttr).deprecatedString();
+            String chset = getAttribute(charsetAttr);
+            if (chset.isEmpty() && document()->frame())
+                chset = document()->frame()->encoding();
+            
             if (m_cachedSheet) {
                 if (m_loading) {
                     document()->stylesheetLoaded();
@@ -184,7 +187,7 @@ void HTMLLinkElement::process()
                 m_cachedSheet->deref(this);
             }
             m_loading = true;
-            m_cachedSheet = document()->docLoader()->requestStyleSheet(m_url, chset);
+            m_cachedSheet = document()->docLoader()->requestCSSStyleSheet(m_url, chset);
             if (m_cachedSheet)
                 m_cachedSheet->ref(this);
         }
@@ -207,9 +210,9 @@ void HTMLLinkElement::removedFromDocument()
     process();
 }
 
-void HTMLLinkElement::setStyleSheet(const String& url, const String& sheetStr)
+void HTMLLinkElement::setCSSStyleSheet(const String& url, const String& charset, const String& sheetStr)
 {
-    m_sheet = new CSSStyleSheet(this, url);
+    m_sheet = new CSSStyleSheet(this, url, charset);
     m_sheet->parseString(sheetStr, !document()->inCompatMode());
 
     RefPtr<MediaList> media = new MediaList((CSSStyleSheet*)0, m_media, true);
index 45a70a0930aa9bf5bb9aba227365be526d406f0f..aa53c36c8614291c2fb5723f19b94b003d83a7b0 100644 (file)
@@ -79,7 +79,7 @@ public:
     virtual void removedFromDocument();
 
     // from CachedResourceClient
-    virtual void setStyleSheet(const String &url, const String &sheet);
+    virtual void setCSSStyleSheet(const String &url, const String& charset, const String &sheet);
     bool isLoading() const;
     void sheetLoaded();
 
index fee08d55a3e6573b8f9a9d4be03dc5fbf951a49d..632284c25d96731c3687e534e7a0f98d4ee16206 100644 (file)
@@ -91,7 +91,7 @@ void HTMLStyleElement::childrenChanged()
         if (screenEval.eval(media.get()) || printEval.eval(media.get())) {
             document()->addPendingSheet();
             m_loading = true;
-            m_sheet = new CSSStyleSheet(this);
+            m_sheet = new CSSStyleSheet(this, document()->URL(), document()->inputEncoding());
             m_sheet->parseString(text, !document()->inCompatMode());
             m_sheet->setMedia(media.get());
             m_loading = false;
index 19364519c7eb3642ecfa1e98d62e4873b3430d7d..9993b6c4643f99104946a518893ffd3964098b74 100644 (file)
@@ -95,6 +95,7 @@ void SVGStyleElement::childrenChanged()
     if(m_sheet)
         m_sheet = 0;
 
+    // FIXME: this code should be shared with HTMLStyleElement::childrenChanged()
     m_loading = false;
     MediaQueryEvaluator screenEval("screen", true);
     MediaQueryEvaluator printEval("print", true);   
@@ -104,7 +105,7 @@ void SVGStyleElement::childrenChanged()
 
         m_loading = true;
  
-        m_sheet = new CSSStyleSheet(this);
+        m_sheet = new CSSStyleSheet(this, document()->URL(), document()->inputEncoding());
         m_sheet->parseString(textContent()); // SVG css is always parsed in strict mode
         
         m_sheet->setMedia(mediaList.get());
index 0264045038a160cec52d10c9b29f1c1c20d08796..dccaaefec17040bb4f3b46a305afc846cd0fabc4 100644 (file)
@@ -178,7 +178,7 @@ CachedImage* Cache::requestImage(DocLoader* dl, const KURL& url, bool reload, ti
     return static_cast<CachedImage *>(o);
 }
 
-CachedCSSStyleSheet* Cache::requestStyleSheet(DocLoader* dl, const String& url, bool reload, time_t expireDate, const String& charset)
+CachedCSSStyleSheet* Cache::requestCSSStyleSheet(DocLoader* dl, const String& url, bool reload, time_t expireDate, const String& charset)
 {
     // this brings the _url to a standard form...
     KURL kurl;
@@ -212,7 +212,7 @@ CachedCSSStyleSheet* Cache::requestStyleSheet(DocLoader* dl, const String& url,
     if (o->type() != CachedResource::CSSStyleSheet)
     {
 #ifdef CACHE_DEBUG
-        kdDebug(6060) << "Cache::Internal Error in requestStyleSheet url=" << kurl.url() << "!" << endl;
+        kdDebug(6060) << "Cache::Internal Error in requestCSSStyleSheet url=" << kurl.url() << "!" << endl;
 #endif
         return 0;
     }
index c9ebb619e87ac20d6de56c0b7d6da50e4d368b89..2054c6521c6bd1ac2514187ab02e3d206c915b59 100644 (file)
@@ -62,7 +62,7 @@ namespace WebCore  {
          */
         static CachedImage* requestImage(DocLoader*, const String& URL, bool reload = false, time_t expireDate = 0);
         static CachedImage* requestImage(DocLoader*, const KURL& URL, bool reload, time_t expireDate);
-        static CachedCSSStyleSheet* requestStyleSheet(DocLoader*, const String& URL, bool reload, time_t expireDate, const String& charset);
+        static CachedCSSStyleSheet* requestCSSStyleSheet(DocLoader*, const String& URL, bool reload, time_t expireDate, const String& charset);
         static CachedScript* requestScript(DocLoader*, const String& URL, bool reload, time_t expireDate, const String& charset);
 
 #ifdef XSLT_SUPPORT
index c77c71536371b0a7467e2b9de3c55ed48e5a599a..9365514f7554596538757a7b6e1f09901225ff55 100644 (file)
@@ -51,14 +51,6 @@ CachedCSSStyleSheet::CachedCSSStyleSheet(DocLoader* dl, const String& url, Cache
     m_loading = true;
 }
 
-CachedCSSStyleSheet::CachedCSSStyleSheet(const String &url, const String& stylesheet_data)
-    : CachedResource(url, CSSStyleSheet, CachePolicyVerify, 0, stylesheet_data.length())
-{
-    m_loading = false;
-    m_status = Persistent;
-    m_sheet = stylesheet_data;
-}
-
 CachedCSSStyleSheet::~CachedCSSStyleSheet()
 {
 }
@@ -68,15 +60,15 @@ void CachedCSSStyleSheet::ref(CachedResourceClient *c)
     CachedResource::ref(c);
 
     if (!m_loading)
-        c->setStyleSheet(m_url, m_sheet);
+        c->setCSSStyleSheet(m_url, m_decoder->encoding().name(), m_sheet);
 }
 
 void CachedCSSStyleSheet::deref(CachedResourceClient *c)
 {
     Cache::flush();
     CachedResource::deref(c);
-    if ( canDelete() && m_free )
-      delete this;
+    if (canDelete() && m_free)
+        delete this;
 }
 
 void CachedCSSStyleSheet::setCharset(const String& chs)
@@ -105,10 +97,10 @@ void CachedCSSStyleSheet::checkNotify()
     while (CachedResourceClient *c = w.next()) {
 #if __APPLE__
         if (m_response && !IsResponseURLEqualToURL(m_response, m_url))
-            c->setStyleSheet(String(ResponseURL(m_response)), m_sheet);
+            c->setCSSStyleSheet(ResponseURL(m_response), m_decoder->encoding().name(), m_sheet);
         else
 #endif
-            c->setStyleSheet(m_url, m_sheet);
+            c->setCSSStyleSheet(m_url, m_decoder->encoding().name(), m_sheet);
     }
 }
 
index 886182903ae49c42ad68efd60988bef795572121..3876c0efbc38ab53fe9f49791b897f96bf40740b 100644 (file)
@@ -40,7 +40,6 @@ namespace WebCore {
     class CachedCSSStyleSheet : public CachedResource {
     public:
         CachedCSSStyleSheet(DocLoader*, const String& URL, CachePolicy, time_t expireDate, const String& charset);
-        CachedCSSStyleSheet(const String& URL, const String& stylesheetData);
         virtual ~CachedCSSStyleSheet();
 
         const String& sheet() const { return m_sheet; }
index be2bf809c7941bf8c402bc0ad6744771d2080620..29c2feaba9b8222cc4d78a580c9804c0d6b67802 100644 (file)
@@ -63,7 +63,8 @@ namespace WebCore {
         // e.g., in the b/f cache or in a background tab).
         virtual bool willRenderImage(CachedImage*) { return false; }
 
-        virtual void setStyleSheet(const String& /*URL*/, const String& /*sheet*/) { }
+        virtual void setCSSStyleSheet(const String& /*URL*/, const String& /*charset*/, const String& /*sheet*/) { }
+        virtual void setXSLStyleSheet(const String& /*URL*/, const String& /*sheet*/) { }
 
 #ifdef XBL_SUPPORT
         virtual void setXBLDocument(const String& /*URL*/, XBL::XBLDocument*) { }
index 4abbe74fed222f2ca28dec24da91c0475479bca3..c1be3f9ee71527ac69e8e402762f9154be227b1c 100644 (file)
@@ -58,7 +58,7 @@ void CachedXSLStyleSheet::ref(CachedResourceClient *c)
     CachedResource::ref(c);
     
     if (!m_loading)
-        c->setStyleSheet(m_url, m_sheet);
+        c->setXSLStyleSheet(m_url, m_sheet);
 }
 
 void CachedXSLStyleSheet::deref(CachedResourceClient *c)
@@ -93,7 +93,7 @@ void CachedXSLStyleSheet::checkNotify()
     
     CachedResourceClientWalker w(m_clients);
     while (CachedResourceClient *c = w.next())
-        c->setStyleSheet(m_url, m_sheet);
+        c->setXSLStyleSheet(m_url, m_sheet);
 }
 
 
index 553391ae089d9465217869199fb76e3640c7f0bb..cc8c5698a8687454ae0c7f73a516aed9c6935bb1 100644 (file)
@@ -101,7 +101,7 @@ CachedImage *DocLoader::requestImage(const String& url)
     return cachedObject;
 }
 
-CachedCSSStyleSheet *DocLoader::requestStyleSheet(const String& url, const String& charset)
+CachedCSSStyleSheet *DocLoader::requestCSSStyleSheet(const String& url, const String& charset)
 {
     KURL fullURL = m_doc->completeURL(url.deprecatedString());
 
@@ -110,7 +110,7 @@ CachedCSSStyleSheet *DocLoader::requestStyleSheet(const String& url, const Strin
 
     bool reload = needReload(fullURL);
 
-    CachedCSSStyleSheet* cachedObject = Cache::requestStyleSheet(this, url, reload, m_expireDate, charset);
+    CachedCSSStyleSheet* cachedObject = Cache::requestCSSStyleSheet(this, url, reload, m_expireDate, charset);
     CheckCacheObjectStatus(this, cachedObject);
     return cachedObject;
 }
index 38c692d4b51aab05027bed7631b6733b9ac9d0f8..1dd919944d35476a9a968332e558e98cf1383f6a 100644 (file)
@@ -54,7 +54,7 @@ namespace WebCore {
         ~DocLoader();
 
         CachedImage* requestImage(const String& url);
-        CachedCSSStyleSheet* requestStyleSheet(const String& url, const String& charset);
+        CachedCSSStyleSheet* requestCSSStyleSheet(const String& url, const String& charset);
         CachedScript* requestScript(const String& url, const String& charset);
 
 #ifdef XSLT_SUPPORT
index 00a27ef81786974a48efa3093dfd694599ac9ab7..73561afb9608e469bcce931168b841a03df374b1 100644 (file)
@@ -123,7 +123,7 @@ class UserStyleSheetLoader : public CachedResourceClient {
 public:
     UserStyleSheetLoader(Frame* frame, const String& url, DocLoader* dl)
         : m_frame(frame)
-        , m_cachedSheet(Cache::requestStyleSheet(dl, url, false, 0, ""))
+        , m_cachedSheet(Cache::requestCSSStyleSheet(dl, url, false, 0, ""))
     {
         m_cachedSheet->ref(this);
     }
@@ -132,7 +132,7 @@ public:
         m_cachedSheet->deref(this);
     }
 private:
-    virtual void setStyleSheet(const String& /*URL*/, const String& sheet)
+    virtual void setCSSStyleSheet(const String& /*URL*/, const String& /*charset*/, const String& sheet)
     {
         m_frame->setUserStyleSheet(sheet);
     }
index 54d456df5ec7a22b5fb5ff462f9d91dad9beae03..5d6c053a6f56aaf99d66c727b8d79d8237fb20bd 100644 (file)
@@ -52,7 +52,7 @@ XSLStyleSheet* XSLImportRule::parentStyleSheet() const
     return (parent() && parent()->isXSLStyleSheet()) ? static_cast<XSLStyleSheet*>(parent()) : 0;
 }
 
-void XSLImportRule::setStyleSheet(const String& url, const String& sheet)
+void XSLImportRule::setXSLStyleSheet(const String& url, const String& sheet)
 {
     if (m_styleSheet)
         m_styleSheet->setParent(0);
@@ -102,7 +102,7 @@ void XSLImportRule::loadSheet()
     if (m_cachedSheet) {
         m_cachedSheet->ref(this);
         
-        // If the imported sheet is in the cache, then setStyleSheet gets called,
+        // If the imported sheet is in the cache, then setXSLStyleSheet gets called,
         // and the sheet even gets parsed (via parseString).  In this case we have
         // loaded (even if our subresources haven't), so if we have a stylesheet after
         // checking the cache, then we've clearly loaded.
index 3dd7a4666553c102d3905ccc60cc7d3da091832b..e4baf9a3c683ae9bf1f0d2f795955a90dba233b9 100644 (file)
@@ -45,7 +45,7 @@ public:
     XSLStyleSheet* parentStyleSheet() const;
     
     // from CachedResourceClient
-    virtual void setStyleSheet(const String& url, const String& sheet);
+    virtual void setXSLStyleSheet(const String& url, const String& sheet);
     
     bool isLoading();
     void loadSheet();