diff options
Diffstat (limited to 'WebCore/css/CSSPrimitiveValue.cpp')
-rw-r--r-- | WebCore/css/CSSPrimitiveValue.cpp | 113 |
1 files changed, 34 insertions, 79 deletions
diff --git a/WebCore/css/CSSPrimitiveValue.cpp b/WebCore/css/CSSPrimitiveValue.cpp index 012aa56..210d6f5 100644 --- a/WebCore/css/CSSPrimitiveValue.cpp +++ b/WebCore/css/CSSPrimitiveValue.cpp @@ -22,6 +22,7 @@ #include "CSSPrimitiveValue.h" #include "CSSHelper.h" +#include "CSSParser.h" #include "CSSPropertyNames.h" #include "CSSStyleSheet.h" #include "CSSValueKeywords.h" @@ -116,83 +117,30 @@ PassRefPtr<CSSPrimitiveValue> CSSPrimitiveValue::create(const String& value, Uni return adoptRef(new CSSPrimitiveValue(value, type)); } -static const char* valueOrPropertyName(int valueOrPropertyID) +static const AtomicString& valueOrPropertyName(int valueOrPropertyID) { - if (const char* valueName = getValueName(valueOrPropertyID)) - return valueName; - return getPropertyName(static_cast<CSSPropertyID>(valueOrPropertyID)); -} - -// "ident" from the CSS tokenizer, minus backslash-escape sequences -static bool isCSSTokenizerIdentifier(const String& string) -{ - const UChar* p = string.characters(); - const UChar* end = p + string.length(); + ASSERT_ARG(valueOrPropertyID, valueOrPropertyID >= 0); + ASSERT_ARG(valueOrPropertyID, valueOrPropertyID < numCSSValueKeywords || (valueOrPropertyID >= firstCSSProperty && valueOrPropertyID < firstCSSProperty + numCSSProperties)); - // -? - if (p != end && p[0] == '-') - ++p; + if (valueOrPropertyID < 0) + return nullAtom; - // {nmstart} - if (p == end || !(p[0] == '_' || p[0] >= 128 || isASCIIAlpha(p[0]))) - return false; - ++p; - - // {nmchar}* - for (; p != end; ++p) { - if (!(p[0] == '_' || p[0] == '-' || p[0] >= 128 || isASCIIAlphanumeric(p[0]))) - return false; + if (valueOrPropertyID < numCSSValueKeywords) { + static AtomicString* cssValueKeywordStrings[numCSSValueKeywords]; + if (!cssValueKeywordStrings[valueOrPropertyID]) + cssValueKeywordStrings[valueOrPropertyID] = new AtomicString(getValueName(valueOrPropertyID)); + return *cssValueKeywordStrings[valueOrPropertyID]; } - return true; -} - -// "url" from the CSS tokenizer, minus backslash-escape sequences -static bool isCSSTokenizerURL(const String& string) -{ - const UChar* p = string.characters(); - const UChar* end = p + string.length(); - - for (; p != end; ++p) { - UChar c = p[0]; - switch (c) { - case '!': - case '#': - case '$': - case '%': - case '&': - break; - default: - if (c < '*') - return false; - if (c <= '~') - break; - if (c < 128) - return false; - } + if (valueOrPropertyID >= firstCSSProperty && valueOrPropertyID < firstCSSProperty + numCSSProperties) { + static AtomicString* cssPropertyStrings[numCSSProperties]; + int propertyIndex = valueOrPropertyID - firstCSSProperty; + if (!cssPropertyStrings[propertyIndex]) + cssPropertyStrings[propertyIndex] = new AtomicString(getPropertyName(static_cast<CSSPropertyID>(valueOrPropertyID))); + return *cssPropertyStrings[propertyIndex]; } - return true; -} - -// We use single quotes for now because markup.cpp uses double quotes. -static String quoteString(const String& string) -{ - // FIXME: Also need to escape characters like '\n'. - String s = string; - s.replace('\\', "\\\\"); - s.replace('\'', "\\'"); - return "'" + s + "'"; -} - -static String quoteStringIfNeeded(const String& string) -{ - return isCSSTokenizerIdentifier(string) ? string : quoteString(string); -} - -static String quoteURLIfNeeded(const String& string) -{ - return isCSSTokenizerURL(string) ? string : quoteString(string); + return nullAtom; } CSSPrimitiveValue::CSSPrimitiveValue() @@ -317,6 +265,7 @@ void CSSPrimitiveValue::cleanup() } m_type = 0; + m_cachedCSSText = String(); } int CSSPrimitiveValue::computeLengthInt(RenderStyle* style, RenderStyle* rootStyle) @@ -484,7 +433,6 @@ void CSSPrimitiveValue::setFloatValue(unsigned short unitType, double floatValue cleanup(); - //if(m_type > CSS_DIMENSION) throw DOMException(INVALID_ACCESS_ERR); m_value.num = floatValue; m_type = unitType; } @@ -685,6 +633,9 @@ String CSSPrimitiveValue::cssText() const { // FIXME: return the original value instead of a generated one (e.g. color // name if it was specified) - check what spec says about this + if (!m_cachedCSSText.isNull()) + return m_cachedCSSText; + String text; switch (m_type) { case CSS_UNKNOWN: @@ -752,10 +703,10 @@ String CSSPrimitiveValue::cssText() const // FIXME break; case CSS_STRING: - text = quoteStringIfNeeded(m_value.string); + text = quoteCSSStringIfNeeded(m_value.string); break; case CSS_URI: - text = "url(" + quoteURLIfNeeded(m_value.string) + ")"; + text = "url(" + quoteCSSURLIfNeeded(m_value.string) + ")"; break; case CSS_IDENT: text = valueOrPropertyName(m_value.ident); @@ -770,7 +721,8 @@ String CSSPrimitiveValue::cssText() const append(result, m_value.string); result.uncheckedAppend(')'); - return String::adopt(result); + text = String::adopt(result); + break; } case CSS_COUNTER: text = "counter("; @@ -798,7 +750,8 @@ String CSSPrimitiveValue::cssText() const append(result, rectVal->left()->cssText()); result.append(')'); - return String::adopt(result); + text = String::adopt(result); + break; } case CSS_RGBCOLOR: case CSS_PARSER_HEXCOLOR: { @@ -827,11 +780,12 @@ String CSSPrimitiveValue::cssText() const appendNumber(result, static_cast<unsigned char>(color.blue())); if (color.hasAlpha()) { append(result, commaSpace); - append(result, String::number(static_cast<float>(color.alpha()) / 256.0f)); + append(result, String::number(color.alpha() / 256.0f)); } result.append(')'); - return String::adopt(result); + text = String::adopt(result); + break; } case CSS_PAIR: text = m_value.pair->first()->cssText(); @@ -880,9 +834,10 @@ String CSSPrimitiveValue::cssText() const break; } case CSS_PARSER_IDENTIFIER: - text = quoteStringIfNeeded(m_value.string); + text = quoteCSSStringIfNeeded(m_value.string); break; } + m_cachedCSSText = text; return text; } @@ -927,7 +882,7 @@ CSSParserValue CSSPrimitiveValue::parserValue() const break; case CSS_IDENT: { value.id = m_value.ident; - String name = valueOrPropertyName(m_value.ident); + const AtomicString& name = valueOrPropertyName(m_value.ident); value.string.characters = const_cast<UChar*>(name.characters()); value.string.length = name.length(); break; |