2 * This file is part of the WebKit open source project.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 #include "WebKitDOMCSSStyleDeclaration.h"
23 #include <WebCore/CSSImportRule.h>
24 #include "DOMObjectCache.h"
25 #include <WebCore/Document.h>
26 #include <WebCore/ExceptionCode.h>
27 #include <WebCore/ExceptionCodeDescription.h>
28 #include <WebCore/JSMainThreadExecState.h>
29 #include "WebKitDOMCSSRulePrivate.h"
30 #include "WebKitDOMCSSStyleDeclarationPrivate.h"
31 #include "WebKitDOMPrivate.h"
32 #include "ConvertToUTF8String.h"
33 #include <wtf/GetPtr.h>
34 #include <wtf/RefPtr.h>
36 #define WEBKIT_DOM_CSS_STYLE_DECLARATION_GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE(obj, WEBKIT_DOM_TYPE_CSS_STYLE_DECLARATION, WebKitDOMCSSStyleDeclarationPrivate)
38 typedef struct _WebKitDOMCSSStyleDeclarationPrivate {
39 RefPtr<WebCore::CSSStyleDeclaration> coreObject;
40 } WebKitDOMCSSStyleDeclarationPrivate;
44 WebKitDOMCSSStyleDeclaration* kit(WebCore::CSSStyleDeclaration* obj)
49 if (gpointer ret = DOMObjectCache::get(obj))
50 return WEBKIT_DOM_CSS_STYLE_DECLARATION(ret);
52 return wrapCSSStyleDeclaration(obj);
55 WebCore::CSSStyleDeclaration* core(WebKitDOMCSSStyleDeclaration* request)
57 return request ? static_cast<WebCore::CSSStyleDeclaration*>(WEBKIT_DOM_OBJECT(request)->coreObject) : 0;
60 WebKitDOMCSSStyleDeclaration* wrapCSSStyleDeclaration(WebCore::CSSStyleDeclaration* coreObject)
63 return WEBKIT_DOM_CSS_STYLE_DECLARATION(g_object_new(WEBKIT_DOM_TYPE_CSS_STYLE_DECLARATION, "core-object", coreObject, nullptr));
68 G_DEFINE_TYPE(WebKitDOMCSSStyleDeclaration, webkit_dom_css_style_declaration, WEBKIT_DOM_TYPE_OBJECT)
77 static void webkit_dom_css_style_declaration_finalize(GObject* object)
79 WebKitDOMCSSStyleDeclarationPrivate* priv = WEBKIT_DOM_CSS_STYLE_DECLARATION_GET_PRIVATE(object);
81 WebKit::DOMObjectCache::forget(priv->coreObject.get());
83 priv->~WebKitDOMCSSStyleDeclarationPrivate();
84 G_OBJECT_CLASS(webkit_dom_css_style_declaration_parent_class)->finalize(object);
87 static void webkit_dom_css_style_declaration_set_property(GObject* object, guint propertyId, const GValue* value, GParamSpec* pspec)
89 WebKitDOMCSSStyleDeclaration* self = WEBKIT_DOM_CSS_STYLE_DECLARATION(object);
93 webkit_dom_css_style_declaration_set_css_text(self, g_value_get_string(value), nullptr);
96 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, pspec);
101 static void webkit_dom_css_style_declaration_get_property(GObject* object, guint propertyId, GValue* value, GParamSpec* pspec)
103 WebKitDOMCSSStyleDeclaration* self = WEBKIT_DOM_CSS_STYLE_DECLARATION(object);
105 switch (propertyId) {
107 g_value_take_string(value, webkit_dom_css_style_declaration_get_css_text(self));
110 g_value_set_ulong(value, webkit_dom_css_style_declaration_get_length(self));
112 case PROP_PARENT_RULE:
113 g_value_set_object(value, webkit_dom_css_style_declaration_get_parent_rule(self));
116 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, pspec);
121 static GObject* webkit_dom_css_style_declaration_constructor(GType type, guint constructPropertiesCount, GObjectConstructParam* constructProperties)
123 GObject* object = G_OBJECT_CLASS(webkit_dom_css_style_declaration_parent_class)->constructor(type, constructPropertiesCount, constructProperties);
125 WebKitDOMCSSStyleDeclarationPrivate* priv = WEBKIT_DOM_CSS_STYLE_DECLARATION_GET_PRIVATE(object);
126 priv->coreObject = static_cast<WebCore::CSSStyleDeclaration*>(WEBKIT_DOM_OBJECT(object)->coreObject);
127 WebKit::DOMObjectCache::put(priv->coreObject.get(), object);
132 static void webkit_dom_css_style_declaration_class_init(WebKitDOMCSSStyleDeclarationClass* requestClass)
134 GObjectClass* gobjectClass = G_OBJECT_CLASS(requestClass);
135 g_type_class_add_private(gobjectClass, sizeof(WebKitDOMCSSStyleDeclarationPrivate));
136 gobjectClass->constructor = webkit_dom_css_style_declaration_constructor;
137 gobjectClass->finalize = webkit_dom_css_style_declaration_finalize;
138 gobjectClass->set_property = webkit_dom_css_style_declaration_set_property;
139 gobjectClass->get_property = webkit_dom_css_style_declaration_get_property;
141 g_object_class_install_property(
146 "CSSStyleDeclaration:css-text",
147 "read-write gchar* CSSStyleDeclaration:css-text",
149 WEBKIT_PARAM_READWRITE));
151 g_object_class_install_property(
156 "CSSStyleDeclaration:length",
157 "read-only gulong CSSStyleDeclaration:length",
159 WEBKIT_PARAM_READABLE));
161 g_object_class_install_property(
166 "CSSStyleDeclaration:parent-rule",
167 "read-only WebKitDOMCSSRule* CSSStyleDeclaration:parent-rule",
168 WEBKIT_DOM_TYPE_CSS_RULE,
169 WEBKIT_PARAM_READABLE));
173 static void webkit_dom_css_style_declaration_init(WebKitDOMCSSStyleDeclaration* request)
175 WebKitDOMCSSStyleDeclarationPrivate* priv = WEBKIT_DOM_CSS_STYLE_DECLARATION_GET_PRIVATE(request);
176 new (priv) WebKitDOMCSSStyleDeclarationPrivate();
179 gchar* webkit_dom_css_style_declaration_get_property_value(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName)
181 WebCore::JSMainThreadNullState state;
182 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
183 g_return_val_if_fail(propertyName, 0);
184 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
185 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
186 gchar* result = convertToUTF8String(item->getPropertyValue(convertedPropertyName));
190 gchar* webkit_dom_css_style_declaration_remove_property(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName, GError** error)
192 WebCore::JSMainThreadNullState state;
193 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
194 g_return_val_if_fail(propertyName, 0);
195 g_return_val_if_fail(!error || !*error, 0);
196 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
197 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
198 auto result = item->removeProperty(convertedPropertyName);
199 if (result.hasException())
201 return convertToUTF8String(result.releaseReturnValue());
204 gchar* webkit_dom_css_style_declaration_get_property_priority(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName)
206 WebCore::JSMainThreadNullState state;
207 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
208 g_return_val_if_fail(propertyName, 0);
209 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
210 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
211 gchar* result = convertToUTF8String(item->getPropertyPriority(convertedPropertyName));
215 void webkit_dom_css_style_declaration_set_property(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName, const gchar* value, const gchar* priority, GError** error)
217 WebCore::JSMainThreadNullState state;
218 g_return_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self));
219 g_return_if_fail(propertyName);
220 g_return_if_fail(value);
221 g_return_if_fail(priority);
222 g_return_if_fail(!error || !*error);
223 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
224 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
225 WTF::String convertedValue = WTF::String::fromUTF8(value);
226 WTF::String convertedPriority = WTF::String::fromUTF8(priority);
227 auto result = item->setProperty(convertedPropertyName, convertedValue, convertedPriority);
228 if (result.hasException()) {
229 WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
230 g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
234 gchar* webkit_dom_css_style_declaration_item(WebKitDOMCSSStyleDeclaration* self, gulong index)
236 WebCore::JSMainThreadNullState state;
237 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
238 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
239 gchar* result = convertToUTF8String(item->item(index));
243 gchar* webkit_dom_css_style_declaration_get_property_shorthand(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName)
245 WebCore::JSMainThreadNullState state;
246 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
247 g_return_val_if_fail(propertyName, 0);
248 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
249 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
250 gchar* result = convertToUTF8String(item->getPropertyShorthand(convertedPropertyName));
254 gboolean webkit_dom_css_style_declaration_is_property_implicit(WebKitDOMCSSStyleDeclaration* self, const gchar* propertyName)
256 WebCore::JSMainThreadNullState state;
257 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), FALSE);
258 g_return_val_if_fail(propertyName, FALSE);
259 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
260 WTF::String convertedPropertyName = WTF::String::fromUTF8(propertyName);
261 gboolean result = item->isPropertyImplicit(convertedPropertyName);
265 gchar* webkit_dom_css_style_declaration_get_css_text(WebKitDOMCSSStyleDeclaration* self)
267 WebCore::JSMainThreadNullState state;
268 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
269 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
270 gchar* result = convertToUTF8String(item->cssText());
274 void webkit_dom_css_style_declaration_set_css_text(WebKitDOMCSSStyleDeclaration* self, const gchar* value, GError** error)
276 WebCore::JSMainThreadNullState state;
277 g_return_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self));
278 g_return_if_fail(value);
279 g_return_if_fail(!error || !*error);
280 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
281 WTF::String convertedValue = WTF::String::fromUTF8(value);
282 auto result = item->setCssText(convertedValue);
283 if (result.hasException()) {
284 WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
285 g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
289 gulong webkit_dom_css_style_declaration_get_length(WebKitDOMCSSStyleDeclaration* self)
291 WebCore::JSMainThreadNullState state;
292 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
293 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
294 gulong result = item->length();
298 WebKitDOMCSSRule* webkit_dom_css_style_declaration_get_parent_rule(WebKitDOMCSSStyleDeclaration* self)
300 WebCore::JSMainThreadNullState state;
301 g_return_val_if_fail(WEBKIT_DOM_IS_CSS_STYLE_DECLARATION(self), 0);
302 WebCore::CSSStyleDeclaration* item = WebKit::core(self);
303 RefPtr<WebCore::CSSRule> gobjectResult = WTF::getPtr(item->parentRule());
304 return WebKit::kit(gobjectResult.get());