summaryrefslogtreecommitdiffstats
path: root/WebCore/css/CSSParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/css/CSSParser.cpp')
-rw-r--r--WebCore/css/CSSParser.cpp106
1 files changed, 48 insertions, 58 deletions
diff --git a/WebCore/css/CSSParser.cpp b/WebCore/css/CSSParser.cpp
index f511507..07cd300 100644
--- a/WebCore/css/CSSParser.cpp
+++ b/WebCore/css/CSSParser.cpp
@@ -138,7 +138,6 @@ CSSParser::CSSParser(bool strictParsing)
, m_important(false)
, m_id(0)
, m_styleSheet(0)
- , m_mediaQuery(0)
, m_valueList(0)
, m_parsedProperties(static_cast<CSSProperty**>(fastMalloc(32 * sizeof(CSSProperty*))))
, m_numParsedProperties(0)
@@ -160,9 +159,6 @@ CSSParser::CSSParser(bool strictParsing)
, m_allowImportRules(true)
, m_allowVariablesRules(true)
, m_allowNamespaceDeclarations(true)
- , m_floatingMediaQuery(0)
- , m_floatingMediaQueryExp(0)
- , m_floatingMediaQueryExpList(0)
{
#if YYDEBUG > 0
cssyydebug = 1;
@@ -180,12 +176,8 @@ CSSParser::~CSSParser()
fastFree(m_data);
- if (m_floatingMediaQueryExpList) {
+ if (m_floatingMediaQueryExpList)
deleteAllValues(*m_floatingMediaQueryExpList);
- delete m_floatingMediaQueryExpList;
- }
- delete m_floatingMediaQueryExp;
- delete m_floatingMediaQuery;
fastDeleteAllValues(m_floatingSelectors);
deleteAllValues(m_floatingValueLists);
deleteAllValues(m_floatingFunctions);
@@ -409,10 +401,15 @@ bool CSSParser::parseMediaQuery(MediaList* queries, const String& string)
if (string.isEmpty())
return true;
+<<<<<<< HEAD
#ifdef ANDROID_INSTRUMENT
android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
#endif
m_mediaQuery = 0;
+=======
+ ASSERT(!m_mediaQuery);
+
+>>>>>>> webkit.org at r66666
// can't use { because tokenizer state switches from mediaquery to initial state when it sees { token.
// instead insert one " " (which is WHITESPACE in CSSGrammar.y)
setupParser("@-webkit-mediaquery ", string, "} ");
@@ -421,8 +418,7 @@ bool CSSParser::parseMediaQuery(MediaList* queries, const String& string)
bool ok = false;
if (m_mediaQuery) {
ok = true;
- queries->appendMediaQuery(m_mediaQuery);
- m_mediaQuery = 0;
+ queries->appendMediaQuery(m_mediaQuery.release());
}
#ifdef ANDROID_INSTRUMENT
@@ -466,12 +462,13 @@ void CSSParser::clearProperties()
Document* CSSParser::document() const
{
StyleBase* root = m_styleSheet;
- Document* doc = 0;
while (root && root->parent())
root = root->parent();
- if (root && root->isCSSStyleSheet())
- doc = static_cast<CSSStyleSheet*>(root)->doc();
- return doc;
+ if (!root)
+ return 0;
+ if (!root->isCSSStyleSheet())
+ return 0;
+ return static_cast<CSSStyleSheet*>(root)->document();
}
bool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict)
@@ -1219,14 +1216,14 @@ bool CSSParser::parseValue(int propId, bool important)
case CSSPropertyBorderBottomRightRadius: {
if (num != 1 && num != 2)
return false;
- validPrimitive = validUnit(value, FLength, m_strict);
+ validPrimitive = validUnit(value, FLength | FPercent, m_strict);
if (!validPrimitive)
return false;
RefPtr<CSSPrimitiveValue> parsedValue1 = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
RefPtr<CSSPrimitiveValue> parsedValue2;
if (num == 2) {
value = m_valueList->next();
- validPrimitive = validUnit(value, FLength, m_strict);
+ validPrimitive = validUnit(value, FLength | FPercent, m_strict);
if (!validPrimitive)
return false;
parsedValue2 = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
@@ -1242,7 +1239,7 @@ bool CSSParser::parseValue(int propId, bool important)
case CSSPropertyWebkitBorderRadius:
return parseBorderRadius(propId, important);
case CSSPropertyOutlineOffset:
- validPrimitive = validUnit(value, FLength, m_strict);
+ validPrimitive = validUnit(value, FLength | FPercent, m_strict);
break;
case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
case CSSPropertyWebkitBoxShadow:
@@ -2363,7 +2360,7 @@ bool CSSParser::parseContent(int propId, bool important)
parsedValue = CSSImageValue::create(m_styleSheet->completeURL(val->string));
} else if (val->unit == CSSParserValue::Function) {
// attr(X) | counter(X [,Y]) | counters(X, Y, [,Z]) | -webkit-gradient(...)
- CSSParserValueList* args = val->function->args;
+ CSSParserValueList* args = val->function->args.get();
if (!args)
return false;
if (equalIgnoringCase(val->function->name, "attr(")) {
@@ -2913,7 +2910,7 @@ PassRefPtr<CSSValue> CSSParser::parseAnimationTimingFunction()
return 0;
// The only timing function we accept for now is a cubic bezier function. 4 points must be specified.
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
if (!equalIgnoringCase(value->function->name, "cubic-bezier(") || !args || args->size() != 7)
return 0;
@@ -3088,7 +3085,7 @@ bool CSSParser::parseDashboardRegions(int propId, bool important)
// also allow
// dashboard-region(label, type) or dashboard-region(label type)
// dashboard-region(label, type) or dashboard-region(label type)
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
if (!equalIgnoringCase(value->function->name, "dashboard-region(") || !args) {
valid = false;
break;
@@ -3234,7 +3231,7 @@ PassRefPtr<CSSValue> CSSParser::parseCounterContent(CSSParserValueList* args, bo
bool CSSParser::parseShape(int propId, bool important)
{
CSSParserValue* value = m_valueList->current();
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
if (!equalIgnoringCase(value->function->name, "rect(") || !args)
return false;
@@ -3598,7 +3595,7 @@ bool CSSParser::parseFontWeight(bool important)
static bool isValidFormatFunction(CSSParserValue* val)
{
- CSSParserValueList* args = val->function->args;
+ CSSParserValueList* args = val->function->args.get();
return equalIgnoringCase(val->function->name, "format(") && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT);
}
@@ -3621,7 +3618,7 @@ bool CSSParser::parseFontFaceSrc()
expectComma = true;
} else if (val->unit == CSSParserValue::Function) {
// There are two allowed functions: local() and format().
- CSSParserValueList* args = val->function->args;
+ CSSParserValueList* args = val->function->args.get();
if (args && args->size() == 1) {
if (equalIgnoringCase(val->function->name, "local(") && !expectComma) {
expectComma = true;
@@ -3959,7 +3956,7 @@ static inline int colorIntFromValue(CSSParserValue* v)
bool CSSParser::parseColorParameters(CSSParserValue* value, int* colorArray, bool parseAlpha)
{
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
CSSParserValue* v = args->current();
Units unitType = FUnknown;
// Get the first value and its type
@@ -4000,7 +3997,7 @@ bool CSSParser::parseColorParameters(CSSParserValue* value, int* colorArray, boo
// The first value, HUE, is in an angle with a value between 0 and 360
bool CSSParser::parseHSLParameters(CSSParserValue* value, double* colorArray, bool parseAlpha)
{
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
CSSParserValue* v = args->current();
// Get the first value
if (!validUnit(v, FNumber, true))
@@ -4549,7 +4546,7 @@ bool CSSParser::parseBorderRadius(int propId, bool important)
if (i - indexAfterSlash >= 4)
return false;
- if (!validUnit(value, FLength, m_strict))
+ if (!validUnit(value, FLength | FPercent, m_strict))
return false;
RefPtr<CSSPrimitiveValue> radius = CSSPrimitiveValue::create(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit));
@@ -4649,7 +4646,7 @@ static bool parseGradientColorStop(CSSParser* p, CSSParserValue* a, CSSGradientC
!equalIgnoringCase(a->function->name, "color-stop("))
return false;
- CSSParserValueList* args = a->function->args;
+ CSSParserValueList* args = a->function->args.get();
if (!args)
return false;
@@ -4708,7 +4705,7 @@ bool CSSParser::parseGradient(RefPtr<CSSValue>& gradient)
RefPtr<CSSGradientValue> result = CSSGradientValue::create();
// Walk the arguments.
- CSSParserValueList* args = m_valueList->current()->function->args;
+ CSSParserValueList* args = m_valueList->current()->function->args.get();
if (!args || args->size() == 0)
return false;
@@ -4829,7 +4826,7 @@ bool CSSParser::parseCanvas(RefPtr<CSSValue>& canvas)
RefPtr<CSSCanvasValue> result = CSSCanvasValue::create();
// Walk the arguments.
- CSSParserValueList* args = m_valueList->current()->function->args;
+ CSSParserValueList* args = m_valueList->current()->function->args.get();
if (!args || args->size() != 1)
return false;
@@ -4949,7 +4946,7 @@ PassRefPtr<CSSValueList> CSSParser::parseTransform()
return 0;
// Every primitive requires at least one argument.
- CSSParserValueList* args = value->function->args;
+ CSSParserValueList* args = value->function->args.get();
if (!args)
return 0;
@@ -5371,52 +5368,45 @@ CSSParserValue& CSSParser::sinkFloatingValue(CSSParserValue& value)
MediaQueryExp* CSSParser::createFloatingMediaQueryExp(const AtomicString& mediaFeature, CSSParserValueList* values)
{
- delete m_floatingMediaQueryExp;
- m_floatingMediaQueryExp = new MediaQueryExp(mediaFeature, values);
- return m_floatingMediaQueryExp;
+ m_floatingMediaQueryExp = adoptPtr(new MediaQueryExp(mediaFeature, values));
+ return m_floatingMediaQueryExp.get();
}
-MediaQueryExp* CSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* e)
+PassOwnPtr<MediaQueryExp> CSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* expression)
{
- ASSERT(e == m_floatingMediaQueryExp);
- m_floatingMediaQueryExp = 0;
- return e;
+ ASSERT_UNUSED(expression, expression == m_floatingMediaQueryExp);
+ return m_floatingMediaQueryExp.release();
}
Vector<MediaQueryExp*>* CSSParser::createFloatingMediaQueryExpList()
{
- if (m_floatingMediaQueryExpList) {
+ if (m_floatingMediaQueryExpList)
deleteAllValues(*m_floatingMediaQueryExpList);
- delete m_floatingMediaQueryExpList;
- }
- m_floatingMediaQueryExpList = new Vector<MediaQueryExp*>;
- return m_floatingMediaQueryExpList;
+ m_floatingMediaQueryExpList = adoptPtr(new Vector<MediaQueryExp*>);
+ return m_floatingMediaQueryExpList.get();
}
-Vector<MediaQueryExp*>* CSSParser::sinkFloatingMediaQueryExpList(Vector<MediaQueryExp*>* l)
+PassOwnPtr<Vector<MediaQueryExp*> > CSSParser::sinkFloatingMediaQueryExpList(Vector<MediaQueryExp*>* list)
{
- ASSERT(l == m_floatingMediaQueryExpList);
- m_floatingMediaQueryExpList = 0;
- return l;
+ ASSERT_UNUSED(list, list == m_floatingMediaQueryExpList);
+ return m_floatingMediaQueryExpList.release();
}
-MediaQuery* CSSParser::createFloatingMediaQuery(MediaQuery::Restrictor r, const String& mediaType, Vector<MediaQueryExp*>* exprs)
+MediaQuery* CSSParser::createFloatingMediaQuery(MediaQuery::Restrictor restrictor, const String& mediaType, PassOwnPtr<Vector<MediaQueryExp*> > expressions)
{
- delete m_floatingMediaQuery;
- m_floatingMediaQuery = new MediaQuery(r, mediaType, exprs);
- return m_floatingMediaQuery;
+ m_floatingMediaQuery = adoptPtr(new MediaQuery(restrictor, mediaType, expressions));
+ return m_floatingMediaQuery.get();
}
-MediaQuery* CSSParser::createFloatingMediaQuery(Vector<MediaQueryExp*>* exprs)
+MediaQuery* CSSParser::createFloatingMediaQuery(PassOwnPtr<Vector<MediaQueryExp*> > expressions)
{
- return createFloatingMediaQuery(MediaQuery::None, "all", exprs);
+ return createFloatingMediaQuery(MediaQuery::None, "all", expressions);
}
-MediaQuery* CSSParser::sinkFloatingMediaQuery(MediaQuery* mq)
+PassOwnPtr<MediaQuery> CSSParser::sinkFloatingMediaQuery(MediaQuery* query)
{
- ASSERT(mq == m_floatingMediaQuery);
- m_floatingMediaQuery = 0;
- return mq;
+ ASSERT_UNUSED(query, query == m_floatingMediaQuery);
+ return m_floatingMediaQuery.release();
}
MediaList* CSSParser::createMediaList()
@@ -5678,7 +5668,7 @@ bool CSSParser::checkForVariables(CSSParserValueList* valueList)
break;
}
- if (valueList->valueAt(i)->unit == CSSParserValue::Function && checkForVariables(valueList->valueAt(i)->function->args)) {
+ if (valueList->valueAt(i)->unit == CSSParserValue::Function && checkForVariables(valueList->valueAt(i)->function->args.get())) {
hasVariables = true;
break;
}