JSCSSStyleDeclarationCustom.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/*
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom *
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Redistribution and use in source and binary forms, with or without
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * modification, are permitted provided that the following conditions
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * are met:
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * 1. Redistributions of source code must retain the above copyright
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom *    notice, this list of conditions and the following disclaimer.
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom *    notice, this list of conditions and the following disclaimer in the
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom *    documentation and/or other materials provided with the distribution.
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom#include "config.h"
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom#include "JSCSSStyleDeclarationCustom.h"
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include "CSSMutableStyleDeclaration.h"
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include "CSSPrimitiveValue.h"
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include "CSSValue.h"
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include "PlatformString.h"
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include <runtime/StringObjectThatMasqueradesAsUndefined.h>
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom#include <runtime/StringPrototype.h>
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom#include <wtf/ASCIICType.h>
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#include <wtf/text/AtomicString.h>
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromusing namespace JSC;
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromusing namespace WTF;
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromnamespace WebCore {
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromvoid JSCSSStyleDeclaration::markChildren(MarkStack& markStack)
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    Base::markChildren(markStack);
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    CSSStyleDeclaration* declaration = impl();
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    JSGlobalData& globalData = *Heap::heap(this)->globalData();
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    if (CSSRule* parentRule = declaration->parentRule())
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        markDOMObjectWrapper(markStack, globalData, parentRule);
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    if (declaration->isMutableStyleDeclaration()) {
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        CSSMutableStyleDeclaration* mutableDeclaration = static_cast<CSSMutableStyleDeclaration*>(declaration);
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        CSSMutableStyleDeclaration::const_iterator end = mutableDeclaration->end();
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        for (CSSMutableStyleDeclaration::const_iterator it = mutableDeclaration->begin(); it != end; ++it)
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            markDOMObjectWrapper(markStack, globalData, it->value());
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom// Check for a CSS prefix.
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom// Passed prefix is all lowercase.
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom// First character of the prefix within the property name may be upper or lowercase.
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// Other characters in the prefix within the property name must be lowercase.
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom// The prefix within the property name must be followed by a capital letter.
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromstatic bool hasCSSPropertyNamePrefix(const Identifier& propertyName, const char* prefix)
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom#ifndef NDEBUG
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    ASSERT(*prefix);
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    for (const char* p = prefix; *p; ++p)
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASSERT(isASCIILower(*p));
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    ASSERT(propertyName.length());
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom#endif
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    if (toASCIILower(propertyName.characters()[0]) != prefix[0])
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return false;
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    unsigned length = propertyName.length();
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    for (unsigned i = 1; i < length; ++i) {
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!prefix[i])
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return isASCIIUpper(propertyName.characters()[i]);
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (propertyName.characters()[i] != prefix[i])
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return false;
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    return false;
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromstatic String cssPropertyName(const Identifier& propertyName, bool* hadPixelOrPosPrefix = 0)
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    if (hadPixelOrPosPrefix)
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        *hadPixelOrPosPrefix = false;
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    unsigned length = propertyName.length();
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    if (!length)
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return String();
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    Vector<UChar> name;
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    name.reserveInitialCapacity(length);
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    unsigned i = 0;
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    if (hasCSSPropertyNamePrefix(propertyName, "css"))
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        i += 3;
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        i += 5;
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (hadPixelOrPosPrefix)
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            *hadPixelOrPosPrefix = true;
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        i += 3;
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (hadPixelOrPosPrefix)
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            *hadPixelOrPosPrefix = true;
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    } else if (hasCSSPropertyNamePrefix(propertyName, "webkit")
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            || hasCSSPropertyNamePrefix(propertyName, "khtml")
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            || hasCSSPropertyNamePrefix(propertyName, "apple"))
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        name.append('-');
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    else {
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (isASCIIUpper(propertyName.characters()[0]))
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return String();
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    name.append(toASCIILower(propertyName.characters()[i++]));
1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    for (; i < length; ++i) {
1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        UChar c = propertyName.characters()[i];
1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (!isASCIIUpper(c))
1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            name.append(c);
1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        else {
1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            name.append('-');
1298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            name.append(toASCIILower(c));
1308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    return String::adopt(name);
1348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
1358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromstatic bool isCSSPropertyName(const Identifier& propertyName)
1378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
1388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    // FIXME: This mallocs a string for the property name and then throws it
1398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    // away.  This shows up on peacekeeper's domDynamicCreationCreateElement.
1408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    return CSSStyleDeclaration::isPropertyName(cssPropertyName(propertyName));
1418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
1428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrombool JSCSSStyleDeclaration::canGetItemsForName(ExecState*, CSSStyleDeclaration*, const Identifier& propertyName)
1448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
1458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    return isCSSPropertyName(propertyName);
1468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
1478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// FIXME: You can get these properties, and set them (see putDelegate below),
1498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// but you should also be able to enumerate them.
1508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian CarlstromJSValue JSCSSStyleDeclaration::nameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
1518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
1528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    JSCSSStyleDeclaration* thisObj = static_cast<JSCSSStyleDeclaration*>(asObject(slotBase));
1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    // Set up pixelOrPos boolean to handle the fact that
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // pixelTop returns "CSS Top" as number value in unit pixels
1568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    // posTop returns "CSS top" as number value in unit pixels _if_ its a
1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // positioned element. if it is not a positioned element, return 0
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // from MSIE documentation FIXME: IMPLEMENT THAT (Dirk)
1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    bool pixelOrPos;
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    String prop = cssPropertyName(propertyName, &pixelOrPos);
1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    RefPtr<CSSValue> v = thisObj->impl()->getPropertyCSSValue(prop);
1628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    if (v) {
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (pixelOrPos && v->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE)
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return jsNumber(static_pointer_cast<CSSPrimitiveValue>(v)->getFloatValue(CSSPrimitiveValue::CSS_PX));
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return jsStringOrNull(exec, v->cssText());
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // If the property is a shorthand property (such as "padding"),
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // it can only be accessed using getPropertyValue.
1708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    // Make the SVG 'filter' attribute undetectable, to avoid confusion with the IE 'filter' attribute.
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    if (propertyName == "filter")
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return StringObjectThatMasqueradesAsUndefined::create(exec, stringToUString(thisObj->impl()->getPropertyValue(prop)));
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    return jsString(exec, thisObj->impl()->getPropertyValue(prop));
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrombool JSCSSStyleDeclaration::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot&)
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    if (!isCSSPropertyName(propertyName))
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return false;
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    bool pixelOrPos;
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    String prop = cssPropertyName(propertyName, &pixelOrPos);
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    String propValue = valueToStringWithNullCheck(exec, value);
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    if (pixelOrPos)
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        propValue += "px";
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ExceptionCode ec = 0;
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    impl()->setProperty(prop, propValue, ec);
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    setDOMException(exec, ec);
1928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    return true;
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
1948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} // namespace WebCore
1964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom