Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Sep 2006 18:34:29 +0000 (18:34 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Sep 2006 18:34:29 +0000 (18:34 +0000)
        http://bugzilla.opendarwin.org/show_bug.cgi?id=10676
        @charset rules not accessible via DOM

        Test: fast/encoding/css-charset-dom.html

        * WebCore.xcodeproj/project.pbxproj: Added CSSCharsetRule.cpp
        * bindings/js/kjs_css.cpp:
        (KJS::DOMCSSStyleSheet::getValueProperty):
        Separated Rules and CssRules, since now they behave differently.

        * css/CSSCharsetRule.h: Make the constructor take an encoding.
        * css/CSSCharsetRule.cpp: Added.

        * css/CSSGrammar.y: Create CSSStylesheetRules as necessary.

        * css/CSSRuleList.cpp:
        (WebCore::CSSRuleList::CSSRuleList):
        * css/CSSRuleList.h:
        * css/CSSStyleSheet.cpp:
        (WebCore::CSSStyleSheet::cssRules):
        * css/CSSStyleSheet.h:
        Skip charset rules in IE compatibility mode.

        * css/StyleBase.h:
        (WebCore::StyleBase::isCharsetRule): Fixed a typo.

        * css/cssparser.cpp:
        (WebCore::CSSParser::createCharsetRule):
        * css/cssparser.h:
        Added createCharsetRule().

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

15 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/encoding/css-charset-dom-expected.txt [new file with mode: 0644]
LayoutTests/fast/encoding/css-charset-dom.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/bindings/js/kjs_css.cpp
WebCore/css/CSSCharsetRule.cpp [new file with mode: 0644]
WebCore/css/CSSCharsetRule.h
WebCore/css/CSSGrammar.y
WebCore/css/CSSRuleList.cpp
WebCore/css/CSSRuleList.h
WebCore/css/CSSStyleSheet.cpp
WebCore/css/CSSStyleSheet.h
WebCore/css/StyleBase.h
WebCore/css/cssparser.cpp
WebCore/css/cssparser.h

index ac345aa4e4479997d7acb51f48a4a56fcb5ad039..202a42d131fc1cd84886a477e2d3c0380376c8e9 100644 (file)
@@ -1,3 +1,13 @@
+2006-09-04  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        Test for http://bugzilla.opendarwin.org/show_bug.cgi?id=10676
+        @charset rules not accessible via DOM
+
+        * fast/encoding/css-charset-dom-expected.txt: Added.
+        * fast/encoding/css-charset-dom.html: Added.
+
 2006-09-04  Rob Buis  <buis@kde.org>
 
         Reviewed by Eric.
diff --git a/LayoutTests/fast/encoding/css-charset-dom-expected.txt b/LayoutTests/fast/encoding/css-charset-dom-expected.txt
new file mode 100644 (file)
index 0000000..9c72fb8
--- /dev/null
@@ -0,0 +1,9 @@
+Test for bug 10676: @charset rules not accessible via DOM
+
+cssText: @charset "utf-8";
+encoding: utf-8
+Resetting encoding...
+cssText: @charset "koi8-r";
+encoding: koi8-r
+
+
diff --git a/LayoutTests/fast/encoding/css-charset-dom.html b/LayoutTests/fast/encoding/css-charset-dom.html
new file mode 100644 (file)
index 0000000..237b85c
--- /dev/null
@@ -0,0 +1,32 @@
+<html>
+<head>
+    <meta content="text/html; charset=windows-1251" http-equiv="Content-Type"/>
+    <link rel="stylesheet" type="text/css" href="css-charset.css" charset="windows-1251">
+    <!-- The document charset and link charset have lower priority than @charset, so they 
+         shouldn't affect anything. -->
+</head>
+<body onload="test()">
+<p>Test for <a href="http://bugzilla.opendarwin.org/show_bug.cgi?id=10676">bug 10676</a>:
+@charset rules not accessible via DOM</p>
+
+<p id="result"></p>
+
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function test() {
+  try {
+    charsetRule = document.styleSheets[0].cssRules[0];
+    document.getElementById("result").innerHTML = "cssText: " + charsetRule.cssText + "<br>encoding: " + charsetRule.encoding;
+    document.getElementById("result").innerHTML += "<br>Resetting encoding...";
+    charsetRule.encoding = "koi8-r";
+    document.getElementById("result").innerHTML += "<br>cssText: " + charsetRule.cssText + "<br>encoding: " + charsetRule.encoding;
+  } catch (ex) {
+    document.getElementById("result").textContent = ex.toString();
+  }
+}
+</script>
+
+</body>
+</html>
index b7f8c8133c8466d8a325b6b5261068a23d71650d..1a0bc151717ed4e2e48f3f75c1cb6e3aa9c30956 100644 (file)
@@ -1,3 +1,38 @@
+2006-09-04  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=10676
+        @charset rules not accessible via DOM
+
+        Test: fast/encoding/css-charset-dom.html
+
+        * WebCore.xcodeproj/project.pbxproj: Added CSSCharsetRule.cpp
+        * bindings/js/kjs_css.cpp:
+        (KJS::DOMCSSStyleSheet::getValueProperty):
+        Separated Rules and CssRules, since now they behave differently.
+
+        * css/CSSCharsetRule.h: Make the constructor take an encoding.
+        * css/CSSCharsetRule.cpp: Added.
+
+        * css/CSSGrammar.y: Create CSSStylesheetRules as necessary.
+
+        * css/CSSRuleList.cpp:
+        (WebCore::CSSRuleList::CSSRuleList):
+        * css/CSSRuleList.h:
+        * css/CSSStyleSheet.cpp:
+        (WebCore::CSSStyleSheet::cssRules):
+        * css/CSSStyleSheet.h:
+        Skip charset rules in IE compatibility mode.
+
+        * css/StyleBase.h:
+        (WebCore::StyleBase::isCharsetRule): Fixed a typo.
+
+        * css/cssparser.cpp:
+        (WebCore::CSSParser::createCharsetRule):
+        * css/cssparser.h:
+        Added createCharsetRule().
+
 2006-09-04  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by Darin.
index 59fcb3e1cc89d631ee42c386f8d4a99ace719166..10d979e71b4ae98f7339be5ead77d70b28664bc1 100644 (file)
@@ -611,8 +611,9 @@ JSValue* DOMCSSStyleSheet::getValueProperty(ExecState* exec, int token) const
   case OwnerRule:
     return toJS(exec, static_cast<CSSStyleSheet*>(impl())->ownerRule());
   case CssRules:
-  case Rules:
     return toJS(exec, static_cast<CSSStyleSheet*>(impl())->cssRules());
+  case Rules:
+    return toJS(exec, static_cast<CSSStyleSheet*>(impl())->cssRules(true));
   default:
     assert(0);
     return jsUndefined();
diff --git a/WebCore/css/CSSCharsetRule.cpp b/WebCore/css/CSSCharsetRule.cpp
new file mode 100644 (file)
index 0000000..3321ca4
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ * This file is part of the DOM implementation for KDE.
+ *
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Alexey Proskuryakov (ap@macrules.ru)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include "config.h"
+#include "CSSCharsetRule.h"
+
+namespace WebCore {
+
+CSSCharsetRule::CSSCharsetRule(StyleBase* parent, const String& encoding) 
+    : CSSRule(parent)
+    , m_encoding(encoding)
+{
+    m_type = CHARSET_RULE;
+}
+
+CSSCharsetRule::~CSSCharsetRule()
+{
+}
+
+String CSSCharsetRule::cssText() const
+{
+    return "@charset \"" + m_encoding + "\";";
+}
+
+}
index ae12c766f4652edc7665158e2265bbe4cea93201..83d52c3cc377ecfdebae71901cac2c600a915700 100644 (file)
@@ -32,13 +32,14 @@ namespace WebCore {
 class CSSCharsetRule : public CSSRule
 {
 public:
-    CSSCharsetRule(StyleBase* parent) : CSSRule(parent) { m_type = CHARSET_RULE; }
+    CSSCharsetRule(StyleBase* parent, const String& encoding);
+    virtual ~CSSCharsetRule();
 
     virtual bool isCharsetRule() { return true; }
     virtual String cssText() const;
 
     String encoding() const { return m_encoding; }
-    void setEncoding(String _encoding) { m_encoding = _encoding; }
+    void setEncoding(const String& encoding) { m_encoding = encoding; }
 
 protected:
     String m_encoding;
index 27f363901f8a755e50da41627696ca1cc5ed3b13..69384179c94fb5f6a538e751644d2b786ef47e4a 100644 (file)
@@ -227,6 +227,7 @@ static int cssyylex(YYSTYPE *yylval) { return CSSParser::current()->lex(yylval);
 
 %type <relation> combinator
 
+%type <rule> charset
 %type <rule> ruleset
 %type <rule> media
 %type <rule> import
@@ -343,10 +344,22 @@ maybe_sgml:
 
 maybe_charset:
    /* empty */
-  | CHARSET_SYM maybe_space STRING maybe_space ';'
-  | CHARSET_SYM error invalid_block
-  | CHARSET_SYM error ';'
- ;
+  | charset {
+  }
+;
+
+charset:
+  CHARSET_SYM maybe_space STRING maybe_space ';' {
+     CSSParser* p = static_cast<CSSParser*>(parser);
+     $$ = static_cast<CSSParser *>(parser)->createCharsetRule($3);
+     if ($$ && p->styleElement && p->styleElement->isCSSStyleSheet())
+         p->styleElement->append($$);
+  }
+  | CHARSET_SYM error invalid_block {
+  }
+  | CHARSET_SYM error ';' {
+  }
+;
 
 import_list:
  /* empty */
index a9f06945917cd7525b91a26babf77d8db08718c1..9ae88b3768480f467e88fa1a51130ac425d99107 100644 (file)
@@ -32,13 +32,13 @@ CSSRuleList::CSSRuleList()
 {
 }
 
-CSSRuleList::CSSRuleList(StyleList* lst)
+CSSRuleList::CSSRuleList(StyleList* lst, bool omitCharsetRules)
 {
     if (lst) {
         unsigned len = lst->length();
         for (unsigned i = 0; i < len; ++i) {
             StyleBase* style = lst->item(i);
-            if (style->isRule())
+            if (style->isRule() && !(omitCharsetRules && style->isCharsetRule()))
                 append(static_cast<CSSRule*>(style));
         }
     }
index e982b62a3642946f76fc489b23c0443f4170c7d6..81c0b171144c94185c19fc9c7166993f83ccc0ee 100644 (file)
@@ -36,7 +36,7 @@ class CSSRuleList : public Shared<CSSRuleList>
 {
 public:
     CSSRuleList();
-    CSSRuleList(StyleList*);
+    CSSRuleList(StyleList*, bool omitCharsetRules = false);
     ~CSSRuleList();
 
     unsigned length() const { return m_lstCSSRules.count(); }
index 0d43f3b64d2ab0de294facce54b790188558fb67..c33ab982009e41b7270af69ce985b7591ea136ba 100644 (file)
@@ -98,9 +98,9 @@ unsigned CSSStyleSheet::addRule(const String &selector, const String &style, int
     return insertRule(selector + " { " + style + " }", index, ec);
 }
 
-CSSRuleList *CSSStyleSheet::cssRules()
+CSSRuleList *CSSStyleSheet::cssRules(bool omitCharsetRules)
 {
-    return new CSSRuleList(this);
+    return new CSSRuleList(this, omitCharsetRules);
 }
 
 void CSSStyleSheet::deleteRule(unsigned index, ExceptionCode& ec)
index 6dc343d59a1af54dbb12ecdbd021aca5b1cc8c09..77abcd100db6de9567cbb176d500d68943a6e024 100644 (file)
@@ -50,7 +50,7 @@ public:
     virtual String type() const { return "text/css"; }
 
     CSSRule* ownerRule() const;
-    CSSRuleList* cssRules();
+    CSSRuleList* cssRules(bool omitCharsetRules = false);
     unsigned insertRule(const String& rule, unsigned index, ExceptionCode&);
     void deleteRule(unsigned index, ExceptionCode&);
     unsigned addRule(const String& selector, const String& style, int index, ExceptionCode&);
index ab6e25fd7b0ac58a89cee9fff75f6dd315f53d03..26c1d38762b1e8bf229dde4c19bbbaf430638dc4 100644 (file)
@@ -54,7 +54,7 @@ namespace WebCore {
         virtual bool isRuleList() { return false; }
         virtual bool isRule() { return false; }
         virtual bool isStyleRule() { return false; }
-        virtual bool isCharetRule() { return false; }
+        virtual bool isCharsetRule() { return false; }
         virtual bool isImportRule() { return false; }
         virtual bool isMediaRule() { return false; }
         virtual bool isFontFaceRule() { return false; }
index d7e191955ed1fdc33f8fb9016a6daa661ee65924..ccf02a0b7f8a25f96fcbb3d939a09b2eddb94d10 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "CSSBorderImageValue.h"
 #include "CSSImageValue.h"
+#include "CSSCharsetRule.h"
 #include "CSSImportRule.h"
 #include "CSSInheritedValue.h"
 #include "CSSInitialValue.h"
@@ -3006,6 +3007,17 @@ MediaList* CSSParser::createMediaList()
     return list;
 }
 
+CSSRule* CSSParser::createCharsetRule(const ParseString& charset)
+{
+    if (!styleElement)
+        return 0;
+    if (!styleElement->isCSSStyleSheet())
+        return 0;
+    CSSCharsetRule* rule = new CSSCharsetRule(styleElement, domString(charset));
+    m_parsedStyleObjects.append(rule);
+    return rule;
+}
+
 CSSRule* CSSParser::createImportRule(const ParseString& URL, MediaList* media)
 {
     if (!media)
index 41aff23776267836bc0daa4244d8fc55edf7c467..cfef6883aae2d537a8dcc4cbc890ffc3d990c1b3 100644 (file)
@@ -179,6 +179,7 @@ namespace WebCore {
         Value& sinkFloatingValue(Value&);
 
         MediaList* createMediaList();
+        CSSRule* createCharsetRule(const ParseString&);
         CSSRule* createImportRule(const ParseString&, MediaList*);
         CSSRule* createMediaRule(MediaList*, CSSRuleList*);
         CSSRuleList* createRuleList();