| Index: Source/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp
|
| diff --git a/Source/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp b/Source/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp
|
| index 252a7f7fb2a116a59bfcb6f0f9136553eb030a70..b76618f72b1f5b524638cc6c3657850dd130923d 100644
|
| --- a/Source/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp
|
| +++ b/Source/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp
|
| @@ -54,105 +54,7 @@ using namespace std;
|
|
|
| namespace WebCore {
|
|
|
| -// FIXME: Next two functions look lifted verbatim from JSCSSStyleDeclarationCustom. Please remove duplication.
|
| -
|
| -// Check for a CSS prefix.
|
| -// Passed prefix is all lowercase.
|
| -// First character of the prefix within the property name may be upper or lowercase.
|
| -// Other characters in the prefix within the property name must be lowercase.
|
| -// The prefix within the property name must be followed by a capital letter.
|
| -static bool hasCSSPropertyNamePrefix(const String& propertyName, const char* prefix)
|
| -{
|
| -#ifndef NDEBUG
|
| - ASSERT(*prefix);
|
| - for (const char* p = prefix; *p; ++p)
|
| - ASSERT(isASCIILower(*p));
|
| - ASSERT(propertyName.length());
|
| -#endif
|
| -
|
| - if (toASCIILower(propertyName[0]) != prefix[0])
|
| - return false;
|
| -
|
| - unsigned length = propertyName.length();
|
| - for (unsigned i = 1; i < length; ++i) {
|
| - if (!prefix[i])
|
| - return isASCIIUpper(propertyName[i]);
|
| - if (propertyName[i] != prefix[i])
|
| - return false;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -class CSSPropertyInfo {
|
| -public:
|
| - CSSPropertyID propID;
|
| - bool hadPixelOrPosPrefix;
|
| -};
|
| -
|
| -// When getting properties on CSSStyleDeclarations, the name used from
|
| -// Javascript and the actual name of the property are not the same, so
|
| -// we have to do the following translation. The translation turns upper
|
| -// case characters into lower case characters and inserts dashes to
|
| -// separate words.
|
| -//
|
| -// Example: 'backgroundPositionY' -> 'background-position-y'
|
| -//
|
| -// Also, certain prefixes such as 'pos', 'css-' and 'pixel-' are stripped
|
| -// and the hadPixelOrPosPrefix out parameter is used to indicate whether or
|
| -// not the property name was prefixed with 'pos-' or 'pixel-'.
|
| -static CSSPropertyInfo* cssPropertyInfo(v8::Handle<v8::String> v8PropertyName)
|
| -{
|
| - String propertyName = toWebCoreString(v8PropertyName);
|
| - typedef HashMap<String, CSSPropertyInfo*> CSSPropertyInfoMap;
|
| - DEFINE_STATIC_LOCAL(CSSPropertyInfoMap, map, ());
|
| - CSSPropertyInfo* propInfo = map.get(propertyName);
|
| - if (!propInfo) {
|
| - unsigned length = propertyName.length();
|
| - bool hadPixelOrPosPrefix = false;
|
| - if (!length)
|
| - return 0;
|
| -
|
| - StringBuilder builder;
|
| - builder.reserveCapacity(length);
|
| -
|
| - unsigned i = 0;
|
| -
|
| - if (hasCSSPropertyNamePrefix(propertyName, "css"))
|
| - i += 3;
|
| - else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {
|
| - i += 5;
|
| - hadPixelOrPosPrefix = true;
|
| - } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {
|
| - i += 3;
|
| - hadPixelOrPosPrefix = true;
|
| - } else if (hasCSSPropertyNamePrefix(propertyName, "webkit"))
|
| - builder.append('-');
|
| - else if (isASCIIUpper(propertyName[0]))
|
| - return 0;
|
| -
|
| - builder.append(toASCIILower(propertyName[i++]));
|
| -
|
| - for (; i < length; ++i) {
|
| - UChar c = propertyName[i];
|
| - if (!isASCIIUpper(c))
|
| - builder.append(c);
|
| - else {
|
| - builder.append('-');
|
| - builder.append(toASCIILower(c));
|
| - }
|
| - }
|
|
|
| - String propName = builder.toString();
|
| - CSSPropertyID propertyID = cssPropertyID(propName);
|
| - if (propertyID && RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID)) {
|
| - propInfo = new CSSPropertyInfo();
|
| - propInfo->hadPixelOrPosPrefix = hadPixelOrPosPrefix;
|
| - propInfo->propID = propertyID;
|
| - map.add(propertyName, propInfo);
|
| - }
|
| - }
|
| - return propInfo;
|
| -}
|
|
|
| v8::Handle<v8::Array> V8CSSStyleDeclaration::namedPropertyEnumerator(const v8::AccessorInfo& info)
|
| {
|
| @@ -184,47 +86,18 @@ v8::Handle<v8::Integer> V8CSSStyleDeclaration::namedPropertyQuery(v8::Local<v8::
|
| {
|
| // NOTE: cssPropertyInfo lookups incur several mallocs.
|
| // Successful lookups have the same cost the first time, but are cached.
|
| - if (cssPropertyInfo(v8Name))
|
| + String propertyName = toWebCoreString(v8Name);
|
| + if (CSSStyleDeclaration::cssPropertyInfo(propertyName))
|
| return v8Integer(0, info.GetIsolate());
|
|
|
| return v8::Handle<v8::Integer>();
|
| }
|
|
|
| -v8::Handle<v8::Value> V8CSSStyleDeclaration::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
|
| -{
|
| - // First look for API defined attributes on the style declaration object.
|
| - if (info.Holder()->HasRealNamedCallbackProperty(name))
|
| - return v8Undefined();
|
| -
|
| - // Search the style declaration.
|
| - CSSPropertyInfo* propInfo = cssPropertyInfo(name);
|
| -
|
| - // Do not handle non-property names.
|
| - if (!propInfo)
|
| - return v8Undefined();
|
| -
|
| - CSSStyleDeclaration* imp = V8CSSStyleDeclaration::toNative(info.Holder());
|
| - RefPtr<CSSValue> cssValue = imp->getPropertyCSSValueInternal(static_cast<CSSPropertyID>(propInfo->propID));
|
| - if (cssValue) {
|
| - if (propInfo->hadPixelOrPosPrefix &&
|
| - cssValue->isPrimitiveValue()) {
|
| - return v8::Number::New(static_cast<CSSPrimitiveValue*>(
|
| - cssValue.get())->getFloatValue(CSSPrimitiveValue::CSS_PX));
|
| - }
|
| - return v8StringOrNull(cssValue->cssText(), info.GetIsolate());
|
| - }
|
| -
|
| - String result = imp->getPropertyValueInternal(static_cast<CSSPropertyID>(propInfo->propID));
|
| - if (result.isNull())
|
| - result = ""; // convert null to empty string.
|
| -
|
| - return v8String(result, info.GetIsolate());
|
| -}
|
| -
|
| v8::Handle<v8::Value> V8CSSStyleDeclaration::namedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
|
| {
|
| CSSStyleDeclaration* imp = V8CSSStyleDeclaration::toNative(info.Holder());
|
| - CSSPropertyInfo* propInfo = cssPropertyInfo(name);
|
| + String propertyName = toWebCoreString(name);
|
| + CSSPropertyInfo* propInfo = CSSStyleDeclaration::cssPropertyInfo(propertyName);
|
| if (!propInfo)
|
| return v8Undefined();
|
|
|
|
|