Reviewed by Darin.
authorrwlbuis <rwlbuis@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Dec 2006 17:22:13 +0000 (17:22 +0000)
committerrwlbuis <rwlbuis@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Dec 2006 17:22:13 +0000 (17:22 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=11625
        Investigate possibility to share code between HTMLStyleElement and SVGStyleElement

        Add a class shared by both HTMLStyleElement and SVGStyleElement that
        encapsulates the common logic.

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

14 files changed:
WebCore/CMakeLists.txt
WebCore/ChangeLog
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/dom/Document.cpp
WebCore/dom/StyleElement.cpp [new file with mode: 0644]
WebCore/dom/StyleElement.h [new file with mode: 0644]
WebCore/html/HTMLStyleElement.cpp
WebCore/html/HTMLStyleElement.h
WebCore/ksvg2/svg/SVGElement.cpp
WebCore/ksvg2/svg/SVGElement.h
WebCore/ksvg2/svg/SVGSVGElement.cpp
WebCore/ksvg2/svg/SVGSVGElement.h
WebCore/ksvg2/svg/SVGStyleElement.cpp
WebCore/ksvg2/svg/SVGStyleElement.h

index 40ac2a1eb5fc5059135f9161baf5d11514d9fa08..d2a5bdc487d9647d944f0bb4bfbb03913a8dbec8 100644 (file)
@@ -793,6 +793,7 @@ set(WebCore_SRCS
     dom/QualifiedName.cpp
     dom/Range.cpp
     dom/RegisteredEventListener.cpp
+    dom/StyleElement.cpp
     dom/StyledElement.cpp
     dom/Text.cpp
     dom/Traversal.cpp
index b929d6749e34de828acef145fd4c696ad4e0ab47..3d04ce48e7de814bc56bd898f39ec50168992648 100644 (file)
@@ -1,3 +1,63 @@
+2006-12-09  Rob Buis  <buis@kde.org>
+
+        Reviewed by Darin.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11625
+        Investigate possibility to share code between HTMLStyleElement and SVGStyleElement
+
+        Add a class shared by both HTMLStyleElement and SVGStyleElement that
+        encapsulates the common logic.
+
+        * CMakeLists.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * dom/Document.cpp:
+        (WebCore::Document::recalcStyleSelector):
+        Generalize stylesheet processing of svg and html.
+
+        * dom/StyleElement.cpp: Added.
+        (WebCore::StyleElement::StyleElement):
+        (WebCore::StyleElement::sheet):
+        (WebCore::StyleElement::insertedIntoDocument):
+        (WebCore::StyleElement::removedFromDocument):
+        (WebCore::StyleElement::childrenChanged):
+        * dom/StyleElement.h: Added.
+        (WebCore::StyleElement::~StyleElement):
+        (WebCore::StyleElement::isLoading):
+        Common base class for SVGStyleElement and HTMLStyleElement.
+
+        * html/HTMLStyleElement.cpp:
+        (WebCore::HTMLStyleElement::HTMLStyleElement):
+        (WebCore::HTMLStyleElement::parseMappedAttribute):
+        (WebCore::HTMLStyleElement::insertedIntoDocument):
+        (WebCore::HTMLStyleElement::removedFromDocument):
+        (WebCore::HTMLStyleElement::childrenChanged):
+        (WebCore::HTMLStyleElement::media):
+        (WebCore::HTMLStyleElement::setMedia):
+        (WebCore::HTMLStyleElement::type):
+        (WebCore::HTMLStyleElement::setType):
+        * html/HTMLStyleElement.h:
+        Use new common class.
+
+        * ksvg2/svg/SVGElement.cpp:
+        * ksvg2/svg/SVGElement.h:
+        * ksvg2/svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::contentScriptType):
+        (WebCore::SVGSVGElement::contentStyleType):
+        * ksvg2/svg/SVGSVGElement.h:
+        Do not use tryGetAttribute(NS) anymore.
+
+        * ksvg2/svg/SVGStyleElement.cpp:
+        (WebCore::SVGStyleElement::SVGStyleElement):
+        (WebCore::SVGStyleElement::xmlspace):
+        (WebCore::SVGStyleElement::type):
+        (WebCore::SVGStyleElement::media):
+        (WebCore::SVGStyleElement::title):
+        (WebCore::SVGStyleElement::insertedIntoDocument):
+        (WebCore::SVGStyleElement::removedFromDocument):
+        (WebCore::SVGStyleElement::childrenChanged):
+        * ksvg2/svg/SVGStyleElement.h:
+        Use new common class.
+
 2006-12-08  David Hyatt  <hyatt@apple.com>
 
         Land the new ICU abstraction layer (WTF::Unicode).  Patch
index 0bb2c17f3d843cb8aeb64207da9339cfc5300da3..5d542515279f88af986fdb9a6c4a9c37b093c3ce 100644 (file)
                A8FEFB320979F4F6005839FD /* SVGForeignObjectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = A8FEFB300979F4F6005839FD /* SVGForeignObjectElement.h */; };
                AA21ECCA0ABF0FBA002B834C /* CSSCursorImageValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA0978ED0ABAA6E100874480 /* CSSCursorImageValue.cpp */; };
                AA21ECCD0ABF0FC6002B834C /* CSSCursorImageValue.h in Headers */ = {isa = PBXBuildFile; fileRef = AA0978EE0ABAA6E100874480 /* CSSCursorImageValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               AA4C3A760B2B1679002334A2 /* StyleElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA4C3A740B2B1679002334A2 /* StyleElement.cpp */; };
+               AA4C3A770B2B1679002334A2 /* StyleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = AA4C3A750B2B1679002334A2 /* StyleElement.h */; };
                AAC8DAB10AA1002000DC0907 /* SVGMetadataElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC8DAAF0AA1002000DC0907 /* SVGMetadataElement.cpp */; };
                AAC8DAB20AA1002000DC0907 /* SVGMetadataElement.h in Headers */ = {isa = PBXBuildFile; fileRef = AAC8DAB00AA1002000DC0907 /* SVGMetadataElement.h */; };
                AB23A31209BBA7760067CC53 /* HTMLTextFieldInnerElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB23A31009BBA7760067CC53 /* HTMLTextFieldInnerElement.cpp */; };
                };
 /* End PBXBuildRule section */
 
-/* Begin PBXBuildStyle section */
-               BC18C5C70B2A883B0018461D /* Development */ = {
-                       isa = PBXBuildStyle;
-                       buildSettings = {
-                               COPY_PHASE_STRIP = NO;
-                       };
-                       name = Development;
-               };
-               BC18C5C80B2A883B0018461D /* Deployment */ = {
-                       isa = PBXBuildStyle;
-                       buildSettings = {
-                               COPY_PHASE_STRIP = YES;
-                       };
-                       name = Deployment;
-               };
-/* End PBXBuildStyle section */
-
 /* Begin PBXContainerItemProxy section */
                DD041FF009D9E3250010AF2A /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                A8FEFB300979F4F6005839FD /* SVGForeignObjectElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGForeignObjectElement.h; sourceTree = "<group>"; };
                AA0978ED0ABAA6E100874480 /* CSSCursorImageValue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CSSCursorImageValue.cpp; sourceTree = "<group>"; };
                AA0978EE0ABAA6E100874480 /* CSSCursorImageValue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSCursorImageValue.h; sourceTree = "<group>"; };
+               AA4C3A740B2B1679002334A2 /* StyleElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = StyleElement.cpp; sourceTree = "<group>"; };
+               AA4C3A750B2B1679002334A2 /* StyleElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = StyleElement.h; sourceTree = "<group>"; };
                AAC8DAAF0AA1002000DC0907 /* SVGMetadataElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGMetadataElement.cpp; sourceTree = "<group>"; };
                AAC8DAB00AA1002000DC0907 /* SVGMetadataElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGMetadataElement.h; sourceTree = "<group>"; };
                AB23A31009BBA7760067CC53 /* HTMLTextFieldInnerElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLTextFieldInnerElement.cpp; sourceTree = "<group>"; };
                F523D32402DE4478018635CA /* dom */ = {
                        isa = PBXGroup;
                        children = (
+                               AA4C3A740B2B1679002334A2 /* StyleElement.cpp */,
+                               AA4C3A750B2B1679002334A2 /* StyleElement.h */,
                                BC3B364705C9D5E200E42902 /* AtomicStringList.h */,
                                A8C4A7FC09D563270003AC8D /* Attr.cpp */,
                                A8C4A7FB09D563270003AC8D /* Attr.h */,
                                B2BFB5A00B22F76200567E80 /* ImageAnimationObserver.h in Headers */,
                                E1D8E3160B29E39C00F4BAF6 /* HTTPParsers.h in Headers */,
                                BC18C5D00B2A886F0018461D /* TextBreakIterator.h in Headers */,
+                               AA4C3A770B2B1679002334A2 /* StyleElement.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                0867D690FE84028FC02AAC07 /* Project object */ = {
                        isa = PBXProject;
                        buildConfigurationList = 149C284308902B11008A9EFC /* Build configuration list for PBXProject "WebCore" */;
-                       buildSettings = {
-                       };
-                       buildStyles = (
-                               BC18C5C70B2A883B0018461D /* Development */,
-                               BC18C5C80B2A883B0018461D /* Deployment */,
-                       );
                        hasScannedForEncodings = 1;
                        knownRegions = (
                                English,
                                93354A3C0B24F8C9003F6DEA /* UIEventWithKeyState.cpp in Sources */,
                                E1D8E31A0B29E3B600F4BAF6 /* HTTPParsers.cpp in Sources */,
                                BC18C5D10B2A886F0018461D /* TextBreakIteratorICU.cpp in Sources */,
+                               AA4C3A760B2B1679002334A2 /* StyleElement.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index 1c6f80636b3f3949e53c14f9f0f242f10d233e22..62a63960e899cefe7948582abe2c87d0d461ccfa 100644 (file)
@@ -1853,9 +1853,12 @@ void Document::recalcStyleSelector()
                 }
             }
 
-        }
-        else if (n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagName(styleTag))) {
-            HTMLElement *e = static_cast<HTMLElement *>(n);
+        } else if (n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagName(styleTag))
+#ifdef SVG_SUPPORT
+            ||  (n->isSVGElement() && n->hasTagName(SVGNames::styleTag))
+#endif
+        ) {
+            Element* e = static_cast<Element*>(n);
             DeprecatedString title = e->getAttribute(titleAttr).deprecatedString();
             bool enabledViaScript = false;
             if (e->hasLocalName(linkTag)) {
@@ -1870,6 +1873,11 @@ void Document::recalcStyleSelector()
 
             // Get the current preferred styleset.  This is the
             // set of sheets that will be enabled.
+#ifdef SVG_SUPPORT
+            if (n->isSVGElement() && n->hasTagName(SVGNames::styleTag))
+                sheet = static_cast<SVGStyleElement*>(n)->sheet();
+            else
+#endif
             if (e->hasLocalName(linkTag))
                 sheet = static_cast<HTMLLinkElement*>(n)->sheet();
             else
@@ -1893,30 +1901,13 @@ void Document::recalcStyleSelector()
                 
                 if (title != m_preferredStylesheetSet)
                     sheet = 0;
-            }
-        }
-#ifdef SVG_SUPPORT
-        else if (n->isSVGElement() && n->hasTagName(SVGNames::styleTag)) {
-            DeprecatedString title;
-            // <STYLE> element
-            SVGStyleElement *s = static_cast<SVGStyleElement*>(n);
-            if (!s->isLoading()) {
-                sheet = s->sheet();
-                if(sheet)
-                    title = s->getAttribute(SVGNames::titleAttr).deprecatedString();
-            }
-
-            if (!title.isEmpty() && m_preferredStylesheetSet.isEmpty())
-                m_preferredStylesheetSet = m_selectedStylesheetSet = title;
-
-            if (!title.isEmpty()) {
-                if (title != m_preferredStylesheetSet)
-                    sheet = 0; // don't use it
 
-                title = title.replace('&', "&&");
-            }
-       }
+#ifdef SVG_SUPPORT
+                if (!n->isHTMLElement())
+                    title = title.replace('&', "&&");
 #endif
+            }
+        }
 
         if (sheet) {
             sheet->ref();
diff --git a/WebCore/dom/StyleElement.cpp b/WebCore/dom/StyleElement.cpp
new file mode 100644 (file)
index 0000000..367359a
--- /dev/null
@@ -0,0 +1,93 @@
+/**
+ * This file is part of the DOM implementation for KDE.
+ *
+ * Copyright (C) 2006 Rob Buis
+ *
+ * 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 "StyleElement.h"
+
+#include "Document.h"
+#include "HTMLNames.h"
+#include "MappedAttribute.h"
+#include "MediaList.h"
+#include "MediaQueryEvaluator.h"
+
+namespace WebCore {
+
+using namespace HTMLNames;
+
+StyleElement::StyleElement()
+    : m_loading(false)
+{
+}
+
+StyleSheet* StyleElement::sheet() const
+{
+    return m_sheet.get();
+}
+
+void StyleElement::insertedIntoDocument(Document* document)
+{
+    if (m_sheet)
+        document->updateStyleSelector();
+}
+
+void StyleElement::removedFromDocument(Document* document)
+{
+    if (m_sheet)
+        document->updateStyleSelector();
+}
+
+void StyleElement::childrenChanged(Node* e)
+{
+    if (!e)
+        return;
+    String text = "";
+    Document* document = e->document();
+
+    for (Node* c = e->firstChild(); c; c = c->nextSibling())
+        if (c->nodeType() == Node::TEXT_NODE || c->nodeType() == Node::CDATA_SECTION_NODE || c->nodeType() == Node::COMMENT_NODE)
+            text += c->nodeValue();
+
+    if (m_sheet) {
+        if (static_cast<CSSStyleSheet *>(m_sheet.get())->isLoading())
+            document->stylesheetLoaded(); // Remove ourselves from the sheet list.
+        m_sheet = 0;
+    }
+
+    m_loading = false;
+    String typeValue = e->isHTMLElement() ? type().deprecatedString().lower() : type();
+    if (typeValue.isEmpty() || typeValue == "text/css") { // Type must be empty or CSS
+        RefPtr<MediaList> mediaList = new MediaList((CSSStyleSheet*)0, media(), e->isHTMLElement());
+        MediaQueryEvaluator screenEval("screen", true);
+        MediaQueryEvaluator printEval("print", true);
+        if (screenEval.eval(mediaList.get()) || printEval.eval(mediaList.get())) {
+            document->addPendingSheet();
+            m_loading = true;
+            m_sheet = new CSSStyleSheet(e, String(), document->inputEncoding());
+            m_sheet->parseString(text, !document->inCompatMode());
+            m_sheet->setMedia(mediaList.get());
+            m_loading = false;
+        }
+    }
+
+    if (!isLoading() && m_sheet)
+        document->stylesheetLoaded();
+}
+
+}
diff --git a/WebCore/dom/StyleElement.h b/WebCore/dom/StyleElement.h
new file mode 100644 (file)
index 0000000..40108f3
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the DOM implementation for KDE.
+ *
+ * Copyright (C) 2006 Rob Buis
+ *
+ * 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.
+ *
+ */
+#ifndef StyleElement_H
+#define StyleElement_H
+
+#include "CSSStyleSheet.h"
+
+namespace WebCore {
+
+class StyleElement {
+public:
+    StyleElement();
+    virtual ~StyleElement() {}
+
+    StyleSheet* sheet() const;
+
+    virtual bool isLoading() const { return false; }
+
+    virtual const AtomicString& type() const = 0;
+    virtual const AtomicString& media() const = 0;
+
+    void insertedIntoDocument(Document*);
+    void removedFromDocument(Document*);
+    void childrenChanged(Node*);
+
+protected:
+    RefPtr<CSSStyleSheet> m_sheet;
+    bool m_loading;
+};
+
+} //namespace
+
+#endif
index f12a968844a7d723aea0809975f01a161f4b5ab0..e1233bef2c9925d4d56235614c452e51dbb17be4 100644 (file)
@@ -26,8 +26,6 @@
 
 #include "Document.h"
 #include "HTMLNames.h"
-#include "MediaList.h"
-#include "MediaQueryEvaluator.h"
 
 namespace WebCore {
 
@@ -35,21 +33,13 @@ using namespace HTMLNames;
 
 HTMLStyleElement::HTMLStyleElement(Document* doc)
     : HTMLElement(styleTag, doc)
-    , m_loading(false)
 {
 }
 
-StyleSheet* HTMLStyleElement::sheet() const
-{
-    return m_sheet.get();
-}
-
 // other stuff...
 void HTMLStyleElement::parseMappedAttribute(MappedAttribute *attr)
 {
-    if (attr->name() == typeAttr)
-        m_type = attr->value().domString().lower();
-    else if (attr->name() == mediaAttr)
+    if (attr->name() == mediaAttr)
         m_media = attr->value().deprecatedString().lower();
     else
         HTMLElement::parseMappedAttribute(attr);
@@ -58,48 +48,18 @@ void HTMLStyleElement::parseMappedAttribute(MappedAttribute *attr)
 void HTMLStyleElement::insertedIntoDocument()
 {
     HTMLElement::insertedIntoDocument();
-    if (m_sheet)
-        document()->updateStyleSelector();
+    StyleElement::insertedIntoDocument(document());
 }
 
 void HTMLStyleElement::removedFromDocument()
 {
     HTMLElement::removedFromDocument();
-    if (m_sheet)
-        document()->updateStyleSelector();
+    StyleElement::removedFromDocument(document());
 }
 
 void HTMLStyleElement::childrenChanged()
 {
-    String text = "";
-
-    for (Node* c = firstChild(); c; c = c->nextSibling())
-        if (c->nodeType() == TEXT_NODE || c->nodeType() == CDATA_SECTION_NODE || c->nodeType() == COMMENT_NODE)
-            text += c->nodeValue();
-
-    if (m_sheet) {
-        if (static_cast<CSSStyleSheet *>(m_sheet.get())->isLoading())
-            document()->stylesheetLoaded(); // Remove ourselves from the sheet list.
-        m_sheet = 0;
-    }
-
-    m_loading = false;
-    if (m_type.isEmpty() || m_type == "text/css") { // Type must be empty or CSS
-        RefPtr<MediaList> media = new MediaList((CSSStyleSheet*)0, m_media, true);
-        MediaQueryEvaluator screenEval("screen", true);
-        MediaQueryEvaluator printEval("print", true);
-        if (screenEval.eval(media.get()) || printEval.eval(media.get())) {
-            document()->addPendingSheet();
-            m_loading = true;
-            m_sheet = new CSSStyleSheet(this, String(), document()->inputEncoding());
-            m_sheet->parseString(text, !document()->inCompatMode());
-            m_sheet->setMedia(media.get());
-            m_loading = false;
-        }
-    }
-
-    if (!isLoading() && m_sheet)
-        document()->stylesheetLoaded();
+    StyleElement::childrenChanged(this);
 }
 
 bool HTMLStyleElement::isLoading() const
@@ -130,22 +90,22 @@ void HTMLStyleElement::setDisabled(bool disabled)
     setAttribute(disabledAttr, disabled ? "" : 0);
 }
 
-String HTMLStyleElement::media() const
+const AtomicString& HTMLStyleElement::media() const
 {
     return getAttribute(mediaAttr);
 }
 
-void HTMLStyleElement::setMedia(const String &value)
+void HTMLStyleElement::setMedia(const AtomicString &value)
 {
     setAttribute(mediaAttr, value);
 }
 
-String HTMLStyleElement::type() const
+const AtomicString& HTMLStyleElement::type() const
 {
     return getAttribute(typeAttr);
 }
 
-void HTMLStyleElement::setType(const String &value)
+void HTMLStyleElement::setType(const AtomicString &value)
 {
     setAttribute(typeAttr, value);
 }
index 39ab8989e27b2601dbc8a804c63f7f58fea2c172..14853af0ee5103e28971928425b2f8dfc8fe8f9f 100644 (file)
 #ifndef HTMLStyleElement_H
 #define HTMLStyleElement_H
 
-#include "HTMLElement.h"
 #include "CSSStyleSheet.h"
+#include "HTMLElement.h"
+#include "StyleElement.h"
 
 namespace WebCore {
 
-class HTMLStyleElement : public HTMLElement
+class HTMLStyleElement : public HTMLElement, public StyleElement
 {
 public:
     HTMLStyleElement(Document*);
@@ -38,30 +39,25 @@ public:
     virtual int tagPriority() const { return 1; }
     virtual bool checkDTD(const Node* newChild) { return newChild->isTextNode(); }
 
-    StyleSheet* sheet() const;
-
     // overload from HTMLElement
     virtual void parseMappedAttribute(MappedAttribute*);
     virtual void insertedIntoDocument();
     virtual void removedFromDocument();
     virtual void childrenChanged();
 
-    bool isLoading() const;
+    virtual bool isLoading() const;
     virtual bool sheetLoaded();
 
     bool disabled() const;
     void setDisabled(bool);
 
-    String media() const;
-    void setMedia(const String&);
+    const AtomicString& media() const;
+    void setMedia(const AtomicString&);
 
-    String type() const;
-    void setType(const String&);
+    const AtomicString& type() const;
+    void setType(const AtomicString&);
 
 protected:
-    RefPtr<CSSStyleSheet> m_sheet;
-    bool m_loading;
-    String m_type;
     String m_media;
 };
 
index be23c63b26a212f63da418a08449e22565a91120..7d6158b899fc5a93173b6e9fe43c749f5874110c 100644 (file)
@@ -105,22 +105,6 @@ SVGElement* SVGElement::viewportElement() const
     return 0;
 }
 
-AtomicString SVGElement::tryGetAttribute(const String& name, AtomicString defaultVal) const
-{
-    if (hasAttribute(name))
-        return getAttribute(name);
-
-    return defaultVal;
-}
-
-AtomicString SVGElement::tryGetAttributeNS(const String& namespaceURI, const String& localName, AtomicString defaultVal) const
-{
-    if (hasAttributeNS(namespaceURI, localName))
-        return getAttributeNS(namespaceURI, localName);
-
-    return defaultVal;
-}
-
 void SVGElement::addSVGEventListener(const AtomicString& eventType, const Attribute* attr)
 {
     Element::setHTMLEventListener(eventType, document()->accessSVGExtensions()->
index 394bfa20491afc6a2b36f0478486409a7291ee35..31be9280efe8a35645df3709272bdcea075de95f 100644 (file)
@@ -160,11 +160,6 @@ namespace WebCore {
         SVGSVGElement* ownerSVGElement() const;
         SVGElement* viewportElement() const;
 
-        // Helper methods that returns the attr value if attr is set, otherwise the default value.
-        // It throws NO_MODIFICATION_ALLOWED_ERR if the element is read-only.
-        AtomicString tryGetAttribute(const String& name, AtomicString defaultValue = AtomicString()) const;
-        AtomicString tryGetAttributeNS(const String& namespaceURI, const String& localName, AtomicString defaultValue = AtomicString()) const;
-
         // Internal
         virtual void parseMappedAttribute(MappedAttribute*);
         
index bbc1ee5b4a2027eb1253cfbefed1f6588b53ec8c..e7f643d9fcf72417d095504d1a0739060a94e4b1 100644 (file)
@@ -34,6 +34,7 @@
 #include "SVGAngle.h"
 #include "SVGLength.h"
 #include "SVGMatrix.h"
+#include "SVGNames.h"
 #include "SVGPreserveAspectRatio.h"
 #include "SVGTransform.h"
 #include "SVGZoomEvent.h"
@@ -43,6 +44,7 @@ namespace WebCore {
 
 using namespace HTMLNames;
 using namespace EventNames;
+using namespace SVGNames;
 
 SVGSVGElement::SVGSVGElement(const QualifiedName& tagName, Document* doc)
     : SVGStyledLocatableElement(tagName, doc)
@@ -76,9 +78,11 @@ ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Y, y, S
 ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
 ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
 
-AtomicString SVGSVGElement::contentScriptType() const
+const AtomicString& SVGSVGElement::contentScriptType() const
 {
-    return tryGetAttribute("contentScriptType", "text/ecmascript");
+    static const AtomicString defaultValue("text/ecmascript");
+    const AtomicString& n = getAttribute(contentScriptTypeAttr);
+    return n.isNull() ? defaultValue : n;
 }
 
 void SVGSVGElement::setContentScriptType(const AtomicString& type)
@@ -86,9 +90,11 @@ void SVGSVGElement::setContentScriptType(const AtomicString& type)
     setAttribute(SVGNames::contentScriptTypeAttr, type);
 }
 
-AtomicString SVGSVGElement::contentStyleType() const
+const AtomicString& SVGSVGElement::contentStyleType() const
 {
-    return tryGetAttribute("contentStyleType", "text/css");
+    static const AtomicString defaultValue("text/css");
+    const AtomicString& n = getAttribute(contentStyleTypeAttr);
+    return n.isNull() ? defaultValue : n;
 }
 
 void SVGSVGElement::setContentStyleType(const AtomicString& type)
index b95fe028a43a4921057f3978af2648095d7849e2..46ffc72536bc6cd57784a3964d4ce80b33d42059 100644 (file)
@@ -61,10 +61,10 @@ namespace WebCore
         virtual bool isValid() const { return SVGTests::isValid(); }
 
         // 'SVGSVGElement' functions
-        AtomicString contentScriptType() const;
+        const AtomicString& contentScriptType() const;
         void setContentScriptType(const AtomicString& type);
 
-        AtomicString contentStyleType() const;
+        const AtomicString& contentStyleType() const;
         void setContentStyleType(const AtomicString& type);
 
         FloatRect viewport() const;
index 043e2884d762fd6a392b84fb33149e0dad6f0f9d..f88aa7c5aa52fffed943b0c755f80170b8abd770 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
     Copyright (C) 2006 Apple Computer, Inc.
 
     This file is part of the KDE project
 #include "CSSStyleSheet.h"
 #include "Document.h"
 #include "ExceptionCode.h"
-#include "MediaList.h"
-#include "MediaQueryEvaluator.h"
-#include "PlatformString.h"
+#include "HTMLNames.h"
 
 namespace WebCore {
 
-SVGStyleElement::SVGStyleElement(const QualifiedName& tagName, Document *doc) : SVGElement(tagName, doc)
-{
-    m_loading = false;
-}
+using namespace HTMLNames;
 
-SVGStyleElement::~SVGStyleElement()
+SVGStyleElement::SVGStyleElement(const QualifiedName& tagName, Document* doc)
+     : SVGElement(tagName, doc)
 {
 }
 
-AtomicString SVGStyleElement::xmlspace() const
+const AtomicString& SVGStyleElement::xmlspace() const
 {
-    return tryGetAttribute("xml:space");
+    static const AtomicString defaultValue("xml:space");
+    return getAttribute(defaultValue);
 }
 
 void SVGStyleElement::setXmlspace(const AtomicString&, ExceptionCode& ec)
@@ -53,9 +50,11 @@ void SVGStyleElement::setXmlspace(const AtomicString&, ExceptionCode& ec)
     ec = NO_MODIFICATION_ALLOWED_ERR;
 }
 
-AtomicString SVGStyleElement::type() const
+const AtomicString& SVGStyleElement::type() const
 {
-    return tryGetAttribute("type", "text/css");
+    static const AtomicString defaultValue("text/css");
+    const AtomicString& n = getAttribute(typeAttr);
+    return n.isNull() ? defaultValue : n;
 }
 
 void SVGStyleElement::setType(const AtomicString&, ExceptionCode& ec)
@@ -63,9 +62,11 @@ void SVGStyleElement::setType(const AtomicString&, ExceptionCode& ec)
     ec = NO_MODIFICATION_ALLOWED_ERR;
 }
 
-AtomicString SVGStyleElement::media() const
+const AtomicString& SVGStyleElement::media() const
 {
-    return tryGetAttribute("media", "all");
+    static const AtomicString defaultValue("all");
+    const AtomicString& n = getAttribute(mediaAttr);
+    return n.isNull() ? defaultValue : n;
 }
 
 void SVGStyleElement::setMedia(const AtomicString&, ExceptionCode& ec)
@@ -73,9 +74,9 @@ void SVGStyleElement::setMedia(const AtomicString&, ExceptionCode& ec)
     ec = NO_MODIFICATION_ALLOWED_ERR;
 }
 
-AtomicString SVGStyleElement::title() const
+const AtomicString& SVGStyleElement::title() const
 {
-    return tryGetAttribute("title");
+    return getAttribute(titleAttr);
 }
 
 void SVGStyleElement::setTitle(const AtomicString&, ExceptionCode& ec)
@@ -83,42 +84,21 @@ void SVGStyleElement::setTitle(const AtomicString&, ExceptionCode& ec)
     ec = NO_MODIFICATION_ALLOWED_ERR;
 }
 
-CSSStyleSheet *SVGStyleElement::sheet()
+void SVGStyleElement::insertedIntoDocument()
 {
-    return m_sheet.get();
+    SVGElement::insertedIntoDocument();
+    StyleElement::insertedIntoDocument(document());
 }
 
-void SVGStyleElement::childrenChanged()
+void SVGStyleElement::removedFromDocument()
 {
-    SVGElement::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);   
-    RefPtr<MediaList> mediaList = new MediaList((CSSStyleSheet*)0, media());
-    if ((type().isEmpty() || type() == "text/css") && (screenEval.eval(mediaList.get()) || printEval.eval(mediaList.get()))) {
-        ownerDocument()->addPendingSheet();
-
-        m_loading = true;
-        m_sheet = new CSSStyleSheet(this, String(), document()->inputEncoding());
-        m_sheet->parseString(textContent()); // SVG css is always parsed in strict mode
-        
-        m_sheet->setMedia(mediaList.get());
-        m_loading = false;
-    }
-
-    if(!isLoading() && m_sheet)
-        document()->stylesheetLoaded();
+    SVGElement::removedFromDocument();
+    StyleElement::removedFromDocument(document());
 }
 
-bool SVGStyleElement::isLoading() const
+void SVGStyleElement::childrenChanged()
 {
-    return false;
+    StyleElement::childrenChanged(this);
 }
 
 }
index bc3dd95ee2207d72ce1fafe682c43ede80cf6985..9320d31911659e8e2e3c9bee7061a772ef0a8d3e 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
 #ifdef SVG_SUPPORT
 
 #include <SVGElement.h>
+#include "StyleElement.h"
 
 namespace WebCore {
 
-    class CSSStyleSheet;
-
-    class SVGStyleElement : public SVGElement {
+    class SVGStyleElement : public SVGElement, public StyleElement {
     public:
         SVGStyleElement(const QualifiedName&, Document*);
-        virtual ~SVGStyleElement();
 
         // Derived from: 'Element'
+        virtual void insertedIntoDocument();
+        virtual void removedFromDocument();
         virtual void childrenChanged();
 
         // 'SVGStyleElement' functions
-        AtomicString xmlspace() const;
+        const AtomicString& xmlspace() const;
         void setXmlspace(const AtomicString&, ExceptionCode&);
 
-        AtomicString type() const;
+        virtual const AtomicString& type() const;
         void setType(const AtomicString&, ExceptionCode&);
 
-        AtomicString media() const;
+        const AtomicString& media() const;
         void setMedia(const AtomicString&, ExceptionCode&);
 
-        AtomicString title() const;
+        const AtomicString& title() const;
         void setTitle(const AtomicString&, ExceptionCode&);
-
-        CSSStyleSheet *sheet();
-
-        // Internal
-        bool isLoading() const;
-
-    protected:
-        RefPtr<CSSStyleSheet> m_sheet;
-        bool m_loading;
     };
 
 } // namespace WebCore