summaryrefslogtreecommitdiffstats
path: root/WebCore/css/CSSPrimitiveValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/css/CSSPrimitiveValue.cpp')
-rw-r--r--WebCore/css/CSSPrimitiveValue.cpp113
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;