18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSCSSStyleDeclarationCustom.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "CSSMutableStyleDeclaration.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPrimitiveValue.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValue.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/StringObjectThatMasqueradesAsUndefined.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/StringPrototype.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/ASCIICType.h>
36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h>
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/text/StringBuilder.h>
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/text/StringConcatenate.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSCSSStyleDeclaration::markChildren(MarkStack& markStack)
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Base::markChildren(markStack);
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSStyleDeclaration* declaration = impl();
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSGlobalData& globalData = *Heap::heap(this)->globalData();
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (CSSRule* parentRule = declaration->parentRule())
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        markDOMObjectWrapper(markStack, globalData, parentRule);
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (declaration->isMutableStyleDeclaration()) {
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSMutableStyleDeclaration* mutableDeclaration = static_cast<CSSMutableStyleDeclaration*>(declaration);
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSMutableStyleDeclaration::const_iterator end = mutableDeclaration->end();
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (CSSMutableStyleDeclaration::const_iterator it = mutableDeclaration->begin(); it != end; ++it)
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            markDOMObjectWrapper(markStack, globalData, it->value());
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Check for a CSS prefix.
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Passed prefix is all lowercase.
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// First character of the prefix within the property name may be upper or lowercase.
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Other characters in the prefix within the property name must be lowercase.
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The prefix within the property name must be followed by a capital letter.
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool hasCSSPropertyNamePrefix(const Identifier& propertyName, const char* prefix)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(*prefix);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (const char* p = prefix; *p; ++p)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(isASCIILower(*p));
74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    ASSERT(propertyName.length());
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
77f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (toASCIILower(propertyName.characters()[0]) != prefix[0])
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned length = propertyName.length();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 1; i < length; ++i) {
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!prefix[i])
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return isASCIIUpper(propertyName.characters()[i]);
84f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (propertyName.characters()[i] != prefix[i])
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic String cssPropertyName(const Identifier& propertyName, bool* hadPixelOrPosPrefix = 0)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hadPixelOrPosPrefix)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *hadPixelOrPosPrefix = false;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned length = propertyName.length();
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return String();
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    StringBuilder builder;
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    builder.reserveCapacity(length);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned i = 0;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasCSSPropertyNamePrefix(propertyName, "css"))
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i += 3;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i += 5;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hadPixelOrPosPrefix)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *hadPixelOrPosPrefix = true;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i += 3;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hadPixelOrPosPrefix)
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *hadPixelOrPosPrefix = true;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (hasCSSPropertyNamePrefix(propertyName, "webkit")
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || hasCSSPropertyNamePrefix(propertyName, "khtml")
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || hasCSSPropertyNamePrefix(propertyName, "apple"))
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        builder.append('-');
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (isASCIIUpper(propertyName.characters()[0]))
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return String();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    builder.append(toASCIILower(propertyName.characters()[i++]));
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (; i < length; ++i) {
126f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        UChar c = propertyName.characters()[i];
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!isASCIIUpper(c))
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            builder.append(c);
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            builder.append(makeString('-', toASCIILower(c)));
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return builder.toString();
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool isCSSPropertyName(const Identifier& propertyIdentifier)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: This mallocs a string for the property name and then throws it
13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // away.  This shows up on peacekeeper's domDynamicCreationCreateElement.
1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return CSSStyleDeclaration::isPropertyName(cssPropertyName(propertyIdentifier));
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSCSSStyleDeclaration::canGetItemsForName(ExecState*, CSSStyleDeclaration*, const Identifier& propertyName)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return isCSSPropertyName(propertyName);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// FIXME: You can get these properties, and set them (see putDelegate below),
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// but you should also be able to enumerate them.
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue JSCSSStyleDeclaration::nameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSCSSStyleDeclaration* thisObj = static_cast<JSCSSStyleDeclaration*>(asObject(slotBase));
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set up pixelOrPos boolean to handle the fact that
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // pixelTop returns "CSS Top" as number value in unit pixels
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // posTop returns "CSS top" as number value in unit pixels _if_ its a
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // positioned element. if it is not a positioned element, return 0
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // from MSIE documentation FIXME: IMPLEMENT THAT (Dirk)
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool pixelOrPos;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String prop = cssPropertyName(propertyName, &pixelOrPos);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> v = thisObj->impl()->getPropertyCSSValue(prop);
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (v) {
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pixelOrPos && v->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE)
164e14391e94c850b8bd03680c23b38978db68687a8John Reck            return jsNumber(static_pointer_cast<CSSPrimitiveValue>(v)->getFloatValue(CSSPrimitiveValue::CSS_PX));
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsStringOrNull(exec, v->cssText());
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the property is a shorthand property (such as "padding"),
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // it can only be accessed using getPropertyValue.
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make the SVG 'filter' attribute undetectable, to avoid confusion with the IE 'filter' attribute.
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propertyName == "filter")
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return StringObjectThatMasqueradesAsUndefined::create(exec, stringToUString(thisObj->impl()->getPropertyValue(prop)));
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsString(exec, thisObj->impl()->getPropertyValue(prop));
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool JSCSSStyleDeclaration::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot&)
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool pixelOrPos;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String prop = cssPropertyName(propertyName, &pixelOrPos);
1832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!CSSStyleDeclaration::isPropertyName(prop))
1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String propValue = valueToStringWithNullCheck(exec, value);
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pixelOrPos)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propValue += "px";
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    impl()->setProperty(prop, propValue, ec);
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDOMException(exec, ec);
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
196