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