2008-11-26 Matt Perry <mpcomplete@gmail.com>
authordarin@chromium.org <darin@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Nov 2008 21:07:03 +0000 (21:07 +0000)
committerdarin@chromium.org <darin@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Nov 2008 21:07:03 +0000 (21:07 +0000)
        Reviewed by Maciej Stachowiak.

        Fix https://bugs.webkit.org/show_bug.cgi?id=22051
        Renderthemes should be able to supply additional CSS rules to the core
        ones.

        * DerivedSources.make:
        * css/CSSStyleSelector.cpp:
        (WebCore::parseUASheet):
        (WebCore::loadFullDefaultStyle):
        (WebCore::loadSimpleDefaultStyle):
        * css/themeWin.css: Added.
        * css/themeWinQuirks.css: Added.
        * platform/qt/RenderThemeQt.cpp:
        (WebCore::RenderThemeQt::extraDefaultStyleSheet):
        * platform/qt/RenderThemeQt.h:
        * rendering/RenderTheme.cpp:
        * rendering/RenderTheme.h:
        (WebCore::RenderTheme::extraDefaultStyleSheet):
        (WebCore::RenderTheme::extraQuirksStyleSheet):
        * rendering/RenderThemeWin.cpp:
        (WebCore::RenderThemeWin::extraDefaultStyleSheet):
        (WebCore::RenderThemeWin::extraQuirksStyleSheet):
        * rendering/RenderThemeWin.h:

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

WebCore/ChangeLog
WebCore/DerivedSources.make
WebCore/css/CSSStyleSelector.cpp
WebCore/css/themeWin.css [new file with mode: 0644]
WebCore/css/themeWinQuirks.css [new file with mode: 0644]
WebCore/platform/qt/RenderThemeQt.cpp
WebCore/platform/qt/RenderThemeQt.h
WebCore/rendering/RenderTheme.cpp
WebCore/rendering/RenderTheme.h
WebCore/rendering/RenderThemeWin.cpp
WebCore/rendering/RenderThemeWin.h

index aef7610..6fe02b0 100644 (file)
@@ -1,3 +1,30 @@
+2008-11-26  Matt Perry  <mpcomplete@gmail.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        Fix https://bugs.webkit.org/show_bug.cgi?id=22051
+        Renderthemes should be able to supply additional CSS rules to the core
+        ones.
+
+        * DerivedSources.make:
+        * css/CSSStyleSelector.cpp:
+        (WebCore::parseUASheet):
+        (WebCore::loadFullDefaultStyle):
+        (WebCore::loadSimpleDefaultStyle):
+        * css/themeWin.css: Added.
+        * css/themeWinQuirks.css: Added.
+        * platform/qt/RenderThemeQt.cpp:
+        (WebCore::RenderThemeQt::extraDefaultStyleSheet):
+        * platform/qt/RenderThemeQt.h:
+        * rendering/RenderTheme.cpp:
+        * rendering/RenderTheme.h:
+        (WebCore::RenderTheme::extraDefaultStyleSheet):
+        (WebCore::RenderTheme::extraQuirksStyleSheet):
+        * rendering/RenderThemeWin.cpp:
+        (WebCore::RenderThemeWin::extraDefaultStyleSheet):
+        (WebCore::RenderThemeWin::extraQuirksStyleSheet):
+        * rendering/RenderThemeWin.h:
+
 2008-11-26  David Kilzer  <ddkilzer@apple.com>
 
         Make CSSStyleSheet::addSubresourceURLStrings() iterative
index fcbc772..7d62c02 100644 (file)
@@ -509,7 +509,7 @@ XPathGrammar.cpp : xml/XPathGrammar.y $(PROJECT_FILE)
 
 # user agent style sheets
 
-USER_AGENT_STYLE_SHEETS = $(WebCore)/css/html4.css $(WebCore)/css/quirks.css $(WebCore)/css/view-source.css $(WebCore)/css/svg.css $(WebCore)/css/wml.css
+USER_AGENT_STYLE_SHEETS = $(WebCore)/css/html4.css $(WebCore)/css/quirks.css $(WebCore)/css/view-source.css $(WebCore)/css/svg.css $(WebCore)/css/wml.css $(WebCore)/css/themeWin.css $(WebCore)/css/themeWinQuirks.css
 UserAgentStyleSheets.h : css/make-css-file-arrays.pl $(USER_AGENT_STYLE_SHEETS)
        perl $< $@ UserAgentStyleSheetsData.cpp $(USER_AGENT_STYLE_SHEETS)
 
index 0af0f19..0b172a1 100644 (file)
@@ -480,13 +480,18 @@ CSSStyleSelector::~CSSStyleSelector()
     m_keyframesRuleMap.clear();
 }
 
-static CSSStyleSheet* parseUASheet(const char* characters, unsigned size)
+static CSSStyleSheet* parseUASheet(const String& str)
 {
     CSSStyleSheet* sheet = CSSStyleSheet::create().releaseRef(); // leak the sheet on purpose
-    sheet->parseString(String(characters, size));
+    sheet->parseString(str);
     return sheet;
 }
 
+static CSSStyleSheet* parseUASheet(const char* characters, unsigned size)
+{
+    return parseUASheet(String(characters, size));
+}
+
 static void loadFullDefaultStyle()
 {
     if (simpleDefaultStyleSheet) {
@@ -503,15 +508,17 @@ static void loadFullDefaultStyle()
     }
 
     // Strict-mode rules.
-    CSSStyleSheet* defaultSheet = parseUASheet(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet));
-    RenderTheme::adjustDefaultStyleSheet(defaultSheet);
+    String defaultRules = String(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet)) + theme()->extraDefaultStyleSheet();
+    CSSStyleSheet* defaultSheet = parseUASheet(defaultRules);
     defaultStyle->addRulesFromSheet(defaultSheet, screenEval());
     defaultPrintStyle->addRulesFromSheet(defaultSheet, printEval());
 
     // Quirks-mode rules.
-    defaultQuirksStyle->addRulesFromSheet(parseUASheet(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)), screenEval());
+    String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + theme()->extraQuirksStyleSheet();
+    CSSStyleSheet* quirksSheet = parseUASheet(quirksRules);
+    defaultQuirksStyle->addRulesFromSheet(quirksSheet, screenEval());
 }
-    
+
 static void loadSimpleDefaultStyle()
 {
     ASSERT(!defaultStyle);
@@ -522,7 +529,6 @@ static void loadSimpleDefaultStyle()
     defaultQuirksStyle = new CSSRuleSet;
 
     simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));
-    RenderTheme::adjustDefaultStyleSheet(simpleDefaultStyleSheet);
     defaultStyle->addRulesFromSheet(simpleDefaultStyleSheet, screenEval());
     
     // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.
diff --git a/WebCore/css/themeWin.css b/WebCore/css/themeWin.css
new file mode 100644 (file)
index 0000000..42962c4
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2008, Google Inc. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* These styles override the default styling for HTML elements as defined in
+   WebCore/css/html4.css. So far we have used this file exclusively for
+   making our form elements match Firefox's. */
+
+input:not([type]), 
+input[type="text"],
+input[type="password"],
+input[type="search"] {
+    margin:0;
+    padding:1px 0;
+}
+
+input[type="checkbox"] {
+    margin:3px 3px 3px 4px;
+}
+
+input[type="radio"] {
+    margin:3px 3px 0 5px;
+}
+
+/* Not sure this is the right color. #EBEBE4 is what Firefox uses.
+   FIXME: Figure out how to support legacy input rendering. 
+   FIXME: Add input[type="file"] once we figure out our file inputs.
+   FIXME: Add input[type="image"] once we figure out our image inputs.
+   FIXME: We probably do the wrong thing if you put an invalid input type.
+          do we care?
+*/
+textarea:disabled,
+input:not([type]):disabled, 
+input[type="text"]:disabled,
+input[type="password"]:disabled,
+input[type="search"]:disabled {
+    background-color: #EBEBE4; 
+}
+
+/* Windows should render input[type="search"] the same as input with no type.
+   This search thing is an Apple-ism to get mac style search inputs. */
+input[type="search"] {
+    -webkit-appearance: textfield;
+    -webkit-box-sizing: content-box;
+}
+
+input[type="button"], input[type="submit"], input[type="reset"], input[type="file"]::-webkit-file-upload-button, button {
+    /* Matches Firefox */
+    padding: 0 6px;
+    margin: 0;
+}
+
+/* Windows selects are not rounded. Custom borders for them shouldn't be either. */
+keygen, 
+select, 
+select[size="0"],
+select[size="1"] {
+    -webkit-border-radius: 0;
+    margin: 0;
+}
+
+textarea {
+  font-family: monospace;
+  margin: 1px 0;
+
+  /* Matches IE */
+  padding: 2px;
+}
diff --git a/WebCore/css/themeWinQuirks.css b/WebCore/css/themeWinQuirks.css
new file mode 100644 (file)
index 0000000..688eabc
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2008, Google Inc. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* These styles override the default styling for HTML elements in quirks-mode
+   as defined in WebCore/css/quirks.css. So far we have used this file exclusively for
+   making our form elements match Firefox's. */
+
+textarea {
+  /* Matches IE's text offsets in quirksmode (causes text to wrap the same as IE). */
+  padding: 2px 0 0 2px;
+}
index 4c9f2d7..c4ecbd6 100644 (file)
@@ -752,13 +752,15 @@ ControlPart RenderThemeQt::applyTheme(QStyleOption& option, RenderObject* o) con
     return result;
 }
 
-void RenderTheme::adjustDefaultStyleSheet(CSSStyleSheet* style)
+String RenderThemeQt::extraDefaultStyleSheet()
 {
     QFile platformStyleSheet(":/webcore/resources/html4-adjustments-qt.css");
     if (platformStyleSheet.open(QFile::ReadOnly)) {
         QByteArray sheetData = platformStyleSheet.readAll();
-        style->parseString(QString::fromUtf8(sheetData.constData(), sheetData.length()));
+        return QString::fromUtf8(sheetData.constData(), sheetData.length());
     }
+
+    return String(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet));
 }
 
 #if ENABLE(VIDEO)
index 76e1855..4b83411 100644 (file)
@@ -42,6 +42,8 @@ public:
     RenderThemeQt();
     virtual ~RenderThemeQt();
 
+    virtual String extraDefaultStyleSheet();
+
     virtual bool supportsHover(const RenderStyle*) const;
     virtual bool supportsFocusRing(const RenderStyle* style) const;
 
index 4e4746e..1d0aea0 100644 (file)
@@ -198,12 +198,6 @@ void RenderTheme::adjustStyle(CSSStyleSelector* selector, RenderStyle* style, El
     }
 }
 
-#if !PLATFORM(QT)
-void RenderTheme::adjustDefaultStyleSheet(CSSStyleSheet*)
-{
-}
-#endif
-
 bool RenderTheme::paint(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
 {
     // If painting is disabled, but we aren't updating control tints, then just bail.
index 9b76df3..7b53944 100644 (file)
@@ -50,10 +50,6 @@ public:
     void adjustStyle(CSSStyleSelector*, RenderStyle*, Element*,  bool UAHasAppearance,
                      const BorderData&, const FillLayer&, const Color& backgroundColor);
 
-    // This method is called once, from CSSStyleSelector::loadDefaultStyle(), to let each platform adjust
-    // the default CSS rules in html4.css.
-    static void adjustDefaultStyleSheet(CSSStyleSheet*);
-
     // This method is called to paint the widget as a background of the RenderObject.  A widget's foreground, e.g., the
     // text of a button, is always rendered by the engine itself.  The boolean return value indicates
     // whether the CSS border/background should also be painted.
@@ -64,6 +60,11 @@ public:
     // The remaining methods should be implemented by the platform-specific portion of the theme, e.g.,
     // RenderThemeMac.cpp for Mac OS X.
 
+    // These methods return the theme's extra style sheets rules, to let each
+    // platform adjust the default CSS rules in html4.css or quirks.css.
+    virtual String extraDefaultStyleSheet() { return String(); }
+    virtual String extraQuirksStyleSheet() { return String(); }
+
     // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
     // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
     // controls that need to do this.
index 4e30afa..0b713d2 100644 (file)
@@ -21,6 +21,7 @@
 #include "config.h"
 #include "RenderThemeWin.h"
 
+#include "CSSStyleSheet.h"
 #include "CSSValueKeywords.h"
 #include "Document.h"
 #include "GraphicsContext.h"
@@ -29,6 +30,7 @@
 #include "Icon.h"
 #include "RenderSlider.h"
 #include "SoftLinking.h"
+#include "UserAgentStyleSheets.h"
 
 #include <tchar.h>
 
@@ -178,6 +180,16 @@ void RenderThemeWin::themeChanged()
     close();
 }
 
+String RenderThemeWin::extraDefaultStyleSheet()
+{
+    return String(themeWinUserAgentStyleSheet, sizeof(themeWinUserAgentStyleSheet));
+}
+
+String RenderThemeWin::extraQuirksStyleSheet()
+{
+    return String(themeWinQuirksUserAgentStyleSheet, sizeof(themeWinQuirksUserAgentStyleSheet));
+}
+
 bool RenderThemeWin::supportsHover(const RenderStyle*) const
 {
     // The Classic/2k look has no hover effects.
index 513f6b5..9120474 100644 (file)
@@ -50,7 +50,10 @@ class RenderThemeWin : public RenderTheme {
 public:
     RenderThemeWin();
     ~RenderThemeWin();
-       
+
+    virtual String extraDefaultStyleSheet();
+    virtual String extraQuirksStyleSheet();
+
     // A method asking if the theme's controls actually care about redrawing when hovered.
     virtual bool supportsHover(const RenderStyle*) const;