// 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; Vector<UChar> name; name.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") || hasCSSPropertyNamePrefix(propertyName, "khtml") || hasCSSPropertyNamePrefix(propertyName, "apple")) name.append('-'); else if (WTF::isASCIIUpper(propertyName[0])) return 0; name.append(WTF::toASCIILower(propertyName[i++])); for (; i < length; ++i) { UChar c = propertyName[i]; if (!WTF::isASCIIUpper(c)) name.append(c); else { name.append('-'); name.append(WTF::toASCIILower(c)); } } String propName = String::adopt(name); int propertyID = cssPropertyID(propName); if (propertyID) { propInfo = new CSSPropertyInfo(); propInfo->hadPixelOrPosPrefix = hadPixelOrPosPrefix; propInfo->wasFilter = (propName == "filter"); propInfo->propID = propertyID; map.add(propertyName, propInfo); } } return propInfo; }
static String cssPropertyName(const Identifier& propertyName, bool* hadPixelOrPosPrefix = 0) { if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = false; unsigned length = propertyName.length(); if (!length) return String(); StringBuilder builder; builder.reserveCapacity(length); unsigned i = 0; if (hasCSSPropertyNamePrefix(propertyName, "css")) i += 3; else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) { i += 5; if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = true; } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) { i += 3; if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = true; } else if (hasCSSPropertyNamePrefix(propertyName, "webkit") || hasCSSPropertyNamePrefix(propertyName, "khtml") || hasCSSPropertyNamePrefix(propertyName, "apple") || hasCSSPropertyNamePrefix(propertyName, "epub")) builder.append('-'); else { if (isASCIIUpper(propertyName.characters()[0])) return String(); } builder.append(toASCIILower(propertyName.characters()[i++])); for (; i < length; ++i) { UChar c = propertyName.characters()[i]; if (!isASCIIUpper(c)) builder.append(c); else builder.append(makeString('-', toASCIILower(c))); } return builder.toString(); }
static String cssPropertyName(const Identifier& propertyName, bool* hadPixelOrPosPrefix = 0) { if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = false; unsigned length = propertyName.size(); if (!length) return String(); Vector<UChar> name; name.reserveInitialCapacity(length); unsigned i = 0; if (hasCSSPropertyNamePrefix(propertyName, "css")) i += 3; else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) { i += 5; if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = true; } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) { i += 3; if (hadPixelOrPosPrefix) *hadPixelOrPosPrefix = true; } else if (hasCSSPropertyNamePrefix(propertyName, "webkit") || hasCSSPropertyNamePrefix(propertyName, "khtml") || hasCSSPropertyNamePrefix(propertyName, "apple")) name.append('-'); else { if (isASCIIUpper(propertyName.data()[0])) return String(); } name.append(toASCIILower(propertyName.data()[i++])); for (; i < length; ++i) { UChar c = propertyName.data()[i]; if (!isASCIIUpper(c)) name.append(c); else { name.append('-'); name.append(toASCIILower(c)); } } return String::adopt(name); }