Bug #: 4154
[WebKit-https.git] / SVGSupport / kdom / css / CSSStyleDeclaration.cpp
1 /*
2     Copyright (C) 2004 Nikolas Zimmermann <wildfox@kde.org>
3                                   2004 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
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., 59 Temple Place - Suite 330,
20     Boston, MA 02111-1307, USA.
21 */
22
23 #include "Ecma.h"
24 #include "CSSRule.h"
25 #include "CSSValue.h"
26 #include "CDFInterface.h"
27 #include "DOMException.h"
28 #include "DOMExceptionImpl.h"
29 #include "CSSStyleDeclaration.h"
30 #include "CSSStyleDeclarationImpl.h"
31
32 #include "kdom/data/CSSConstants.h"
33 #include "CSSStyleDeclaration.lut.h"
34 using namespace KDOM;
35 using namespace KJS;
36
37 /*
38 @begin CSSStyleDeclaration::s_hashTable 5
39  cssText        CSSStyleDeclarationConstants::CssText           DontDelete
40  length         CSSStyleDeclarationConstants::Length            DontDelete|ReadOnly
41  parentRule     CSSStyleDeclarationConstants::ParentRule        DontDelete|ReadOnly
42 @end
43 @begin CSSStyleDeclarationProto::s_hashTable 7
44  getPropertyValue               CSSStyleDeclarationConstants::GetPropertyValue        DontDelete|Function 1
45  getPropertyCSSValue    CSSStyleDeclarationConstants::GetPropertyCSSValue     DontDelete|Function 1
46  removeProperty                 CSSStyleDeclarationConstants::RemoveProperty          DontDelete|Function 1
47  getPropertyPriority    CSSStyleDeclarationConstants::GetPropertyPriority     DontDelete|Function 1
48  setProperty                    CSSStyleDeclarationConstants::SetProperty             DontDelete|Function 3
49  item                                   CSSStyleDeclarationConstants::Item                    DontDelete|Function 1
50 @end
51 */
52
53 KDOM_IMPLEMENT_PROTOTYPE("CSSStyleDeclaration", CSSStyleDeclarationProto, CSSStyleDeclarationProtoFunc)
54
55 Value CSSStyleDeclaration::getValueProperty(ExecState *exec, int token) const
56 {
57         switch(token)
58         {
59                 case CSSStyleDeclarationConstants::CssText:
60                         return getDOMString(cssText());
61                 case CSSStyleDeclarationConstants::Length:
62                         return Number(length());
63                 case CSSStyleDeclarationConstants::ParentRule:
64                         return getDOMCSSRule(exec, parentRule());
65                 default:
66                         kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
67         }
68
69         return Undefined();
70 }
71
72 void CSSStyleDeclaration::putValueProperty(ExecState *exec, int token, const Value &value, int)
73 {
74         KDOM_ENTER_SAFE
75
76         switch(token)
77         {
78                 case CSSStyleDeclarationConstants::CssText:
79                         setCssText(toDOMString(exec, value));
80                         break;
81                 default:
82                         kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
83         }
84
85         KDOM_LEAVE_SAFE(DOMException)
86 }
87
88 Value CSSStyleDeclarationProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
89 {
90         KDOM_CHECK_THIS(CSSStyleDeclaration)
91         KDOM_ENTER_SAFE
92
93         switch(id)
94         {
95                 case CSSStyleDeclarationConstants::GetPropertyValue:
96                 {
97                         DOMString propertyName = toDOMString(exec, args[0]);
98                         return getDOMString(obj.getPropertyValue(propertyName));
99                 }
100                 case CSSStyleDeclarationConstants::GetPropertyCSSValue:
101                 {
102                         DOMString propertyName = toDOMString(exec, args[0]);
103                         return getDOMCSSValue(exec, obj.getPropertyCSSValue(propertyName));
104                 }
105                 case CSSStyleDeclarationConstants::RemoveProperty:
106                 {
107                         DOMString propertyName = toDOMString(exec, args[0]);
108                         return getDOMString(obj.removeProperty(propertyName));
109                 }
110                 case CSSStyleDeclarationConstants::GetPropertyPriority:
111                 {
112                         DOMString propertyName = toDOMString(exec, args[0]);
113                         return getDOMString(obj.getPropertyPriority(propertyName));
114                 }
115                 case CSSStyleDeclarationConstants::SetProperty:
116                 {
117                         DOMString propertyName = toDOMString(exec, args[0]);
118                         DOMString value = toDOMString(exec, args[1]);
119                         DOMString priority = toDOMString(exec, args[2]);
120                         obj.setProperty(propertyName, value, priority);
121                         return Undefined();
122                 }
123                 case CSSStyleDeclarationConstants::Item:
124                 {
125                         unsigned long index = args[0].toUInt32(exec);
126                         return getDOMString(obj.item(index));
127                 }
128                 default:
129                         kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
130         }
131
132         KDOM_LEAVE_SAFE(DOMException)
133         return Undefined();
134 }
135
136 CSSStyleDeclaration CSSStyleDeclaration::null;
137
138 CSSStyleDeclaration::CSSStyleDeclaration() : d(0)
139 {
140 }
141
142 CSSStyleDeclaration::CSSStyleDeclaration(const CSSStyleDeclaration &other) : d(other.d)
143 {
144         if(d)
145                 d->ref();
146 }
147
148 CSSStyleDeclaration::CSSStyleDeclaration(CSSStyleDeclarationImpl *i) : d(i)
149 {
150         if(d)
151                 d->ref();
152 }
153
154 KDOM_IMPL_DTOR_ASSIGN_OP(CSSStyleDeclaration)
155
156 void CSSStyleDeclaration::setCssText(const DOMString &cssText)
157 {
158         if(d)
159                 d->setCssText(cssText);
160 }
161
162 DOMString CSSStyleDeclaration::cssText() const
163 {
164         if(!d)
165                 return DOMString();
166
167         return d->cssText();
168 }
169
170 DOMString CSSStyleDeclaration::getPropertyValue(const DOMString &propertyName) const
171 {
172         if(d)
173         {
174                 int id = d->interface()->getPropertyID(propertyName.string().ascii(), propertyName.length());
175                 if(id)
176                         return d->getPropertyValue(id);
177         }
178
179         return DOMString();
180 }
181
182 CSSValue CSSStyleDeclaration::getPropertyCSSValue(const DOMString &propertyName) const
183 {
184         if(!d)
185                 return CSSValue::null;
186
187         return CSSValue(d->getPropertyCSSValue(propertyName));
188 }
189
190 DOMString CSSStyleDeclaration::removeProperty(const DOMString &propertyName)
191 {
192         if(!d)
193                 return DOMString();
194
195         int id = d->interface()->getPropertyID(propertyName.string().ascii(), propertyName.length());
196         return d->removeProperty(id);
197 }
198
199 DOMString CSSStyleDeclaration::getPropertyPriority(const DOMString &propertyName) const
200 {
201         if(!d)
202                 return DOMString();
203
204         int id = d->interface()->getPropertyID(propertyName.string().ascii(), propertyName.length());
205         if(id && d->getPropertyPriority(id))
206                 return DOMString("important");
207
208         return DOMString();
209 }
210
211 void CSSStyleDeclaration::setProperty(const DOMString &propertyName, const DOMString &value, const DOMString &prio)
212 {
213         if(d)
214         {
215                 int id = d->interface()->getPropertyID(propertyName.string().ascii(), propertyName.length());
216                 if(id)
217                 {
218                         bool important = false;
219
220                         QString str = prio.string();
221                         if(str.find(QString::fromLatin1("important"), 0, false) != -1)
222                                 important = true;
223                                 
224                         d->setProperty(id, value, important);
225                 }
226         }
227 }
228
229 unsigned long CSSStyleDeclaration::length() const
230 {
231         if(!d)
232                 return 0;
233
234         return d->length();
235 }
236
237 DOMString CSSStyleDeclaration::item(unsigned long index) const
238 {
239         if(!d)
240                 return DOMString();
241
242         return d->item(index);
243 }
244
245 CSSRule CSSStyleDeclaration::parentRule() const
246 {
247         if(!d)
248                 return CSSRule::null;
249
250         return CSSRule(d->parentRule());
251 }
252
253 // vim:ts=4:noet