15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007-2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "V8CSSStyleDeclaration.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h"
357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "bindings/v8/ExceptionState.h"
367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "bindings/v8/V8Binding.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSParser.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPrimitiveValue.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleDeclaration.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValue.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/EventTarget.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/RuntimeCSSEnabled.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/ASCIICType.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/PassRefPtr.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/RefPtr.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/StdLibExtras.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Vector.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/StringBuilder.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/StringConcatenate.h"
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// FIXME: Next two functions look lifted verbatim from JSCSSStyleDeclarationCustom. Please remove duplication.
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Check for a CSS prefix.
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Passed prefix is all lowercase.
605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// First character of the prefix within the property name may be upper or lowercase.
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Other characters in the prefix within the property name must be lowercase.
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// The prefix within the property name must be followed by a capital letter.
635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static bool hasCSSPropertyNamePrefix(const String& propertyName, const char* prefix)
645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#ifndef NDEBUG
665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(*prefix);
675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    for (const char* p = prefix; *p; ++p)
685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        ASSERT(isASCIILower(*p));
695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(propertyName.length());
705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (toASCIILower(propertyName[0]) != prefix[0])
735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return false;
745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    unsigned length = propertyName.length();
765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    for (unsigned i = 1; i < length; ++i) {
775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (!prefix[i])
785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return isASCIIUpper(propertyName[i]);
795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (propertyName[i] != prefix[i])
805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return false;
815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return false;
835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class CSSPropertyInfo {
865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)public:
875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSPropertyID propID;
885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)};
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// When getting properties on CSSStyleDeclarations, the name used from
915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Javascript and the actual name of the property are not the same, so
925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// we have to do the following translation. The translation turns upper
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// case characters into lower case characters and inserts dashes to
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// separate words.
955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)//
965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Example: 'backgroundPositionY' -> 'background-position-y'
975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)//
98f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)// Also, certain prefixes such as 'css-' are stripped.
995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static CSSPropertyInfo* cssPropertyInfo(v8::Handle<v8::String> v8PropertyName)
1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    String propertyName = toWebCoreString(v8PropertyName);
1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    typedef HashMap<String, CSSPropertyInfo*> CSSPropertyInfoMap;
1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DEFINE_STATIC_LOCAL(CSSPropertyInfoMap, map, ());
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSPropertyInfo* propInfo = map.get(propertyName);
1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!propInfo) {
1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        unsigned length = propertyName.length();
1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (!length)
1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return 0;
1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        StringBuilder builder;
1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        builder.reserveCapacity(length);
1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        unsigned i = 0;
1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (hasCSSPropertyNamePrefix(propertyName, "css"))
1165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            i += 3;
117f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        else if (hasCSSPropertyNamePrefix(propertyName, "webkit"))
1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            builder.append('-');
1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        else if (isASCIIUpper(propertyName[0]))
1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return 0;
1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        builder.append(toASCIILower(propertyName[i++]));
1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        for (; i < length; ++i) {
1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            UChar c = propertyName[i];
1265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (!isASCIIUpper(c))
1275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                builder.append(c);
1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            else {
1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                builder.append('-');
1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                builder.append(toASCIILower(c));
1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            }
1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        String propName = builder.toString();
1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSPropertyID propertyID = cssPropertyID(propName);
1365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (propertyID && RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID)) {
1375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            propInfo = new CSSPropertyInfo();
1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            propInfo->propID = propertyID;
1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            map.add(propertyName, propInfo);
1405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return propInfo;
1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid V8CSSStyleDeclaration::namedPropertyEnumeratorCustom(const v8::PropertyCallbackInfo<v8::Array>& info)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef Vector<String, numCSSProperties - 1> PreAllocatedPropertyVector;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(PreAllocatedPropertyVector, propertyNames, ());
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static unsigned propertyNamesLength = 0;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (propertyNames.isEmpty()) {
15253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (int id = firstCSSProperty; id <= lastCSSProperty; ++id) {
15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            CSSPropertyID propertyId = static_cast<CSSPropertyID>(id);
15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (RuntimeCSSEnabled::isCSSPropertyEnabled(propertyId))
15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                propertyNames.append(getJSPropertyName(propertyId));
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sort(propertyNames.begin(), propertyNames.end(), codePointCompareLessThan);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        propertyNamesLength = propertyNames.size();
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    v8::Handle<v8::Array> properties = v8::Array::New(propertyNamesLength);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < propertyNamesLength; ++i) {
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String key = propertyNames.at(i);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!key.isNull());
165591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        properties->Set(v8::Integer::New(i, info.GetIsolate()), v8String(key, info.GetIsolate()));
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    v8SetReturnValue(info, properties);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid V8CSSStyleDeclaration::namedPropertyQueryCustom(v8::Local<v8::String> v8Name, const v8::PropertyCallbackInfo<v8::Integer>& info)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // NOTE: cssPropertyInfo lookups incur several mallocs.
17453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Successful lookups have the same cost the first time, but are cached.
175521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (cssPropertyInfo(v8Name)) {
176521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        v8SetReturnValueInt(info, 0);
177521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
178521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid V8CSSStyleDeclaration::namedPropertyGetterCustom(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
1825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // First look for API defined attributes on the style declaration object.
1845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (info.Holder()->HasRealNamedCallbackProperty(name))
185521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
1865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Search the style declaration.
1885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSPropertyInfo* propInfo = cssPropertyInfo(name);
1895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Do not handle non-property names.
1915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!propInfo)
192521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
1935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSStyleDeclaration* imp = V8CSSStyleDeclaration::toNative(info.Holder());
1955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    RefPtr<CSSValue> cssValue = imp->getPropertyCSSValueInternal(static_cast<CSSPropertyID>(propInfo->propID));
1965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (cssValue) {
1977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        v8SetReturnValueStringOrNull(info, cssValue->cssText(), info.GetIsolate());
198521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
1995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
2005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    String result = imp->getPropertyValueInternal(static_cast<CSSPropertyID>(propInfo->propID));
2025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (result.isNull())
2035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        result = ""; // convert null to empty string.
2045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
205e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    v8SetReturnValueString(info, result, info.GetIsolate());
2065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid V8CSSStyleDeclaration::namedPropertySetterCustom(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info)
2095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSStyleDeclaration* imp = V8CSSStyleDeclaration::toNative(info.Holder());
2115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSPropertyInfo* propInfo = cssPropertyInfo(name);
2125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!propInfo)
213521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
2145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    String propertyValue = toWebCoreStringWithNullCheck(value);
2165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ExceptionState es(info.GetIsolate());
2187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    imp->setPropertyInternal(static_cast<CSSPropertyID>(propInfo->propID), propertyValue, false, es);
2195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (es.throwIfNeeded())
221521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
2225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
223521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    v8SetReturnValue(info, value);
2245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
227