f12a968844a7d723aea0809975f01a161f4b5ab0
[WebKit-https.git] / WebCore / html / HTMLStyleElement.cpp
1 /**
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2001 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2003 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  */
24 #include "config.h"
25 #include "HTMLStyleElement.h"
26
27 #include "Document.h"
28 #include "HTMLNames.h"
29 #include "MediaList.h"
30 #include "MediaQueryEvaluator.h"
31
32 namespace WebCore {
33
34 using namespace HTMLNames;
35
36 HTMLStyleElement::HTMLStyleElement(Document* doc)
37     : HTMLElement(styleTag, doc)
38     , m_loading(false)
39 {
40 }
41
42 StyleSheet* HTMLStyleElement::sheet() const
43 {
44     return m_sheet.get();
45 }
46
47 // other stuff...
48 void HTMLStyleElement::parseMappedAttribute(MappedAttribute *attr)
49 {
50     if (attr->name() == typeAttr)
51         m_type = attr->value().domString().lower();
52     else if (attr->name() == mediaAttr)
53         m_media = attr->value().deprecatedString().lower();
54     else
55         HTMLElement::parseMappedAttribute(attr);
56 }
57
58 void HTMLStyleElement::insertedIntoDocument()
59 {
60     HTMLElement::insertedIntoDocument();
61     if (m_sheet)
62         document()->updateStyleSelector();
63 }
64
65 void HTMLStyleElement::removedFromDocument()
66 {
67     HTMLElement::removedFromDocument();
68     if (m_sheet)
69         document()->updateStyleSelector();
70 }
71
72 void HTMLStyleElement::childrenChanged()
73 {
74     String text = "";
75
76     for (Node* c = firstChild(); c; c = c->nextSibling())
77         if (c->nodeType() == TEXT_NODE || c->nodeType() == CDATA_SECTION_NODE || c->nodeType() == COMMENT_NODE)
78             text += c->nodeValue();
79
80     if (m_sheet) {
81         if (static_cast<CSSStyleSheet *>(m_sheet.get())->isLoading())
82             document()->stylesheetLoaded(); // Remove ourselves from the sheet list.
83         m_sheet = 0;
84     }
85
86     m_loading = false;
87     if (m_type.isEmpty() || m_type == "text/css") { // Type must be empty or CSS
88         RefPtr<MediaList> media = new MediaList((CSSStyleSheet*)0, m_media, true);
89         MediaQueryEvaluator screenEval("screen", true);
90         MediaQueryEvaluator printEval("print", true);
91         if (screenEval.eval(media.get()) || printEval.eval(media.get())) {
92             document()->addPendingSheet();
93             m_loading = true;
94             m_sheet = new CSSStyleSheet(this, String(), document()->inputEncoding());
95             m_sheet->parseString(text, !document()->inCompatMode());
96             m_sheet->setMedia(media.get());
97             m_loading = false;
98         }
99     }
100
101     if (!isLoading() && m_sheet)
102         document()->stylesheetLoaded();
103 }
104
105 bool HTMLStyleElement::isLoading() const
106 {
107     if (m_loading)
108         return true;
109     if (!m_sheet)
110         return false;
111     return static_cast<CSSStyleSheet *>(m_sheet.get())->isLoading();
112 }
113
114 bool HTMLStyleElement::sheetLoaded()
115 {
116     if (!isLoading()) {
117         document()->stylesheetLoaded();
118         return true;
119     }
120     return false;
121 }
122
123 bool HTMLStyleElement::disabled() const
124 {
125     return !getAttribute(disabledAttr).isNull();
126 }
127
128 void HTMLStyleElement::setDisabled(bool disabled)
129 {
130     setAttribute(disabledAttr, disabled ? "" : 0);
131 }
132
133 String HTMLStyleElement::media() const
134 {
135     return getAttribute(mediaAttr);
136 }
137
138 void HTMLStyleElement::setMedia(const String &value)
139 {
140     setAttribute(mediaAttr, value);
141 }
142
143 String HTMLStyleElement::type() const
144 {
145     return getAttribute(typeAttr);
146 }
147
148 void HTMLStyleElement::setType(const String &value)
149 {
150     setAttribute(typeAttr, value);
151 }
152
153 }