045ae6d1fcece22ad9272d4ddeb37b805d5fef5a
[WebKit-https.git] / Source / WebCore / svg / SVGStyleElement.cpp
1 /*
2  * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
4  * Copyright (C) 2006, 2013 Apple Inc. All rights reserved.
5  * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24 #include "SVGStyleElement.h"
25
26 #include "CSSStyleSheet.h"
27 #include "Document.h"
28 #include "ExceptionCode.h"
29 #include "SVGNames.h"
30 #include <wtf/StdLibExtras.h>
31
32 namespace WebCore {
33
34 inline SVGStyleElement::SVGStyleElement(const QualifiedName& tagName, Document& document, bool createdByParser)
35     : SVGElement(tagName, document)
36     , m_styleSheetOwner(document, createdByParser)
37     , m_svgLoadEventTimer(*this, &SVGElement::svgLoadEventTimerFired)
38 {
39     ASSERT(hasTagName(SVGNames::styleTag));
40 }
41
42 SVGStyleElement::~SVGStyleElement()
43 {
44     m_styleSheetOwner.clearDocumentData(document(), *this);
45 }
46
47 Ref<SVGStyleElement> SVGStyleElement::create(const QualifiedName& tagName, Document& document, bool createdByParser)
48 {
49     return adoptRef(*new SVGStyleElement(tagName, document, createdByParser));
50 }
51
52 bool SVGStyleElement::disabled() const
53 {
54     return sheet() && sheet()->disabled();
55 }
56
57 void SVGStyleElement::setDisabled(bool setDisabled)
58 {
59     if (CSSStyleSheet* styleSheet = sheet())
60         styleSheet->setDisabled(setDisabled);
61 }
62
63 const AtomicString& SVGStyleElement::type() const
64 {
65     static NeverDestroyed<const AtomicString> defaultValue("text/css", AtomicString::ConstructFromLiteral);
66     const AtomicString& n = getAttribute(SVGNames::typeAttr);
67     return n.isNull() ? defaultValue.get() : n;
68 }
69
70 void SVGStyleElement::setType(const AtomicString& type, ExceptionCode&)
71 {
72     setAttribute(SVGNames::typeAttr, type);
73 }
74
75 const AtomicString& SVGStyleElement::media() const
76 {
77     static NeverDestroyed<const AtomicString> defaultValue("all", AtomicString::ConstructFromLiteral);
78     const AtomicString& n = fastGetAttribute(SVGNames::mediaAttr);
79     return n.isNull() ? defaultValue.get() : n;
80 }
81
82 void SVGStyleElement::setMedia(const AtomicString& media, ExceptionCode&)
83 {
84     setAttribute(SVGNames::mediaAttr, media);
85 }
86
87 String SVGStyleElement::title() const
88 {
89     return fastGetAttribute(SVGNames::titleAttr);
90 }
91
92 void SVGStyleElement::setTitle(const AtomicString& title, ExceptionCode&)
93 {
94     setAttribute(SVGNames::titleAttr, title);
95 }
96
97 void SVGStyleElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
98 {
99     if (name == SVGNames::titleAttr) {
100         if (sheet())
101             sheet()->setTitle(value);
102         return;
103     }
104     if (name == SVGNames::typeAttr) {
105         m_styleSheetOwner.setContentType(value);
106         return;
107     }
108     if (name == SVGNames::mediaAttr) {
109         m_styleSheetOwner.setMedia(value);
110         return;
111     }
112
113     SVGElement::parseAttribute(name, value);
114 }
115
116 void SVGStyleElement::finishParsingChildren()
117 {
118     m_styleSheetOwner.finishParsingChildren(*this);
119     SVGElement::finishParsingChildren();
120 }
121
122 Node::InsertionNotificationRequest SVGStyleElement::insertedInto(ContainerNode& rootParent)
123 {
124     SVGElement::insertedInto(rootParent);
125     if (rootParent.inDocument())
126         m_styleSheetOwner.insertedIntoDocument(document(), *this);
127     return InsertionDone;
128 }
129
130 void SVGStyleElement::removedFrom(ContainerNode& rootParent)
131 {
132     SVGElement::removedFrom(rootParent);
133     if (rootParent.inDocument())
134         m_styleSheetOwner.removedFromDocument(document(), *this);
135 }
136
137 void SVGStyleElement::childrenChanged(const ChildChange& change)
138 {
139     SVGElement::childrenChanged(change);
140     m_styleSheetOwner.childrenChanged(*this);
141 }
142
143 }