CSSParser.cpp revision 54cdeeebc7adcbcd900e8b6a141a8cae27d9a631
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSBorderImageValue.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSCanvasValue.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSCharsetRule.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSCursorImageValue.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSFontFaceRule.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSFontFaceSrcValue.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSGradientValue.h"
35a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "CSSImageValue.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSImportRule.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSInheritedValue.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSInitialValue.h"
392bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSLineBoxContainValue.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSMediaRule.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSMutableStyleDeclaration.h"
4221939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "CSSPageRule.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPrimitiveValue.h"
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "CSSPrimitiveValueCache.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSProperty.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
4768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "CSSPropertySourceData.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSQuirkPrimitiveValue.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSReflectValue.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSRuleList.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSSelector.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleRule.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h"
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "CSSTimingFunctionValue.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSUnicodeRangeValue.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueKeywords.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueList.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Counter.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatConversion.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontFamilyValue.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontValue.h"
63a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h"
64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "HashTools.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaList.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaQueryExp.h"
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Page.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Pair.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Rect.h"
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "RenderTheme.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ShadowValue.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframeRule.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframesRule.h"
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSTransformValue.h"
7521939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <limits.h>
762bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/HexNumber.h>
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/dtoa.h>
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringBuffer.h>
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DashboardRegion.h"
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YYDEBUG 0
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if YYDEBUG > 0
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern int cssyydebug;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern int cssyyparse(void* parser);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
96dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#include "TimeCounter.h"
97dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
98dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10121939df44de1705786c545cd1bf519d47250322dBen Murdochstatic const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX;
1022bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const double MAX_SCALE = 1000000;
10321939df44de1705786c545cd1bf519d47250322dBen Murdoch
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool equal(const CSSParserString& a, const char* b)
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < a.length; ++i) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b[i])
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a.characters[i] != b[i])
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !b[a.length];
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool equalIgnoringCase(const CSSParserString& a, const char* b)
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < a.length; ++i) {
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b[i])
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!isASCIIUpper(b[i]));
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (toASCIILower(a.characters[i]) != b[i])
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !b[a.length];
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool hasPrefix(const char* string, unsigned length, const char* prefix)
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < length; ++i) {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!prefix[i])
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (string[i] != prefix[i])
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParser::CSSParser(bool strictParsing)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_strict(strictParsing)
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_important(false)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_id(0)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_styleSheet(0)
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_valueList(0)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_parsedProperties(static_cast<CSSProperty**>(fastMalloc(32 * sizeof(CSSProperty*))))
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_numParsedProperties(0)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_maxParsedProperties(32)
14721939df44de1705786c545cd1bf519d47250322dBen Murdoch    , m_numParsedPropertiesBeforeMarginBox(INVALID_NUM_PARSED_PROPERTIES)
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_inParseShorthand(0)
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_currentShorthand(0)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_implicitShorthand(false)
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hasFontFaceOnlyValues(false)
152d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_hadSyntacticallyValidCSSRule(false)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_defaultNamespace(starAtom)
1544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    , m_inStyleRuleOrDeclaration(false)
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_selectorListRange(0, 0)
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_ruleBodyRange(0, 0)
157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_propertyRange(UINT_MAX, UINT_MAX)
15868513a70bcd92384395513322f1b801e7bf9c729Steve Block    , m_ruleRangeMap(0)
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_currentRuleData(0)
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_data(0)
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , yy_start(1)
162e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    , m_lineNumber(0)
163e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    , m_lastSelectorLineNumber(0)
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_allowImportRules(true)
165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_allowNamespaceDeclarations(true)
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if YYDEBUG > 0
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyydebug = 1;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
17068513a70bcd92384395513322f1b801e7bf9c729Steve Block    CSSPropertySourceData::init();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParser::~CSSParser()
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_parsedProperties);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_valueList;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_data);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    fastDeleteAllValues(m_floatingSelectors);
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block    deleteAllValues(m_floatingSelectorVectors);
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_floatingValueLists);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_floatingFunctions);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParserString::lower()
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: If we need Unicode lowercasing here, then we probably want the real kind
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that can potentially change the length of the string rather than the character
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by character kind. If we don't need Unicode lowercasing, it would be good to
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // simplify this function.
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (charactersAreAllASCII(characters, length)) {
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fast case for all-ASCII.
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < length; i++)
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            characters[i] = toASCIILower(characters[i]);
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < length; i++)
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            characters[i] = Unicode::toLower(characters[i]);
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::setupParser(const char* prefix, const String& string, const char* suffix)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = string.length() + strlen(prefix) + strlen(suffix) + 2;
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_data);
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data = static_cast<UChar*>(fastMalloc(length * sizeof(UChar)));
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < strlen(prefix); i++)
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data[i] = prefix[i];
213e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    memcpy(m_data + strlen(prefix), string.characters(), string.length() * sizeof(UChar));
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned start = strlen(prefix) + string.length();
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned end = start + strlen(suffix);
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = start; i < end; i++)
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data[i] = suffix[i - start];
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data[length - 1] = 0;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data[length - 2] = 0;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yy_hold_char = 0;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yyleng = 0;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yytext = yy_c_buf_p = m_data;
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yy_hold_char = *yy_c_buf_p;
2285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    resetRuleBodyMarks();
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23168513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::parseSheet(CSSStyleSheet* sheet, const String& string, int startLineNumber, StyleRuleRangeMap* ruleRangeMap)
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
233dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
234dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
235dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
23681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_defaultNamespace = starAtom; // Reset the default namespace.
23868513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_ruleRangeMap = ruleRangeMap;
239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (ruleRangeMap) {
240a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = CSSRuleSourceData::create();
241a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
243e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
244e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_lineNumber = startLineNumber;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("", string, "");
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
24768513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_ruleRangeMap = 0;
248a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_currentRuleData = 0;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
250dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
251dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
252dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSRule> CSSParser::parseRule(CSSStyleSheet* sheet, const String& string)
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
257dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
258dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
259dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
26081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_allowNamespaceDeclarations = false;
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-rule{", string, "} ");
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
264dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
265dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
266dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_rule.release();
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSRule> CSSParser::parseKeyframeRule(CSSStyleSheet *sheet, const String &string)
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
272dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
273dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
274dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-keyframe-rule{ ", string, "} ");
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
278dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
279dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
280dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_keyframe.release();
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool isColorPropertyID(int propertyId)
2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (propertyId) {
2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyColor:
2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundColor:
2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderBottomColor:
2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderLeftColor:
2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderRightColor:
2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderTopColor:
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOutlineColor:
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextLineThroughColor:
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextOverlineColor:
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextUnderlineColor:
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderAfterColor:
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderBeforeColor:
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitColumnRuleColor:
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextEmphasisColor:
3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextFillColor:
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextStrokeColor:
3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    default:
3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool parseColorValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!string.length())
3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!isColorPropertyID(propertyId))
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSParserString cssString;
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cssString.characters = const_cast<UChar*>(string.characters());
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cssString.length = string.length();
3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int valueID = cssValueKeywordID(cssString);
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool validPrimitive = false;
3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (valueID == CSSValueWebkitText)
3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else if (valueID == CSSValueCurrentcolor)
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else if ((valueID >= CSSValueAqua && valueID <= CSSValueWindowtext) || valueID == CSSValueMenu
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch             || (valueID >= CSSValueWebkitFocusRingColor && valueID < CSSValueWebkitText && !strict)) {
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSStyleSheet* stylesheet = static_cast<CSSStyleSheet*>(declaration->stylesheet());
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!stylesheet || !stylesheet->document())
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (validPrimitive) {
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createIdentifierValue(valueID), important);
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        declaration->addParsedProperty(property);
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RGBA32 color;
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!CSSParser::parseColor(string, color, strict && string[0] != '#'))
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createColorValue(color), important);
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    declaration->addParsedProperty(property);
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool isSimpleLengthPropertyID(int propertyId, bool& acceptsNegativeNumbers)
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (propertyId) {
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyFontSize:
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyHeight:
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWidth:
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMinHeight:
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMinWidth:
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingBottom:
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingLeft:
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingRight:
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingTop:
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitLogicalWidth:
3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitLogicalHeight:
3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMinLogicalWidth:
3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMinLogicalHeight:
3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingAfter:
3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingBefore:
3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingEnd:
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingStart:
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        acceptsNegativeNumbers = false;
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBottom:
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyLeft:
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginBottom:
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginLeft:
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginRight:
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginTop:
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyRight:
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextIndent:
3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTop:
3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginAfter:
3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginBefore:
3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginEnd:
3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginStart:
3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        acceptsNegativeNumbers = true;
3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    default:
3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool parseSimpleLengthValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
3902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    const UChar* characters = string.characters();
3922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    unsigned length = string.length();
3932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!characters || !length)
3942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool acceptsNegativeNumbers;
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!isSimpleLengthPropertyID(propertyId, acceptsNegativeNumbers))
3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSPrimitiveValue::UnitTypes unit = CSSPrimitiveValue::CSS_NUMBER;
4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (length > 2 && characters[length - 2] == 'p' && characters[length - 1] == 'x') {
4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        length -= 2;
4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PX;
4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    } else if (length > 1 && characters[length - 1] == '%') {
4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        length -= 1;
4052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PERCENTAGE;
4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // We rely on charactersToDouble for validation as well. The function
4092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // will set "ok" to "false" if the entire passed-in character range does
4102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // not represent a double.
4112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool ok;
4122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    double number = charactersToDouble(characters, length, &ok);
4132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!ok)
4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (unit == CSSPrimitiveValue::CSS_NUMBER) {
4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (number && strict)
4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return false;
4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PX;
4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (number < 0 && !acceptsNegativeNumbers)
4212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
4222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSStyleSheet* stylesheet = static_cast<CSSStyleSheet*>(declaration->stylesheet());
4242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!stylesheet || !stylesheet->document())
4252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createValue(number, unit), important);
4272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    declaration->addParsedProperty(property);
4282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
4292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
4302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool CSSParser::parseValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
4332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (parseSimpleLengthValue(declaration, propertyId, string, important, strict))
4342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
4352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (parseColorValue(declaration, propertyId, string, important, strict))
4362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSParser parser(strict);
4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return parser.parseValue(declaration, propertyId, string, important);
4392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool CSSParser::parseValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important)
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
443dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
444dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
445dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-value{", string, "} ");
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_id = propertyId;
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_important = important;
453e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
455e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasFontFaceOnlyValues)
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        deleteFontFaceOnlyValues();
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties) {
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        declaration->addParsedProperties(m_parsedProperties, m_numParsedProperties);
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clearProperties();
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
467dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
468dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
469dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// color will only be changed when string contains a valid css color, making it
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// possible to set up a default color.
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(RGBA32& color, const String& string, bool strict)
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
477f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // First try creating a color specified by name, rgba(), rgb() or "#" syntax.
478e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (parseColor(string, color, strict))
479e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return true;
480e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser parser(true);
482e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RefPtr<CSSMutableStyleDeclaration> dummyStyleDeclaration = CSSMutableStyleDeclaration::create();
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
484e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // Now try to create a color from rgba() syntax.
485e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!parser.parseColor(dummyStyleDeclaration.get(), string))
486e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return false;
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CSSValue* value = parser.m_parsedProperties[0]->value();
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (value->cssValueType() != CSSValue::CSS_PRIMITIVE_VALUE)
4902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_RGBCOLOR)
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    color = primitiveValue->getRGBA32Value();
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(CSSMutableStyleDeclaration* declaration, const String& string)
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
502dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
503dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
504dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
50681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-decls{color:", string, "} ");
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
512dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
513dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
514dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (m_numParsedProperties && m_parsedProperties[0]->m_id == CSSPropertyColor);
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool CSSParser::parseSystemColor(RGBA32& color, const String& string, Document* document)
5192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!document || !document->page())
5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
5222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserString cssColor;
5242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    cssColor.characters = const_cast<UChar*>(string.characters());
5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    cssColor.length = string.length();
5262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int id = cssValueKeywordID(cssColor);
5272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (id <= 0)
5282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
5292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    color = document->page()->theme()->systemColor(id).rgb();
5312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
5322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
534635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSParser::parseSelector(const String& string, Document* doc, CSSSelectorList& selectorList)
5351e6338658628fcabd955cf65687a30976c7893ceSteve Block{
536dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
537dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
538dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSStyleSheet> dummyStyleSheet = CSSStyleSheet::create(doc);
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(dummyStyleSheet.get());
542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_selectorListForParseSelector = &selectorList;
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-selector{", string, "}");
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_selectorListForParseSelector = 0;
5496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
5506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // The style sheet will be deleted right away, so it won't outlive the document.
5516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ASSERT(dummyStyleSheet->hasOneRef());
5521dc835977a4eb41ef79490200c176352bae43cc1Russell Brenner
5531dc835977a4eb41ef79490200c176352bae43cc1Russell Brenner#ifdef ANDROID_INSTRUMENT
5541dc835977a4eb41ef79490200c176352bae43cc1Russell Brenner    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
5551dc835977a4eb41ef79490200c176352bae43cc1Russell Brenner#endif
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool CSSParser::parseDeclaration(CSSMutableStyleDeclaration* declaration, const String& string, RefPtr<CSSStyleSourceData>* styleSourceData)
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
560dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
561dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
562dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
5638de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
56468513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Length of the "@-webkit-decls{" prefix.
56568513a70bcd92384395513322f1b801e7bf9c729Steve Block    static const unsigned prefixLength = 15;
56668513a70bcd92384395513322f1b801e7bf9c729Steve Block
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
56881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
569a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (styleSourceData) {
570a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = CSSRuleSourceData::create();
571a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
5724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_inStyleRuleOrDeclaration = true;
573a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-decls{", string, "} ");
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasFontFaceOnlyValues)
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        deleteFontFaceOnlyValues();
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties) {
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        declaration->addParsedProperties(m_parsedProperties, m_numParsedProperties);
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clearProperties();
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_currentRuleData) {
589a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->styleBodyRange.start = 0;
590a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->styleBodyRange.end = string.length();
591a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (Vector<CSSPropertySourceData>::iterator it = m_currentRuleData->styleSourceData->propertyData.begin(), endIt = m_currentRuleData->styleSourceData->propertyData.end(); it != endIt; ++it) {
59268513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*it).range.start -= prefixLength;
59368513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*it).range.end -= prefixLength;
59468513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
59568513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
59668513a70bcd92384395513322f1b801e7bf9c729Steve Block
597a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (styleSourceData) {
598a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        *styleSourceData = m_currentRuleData->styleSourceData.release();
599a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = 0;
6004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_inStyleRuleOrDeclaration = false;
601a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
6025e86dc63da68e46049c5252367ef8b2a54016f0aBen Murdoch#ifdef ANDROID_INSTRUMENT
6035e86dc63da68e46049c5252367ef8b2a54016f0aBen Murdoch    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
6045e86dc63da68e46049c5252367ef8b2a54016f0aBen Murdoch#endif
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseMediaQuery(MediaList* queries, const String& string)
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (string.isEmpty())
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
613dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
614dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::start(android::TimeCounter::CSSParseTimeCounter);
615dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
6165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(!m_mediaQuery);
6175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // can't use { because tokenizer state switches from mediaquery to initial state when it sees { token.
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // instead insert one " " (which is WHITESPACE in CSSGrammar.y)
6200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setupParser("@-webkit-mediaquery ", string, "} ");
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_mediaQuery) {
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
6265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        queries->appendMediaQuery(m_mediaQuery.release());
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
629dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#ifdef ANDROID_INSTRUMENT
630dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba    android::TimeCounter::record(android::TimeCounter::CSSParseTimeCounter, __FUNCTION__);
631dac9d5be4c497a51b6e083bc9b232977d8e195c1Grace Kloba#endif
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addProperty(int propId, PassRefPtr<CSSValue> value, bool important)
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    OwnPtr<CSSProperty> prop(new CSSProperty(propId, value, important, m_currentShorthand, m_implicitShorthand));
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties >= m_maxParsedProperties) {
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_maxParsedProperties += 32;
6418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (m_maxParsedProperties > UINT_MAX / sizeof(CSSProperty*))
6428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parsedProperties = static_cast<CSSProperty**>(fastRealloc(m_parsedProperties,
644e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_maxParsedProperties * sizeof(CSSProperty*)));
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
646e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_parsedProperties[m_numParsedProperties++] = prop.leakPtr();
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::rollbackLastProperties(int num)
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(num >= 0);
6528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(m_numParsedProperties >= static_cast<unsigned>(num));
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < num; ++i)
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_parsedProperties[--m_numParsedProperties];
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::clearProperties()
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; i++)
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_parsedProperties[i];
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_numParsedProperties = 0;
66321939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasFontFaceOnlyValues = false;
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
66781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid CSSParser::setStyleSheet(CSSStyleSheet* styleSheet)
66881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
66981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_styleSheet = styleSheet;
67081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_primitiveValueCache = document() ? document()->cssPrimitiveValueCache() : CSSPrimitiveValueCache::create();
67181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocument* CSSParser::document() const
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    StyleBase* root = m_styleSheet;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (root && root->parent())
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        root = root->parent();
6785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!root)
6795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return 0;
6805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!root->isCSSStyleSheet())
6815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return 0;
6825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return static_cast<CSSStyleSheet*>(root)->document();
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict)
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool b = false;
6880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (value->unit) {
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_NUMBER:
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FNumber);
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b && ((unitflags & (FLength | FAngle | FTime)) && (value->fValue == 0 || !strict))) {
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value->unit = (unitflags & FLength) ? CSSPrimitiveValue::CSS_PX :
693635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                          ((unitflags & FAngle) ? CSSPrimitiveValue::CSS_DEG : CSSPrimitiveValue::CSS_MS);
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            b = true;
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b && (unitflags & FInteger) && value->isInt)
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            b = true;
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PERCENTAGE:
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FPercent);
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSParserValue::Q_EMS:
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_EMS:
7040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPrimitiveValue::CSS_REMS:
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_EXS:
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PX:
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_CM:
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_MM:
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_IN:
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PT:
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PC:
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FLength);
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_MS:
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_S:
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FTime);
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_DEG:
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_RAD:
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_GRAD:
721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPrimitiveValue::CSS_TURN:
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FAngle);
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_HZ:
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_KHZ:
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_DIMENSION:
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
730cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (b && unitflags & FNonNeg && value->fValue < 0)
731cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        b = false;
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return b;
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int unitFromString(CSSParserValue* value)
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSPrimitiveValue::CSS_IDENT || value->id)
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "em"))
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_EMS;
7420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (equal(value->string, "rem"))
7430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return CSSPrimitiveValue::CSS_REMS;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "ex"))
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_EXS;
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "px"))
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PX;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "cm"))
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_CM;
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "mm"))
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_MM;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "in"))
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_IN;
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "pt"))
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PT;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "pc"))
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PC;
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "deg"))
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_DEG;
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "rad"))
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_RAD;
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "grad"))
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_GRAD;
764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (equal(value->string, "turn"))
765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return CSSPrimitiveValue::CSS_TURN;
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "ms"))
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_MS;
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "s"))
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_S;
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "Hz"))
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_HZ;
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "kHz"))
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_KHZ;
774e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::checkForOrphanedUnits()
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_strict || inShorthand())
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
782e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The purpose of this code is to implement the WinIE quirk that allows unit types to be separated from their numeric values
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by whitespace, so e.g., width: 20 px instead of width:20px.  This is invalid CSS, so we don't do this in strict mode.
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* numericVal = 0;
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned size = m_valueList->size();
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < size; i++) {
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* value = m_valueList->valueAt(i);
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (numericVal) {
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Change the unit type of the numeric val to match.
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int unit = unitFromString(value);
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (unit) {
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                numericVal->unit = unit;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                numericVal = 0;
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Now delete the bogus unit value.
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->deleteValueAt(i);
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                i--; // We're safe even though |i| is unsigned, since we only hit this code if we had a previous numeric value (so |i| is always > 0 here).
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size--;
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
804e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        numericVal = (value->unit == CSSPrimitiveValue::CSS_NUMBER) ? value : 0;
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseValue(int propId, bool important)
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_valueList)
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
814cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* value = m_valueList->current();
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value)
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int id = value->id;
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In quirks mode, we will look for units that have been incorrectly separated from the number they belong to
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by a space.  We go ahead and associate the unit with the number even though it is invalid CSS.
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForOrphanedUnits();
824e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int num = inShorthand() ? 1 : m_valueList->size();
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueInherit) {
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1)
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, CSSInheritedValue::create(), important);
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (id == CSSValueInitial) {
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1)
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, CSSInitialValue::createExplicit(), important);
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    bool validPrimitive = false;
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> parsedValue;
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (static_cast<CSSPropertyID>(propId)) {
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* The comment to the left defines all valid value of this properties as defined
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * in CSS 2, Appendix F. Property index
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* All the CSS properties are not supported by the renderer at the moment.
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * Note that all the CSS2 Aural properties are only checked, if CSS_AURAL is defined
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * (see parseAuralValues). As we don't support them at all this seems reasonable.
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
85321939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertySize:                 // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
85421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return parseSize(propId, important);
85521939df44de1705786c545cd1bf519d47250322dBen Murdoch
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyQuotes:               // [<string> <string>]+ | none | inherit
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id)
8588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
85981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
86081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return parseQuotes(propId, important);
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8622bde8e466a4451c7319e3a072d118917957d6554Steve Block    case CSSPropertyUnicodeBidi: // normal | embed | bidi-override | isolate | inherit
8632bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueNormal
8642bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueEmbed
8652bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueBidiOverride
8662bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueWebkitIsolate)
8678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPosition:             // static | relative | absolute | fixed | inherit
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStatic ||
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRelative ||
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAbsolute ||
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueFixed)
8758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakAfter:     // auto | always | avoid | left | right | inherit
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakBefore:
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakAfter:
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakBefore:
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto ||
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAlways ||
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAvoid ||
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueLeft ||
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRight)
8878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakInside:    // avoid | auto | inherit
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakInside:
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueAvoid)
8938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyEmptyCells:          // show | hide | inherit
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueShow ||
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueHide)
8998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyContent:              // [ <string> | <uri> | <counter> | attr(X) | open-quote |
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // close-quote | no-open-quote | no-close-quote ]+ | inherit
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseContent(propId, important);
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWhiteSpace:          // normal | pre | nowrap | inherit
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal ||
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePre ||
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePreWrap ||
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePreLine ||
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueNowrap)
9128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClip:                 // <shape> | auto | inherit
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
9178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit == CSSParserValue::Function)
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseShape(propId, important);
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Start of supported CSS properties with validation. This is needed for parseShorthand to work
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * correctly and allows optimization in WebCore::applyRule(..)
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCaptionSide:         // top | bottom | left | right | inherit
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight ||
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueTop || id == CSSValueBottom)
9288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderCollapse:      // collapse | separate | inherit
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueCollapse || id == CSSValueSeparate)
9338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVisibility:           // visible | hidden | collapse | inherit
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueHidden || id == CSSValueCollapse)
9388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflow: {
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ShorthandScope scope(this, propId);
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1 || !parseValue(CSSPropertyOverflowX, important))
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValue* value = m_parsedProperties[m_numParsedProperties - 1]->value();
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyOverflowY, value, important);
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflowX:
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflowY:           // visible | hidden | scroll | auto | marquee | overlay | inherit
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueHidden || id == CSSValueScroll || id == CSSValueAuto ||
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueOverlay || id == CSSValueWebkitMarquee)
9538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStylePosition:  // inside | outside | inherit
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueInside || id == CSSValueOutside)
9588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleType:
962d0825bca7fe65beaee391d30da42e937db621564Steve Block        // See section CSS_PROP_LIST_STYLE_TYPE of file CSSValueKeywords.in
963d0825bca7fe65beaee391d30da42e937db621564Steve Block        // for the list of supported list-style-types.
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueDisc && id <= CSSValueKatakanaIroha) || id == CSSValueNone)
9658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDisplay:
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // inline | block | list-item | run-in | inline-block | table |
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // inline-table | table-row-group | table-header-group | table-footer-group | table-row |
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // table-column-group | table-column | table-cell | table-caption | box | inline-box | none | inherit
972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ((id >= CSSValueInline && id <= CSSValueWapMarquee) || id == CSSValueNone)
974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueInline && id <= CSSValueWebkitInlineBox) || id == CSSValueNone)
976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
9778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDirection:            // ltr | rtl | inherit
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLtr || id == CSSValueRtl)
9828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextTransform:       // capitalize | uppercase | lowercase | none | inherit
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueCapitalize && id <= CSSValueLowercase) || id == CSSValueNone)
9878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFloat:                // left | right | none | inherit + center for buggy CSS
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight ||
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueNone || id == CSSValueCenter)
9938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClear:                // none | left | right | both | inherit
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueLeft ||
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRight|| id == CSSValueBoth)
9998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextAlign:
10032bde8e466a4451c7319e3a072d118917957d6554Steve Block        // left | right | center | justify | webkit_left | webkit_right | webkit_center | webkit_match_parent |
10042bde8e466a4451c7319e3a072d118917957d6554Steve Block        // start | end | <string> | inherit
10052bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((id >= CSSValueWebkitAuto && id <= CSSValueWebkitMatchParent) || id == CSSValueStart || id == CSSValueEnd
10062bde8e466a4451c7319e3a072d118917957d6554Steve Block             || value->unit == CSSPrimitiveValue::CSS_STRING)
10078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineStyle:        // (<border-style> except hidden) | auto | inherit
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || (id >= CSSValueInset && id <= CSSValueDouble))
10128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1013e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
1014e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopStyle:     //// <border-style> | inherit
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightStyle:   //   Defined as:    none | hidden | dotted | dashed |
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomStyle:  //   solid | double | groove | ridge | inset | outset
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftStyle:
1019967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartStyle:
1020967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndStyle:
102168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeStyle:
102268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterStyle:
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleStyle:
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueNone && id <= CSSValueDouble)
10258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontWeight:  // normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontWeight(important);
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderSpacing: {
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitBorderHorizontalSpacing,
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitBorderVerticalSpacing };
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 1) {
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyBorderSpacing);
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* value = m_parsedProperties[m_numParsedProperties-1]->value();
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (num == 2) {
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyBorderSpacing);
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderHorizontalSpacing:
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderVerticalSpacing:
10528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineColor:        // <color> | invert | inherit
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Outline color has "invert" as additional keyword.
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Also, we want to allow the special focus color even in strict parsing mode.
105706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueInvert || id == CSSValueWebkitFocusRingColor) {
10588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
1062967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBackgroundColor: // <color> | inherit
1063967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderTopColor: // <color> | inherit
1064967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderRightColor:
1065967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderBottomColor:
1066967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderLeftColor:
1067967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
1068967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
106968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeColor:
107068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterColor:
1071967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyColor: // <color> | inherit
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughColor: // CSS3 text decoration colors
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineColor:
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineColor:
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleColor:
1076f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasisColor:
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextFillColor:
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeColor:
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText)
10808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true; // Always allow this, even when strict parsing is on,
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    // since we use this in our UA sheets.
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (id == CSSValueCurrentcolor)
10838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if ((id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu ||
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (id >= CSSValueWebkitFocusRingColor && id < CSSValueWebkitText && !m_strict)) {
10868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = parseColor();
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (parsedValue)
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCursor: {
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [<uri>,]*  [ auto | crosshair | default | pointer | progress | move | e-resize | ne-resize |
1096e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // nw-resize | n-resize | se-resize | sw-resize | s-resize | w-resize | ew-resize |
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | text | wait | help |
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // vertical-text | cell | context-menu | alias | copy | no-drop | not-allowed | -webkit-zoom-in
109906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // -webkit-zoom-out | all-scroll | -webkit-grab | -webkit-grabbing ] ] | inherit
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValueList> list;
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (value && value->unit == CSSPrimitiveValue::CSS_URI) {
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!list)
1103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                list = CSSValueList::createCommaSeparated();
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            String uri = value->string;
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Vector<int> coords;
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (value && value->unit == CSSPrimitiveValue::CSS_NUMBER) {
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                coords.append(int(value->fValue));
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = m_valueList->next();
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            IntPoint hotSpot(-1, -1);
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int nrcoords = coords.size();
11130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (nrcoords > 0 && nrcoords != 2)
11140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
11150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (nrcoords == 2)
1116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                hotSpot = IntPoint(coords[0], coords[1]);
1117e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
11180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!uri.isNull() && m_styleSheet) {
11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // FIXME: The completeURL call should be done when using the CSSCursorImageValue,
11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // not when creating it.
1121545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                list->append(CSSCursorImageValue::create(m_styleSheet->completeURL(uri), hotSpot));
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((m_strict && !value) || (value && !(value->unit == CSSParserValue::Operator && value->iValue == ',')))
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next(); // comma
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list) {
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!value) { // no value after url list (MSIE 5 compatibility)
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (list->length() != 1)
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (!m_strict && value->id == CSSValueHand) // MSIE 5 compatibility :/
113381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(CSSValuePointer));
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (value && ((value->id >= CSSValueAuto && value->id <= CSSValueWebkitGrabbing) || value->id == CSSValueCopy || value->id == CSSValueNone))
113581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(value->id));
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = list.release();
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id = value->id;
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_strict && value->id == CSSValueHand) { // MSIE 5 compatibility :/
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id = CSSValuePointer;
11438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if ((value->id >= CSSValueAuto && value->id <= CSSValueWebkitGrabbing) || value->id == CSSValueCopy || value->id == CSSValueNone)
11458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundAttachment:
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBackgroundClip:
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundClip:
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundComposite:
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundImage:
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBackgroundOrigin:
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundOrigin:
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPosition:
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPositionX:
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPositionY:
1159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundSize:
1160cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    case CSSPropertyWebkitBackgroundSize:
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundRepeat:
1162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundRepeatX:
1163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundRepeatY:
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskAttachment:
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskClip:
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskComposite:
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskImage:
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskOrigin:
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPosition:
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPositionX:
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPositionY:
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskSize:
1173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeat:
1174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeatX:
1175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeatY: {
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val1;
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val2;
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int propId1, propId2;
1179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool result = false;
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parseFillProperty(propId, propId1, propId2, val1, val2)) {
1181cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            OwnPtr<ShorthandScope> shorthandScope;
1182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if (propId == CSSPropertyBackgroundPosition ||
1183cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyBackgroundRepeat ||
1184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyWebkitMaskPosition ||
1185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyWebkitMaskRepeat) {
1186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                shorthandScope.set(new ShorthandScope(this, propId));
1187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            }
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId1, val1.release(), important);
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val2)
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId2, val2.release(), important);
1191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            result = true;
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = false;
1194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return result;
11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleImage:     // <uri> | none | inherit
11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone) {
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = CSSImageValue::create();
11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_URI) {
12010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (m_styleSheet) {
12020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // FIXME: The completeURL call should be done when using the CSSImageValue,
12030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // not when creating it.
12040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                parsedValue = CSSImageValue::create(m_styleSheet->completeURL(value->string));
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1207cad810f21b803229eb11403f9209855525a25d57Steve Block        } else if (isGeneratedImageValue(value)) {
1208cad810f21b803229eb11403f9209855525a25d57Steve Block            if (parseGeneratedImage(parsedValue))
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeWidth:
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineWidth:        // <border-width> | inherit
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopWidth:     //// <border-width> | inherit
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightWidth:   //   Which is defined as
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomWidth:  //   thin | medium | thick | <length>
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftWidth:
1221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartWidth:
1222967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndWidth:
122368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeWidth:
122468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterWidth:
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleWidth:
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
12278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
1229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLetterSpacing:       // normal | <length> | inherit
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordSpacing:         // normal | <length> | inherit
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
12358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength, m_strict);
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordBreak:          // normal | break-all | break-word (this is a custom extension)
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueBreakAll || id == CSSValueBreakWord)
12428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordWrap:           // normal | break-word
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueBreakWord)
12478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CSSPropertySpeak:           // none | normal | spell-out | digits | literal-punctuation | no-punctuation | inherit
1250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (id == CSSValueNone || id == CSSValueNormal || id == CSSValueSpellOut || id == CSSValueDigits
1251a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            || id == CSSValueLiteralPunctuation || id == CSSValueNoPunctuation)
1252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            validPrimitive = true;
1253a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        break;
1254a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextIndent:          // <length> | <percentage> | inherit
125606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
125706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
125806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingTop:          //// <padding-width> | inherit
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingRight:        //   Which is defined as
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingBottom:       //   <length> | <percentage>
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingLeft:         ////
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitPaddingStart:
1264e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    case CSSPropertyWebkitPaddingEnd:
126568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingBefore:
126668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingAfter:
126706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxHeight:           // <length> | <percentage> | none | inherit
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxWidth:            // <length> | <percentage> | none | inherit
127268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalWidth:
127368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalHeight:
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueIntrinsic || id == CSSValueMinIntrinsic) {
12758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinHeight:           // <length> | <percentage> | inherit
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinWidth:            // <length> | <percentage> | inherit
128168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalWidth:
128268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalHeight:
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic)
12848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontSize:
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueXxSmall && id <= CSSValueLarger)
12928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStyle:           // normal | italic | oblique | inherit
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontStyle(important);
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontVariant:         // normal | small-caps | inherit
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontVariant(important);
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVerticalAlign:
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // baseline | sub | super | top | text-top | middle | bottom | text-bottom |
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <percentage> | <length> | inherit
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueBaseline && id <= CSSValueWebkitBaselineMiddle)
13088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyHeight:               // <length> | <percentage> | auto | inherit
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidth:                // <length> | <percentage> | auto | inherit
131568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalWidth:
131668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalHeight:
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueIntrinsic || id == CSSValueMinIntrinsic)
13188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ### handle multilength case where we allow relative units
13218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg, m_strict));
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBottom:               // <length> | <percentage> | auto | inherit
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLeft:                 // <length> | <percentage> | auto | inherit
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyRight:                // <length> | <percentage> | auto | inherit
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTop:                  // <length> | <percentage> | auto | inherit
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginTop:           //// <margin-width> | inherit
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginRight:         //   Which is defined as
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginBottom:        //   <length> | <percentage> | auto | inherit
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginLeft:          ////
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginStart:
1333e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    case CSSPropertyWebkitMarginEnd:
133468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginBefore:
133568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginAfter:
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
13378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZIndex:              // auto | <integer> | inherit
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto) {
13448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOrphans:              // <integer> | inherit
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidows:               // <integer> | inherit
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ### not supported later on
13518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = (!id && validUnit(value, FInteger, false));
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLineHeight:          // normal | <number> | <length> | <percentage> | inherit
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
13568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FNumber | FLength | FPercent | FNonNeg, m_strict));
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterIncrement:    // [ <identifier> <integer>? ]+ | none | inherit
13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSValueNone)
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseCounter(propId, 1, important);
13638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = true;
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     case CSSPropertyCounterReset:        // [ <identifier> <integer>? ]+ | none | inherit
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSValueNone)
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseCounter(propId, 0, important);
13688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = true;
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontFamily:
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [[ <family-name> | <generic-family> ],]* [<family-name> | <generic-family>] | inherit
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parsedValue = parseFontFamily();
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextDecoration:
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextDecorationsInEffect:
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // none | [ underline || overline || line-through || blink ] | inherit
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone) {
13818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
13830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
13848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            bool isValid = true;
13858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            while (isValid && value) {
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (value->id) {
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBlink:
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueUnderline:
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueOverline:
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLineThrough:
139281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    list->append(primitiveValueCache()->createIdentifierValue(value->id));
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
13958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    isValid = false;
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = m_valueList->next();
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (list->length() && isValid) {
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = list.release();
14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyZoom:          // normal | reset | document | <number> | <percentage> | inherit
1407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueReset || id == CSSValueDocument)
14088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FNumber | FPercent | FNonNeg, true));
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1412e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTableLayout:         // auto | fixed | inherit
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueFixed)
14158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertySrc:  // Only used within @font-face, so cannot use inherit | initial or be !important.  This is a list of urls or local references.
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontFaceSrc();
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyUnicodeRange:
14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontFaceUnicodeRange();
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* CSS3 properties */
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAppearance:
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueCheckbox && id <= CSSValueTextarea) || id == CSSValueNone)
14278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderImage:
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskBoxImage:
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
14338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSValue> result;
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (parseBorderImage(propId, important, result)) {
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId, result, important);
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopRightRadius:
14430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopLeftRadius:
14440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomLeftRadius:
14450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomRightRadius: {
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1 && num != 2)
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
14485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!validPrimitive)
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
145181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> parsedValue1 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue2;
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 2) {
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
14555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (!validPrimitive)
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
145881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue2 = parsedValue1;
14610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<Pair> pair = Pair::create(parsedValue1.release(), parsedValue2.release());
146381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> val = primitiveValueCache()->createValue(pair.release());
14640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        addProperty(propId, val.release(), important);
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderRadius:
14680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitBorderRadius:
14690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return parseBorderRadius(propId, important);
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineOffset:
14715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
1474cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSPropertyBoxShadow:
1475231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitBoxShadow:
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
14778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseShadow(propId, important);
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxReflect:
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
14838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseReflect(propId, important);
14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOpacity:
14888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FNumber, m_strict);
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxAlign:
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStretch || id == CSSValueStart || id == CSSValueEnd ||
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueCenter || id == CSSValueBaseline)
14938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxDirection:
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueReverse)
14978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxLines:
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueSingle || id == CSSValueMultiple)
15018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrient:
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueHorizontal || id == CSSValueVertical ||
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueInlineAxis || id == CSSValueBlockAxis)
15068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxPack:
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStart || id == CSSValueEnd ||
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueCenter || id == CSSValueJustify)
15118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlex:
15148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FNumber, m_strict);
15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlexGroup:
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrdinalGroup:
15188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FInteger | FNonNeg, true);
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
152028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case CSSPropertyBoxSizing:
15218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = id == CSSValueBorderBox || id == CSSValueContentBox;
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1523643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case CSSPropertyWebkitColorCorrection:
15248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = id == CSSValueSrgb || id == CSSValueDefault;
1525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarquee: {
15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[5] = { CSSPropertyWebkitMarqueeDirection, CSSPropertyWebkitMarqueeIncrement,
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitMarqueeRepetition,
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitMarqueeStyle, CSSPropertyWebkitMarqueeSpeed };
15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 5, important);
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeDirection:
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueForwards || id == CSSValueBackwards || id == CSSValueAhead ||
15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueReverse || id == CSSValueLeft || id == CSSValueRight || id == CSSValueDown ||
15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueUp || id == CSSValueAuto)
15368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeIncrement:
15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueSmall || id == CSSValueLarge || id == CSSValueMedium)
15408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
15428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength | FPercent, m_strict);
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeStyle:
15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueSlide || id == CSSValueScroll || id == CSSValueAlternate)
15468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeRepetition:
15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueInfinite)
15508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
15528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FInteger | FNonNeg, m_strict);
15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeSpeed:
15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueSlow || id == CSSValueFast)
15568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
15588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FTime | FInteger | FNonNeg, m_strict);
15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
1561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeDir:
1562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueLtr || id == CSSValueRtl)
15638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeStyle:
1566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueNone || id == CSSValueSlide || id == CSSValueScroll || id == CSSValueAlternate)
15678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeLoop:
1570231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueInfinite)
15718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1572231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else
15738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FInteger | FNonNeg, m_strict);
1574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1575231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeSpeed:
1576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueNormal || id == CSSValueSlow || id == CSSValueFast)
15778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else
15798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FTime | FInteger | FNonNeg, m_strict);
1580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserDrag: // auto | none | element
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueElement)
15848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserModify: // read-only | read-write
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueReadOnly || id == CSSValueReadWrite || id == CSSValueReadWritePlaintextOnly)
15888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserSelect: // auto | none | text
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueText)
15928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverflow: // clip | ellipsis
15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueClip || id == CSSValueEllipsis)
15968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransform:
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
16008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> val = parseTransform();
16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val) {
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId, val, important);
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOrigin:
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginX:
16128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginY:
16138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginZ: {
16148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val1;
16158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val2;
16168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val3;
16178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int propId1, propId2, propId3;
16188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (parseTransformOrigin(propId, propId1, propId2, propId3, val1, val2, val3)) {
16198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            addProperty(propId1, val1.release(), important);
16208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (val2)
16218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                addProperty(propId2, val2.release(), important);
16228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (val3)
16238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                addProperty(propId3, val3.release(), important);
16248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return true;
16258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
16268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return false;
16278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
16288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformStyle:
16298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (value->id == CSSValueFlat || value->id == CSSValuePreserve3d)
16308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
16328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitBackfaceVisibility:
16338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (value->id == CSSValueVisible || value->id == CSSValueHidden)
16348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
16368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspective:
16378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (id == CSSValueNone)
16388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else {
16400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Accepting valueless numbers is a quirk of the -webkit prefixed version of the property.
16418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (validUnit(value, FNumber | FLength | FNonNeg, m_strict)) {
164281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                RefPtr<CSSValue> val = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
16438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (val) {
16448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    addProperty(propId, val.release(), important);
16458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return true;
16468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
16478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return false;
16488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
16498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
16508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
16518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOrigin:
16528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginX:
16538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginY: {
16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val1;
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val2;
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int propId1, propId2;
16578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (parsePerspectiveOrigin(propId, propId1, propId2, val1, val2)) {
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId1, val1.release(), important);
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val2)
16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId2, val2.release(), important);
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDelay:
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDirection:
16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDuration:
1668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSPropertyWebkitAnimationFillMode:
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationName:
16700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitAnimationPlayState:
16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationIterationCount:
16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationTimingFunction:
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDelay:
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDuration:
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionTimingFunction:
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionProperty: {
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val;
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parseAnimationProperty(propId, val)) {
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, val.release(), important);
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginCollapse: {
1685bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const int properties[2] = { CSSPropertyWebkitMarginBeforeCollapse,
1686bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            CSSPropertyWebkitMarginAfterCollapse };
16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 1) {
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse);
16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* value = m_parsedProperties[m_numParsedProperties-1]->value();
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (num == 2) {
16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse);
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1703bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginBeforeCollapse:
1704bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginAfterCollapse:
17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginTopCollapse:
17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginBottomCollapse:
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueCollapse || id == CSSValueSeparate || id == CSSValueDiscard)
17088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughMode:
17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineMode:
17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineMode:
17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueContinuous || id == CSSValueSkipWhiteSpace)
17148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughStyle:
17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineStyle:
17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineStyle:
17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueSolid || id == CSSValueDouble ||
17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueDashed || id == CSSValueDotDash || id == CSSValueDotDotDash ||
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueWave)
17228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1724231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyTextRendering: // auto | optimizeSpeed | optimizeLegibility | geometricPrecision
1725231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueOptimizelegibility
1726231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            || id == CSSValueGeometricprecision)
17278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1728231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughWidth:
17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineWidth:
17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineWidth:
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNormal || id == CSSValueThin ||
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueMedium || id == CSSValueThick)
17348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
17368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = !id && validUnit(value, FNumber | FLength | FPercent, m_strict);
17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyResize: // none | both | horizontal | vertical | auto
17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueBoth || id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValueAuto)
17408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnCount:
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
17448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
17468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = !id && validUnit(value, FInteger | FNonNeg, false);
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnGap:         // normal | <length>
17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
17508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
17528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1754e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitColumnSpan:        // all | 1
1755e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (id == CSSValueAll)
1756e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            validPrimitive = true;
1757e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        else
1758e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            validPrimitive = validUnit(value, FNumber | FNonNeg, m_strict) && value->fValue == 1;
1759e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnWidth:         // auto | <length>
17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
17628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else // Always parse this property in strict mode, since it would be ambiguous otherwise when used in the 'columns' shorthand property.
17648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength, true);
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyPointerEvents:
1767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // none | visiblePainted | visibleFill | visibleStroke | visible |
1768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // painted | fill | stroke | auto | all | inherit
1769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueNone || id == CSSValueAll || id == CSSValueAuto ||
1770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            (id >= CSSValueVisiblepainted && id <= CSSValueStroke))
17718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        break;
1773e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // End of CSS3 properties
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apple specific properties.  These will never be standardized and are purely to
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // support custom WebKit-based Apple applications.
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineClamp:
1779643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // When specifying number of lines, don't allow 0 as a valid value
1780643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // When specifying either type of unit, require non-negative integers
17818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTAGE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg, false));
17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSizeAdjust:
17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone)
17858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitRtlOrdering:
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLogical || id == CSSValueVisual)
17898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1791e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitFontSizeDelta:           // <length>
17938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FLength, m_strict);
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitNbspMode:     // normal | space
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueSpace)
17988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineBreak:   // normal | after-white-space
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueAfterWhiteSpace)
18038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMatchNearestMailBlockquoteColor:   // normal | match
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueMatch)
18088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitHighlight:
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || value->unit == CSSPrimitiveValue::CSS_STRING)
18138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1815e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
181606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphens:
181706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueNone || id == CSSValueManual || id == CSSValueAuto)
181806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            validPrimitive = true;
181906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
182006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
182106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphenateCharacter:
182206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING)
182306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            validPrimitive = true;
182406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
182506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
182681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitBefore:
182781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitAfter:
182881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (id == CSSValueAuto || validUnit(value, FInteger | FNonNeg, true))
182981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            validPrimitive = true;
183081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
183181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
183281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitLocale:
1833dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING)
1834dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            validPrimitive = true;
1835dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        break;
1836dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderFit:
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueBorder || id == CSSValueLines)
18398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1841e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSecurity:
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // disc | circle | square | none | inherit
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueDisc || id == CSSValueCircle || id == CSSValueSquare|| id == CSSValueNone)
18458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitFontSmoothing:
1849e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (id == CSSValueAuto || id == CSSValueNone
1850231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            || id == CSSValueAntialiased || id == CSSValueSubpixelAntialiased)
18518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1852231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1855e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitDashboardRegion: // <dashboard-region> | <dashboard-region>
18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit == CSSParserValue::Function || id == CSSValueNone)
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseDashboardRegions(propId, important);
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // End Apple-specific properties
18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* shorthand properties */
18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackground: {
18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Position must come before color in this array because a plain old "0" is a legal color
18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // in quirks mode but it's usually the X coordinate of a position.
1866231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // FIXME: Add CSSPropertyBackgroundSize to the shorthand.
1867e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        const int properties[] = { CSSPropertyBackgroundImage, CSSPropertyBackgroundRepeat,
1868e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                                   CSSPropertyBackgroundAttachment, CSSPropertyBackgroundPosition, CSSPropertyBackgroundOrigin,
18692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                                   CSSPropertyBackgroundClip, CSSPropertyBackgroundColor };
18702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return parseFillShorthand(propId, properties, 7, important);
18718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMask: {
1873e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        const int properties[] = { CSSPropertyWebkitMaskImage, CSSPropertyWebkitMaskRepeat,
18740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                   CSSPropertyWebkitMaskAttachment, CSSPropertyWebkitMaskPosition,
18752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                                   CSSPropertyWebkitMaskOrigin, CSSPropertyWebkitMaskClip };
18762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return parseFillShorthand(propId, properties, 6, important);
18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorder:
18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-width' || 'border-style' || <color> ] | inherit
18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderWidth, CSSPropertyBorderStyle,
18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderColor };
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTop:
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-top-width' || 'border-style' || <color> ] | inherit
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderTopWidth, CSSPropertyBorderTopStyle,
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderTopColor};
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRight:
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-right-width' || 'border-style' || <color> ] | inherit
18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderRightWidth, CSSPropertyBorderRightStyle,
18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderRightColor };
18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottom:
19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-bottom-width' || 'border-style' || <color> ] | inherit
19018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderBottomWidth, CSSPropertyBorderBottomStyle,
19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomColor };
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeft:
19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-left-width' || 'border-style' || <color> ] | inherit
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderLeftWidth, CSSPropertyBorderLeftStyle,
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderLeftColor };
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1913967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStart:
1914967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    {
1915967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        const int properties[3] = { CSSPropertyWebkitBorderStartWidth, CSSPropertyWebkitBorderStartStyle,
1916967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CSSPropertyWebkitBorderStartColor };
1917967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return parseShorthand(propId, properties, 3, important);
1918967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
1919967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEnd:
1920967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    {
1921967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        const int properties[3] = { CSSPropertyWebkitBorderEndWidth, CSSPropertyWebkitBorderEndStyle,
1922967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CSSPropertyWebkitBorderEndColor };
1923967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return parseShorthand(propId, properties, 3, important);
1924967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
192568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBefore:
192668513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
192768513a70bcd92384395513322f1b801e7bf9c729Steve Block        const int properties[3] = { CSSPropertyWebkitBorderBeforeWidth, CSSPropertyWebkitBorderBeforeStyle,
192868513a70bcd92384395513322f1b801e7bf9c729Steve Block            CSSPropertyWebkitBorderBeforeColor };
192968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return parseShorthand(propId, properties, 3, important);
193068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
193168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfter:
193268513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
193368513a70bcd92384395513322f1b801e7bf9c729Steve Block        const int properties[3] = { CSSPropertyWebkitBorderAfterWidth, CSSPropertyWebkitBorderAfterStyle,
193468513a70bcd92384395513322f1b801e7bf9c729Steve Block            CSSPropertyWebkitBorderAfterColor };
193568513a70bcd92384395513322f1b801e7bf9c729Steve Block        return parseShorthand(propId, properties, 3, important);
193668513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutline:
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'outline-color' || 'outline-style' || 'outline-width' ] | inherit
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyOutlineWidth, CSSPropertyOutlineStyle,
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyOutlineColor };
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderColor:
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <color>{1,4} | inherit
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor,
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderWidth:
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <border-width>{1,4} | inherit
19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth,
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderStyle:
19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <border-style>{1,4} | inherit
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle,
19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMargin:
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <margin-width>{1,4} | inherit
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight,
19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyMarginBottom, CSSPropertyMarginLeft };
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPadding:
19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <padding-width>{1,4} | inherit
19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight,
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFont:
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]?
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 'font-family' ] | caption | icon | menu | message-box | small-caption | status-bar | inherit
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueCaption && id <= CSSValueStatusBar)
19838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseFont(important);
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyle:
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyListStyleType, CSSPropertyListStylePosition,
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyListStyleImage };
19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumns: {
19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitColumnWidth, CSSPropertyWebkitColumnCount };
19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 2, important);
19968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRule: {
19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyWebkitColumnRuleWidth, CSSPropertyWebkitColumnRuleStyle,
19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitColumnRuleColor };
20008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStroke: {
20038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitTextStrokeWidth, CSSPropertyWebkitTextStrokeColor };
20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 2, important);
20058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimation:
20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseAnimationShorthand(important);
20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransition:
20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseTransitionShorthand(important);
20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyInvalid:
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPage:
201321939df44de1705786c545cd1bf519d47250322dBen Murdoch        return parsePage(propId, important);
201421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyFontStretch:
20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThrough:
20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverline:
20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderline:
20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
201957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
202021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
202121939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputFormat:
202221939df44de1705786c545cd1bf519d47250322dBen Murdoch        validPrimitive = true;
202321939df44de1705786c545cd1bf519d47250322dBen Murdoch        break;
202421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputRequired:
202521939df44de1705786c545cd1bf519d47250322dBen Murdoch        parsedValue = parseWCSSInputProperty();
202657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        break;
202757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif
202857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
20298de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    // CSS Text Layout Module Level 3: Vertical writing support
20308de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    case CSSPropertyWebkitWritingMode:
2031a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (id >= CSSValueHorizontalTb && id <= CSSValueHorizontalBt)
20328de7ac488df2f39f82e56811541f4847b3f2e952Steve Block            validPrimitive = true;
20338de7ac488df2f39f82e56811541f4847b3f2e952Steve Block        break;
20348de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
2035a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    case CSSPropertyWebkitTextCombine:
2036f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (id == CSSValueNone || id == CSSValueHorizontal)
2037f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            validPrimitive = true;
2038f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        break;
2039f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2040f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasis: {
2041f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        const int properties[] = { CSSPropertyWebkitTextEmphasisStyle, CSSPropertyWebkitTextEmphasisColor };
2042f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return parseShorthand(propId, properties, WTF_ARRAY_LENGTH(properties), important);
2043f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
2044f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2045f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasisPosition:
2046f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (id == CSSValueOver || id == CSSValueUnder)
2047a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu            validPrimitive = true;
2048a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        break;
2049a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu
2050e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisStyle:
2051e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return parseTextEmphasisStyle(important);
2052e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
205374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextOrientation:
205474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        // FIXME: For now just support upright and vertical-right.
205574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (id == CSSValueVerticalRight || id == CSSValueUpright)
205674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            validPrimitive = true;
205774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        break;
205874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
205974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitLineBoxContain:
206074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (id == CSSValueNone)
206174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            validPrimitive = true;
206274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else
206374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return parseLineBoxContain(important);
206474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        break;
206574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
20661b7c6c8d699a6520472f566710662983ed0ac650Cary Clark#ifdef ANDROID_CSS_RING
20671b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRing:
20681b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    {
20691b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        const int properties[9] = { CSSPropertyWebkitRingFillColor,
20701b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingInnerWidth,
20711b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingOuterWidth,
20721b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingOutset,
20731b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingPressedInnerColor,
20741b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingPressedOuterColor,
20751b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingRadius,
20761b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingSelectedInnerColor,
20771b7c6c8d699a6520472f566710662983ed0ac650Cary Clark                                    CSSPropertyWebkitRingSelectedOuterColor };
20781b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        return parseShorthand(propId, properties, 9, important);
20791b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    }
20801b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingFillColor:
20811b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingPressedInnerColor:
20821b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingPressedOuterColor:
20831b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingSelectedInnerColor:
20841b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingSelectedOuterColor:
20851b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        parsedValue = parseColor();
20861b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        if (parsedValue)
20871b7c6c8d699a6520472f566710662983ed0ac650Cary Clark            m_valueList->next();
20881b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        break;
20891b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingInnerWidth:
20901b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingOuterWidth:
20911b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingOutset:
20921b7c6c8d699a6520472f566710662983ed0ac650Cary Clark    case CSSPropertyWebkitRingRadius:
20931b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
20941b7c6c8d699a6520472f566710662983ed0ac650Cary Clark        break;
20951b7c6c8d699a6520472f566710662983ed0ac650Cary Clark#endif
209657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
209757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    case CSSPropertyWebkitTapHighlightColor:
209857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        parsedValue = parseColor();
209957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        if (parsedValue)
210057a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch            m_valueList->next();
21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseSVGValue(propId, important);
21078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validPrimitive) {
21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != 0)
211281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createIdentifierValue(id);
21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit == CSSPrimitiveValue::CSS_STRING)
211481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->string, (CSSPrimitiveValue::UnitTypes) value->unit);
21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ)
211681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
21170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (value->unit >= CSSPrimitiveValue::CSS_TURN && value->unit <= CSSPrimitiveValue::CSS_REMS)
211881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit >= CSSParserValue::Q_EMS)
21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = CSSQuirkPrimitiveValue::create(value->fValue, CSSPrimitiveValue::CSS_EMS);
21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parsedValue) {
21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_valueList->current() || inShorthand()) {
21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, parsedValue.release(), important);
21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
213221939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
213321939df44de1705786c545cd1bf519d47250322dBen MurdochPassRefPtr<CSSValue> CSSParser::parseWCSSInputProperty()
213421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
213521939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<CSSValue> parsedValue = 0;
213621939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
213721939df44de1705786c545cd1bf519d47250322dBen Murdoch    String inputProperty;
213821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value->unit == CSSPrimitiveValue::CSS_STRING || value->unit == CSSPrimitiveValue::CSS_IDENT)
213921939df44de1705786c545cd1bf519d47250322dBen Murdoch        inputProperty = String(value->string);
214021939df44de1705786c545cd1bf519d47250322dBen Murdoch
214121939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!inputProperty.isEmpty())
214281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch       parsedValue = primitiveValueCache()->createValue(inputProperty, CSSPrimitiveValue::CSS_STRING);
214321939df44de1705786c545cd1bf519d47250322dBen Murdoch
214421939df44de1705786c545cd1bf519d47250322dBen Murdoch    while (m_valueList->next()) {
2145e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // pass all other values, if any. If we don't do this,
2146e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // the parser will think that it's not done and won't process this property
214721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
214821939df44de1705786c545cd1bf519d47250322dBen Murdoch
214921939df44de1705786c545cd1bf519d47250322dBen Murdoch    return parsedValue;
215021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
215121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
215221939df44de1705786c545cd1bf519d47250322dBen Murdoch
21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addFillValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval)
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lval) {
21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (lval->isValueList())
21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static_cast<CSSValueList*>(lval.get())->append(rval);
21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> oldlVal(lval.release());
21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(oldlVal);
21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(rval);
21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lval = list;
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lval = rval;
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
217081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool parseBackgroundClip(CSSParserValue* parserValue, RefPtr<CSSValue>& cssValue, CSSPrimitiveValueCache* primitiveValueCache)
2171cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2172ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (parserValue->id == CSSValueBorderBox || parserValue->id == CSSValuePaddingBox
2173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || parserValue->id == CSSValueContentBox || parserValue->id == CSSValueWebkitText) {
217481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cssValue = primitiveValueCache->createIdentifierValue(parserValue->id);
2175cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return true;
2176cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
2177cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return false;
2178cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2179cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst int cMaxFillProperties = 9;
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFillShorthand(int propId, const int* properties, int numProperties, bool important)
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(numProperties <= cMaxFillProperties);
21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (numProperties > cMaxFillProperties)
21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[cMaxFillProperties] = { false };
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[cMaxFillProperties];
21920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSValue> clipValue;
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> positionYValue;
2194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RefPtr<CSSValue> repeatYValue;
21952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool foundClip = false;
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (properties[i] == CSSPropertyBackgroundColor && parsedProperty[i])
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Color is not allowed except as the last item in a list for backgrounds.
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Reject the entire property.
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i] && properties[i] != CSSPropertyBackgroundColor) {
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addFillValue(values[i], CSSInitialValue::createImplicit());
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addFillValue(positionYValue, CSSInitialValue::createImplicit());
2213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                        addFillValue(repeatYValue, CSSInitialValue::createImplicit());
22150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if ((properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) && !parsedProperty[i]) {
22160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        // If background-origin wasn't present, then reset background-clip also.
22170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        addFillValue(clipValue, CSSInitialValue::createImplicit());
22182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    }
22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2225e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val1;
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val2;
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int propId1, propId2;
2232cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                CSSParserValue* parserValue = m_valueList->current();
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseFillProperty(properties[i], propId1, propId2, val1, val2)) {
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addFillValue(values[i], val1.release());
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addFillValue(positionYValue, val2.release());
2238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                        addFillValue(repeatYValue, val2.release());
22400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) {
22410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        // Reparse the value as a clip, and see if we succeed.
224281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        if (parseBackgroundClip(parserValue, val1, primitiveValueCache()))
22430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                            addFillValue(clipValue, val1.release()); // The property parsed successfully.
22440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        else
22450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                            addFillValue(clipValue, CSSInitialValue::createImplicit()); // Some value was used for origin that is not supported by clip. Just reset clip instead.
22460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    }
22472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    if (properties[i] == CSSPropertyBackgroundClip || properties[i] == CSSPropertyWebkitMaskClip) {
22482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        // Update clipValue
22492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        addFillValue(clipValue, val1.release());
22502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        foundClip = true;
22512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    }
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2261e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; ++i) {
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedProperty[i]) {
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addFillValue(values[i], CSSInitialValue::createImplicit());
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addFillValue(positionYValue, CSSInitialValue::createImplicit());
2268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                addFillValue(repeatYValue, CSSInitialValue::createImplicit());
22700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if ((properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) && !parsedProperty[i]) {
22710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // If background-origin wasn't present, then reset background-clip also.
22720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                addFillValue(clipValue, CSSInitialValue::createImplicit());
22730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2276e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++) {
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (properties[i] == CSSPropertyBackgroundPosition) {
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyBackgroundPositionX, values[i].release(), important);
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // it's OK to call positionYValue.release() since we only see CSSPropertyBackgroundPosition once
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyBackgroundPositionY, positionYValue.release(), important);
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (properties[i] == CSSPropertyWebkitMaskPosition) {
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyWebkitMaskPositionX, values[i].release(), important);
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // it's OK to call positionYValue.release() since we only see CSSPropertyWebkitMaskPosition once
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyWebkitMaskPositionY, positionYValue.release(), important);
2287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (properties[i] == CSSPropertyBackgroundRepeat) {
2288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyBackgroundRepeatX, values[i].release(), important);
2289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // it's OK to call repeatYValue.release() since we only see CSSPropertyBackgroundPosition once
2290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyBackgroundRepeatY, repeatYValue.release(), important);
2291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (properties[i] == CSSPropertyWebkitMaskRepeat) {
2292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyWebkitMaskRepeatX, values[i].release(), important);
2293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // it's OK to call repeatYValue.release() since we only see CSSPropertyBackgroundPosition once
2294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyWebkitMaskRepeatY, repeatYValue.release(), important);
22952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        } else if ((properties[i] == CSSPropertyBackgroundClip || properties[i] == CSSPropertyWebkitMaskClip) && !foundClip)
22962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // Value is already set while updating origin
22972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            continue;
22982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[i], values[i].release(), important);
2300e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Add in clip values when we hit the corresponding origin property.
23022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (properties[i] == CSSPropertyBackgroundOrigin && !foundClip)
23030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            addProperty(CSSPropertyBackgroundClip, clipValue.release(), important);
23042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else if (properties[i] == CSSPropertyWebkitMaskOrigin && !foundClip)
23050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            addProperty(CSSPropertyWebkitMaskClip, clipValue.release(), important);
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addAnimationValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval)
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lval) {
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (lval->isValueList())
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static_cast<CSSValueList*>(lval.get())->append(rval);
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> oldVal(lval.release());
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(oldVal);
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(rval);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lval = list;
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lval = rval;
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseAnimationShorthand(bool important)
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int properties[] = {  CSSPropertyWebkitAnimationName,
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationDuration,
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationTimingFunction,
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationDelay,
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationIterationCount,
2335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                CSSPropertyWebkitAnimationDirection,
2336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                CSSPropertyWebkitAnimationFillMode };
23374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const int numProperties = WTF_ARRAY_LENGTH(properties);
2338e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, CSSPropertyWebkitAnimation);
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[numProperties];
2343e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i])
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], CSSInitialValue::createImplicit());
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2358e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val;
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseAnimationProperty(properties[i], val)) {
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], val.release());
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2375e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; ++i) {
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedProperty[i])
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addAnimationValue(values[i], CSSInitialValue::createImplicit());
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2381e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++)
23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(properties[i], values[i].release(), important);
2385e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseTransitionShorthand(bool important)
23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int properties[] = { CSSPropertyWebkitTransitionProperty,
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                               CSSPropertyWebkitTransitionDuration,
2393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                               CSSPropertyWebkitTransitionTimingFunction,
2394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                               CSSPropertyWebkitTransitionDelay };
23954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const int numProperties = WTF_ARRAY_LENGTH(properties);
2396e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, CSSPropertyWebkitTransition);
23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[numProperties];
2401e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i])
24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], CSSInitialValue::createImplicit());
24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2416e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val;
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseAnimationProperty(properties[i], val)) {
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], val.release());
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2433e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; ++i) {
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedProperty[i])
24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addAnimationValue(values[i], CSSInitialValue::createImplicit());
24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2439e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++)
24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(properties[i], values[i].release(), important);
2443e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShorthand(int propId, const int *properties, int numProperties, bool important)
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We try to match as many properties as possible
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We set up an array of booleans to mark which property has been found,
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and we try to search for properties until it makes no longer any sense.
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool found = false;
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool fnd[6]; // Trust me ;)
24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < numProperties; i++)
24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fnd[i] = false;
24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        found = false;
24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int propIndex = 0; !found && propIndex < numProperties; ++propIndex) {
24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!fnd[propIndex]) {
24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseValue(properties[propIndex], important))
24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fnd[propIndex] = found = true;
24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2473e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_implicitShorthand = true;
24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < numProperties; ++i) {
24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!fnd[i])
24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[i], CSSInitialValue::createImplicit(), important);
24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_implicitShorthand = false;
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parse4Values(int propId, const int *properties,  bool important)
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* From the CSS 2 specs, 8.3
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * If there is only one value, it applies to all sides. If there are two values, the top and
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * bottom margins are set to the first value and the right and left margins are set to the second.
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * If there are three values, the top is set to the first value, the left and right are set to the
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * second, and the bottom is set to the third. If there are four values, they apply to the top,
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * right, bottom, and left, respectively.
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
2494e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int num = inShorthand() ? 1 : m_valueList->size();
2496e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the order is top, right, bottom, left
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (num) {
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 1: {
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-1]->value();
25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[2], value, important);
25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 2: {
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-2]->value();
25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[2], value, important);
25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_parsedProperties[m_numParsedProperties-2]->value();
25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 3: {
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) || !parseValue(properties[2], important))
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-2]->value();
25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 4: {
25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) ||
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                !parseValue(properties[2], important) || !parseValue(properties[3], important))
25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: {
25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2542e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
254621939df44de1705786c545cd1bf519d47250322dBen Murdoch// auto | <identifier>
254721939df44de1705786c545cd1bf519d47250322dBen Murdochbool CSSParser::parsePage(int propId, bool important)
254821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
254921939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(propId == CSSPropertyPage);
255021939df44de1705786c545cd1bf519d47250322dBen Murdoch
255121939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (m_valueList->size() != 1)
255221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
255321939df44de1705786c545cd1bf519d47250322dBen Murdoch
255421939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
255521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!value)
255621939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
255721939df44de1705786c545cd1bf519d47250322dBen Murdoch
255821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value->id == CSSValueAuto) {
255981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createIdentifierValue(value->id), important);
256021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return true;
256121939df44de1705786c545cd1bf519d47250322dBen Murdoch    } else if (value->id == 0 && value->unit == CSSPrimitiveValue::CSS_IDENT) {
256281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING), important);
256321939df44de1705786c545cd1bf519d47250322dBen Murdoch        return true;
256421939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
256521939df44de1705786c545cd1bf519d47250322dBen Murdoch    return false;
256621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
256721939df44de1705786c545cd1bf519d47250322dBen Murdoch
256821939df44de1705786c545cd1bf519d47250322dBen Murdoch// <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
256921939df44de1705786c545cd1bf519d47250322dBen Murdochbool CSSParser::parseSize(int propId, bool important)
257021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
257121939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(propId == CSSPropertySize);
257221939df44de1705786c545cd1bf519d47250322dBen Murdoch
257321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (m_valueList->size() > 2)
257421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
257521939df44de1705786c545cd1bf519d47250322dBen Murdoch
257621939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
257721939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!value)
257821939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
257921939df44de1705786c545cd1bf519d47250322dBen Murdoch
258021939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
258121939df44de1705786c545cd1bf519d47250322dBen Murdoch
258221939df44de1705786c545cd1bf519d47250322dBen Murdoch    // First parameter.
258321939df44de1705786c545cd1bf519d47250322dBen Murdoch    SizeParameterType paramType = parseSizeParameter(parsedValues.get(), value, None);
258421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (paramType == None)
258521939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
258621939df44de1705786c545cd1bf519d47250322dBen Murdoch
258721939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Second parameter, if any.
258821939df44de1705786c545cd1bf519d47250322dBen Murdoch    value = m_valueList->next();
258921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value) {
259021939df44de1705786c545cd1bf519d47250322dBen Murdoch        paramType = parseSizeParameter(parsedValues.get(), value, paramType);
259121939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (paramType == None)
259221939df44de1705786c545cd1bf519d47250322dBen Murdoch            return false;
259321939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
259421939df44de1705786c545cd1bf519d47250322dBen Murdoch
259521939df44de1705786c545cd1bf519d47250322dBen Murdoch    addProperty(propId, parsedValues.release(), important);
259621939df44de1705786c545cd1bf519d47250322dBen Murdoch    return true;
259721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
259821939df44de1705786c545cd1bf519d47250322dBen Murdoch
259921939df44de1705786c545cd1bf519d47250322dBen MurdochCSSParser::SizeParameterType CSSParser::parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType)
260021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
260121939df44de1705786c545cd1bf519d47250322dBen Murdoch    switch (value->id) {
260221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueAuto:
260321939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None) {
260481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createIdentifierValue(value->id));
260521939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Auto;
260621939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
260721939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
260821939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLandscape:
260921939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValuePortrait:
261021939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None || prevParamType == PageSize) {
261181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createIdentifierValue(value->id));
261221939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Orientation;
261321939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
261421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
261521939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA3:
261621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA4:
261721939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA5:
261821939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueB4:
261921939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueB5:
262021939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLedger:
262121939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLegal:
262221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLetter:
262321939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None || prevParamType == Orientation) {
262421939df44de1705786c545cd1bf519d47250322dBen Murdoch            // Normalize to Page Size then Orientation order by prepending.
262506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // This is not specified by the CSS3 Paged Media specification, but for simpler processing later (CSSStyleSelector::applyPageSizeProperty).
262681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->prepend(primitiveValueCache()->createIdentifierValue(value->id));
262721939df44de1705786c545cd1bf519d47250322dBen Murdoch            return PageSize;
262821939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
262921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
263021939df44de1705786c545cd1bf519d47250322dBen Murdoch    case 0:
263106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (validUnit(value, FLength | FNonNeg, m_strict) && (prevParamType == None || prevParamType == Length)) {
263281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createValue(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit)));
263321939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Length;
263421939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
263521939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
263621939df44de1705786c545cd1bf519d47250322dBen Murdoch    default:
263721939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
263821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
263921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
264021939df44de1705786c545cd1bf519d47250322dBen Murdoch
264181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// [ <string> <string> ]+ | inherit | none
264281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// inherit and none are handled in parseValue.
264381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool CSSParser::parseQuotes(int propId, bool important)
264481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
264581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
264681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (CSSParserValue* val = m_valueList->current()) {
264781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSValue> parsedValue;
264881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (val->unit == CSSPrimitiveValue::CSS_STRING)
264981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = CSSPrimitiveValue::create(val->string, CSSPrimitiveValue::CSS_STRING);
265081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
265181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            break;
265281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        values->append(parsedValue.release());
265381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_valueList->next();
265481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
265581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (values->length()) {
265681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, values.release(), important);
265781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_valueList->next();
265881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
265981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
266081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
266181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
266281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
26638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ <string> | <uri> | <counter> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
26648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// in CSS 2.1 this got somewhat reduced:
26658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ <string> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
26668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseContent(int propId, bool important)
26678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
26688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
26698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (CSSParserValue* val = m_valueList->current()) {
26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> parsedValue;
26728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (val->unit == CSSPrimitiveValue::CSS_URI && m_styleSheet) {
26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // url
26740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // FIXME: The completeURL call should be done when using the CSSImageValue,
26750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // not when creating it.
26760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            parsedValue = CSSImageValue::create(m_styleSheet->completeURL(val->string));
26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Function) {
26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // attr(X) | counter(X [,Y]) | counters(X, Y, [,Z]) | -webkit-gradient(...)
26795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            CSSParserValueList* args = val->function->args.get();
26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!args)
26818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
26828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(val->function->name, "attr(")) {
26835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                parsedValue = parseAttr(args);
26845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!parsedValue)
26858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
26868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (equalIgnoringCase(val->function->name, "counter(")) {
26878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = parseCounterContent(args, false);
26885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!parsedValue)
26895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return false;
26908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (equalIgnoringCase(val->function->name, "counters(")) {
26918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = parseCounterContent(args, true);
26928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedValue)
26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
2694cad810f21b803229eb11403f9209855525a25d57Steve Block            } else if (isGeneratedImageValue(val)) {
2695cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!parseGeneratedImage(parsedValue))
26968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
26978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
26988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
26998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSPrimitiveValue::CSS_IDENT) {
27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // open-quote
27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // close-quote
27028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // no-open-quote
27038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // no-close-quote
27046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // inherit
27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: These are not yet implemented (http://bugs.webkit.org/show_bug.cgi?id=6503).
27066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // none
27076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // normal
27086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            switch (val->id) {
27096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueOpenQuote:
27106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueCloseQuote:
27116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNoOpenQuote:
27126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNoCloseQuote:
27136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNone:
27146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNormal:
271581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
27166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSPrimitiveValue::CSS_STRING) {
271881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(val->string, CSSPrimitiveValue::CSS_STRING);
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values->append(parsedValue.release());
27238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
27258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values->length()) {
27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, values.release(), important);
27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27355f1ab04193ad0130ca8204aadaceae083aca9881Feng QianPassRefPtr<CSSValue> CSSParser::parseAttr(CSSParserValueList* args)
27365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
27375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (args->size() != 1)
27385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
27395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
27405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CSSParserValue* a = args->current();
27415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
27425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (a->unit != CSSPrimitiveValue::CSS_IDENT)
27435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
27445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
27455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    String attrName = a->string;
27465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // CSS allows identifiers with "-" at the start, like "-webkit-mask-image".
27475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // But HTML attribute names can't have those characters, and we should not
27485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // even parse them inside attr().
27495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (attrName[0] == '-')
27505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
27515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2752231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (document() && document()->isHTMLDocument())
27535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        attrName = attrName.lower();
2754e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
275581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(attrName, CSSPrimitiveValue::CSS_ATTR);
27565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
27575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseBackgroundColor()
27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int id = m_valueList->current()->id;
27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu || id == CSSValueCurrentcolor ||
27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (id >= CSSValueGrey && id < CSSValueWebkitText && !m_strict))
276381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch       return primitiveValueCache()->createIdentifierValue(id);
27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return parseColor();
27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFillImage(RefPtr<CSSValue>& value)
27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current()->id == CSSValueNone) {
27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = CSSImageValue::create();
27718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
27728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
27738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current()->unit == CSSPrimitiveValue::CSS_URI) {
27740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: The completeURL call should be done when using the CSSImageValue,
27750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // not when creating it.
27760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (m_styleSheet)
27770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            value = CSSImageValue::create(m_styleSheet->completeURL(m_valueList->current()->string));
27788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
27798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2781cad810f21b803229eb11403f9209855525a25d57Steve Block    if (isGeneratedImageValue(m_valueList->current()))
2782cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseGeneratedImage(value);
27830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
27848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
27858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27872bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionX(CSSParserValueList* valueList)
27882bde8e466a4451c7319e3a072d118917957d6554Steve Block{
27892bde8e466a4451c7319e3a072d118917957d6554Steve Block    int id = valueList->current()->id;
27902bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (id == CSSValueLeft || id == CSSValueRight || id == CSSValueCenter) {
27912bde8e466a4451c7319e3a072d118917957d6554Steve Block        int percent = 0;
27922bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueRight)
27932bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 100;
27942bde8e466a4451c7319e3a072d118917957d6554Steve Block        else if (id == CSSValueCenter)
27952bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 50;
27962bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
27972bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
27982bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict))
27992bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(valueList->current()->fValue,
28002bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
28012bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
28022bde8e466a4451c7319e3a072d118917957d6554Steve Block}
28032bde8e466a4451c7319e3a072d118917957d6554Steve Block
28042bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionY(CSSParserValueList* valueList)
28052bde8e466a4451c7319e3a072d118917957d6554Steve Block{
28062bde8e466a4451c7319e3a072d118917957d6554Steve Block    int id = valueList->current()->id;
28072bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (id == CSSValueTop || id == CSSValueBottom || id == CSSValueCenter) {
28082bde8e466a4451c7319e3a072d118917957d6554Steve Block        int percent = 0;
28092bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueBottom)
28102bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 100;
28112bde8e466a4451c7319e3a072d118917957d6554Steve Block        else if (id == CSSValueCenter)
28122bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 50;
28132bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
28142bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
28152bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict))
28162bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(valueList->current()->fValue,
28172bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
28182bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
28192bde8e466a4451c7319e3a072d118917957d6554Steve Block}
28202bde8e466a4451c7319e3a072d118917957d6554Steve Block
28212bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionComponent(CSSParserValueList* valueList, unsigned& cumulativeFlags, FillPositionFlag& individualFlag)
28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2823cad810f21b803229eb11403f9209855525a25d57Steve Block    int id = valueList->current()->id;
28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueLeft || id == CSSValueTop || id == CSSValueRight || id == CSSValueBottom || id == CSSValueCenter) {
28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int percent = 0;
28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight) {
28272bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (cumulativeFlags & XFillPosition)
28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
28292bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= XFillPosition;
28302bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = XFillPosition;
28318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueRight)
28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                percent = 100;
28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (id == CSSValueTop || id == CSSValueBottom) {
28352bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (cumulativeFlags & YFillPosition)
28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
28372bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= YFillPosition;
28382bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = YFillPosition;
28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueBottom)
28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                percent = 100;
28412bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (id == CSSValueCenter) {
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Center is ambiguous, so we're not sure which position we've found yet, an x or a y.
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            percent = 50;
28442bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= AmbiguousFillPosition;
28452bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = AmbiguousFillPosition;
28462bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
284781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
28492bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict)) {
28502bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!cumulativeFlags) {
28512bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= XFillPosition;
28522bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = XFillPosition;
28532bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (cumulativeFlags & (XFillPosition | AmbiguousFillPosition)) {
28542bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= YFillPosition;
28552bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = YFillPosition;
28562bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else
28572bde8e466a4451c7319e3a072d118917957d6554Steve Block            return 0;
285881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(valueList->current()->fValue,
28592bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
28602bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
28628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2864cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid CSSParser::parseFillPosition(CSSParserValueList* valueList, RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2)
28658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2866cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* value = valueList->current();
2867e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Parse the first value.  We're just making sure that it is one of the valid keywords or a percentage/length.
28692bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned cumulativeFlags = 0;
28702bde8e466a4451c7319e3a072d118917957d6554Steve Block    FillPositionFlag value1Flag = InvalidFillPosition;
28712bde8e466a4451c7319e3a072d118917957d6554Steve Block    FillPositionFlag value2Flag = InvalidFillPosition;
28722bde8e466a4451c7319e3a072d118917957d6554Steve Block    value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag);
28738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value1)
28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2875e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // It only takes one value for background-position to be correctly parsed if it was specified in a shorthand (since we
28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // can assume that any other values belong to the rest of the shorthand).  If we're not parsing a shorthand, though, the
28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value was explicitly specified for our property.
2879cad810f21b803229eb11403f9209855525a25d57Steve Block    value = valueList->next();
2880e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First check for the comma.  If so, we are finished parsing this value or value pair.
28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = 0;
2884e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
28862bde8e466a4451c7319e3a072d118917957d6554Steve Block        value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Flag);
28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value2)
2888cad810f21b803229eb11403f9209855525a25d57Steve Block            valueList->next();
28898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!inShorthand()) {
28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value1.clear();
28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2896e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value2)
28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only one value was specified.  If that value was not a keyword, then it sets the x position, and the y position
28998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // is simply 50%.  This is our default.
29008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // For keywords, the keyword was either an x-keyword (left/right), a y-keyword (top/bottom), or an ambiguous keyword (center).
29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // For left/right/center, the default of 50% in the y is still correct.
290281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createValue(50, CSSPrimitiveValue::CSS_PERCENTAGE);
29038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29042bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (value1Flag == YFillPosition || value2Flag == XFillPosition)
29058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value1.swap(value2);
29068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid CSSParser::parseFillRepeat(RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2)
2909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSParserValue* value = m_valueList->current();
2911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    int id = m_valueList->current()->id;
2913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeatX) {
2914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
291581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(CSSValueRepeat);
291681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(CSSValueNoRepeat);
2917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2919e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
2920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeatY) {
2921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
292281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(CSSValueNoRepeat);
292381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(CSSValueRepeat);
2924231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2925e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
2926231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2927231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeat || id == CSSValueNoRepeat || id == CSSValueRound || id == CSSValueSpace)
292881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(id);
2929231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
2930231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        value1 = 0;
2931231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2932231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2933231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2934231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    value = m_valueList->next();
2935231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2936231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // First check for the comma.  If so, we are finished parsing this value or value pair.
2937231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
2938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        value = 0;
2939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2940231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value)
2941231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        id = m_valueList->current()->id;
2942e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2943231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value && (id == CSSValueRepeat || id == CSSValueNoRepeat || id == CSSValueRound || id == CSSValueSpace)) {
294481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(id);
2945231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2946e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    } else {
2947231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If only one value was specified, value2 is the same as value1.
2948231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
294981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(static_cast<CSSPrimitiveValue*>(value1.get())->getIdent());
2950231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2951231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2952231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2953cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockPassRefPtr<CSSValue> CSSParser::parseFillSize(int propId, bool& allowComma)
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    allowComma = true;
29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
2957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value->id == CSSValueContain || value->id == CSSValueCover)
295981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
2960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> parsedValue1;
2962cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueAuto)
296481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        parsedValue1 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
29668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!validUnit(value, FLength | FPercent, m_strict))
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
296881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        parsedValue1 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2970cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2971cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    CSSPropertyID property = static_cast<CSSPropertyID>(propId);
2972cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RefPtr<CSSPrimitiveValue> parsedValue2;
29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((value = m_valueList->next())) {
29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueAuto)
297581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
2976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (value->unit == CSSParserValue::Operator && value->iValue == ',')
2977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            allowComma = false;
29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
29798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (!validUnit(value, FLength | FPercent, m_strict))
29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
298181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
29828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2984cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!parsedValue2) {
2985cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (property == CSSPropertyWebkitBackgroundSize || property == CSSPropertyWebkitMaskSize)
2986cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            parsedValue2 = parsedValue1;
2987cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        else
298881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
2989cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
2990cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
299181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(Pair::create(parsedValue1.release(), parsedValue2.release()));
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2994e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockbool CSSParser::parseFillProperty(int propId, int& propId1, int& propId2,
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  RefPtr<CSSValue>& retValue1, RefPtr<CSSValue>& retValue2)
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values2;
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value;
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value2;
3002e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowComma = false;
3004e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    retValue1 = retValue2 = 0;
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId1 = propId;
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId2 = propId;
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propId == CSSPropertyBackgroundPosition) {
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyBackgroundPositionX;
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyBackgroundPositionY;
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (propId == CSSPropertyWebkitMaskPosition) {
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyWebkitMaskPositionX;
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyWebkitMaskPositionY;
3014231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (propId == CSSPropertyBackgroundRepeat) {
3015231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId1 = CSSPropertyBackgroundRepeatX;
3016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId2 = CSSPropertyBackgroundRepeatY;
3017231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (propId == CSSPropertyWebkitMaskRepeat) {
3018231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId1 = CSSPropertyWebkitMaskRepeatX;
3019231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId2 = CSSPropertyWebkitMaskRepeatY;
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue;
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue2;
3025e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowComma) {
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
30288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = false;
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3032231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            allowComma = true;
30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (propId) {
30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundColor:
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseBackgroundColor();
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
30378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundAttachment:
30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskAttachment:
30410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (val->id == CSSValueScroll || val->id == CSSValueFixed || val->id == CSSValueLocal) {
304281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
30458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundImage:
30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskImage:
30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (parseFillImage(currValue))
30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundClip:
30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundOrigin:
30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskClip:
30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskOrigin:
30550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    // The first three values here are deprecated and do not apply to the version of the property that has
30560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    // the -webkit- prefix removed.
30578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    if (val->id == CSSValueBorder || val->id == CSSValuePadding || val->id == CSSValueContent ||
30580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        val->id == CSSValueBorderBox || val->id == CSSValuePaddingBox || val->id == CSSValueContentBox ||
30590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        ((propId == CSSPropertyWebkitBackgroundClip || propId == CSSPropertyWebkitMaskClip) &&
30600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                         (val->id == CSSValueText || val->id == CSSValueWebkitText))) {
306181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
30620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
30630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    }
30640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
30650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyBackgroundClip:
306681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    if (parseBackgroundClip(val, currValue, primitiveValueCache()))
30670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
30680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
30690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyBackgroundOrigin:
30700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (val->id == CSSValueBorderBox || val->id == CSSValuePaddingBox || val->id == CSSValueContentBox) {
307181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
30728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
30748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPosition:
30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPosition:
3077cad810f21b803229eb11403f9209855525a25d57Steve Block                    parseFillPosition(m_valueList, currValue, currValue2);
30788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    // parseFillPosition advances the m_valueList pointer
30798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPositionX:
30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPositionX: {
30822bde8e466a4451c7319e3a072d118917957d6554Steve Block                    currValue = parseFillPositionX(m_valueList);
30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
30848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
30878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPositionY:
30888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPositionY: {
30892bde8e466a4451c7319e3a072d118917957d6554Steve Block                    currValue = parseFillPositionY(m_valueList);
30908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
30918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
30948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundComposite:
30958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskComposite:
30968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if ((val->id >= CSSValueClear && val->id <= CSSValuePlusLighter) || val->id == CSSValueHighlight) {
309781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
30988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
31008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
31018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundRepeat:
31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskRepeat:
3103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    parseFillRepeat(currValue, currValue2);
3104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    // parseFillRepeat advances the m_valueList pointer
31058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSPropertyBackgroundSize:
3107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                case CSSPropertyWebkitBackgroundSize:
3108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSPropertyWebkitMaskSize: {
3109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    currValue = parseFillSize(propId, allowComma);
31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                }
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!currValue)
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3117e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value && !values) {
31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(value.release());
31218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3122e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value2 && !values2) {
31248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values2 = CSSValueList::createCommaSeparated();
31258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values2->append(value2.release());
31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (values)
31298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(currValue.release());
31308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
31318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = currValue.release();
31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currValue2) {
31338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (values2)
31348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    values2->append(currValue2.release());
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value2 = currValue2.release();
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3139e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // When parsing any fill shorthand property, we let it handle building up the lists for all
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // properties.
31428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inShorthand())
31438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
31448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
31478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue1 = values.release();
31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values2 && values2->length())
31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            retValue2 = values2.release();
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
31538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue1 = value.release();
31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue2 = value2.release();
31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
31568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDelay()
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (validUnit(value, FTime, m_strict))
316481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDirection()
31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueNormal || value->id == CSSValueAlternate)
317281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDuration()
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validUnit(value, FTime | FNonNeg, m_strict))
318081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPassRefPtr<CSSValue> CSSParser::parseAnimationFillMode()
3185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
3186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CSSParserValue* value = m_valueList->current();
3187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (value->id == CSSValueNone || value->id == CSSValueForwards || value->id == CSSValueBackwards || value->id == CSSValueBoth)
318881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
3189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
3190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
3191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
31928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationIterationCount()
31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueInfinite)
319681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
31978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validUnit(value, FInteger | FNonNeg, m_strict))
319881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
31998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationName()
32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit == CSSPrimitiveValue::CSS_STRING || value->unit == CSSPrimitiveValue::CSS_IDENT) {
32068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueNone || (value->unit == CSSPrimitiveValue::CSS_STRING && equalIgnoringCase(value->string, "none"))) {
320781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return primitiveValueCache()->createIdentifierValue(CSSValueNone);
32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
320981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING);
32108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
32118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
32138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<CSSValue> CSSParser::parseAnimationPlayState()
32160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
32170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSParserValue* value = m_valueList->current();
32180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (value->id == CSSValueRunning || value->id == CSSValuePaused)
321981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
32200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
32210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
32220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
32238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationProperty()
32248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
32268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSPrimitiveValue::CSS_IDENT)
32278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
32288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int result = cssPropertyID(value->string);
32298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result)
323081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(result);
32318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(value->string, "all"))
323281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(CSSValueAll);
32338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(value->string, "none"))
323481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(CSSValueNone);
32358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
32368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangbool CSSParser::parseTransformOriginShorthand(RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)
32398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
3240cad810f21b803229eb11403f9209855525a25d57Steve Block    parseFillPosition(m_valueList, value1, value2);
32418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
32428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // now get z
32434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (m_valueList->current()) {
32444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (validUnit(m_valueList->current(), FLength, m_strict)) {
324581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            value3 = primitiveValueCache()->createValue(m_valueList->current()->fValue,
32464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                             (CSSPrimitiveValue::UnitTypes)m_valueList->current()->unit);
32474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            m_valueList->next();
32484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return true;
32494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
32504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return false;
32514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
32524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return true;
32538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
32548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
32555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickbool CSSParser::parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result)
32568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
32588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!validUnit(v, FNumber, m_strict))
32598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
32608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = v->fValue;
32618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result < 0 || result > 1.0)
32628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
32638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    v = args->next();
32648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!v)
32658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The last number in the function has no comma after it, so we're done.
32668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
32678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (v->unit != CSSParserValue::Operator && v->iValue != ',')
32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
32698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    v = args->next();
32708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
32718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationTimingFunction()
32748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
32765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (value->id == CSSValueEase || value->id == CSSValueLinear || value->id == CSSValueEaseIn || value->id == CSSValueEaseOut
32775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        || value->id == CSSValueEaseInOut || value->id == CSSValueStepStart || value->id == CSSValueStepEnd)
327881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
3279e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
32808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We must be a function.
32818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSParserValue::Function)
32828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3283e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
32845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
32858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (equalIgnoringCase(value->function->name, "steps(")) {
32875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // For steps, 1 or 2 params must be specified (comma-separated)
32885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!args || (args->size() != 1 && args->size() != 3))
32895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // There are two values.
32925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        int numSteps;
32935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        bool stepAtStart = false;
32948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        CSSParserValue* v = args->current();
32965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!validUnit(v, FInteger, m_strict))
32975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        numSteps = (int) min(v->fValue, (double)INT_MAX);
32995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (numSteps < 1)
33005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        v = args->next();
33025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (v) {
33045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            // There is a comma so we need to parse the second value
33055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (v->unit != CSSParserValue::Operator && v->iValue != ',')
33065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return 0;
33075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            v = args->next();
33085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (v->id != CSSValueStart && v->id != CSSValueEnd)
33095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return 0;
33105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            stepAtStart = v->id == CSSValueStart;
33115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
33125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return CSSStepsTimingFunctionValue::create(numSteps, stepAtStart);
33145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
33155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (equalIgnoringCase(value->function->name, "cubic-bezier(")) {
33175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // For cubic bezier, 4 values must be specified.
33185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!args || args->size() != 7)
33195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // There are two points specified.  The values must be between 0 and 1.
33225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        double x1, y1, x2, y2;
33235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, x1))
33255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, y1))
33275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, x2))
33295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, y2))
33315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
33325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return CSSCubicBezierTimingFunctionValue::create(x1, y1, x2, y2);
33345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
33355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
33365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return 0;
33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseAnimationProperty(int propId, RefPtr<CSSValue>& result)
33408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
33438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value;
33448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowComma = false;
3345e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = 0;
33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue;
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowComma) {
33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = false;
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (propId) {
33588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDelay:
33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionDelay:
33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDelay();
33618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDirection:
33658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDirection();
33668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDuration:
33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionDuration:
33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDuration();
33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                case CSSPropertyWebkitAnimationFillMode:
3376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    currValue = parseAnimationFillMode();
3377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (currValue)
3378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        m_valueList->next();
3379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    break;
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationIterationCount:
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationIterationCount();
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationName:
33868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationName();
33878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyWebkitAnimationPlayState:
33910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    currValue = parseAnimationPlayState();
33920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (currValue)
33930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
33940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
33958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionProperty:
33968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationProperty();
33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationTimingFunction:
34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionTimingFunction:
34028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationTimingFunction();
34038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
34058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
34068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3407e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!currValue)
34098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3410e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value && !values) {
34128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
34138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(value.release());
34148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3415e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (values)
34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(currValue.release());
34188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = currValue.release();
3420e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = true;
34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3423e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // When parsing the 'transition' shorthand property, we let it handle building up the lists for all
34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // properties.
34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inShorthand())
34278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3429e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = values.release();
34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
34358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = value.release();
34368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
34398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
34448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DASHBOARD_REGION_NUM_PARAMETERS  6
34468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DASHBOARD_REGION_SHORT_NUM_PARAMETERS  2
34478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic CSSParserValue* skipCommaInDashboardRegion(CSSParserValueList *args)
34498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (args->size() == (DASHBOARD_REGION_NUM_PARAMETERS*2-1) ||
34518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         args->size() == (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1)) {
34528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* current = args->current();
34538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (current->unit == CSSParserValue::Operator && current->iValue == ',')
34548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return args->next();
34558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return args->current();
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseDashboardRegions(int propId, bool important)
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
3462e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueNone) {
34668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_valueList->next())
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
346881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createIdentifierValue(value->id), important);
34698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return valid;
34708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3471e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DashboardRegion> firstRegion = DashboardRegion::create();
34738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DashboardRegion* region = 0;
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (region == 0) {
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = firstRegion.get();
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<DashboardRegion> nextRegion = DashboardRegion::create();
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_next = nextRegion;
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = nextRegion.get();
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3483e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit != CSSParserValue::Function) {
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3488e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Commas count as values, so allow:
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type, t, r, b, l) or dashboard-region(label type t r b l)
34918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type, t, r, b, l) or dashboard-region(label type t r b l)
34928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // also allow
34938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type) or dashboard-region(label type)
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type) or dashboard-region(label type)
34955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSParserValueList* args = value->function->args.get();
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!equalIgnoringCase(value->function->name, "dashboard-region(") || !args) {
34978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3500e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int numArgs = args->size();
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((numArgs != DASHBOARD_REGION_NUM_PARAMETERS && numArgs != (DASHBOARD_REGION_NUM_PARAMETERS*2-1)) &&
35030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (numArgs != DASHBOARD_REGION_SHORT_NUM_PARAMETERS && numArgs != (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1))) {
35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
35068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3507e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First arg is a label.
35098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* arg = args->current();
35108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (arg->unit != CSSPrimitiveValue::CSS_IDENT) {
35118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
35128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
35138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3514e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        region->m_label = arg->string;
35168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second arg is a type.
35188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        arg = args->next();
35190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        arg = skipCommaInDashboardRegion(args);
35208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (arg->unit != CSSPrimitiveValue::CSS_IDENT) {
35218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
35228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
35238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(arg->string, "circle"))
35268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_isCircle = true;
35278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (equalIgnoringCase(arg->string, "rectangle"))
35288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_isRectangle = true;
35298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
35308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
35318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
35328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3533e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        region->m_geometryType = arg->string;
35358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (numArgs == DASHBOARD_REGION_SHORT_NUM_PARAMETERS || numArgs == (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1)) {
35378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // This originally used CSSValueInvalid by accident. It might be more logical to use something else.
353881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            RefPtr<CSSPrimitiveValue> amount = primitiveValueCache()->createIdentifierValue(CSSValueInvalid);
3539e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setTop(amount);
35418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setRight(amount);
35428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setBottom(amount);
35438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setLeft(amount);
35448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
35458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Next four arguments must be offset numbers
35468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int i;
35478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < 4; i++) {
35488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                arg = args->next();
35490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                arg = skipCommaInDashboardRegion(args);
35508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = arg->id == CSSValueAuto || validUnit(arg, FLength, m_strict);
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!valid)
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3554e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSPrimitiveValue> amount = arg->id == CSSValueAuto ?
355681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createIdentifierValue(CSSValueAuto) :
355781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createValue(arg->fValue, (CSSPrimitiveValue::UnitTypes) arg->unit);
3558e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (i == 0)
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setTop(amount);
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (i == 1)
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setRight(amount);
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (i == 2)
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setBottom(amount);
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
35668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setLeft(amount);
35678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->next())
35718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
35728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
35748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (valid)
357781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(firstRegion.release()), important);
3578e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return valid;
35808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* ENABLE(DASHBOARD_SUPPORT) */
35838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseCounterContent(CSSParserValueList* args, bool counters)
35858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned numArgs = args->size();
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (counters && numArgs != 3 && numArgs != 5)
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!counters && numArgs != 1 && numArgs != 3)
35908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3591e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* i = args->current();
35938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (i->unit != CSSPrimitiveValue::CSS_IDENT)
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
359581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSPrimitiveValue> identifier = primitiveValueCache()->createValue(i->string, CSSPrimitiveValue::CSS_STRING);
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> separator;
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!counters)
359981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        separator = primitiveValueCache()->createValue(String(), CSSPrimitiveValue::CSS_STRING);
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSParserValue::Operator || i->iValue != ',')
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3604e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSPrimitiveValue::CSS_STRING)
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3608e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
360981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        separator = primitiveValueCache()->createValue(i->string, (CSSPrimitiveValue::UnitTypes) i->unit);
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> listStyle;
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    i = args->next();
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!i) // Make the list style default decimal
361581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        listStyle = primitiveValueCache()->createValue(CSSValueDecimal - CSSValueDisc, CSSPrimitiveValue::CSS_NUMBER);
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
36178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSParserValue::Operator || i->iValue != ',')
36188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3619e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
36218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSPrimitiveValue::CSS_IDENT)
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3623e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
36248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short ls = 0;
36258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->id == CSSValueNone)
36268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ls = CSSValueKatakanaIroha - CSSValueDisc + 1;
36278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i->id >= CSSValueDisc && i->id <= CSSValueKatakanaIroha)
36288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ls = i->id - CSSValueDisc;
36298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
36308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
36318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
363281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        listStyle = primitiveValueCache()->createValue(ls, (CSSPrimitiveValue::UnitTypes) i->unit);
36338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
363581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(Counter::create(identifier.release(), listStyle.release(), separator.release()));
36368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShape(int propId, bool important)
36398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
36415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
3642e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
36438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!equalIgnoringCase(value->function->name, "rect(") || !args)
36448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // rect(t, r, b, l) || rect(t r b l)
36478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (args->size() != 4 && args->size() != 7)
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
36498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Rect> rect = Rect::create();
36508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i = 0;
36528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (a) {
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        valid = a->id == CSSValueAuto || validUnit(a, FLength, m_strict);
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!valid)
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> length = a->id == CSSValueAuto ?
365881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            primitiveValueCache()->createIdentifierValue(CSSValueAuto) :
365981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == 0)
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setTop(length);
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i == 1)
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setRight(length);
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i == 2)
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setBottom(length);
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
36678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setLeft(length);
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
36698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a && args->size() == 7) {
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (a->unit == CSSParserValue::Operator && a->iValue == ',') {
36718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                a = args->next();
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
36768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i++;
36788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (valid) {
368081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(rect.release()), important);
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]? 'font-family'
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFont(bool important)
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
36918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue *value = m_valueList->current();
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<FontValue> font = FontValue::create();
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // optional font-style, font-variant and font-weight
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = value->id;
36968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id) {
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueNormal) {
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // do nothing, it's the inital value for all three
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id == CSSValueItalic || id == CSSValueOblique) {
37008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->style)
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
370281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->style = primitiveValueCache()->createIdentifierValue(id);
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id == CSSValueSmallCaps) {
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->variant)
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
370681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->variant = primitiveValueCache()->createIdentifierValue(id);
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id >= CSSValueBold && id <= CSSValueLighter) {
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->weight)
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
371081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->weight = primitiveValueCache()->createIdentifierValue(id);
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
37148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } else if (!font->weight && validUnit(value, FInteger | FNonNeg, true)) {
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int weight = (int)value->fValue;
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int val = 0;
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (weight == 100)
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue100;
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 200)
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue200;
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 300)
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue300;
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 400)
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue400;
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 500)
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue500;
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 600)
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue600;
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 700)
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue700;
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 800)
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue800;
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 900)
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue900;
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val)
373781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->weight = primitiveValueCache()->createIdentifierValue(val);
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!valid)
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value)
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // set undefined values to default
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->style)
375281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->style = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->variant)
375481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->variant = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->weight)
375681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->weight = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // now a font size _must_ come
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id >= CSSValueXxSmall && value->id <= CSSValueLarger)
376181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->size = primitiveValueCache()->createIdentifierValue(value->id);
37628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    else if (validUnit(value, FLength | FPercent | FNonNeg, m_strict))
376381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->size = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    value = m_valueList->next();
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->size || !value)
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit == CSSParserValue::Operator && value->iValue == '/') {
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // line-height
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value)
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueNormal) {
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // default value, nothing to do
37758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } else if (validUnit(value, FNumber | FLength | FPercent | FNonNeg, m_strict))
377681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            font->lineHeight = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value)
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3783e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->lineHeight)
378581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->lineHeight = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // font family must come now
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    font->family = parseFontFamily();
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current() || !font->family)
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(CSSPropertyFont, font.release(), important);
37948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
37958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValueList> CSSParser::parseFontFamily()
37988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
38008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
38018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontFamilyValue* currFamily = 0;
38038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
38048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* nextValue = m_valueList->next();
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool nextValBreaksFont = !nextValue ||
38068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                 (nextValue->unit == CSSParserValue::Operator && nextValue->iValue == ',');
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool nextValIsFontName = nextValue &&
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ((nextValue->id >= CSSValueSerif && nextValue->id <= CSSValueWebkitBody) ||
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (nextValue->unit == CSSPrimitiveValue::CSS_STRING || nextValue->unit == CSSPrimitiveValue::CSS_IDENT));
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id >= CSSValueSerif && value->id <= CSSValueWebkitBody) {
38128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currFamily)
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily->appendSpaceSeparated(value->string.characters, value->string.length);
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (nextValBreaksFont || !nextValIsFontName)
381581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(value->id));
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<FontFamilyValue> newFamily = FontFamilyValue::create(value->string);
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily = newFamily.get();
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(newFamily.release());
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_STRING) {
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Strings never share in a family name.
38238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            currFamily = 0;
38248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(FontFamilyValue::create(value->string));
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_IDENT) {
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currFamily)
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily->appendSpaceSeparated(value->string.characters, value->string.length);
38288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (nextValBreaksFont || !nextValIsFontName)
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(FontFamilyValue::create(value->string));
38308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
38318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<FontFamilyValue> newFamily = FontFamilyValue::create(value->string);
38328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily = newFamily.get();
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(newFamily.release());
38348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3838e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!nextValue)
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (nextValBreaksFont) {
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            currFamily = 0;
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (nextValIsFontName)
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = nextValue;
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!list->length())
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list = 0;
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list.release();
38548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontStyle(bool important)
38578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
38598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
38608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
38618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
38628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->id == CSSValueNormal || val->id == CSSValueItalic || val->id == CSSValueOblique)
386881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (val->id == CSSValueAll && !values) {
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // 'all' is only allowed in @font-face and with no other values. Make a value list to
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // indicate that we are in the @font-face case.
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
387381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
38778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
38788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
38798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
38838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
38888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontStyle, parsedValue.release(), important);
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontStyle, values.release(), important);
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontVariant(bool important)
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
39078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->id == CSSValueNormal || val->id == CSSValueSmallCaps)
391581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (val->id == CSSValueAll && !values) {
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // 'all' is only allowed in @font-face and with no other values. Make a value list to
39188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // indicate that we are in the @font-face case.
39198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
392081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
39228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
39238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
39328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
39348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
39358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
39368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontVariant, parsedValue.release(), important);
39378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
39388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
39428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
39438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontVariant, values.release(), important);
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
39458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
39488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontWeight(bool important)
39518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
39538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
39548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
39558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
39568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
39578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
39588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
39598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
39608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
39618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit == CSSPrimitiveValue::CSS_IDENT) {
39628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val->id >= CSSValueNormal && val->id <= CSSValue900)
396381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
39648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (val->id == CSSValueAll && !values) {
39658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // 'all' is only allowed in @font-face and with no other values. Make a value list to
39668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // indicate that we are in the @font-face case.
39678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    values = CSSValueList::createCommaSeparated();
396881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
39698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
39708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (validUnit(val, FInteger | FNonNeg, false)) {
39718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int weight = static_cast<int>(val->fValue);
39728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!(weight % 100) && weight >= 100 && weight <= 900)
397381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(CSSValue100 + weight / 100 - 1);
39748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
39758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
39768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
39778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
39788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
39798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
39828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
39838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
39858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
39878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
39888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
39898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontWeight, parsedValue.release(), important);
39908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
39918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
39958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
39968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontWeight, values.release(), important);
39978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
39988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
40018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4003643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic bool isValidFormatFunction(CSSParserValue* val)
4004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
40055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = val->function->args.get();
4006643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return equalIgnoringCase(val->function->name, "format(") && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT);
4007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
4008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
40098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontFaceSrc()
40108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values(CSSValueList::createCommaSeparated());
40128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
40138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
40148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowFormat = false;
40158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool failed = false;
40168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSFontFaceSrcValue> uriValue;
40178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
40188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSFontFaceSrcValue> parsedValue;
40198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (val->unit == CSSPrimitiveValue::CSS_URI && !expectComma && m_styleSheet) {
40200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // FIXME: The completeURL call should be done when using the CSSFontFaceSrcValue,
40210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // not when creating it.
40220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            parsedValue = CSSFontFaceSrcValue::create(m_styleSheet->completeURL(val->string));
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uriValue = parsedValue;
40248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowFormat = true;
40258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
40268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Function) {
4027e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            // There are two allowed functions: local() and format().
40285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            CSSParserValueList* args = val->function->args.get();
40298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (args && args->size() == 1) {
40304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                if (equalIgnoringCase(val->function->name, "local(") && !expectComma && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT)) {
40318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    expectComma = true;
40328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    allowFormat = false;
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    CSSParserValue* a = args->current();
40348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue.clear();
40358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedValue = CSSFontFaceSrcValue::createLocal(a->string);
4036643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                } else if (allowFormat && uriValue && isValidFormatFunction(val)) {
40378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    expectComma = true;
40388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    allowFormat = false;
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue->setFormat(args->current()->string);
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue.clear();
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',' && expectComma) {
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowFormat = false;
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uriValue.clear();
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4052e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parsedValue)
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4061e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
40628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values->length() && !failed) {
40638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertySrc, values.release(), m_important);
40648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
40658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontFaceUnicodeRange()
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool failed = false;
4075e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    bool operatorExpected = false;
4076e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    for (; m_valueList->current(); m_valueList->next(), operatorExpected = !operatorExpected) {
4077e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (operatorExpected) {
4078e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (m_valueList->current()->unit == CSSParserValue::Operator && m_valueList->current()->iValue == ',')
4079e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                continue;
4080e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            failed = true;
4081e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            break;
4082e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
40838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_valueList->current()->unit != CSSPrimitiveValue::CSS_UNICODE_RANGE) {
40848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
40858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String rangeString = m_valueList->current()->string;
40898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar32 from = 0;
40908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar32 to = 0;
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned length = rangeString.length();
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (length < 3) {
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned i = 2;
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (i < length) {
41008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            UChar c = rangeString[i];
41018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (c == '-' || c == '?')
41028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            from *= 16;
41048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (c >= '0' && c <= '9')
41058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += c - '0';
41068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (c >= 'A' && c <= 'F')
41078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += 10 + c - 'A';
41088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (c >= 'a' && c <= 'f')
41098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += 10 + c - 'a';
41108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
41128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            i++;
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (failed)
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == length)
41208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            to = from;
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (rangeString[i] == '?') {
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned span = 1;
41238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (i < length && rangeString[i] == '?') {
41248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                span *= 16;
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from *= 16;
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                i++;
41278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (i < length)
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            to = from + span - 1;
41318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (length < i + 2) {
41338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
41348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            i++;
41378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (i < length) {
41388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                UChar c = rangeString[i];
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                to *= 16;
41408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (c >= '0' && c <= '9')
41418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += c - '0';
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (c >= 'A' && c <= 'F')
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += 10 + c - 'A';
41448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (c >= 'a' && c <= 'f')
41458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += 10 + c - 'a';
41468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else {
41478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    failed = true;
41488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
41498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
41508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                i++;
41518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (failed)
41538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4155ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (from <= to)
4156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            values->append(CSSUnicodeRangeValue::create(from, to));
41578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
41588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (failed || !values->length())
41598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
41608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(CSSPropertyUnicodeRange, values.release(), m_important);
41618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
41628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41642bde8e466a4451c7319e3a072d118917957d6554Steve Block// Returns the number of characters which form a valid double
41652bde8e466a4451c7319e3a072d118917957d6554Steve Block// and are terminated by the given terminator character
41662bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic int checkForValidDouble(const UChar* string, const UChar* end, const char terminator)
41672bde8e466a4451c7319e3a072d118917957d6554Steve Block{
41682bde8e466a4451c7319e3a072d118917957d6554Steve Block    int length = end - string;
41692bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (length < 1)
41702bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
41712bde8e466a4451c7319e3a072d118917957d6554Steve Block
41722bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool decimalMarkSeen = false;
41732bde8e466a4451c7319e3a072d118917957d6554Steve Block    int processedLength = 0;
41742bde8e466a4451c7319e3a072d118917957d6554Steve Block
41752bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (int i = 0; i < length; ++i) {
41762bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (string[i] == terminator) {
41772bde8e466a4451c7319e3a072d118917957d6554Steve Block            processedLength = i;
41782bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
41792bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
41802bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!isASCIIDigit(string[i])) {
41812bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (!decimalMarkSeen && string[i] == '.')
41822bde8e466a4451c7319e3a072d118917957d6554Steve Block                decimalMarkSeen = true;
41832bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
41842bde8e466a4451c7319e3a072d118917957d6554Steve Block                return 0;
41852bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
41862bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41872bde8e466a4451c7319e3a072d118917957d6554Steve Block
41882bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (decimalMarkSeen && processedLength == 1)
41892bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
41902bde8e466a4451c7319e3a072d118917957d6554Steve Block
41912bde8e466a4451c7319e3a072d118917957d6554Steve Block    return processedLength;
41922bde8e466a4451c7319e3a072d118917957d6554Steve Block}
41932bde8e466a4451c7319e3a072d118917957d6554Steve Block
41942bde8e466a4451c7319e3a072d118917957d6554Steve Block// Returns the number of characters consumed for parsing a valid double
41952bde8e466a4451c7319e3a072d118917957d6554Steve Block// terminated by the given terminator character
41962bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic int parseDouble(const UChar* string, const UChar* end, const char terminator, double& value)
41972bde8e466a4451c7319e3a072d118917957d6554Steve Block{
41982bde8e466a4451c7319e3a072d118917957d6554Steve Block    int length = checkForValidDouble(string, end, terminator);
41992bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!length)
42002bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
42012bde8e466a4451c7319e3a072d118917957d6554Steve Block
42022bde8e466a4451c7319e3a072d118917957d6554Steve Block    int position = 0;
42032bde8e466a4451c7319e3a072d118917957d6554Steve Block    double localValue = 0;
42042bde8e466a4451c7319e3a072d118917957d6554Steve Block
42052bde8e466a4451c7319e3a072d118917957d6554Steve Block    // The consumed characters here are guaranteed to be
42062bde8e466a4451c7319e3a072d118917957d6554Steve Block    // ASCII digits with or without a decimal mark
42072bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (; position < length; ++position) {
42082bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (string[position] == '.')
42092bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
42102bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue = localValue * 10 + string[position] - '0';
42112bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
42122bde8e466a4451c7319e3a072d118917957d6554Steve Block
42132bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (++position == length) {
42142bde8e466a4451c7319e3a072d118917957d6554Steve Block        value = localValue;
42152bde8e466a4451c7319e3a072d118917957d6554Steve Block        return length;
42162bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
42172bde8e466a4451c7319e3a072d118917957d6554Steve Block
42182bde8e466a4451c7319e3a072d118917957d6554Steve Block    double fraction = 0;
42192bde8e466a4451c7319e3a072d118917957d6554Steve Block    double scale = 1;
42202bde8e466a4451c7319e3a072d118917957d6554Steve Block
42212bde8e466a4451c7319e3a072d118917957d6554Steve Block    while (position < length && scale < MAX_SCALE) {
42222bde8e466a4451c7319e3a072d118917957d6554Steve Block        fraction = fraction * 10 + string[position++] - '0';
42232bde8e466a4451c7319e3a072d118917957d6554Steve Block        scale *= 10;
42242bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
42252bde8e466a4451c7319e3a072d118917957d6554Steve Block
42262bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = localValue + fraction / scale;
42272bde8e466a4451c7319e3a072d118917957d6554Steve Block    return length;
42282bde8e466a4451c7319e3a072d118917957d6554Steve Block}
42292bde8e466a4451c7319e3a072d118917957d6554Steve Block
42302bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic bool parseColorIntOrPercentage(const UChar*& string, const UChar* end, const char terminator, CSSPrimitiveValue::UnitTypes& expect, int& value)
4231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
4232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* current = string;
42332bde8e466a4451c7319e3a072d118917957d6554Steve Block    double localValue = 0;
4234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool negative = false;
4235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (current != end && isHTMLSpace(*current))
4236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current != end && *current == '-') {
4238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        negative = true;
4239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
4241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current == end || !isASCIIDigit(*current))
4242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
4243ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    while (current != end && isASCIIDigit(*current)) {
42442bde8e466a4451c7319e3a072d118917957d6554Steve Block        double newValue = localValue * 10 + *current++ - '0';
4245ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (newValue >= 255) {
4246ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Clamp values at 255.
4247ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            localValue = 255;
4248ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            while (current != end && isASCIIDigit(*current))
4249ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                ++current;
4250ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
4251ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
4252ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        localValue = newValue;
4253ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
42542bde8e466a4451c7319e3a072d118917957d6554Steve Block
425554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (current == end)
425654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        return false;
425754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
42582bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (expect == CSSPrimitiveValue::CSS_NUMBER && (*current == '.' || *current == '%'))
42592bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
42602bde8e466a4451c7319e3a072d118917957d6554Steve Block
42612bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (*current == '.') {
42622bde8e466a4451c7319e3a072d118917957d6554Steve Block        // We already parsed the integral part, try to parse
42632bde8e466a4451c7319e3a072d118917957d6554Steve Block        // the fraction part of the percentage value.
42642bde8e466a4451c7319e3a072d118917957d6554Steve Block        double percentage = 0;
42652bde8e466a4451c7319e3a072d118917957d6554Steve Block        int numCharactersParsed = parseDouble(current, end, '%', percentage);
42662bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!numCharactersParsed)
42672bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
42682bde8e466a4451c7319e3a072d118917957d6554Steve Block        current += numCharactersParsed;
42692bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (*current != '%')
42702bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
42712bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue += percentage;
42722bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
42732bde8e466a4451c7319e3a072d118917957d6554Steve Block
42742bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (expect == CSSPrimitiveValue::CSS_PERCENTAGE && *current != '%')
42752bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
42762bde8e466a4451c7319e3a072d118917957d6554Steve Block
42772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (*current == '%') {
42782bde8e466a4451c7319e3a072d118917957d6554Steve Block        expect = CSSPrimitiveValue::CSS_PERCENTAGE;
42792bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue = localValue / 100.0 * 256.0;
42802bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Clamp values at 255 for percentages over 100%
42812bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (localValue > 255)
42822bde8e466a4451c7319e3a072d118917957d6554Steve Block            localValue = 255;
42832bde8e466a4451c7319e3a072d118917957d6554Steve Block        current++;
42842bde8e466a4451c7319e3a072d118917957d6554Steve Block    } else
42852bde8e466a4451c7319e3a072d118917957d6554Steve Block        expect = CSSPrimitiveValue::CSS_NUMBER;
42862bde8e466a4451c7319e3a072d118917957d6554Steve Block
4287a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (current != end && isHTMLSpace(*current))
4288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current == end || *current++ != terminator)
4290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
4291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Clamp negative values at zero.
42922bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = negative ? 0 : static_cast<int>(localValue);
4293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    string = current;
4294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
4295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
4296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4297f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickstatic inline bool isTenthAlpha(const UChar* string, const int length)
4298f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
4299f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // "0.X"
4300f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 3 && string[0] == '0' && string[1] == '.' && isASCIIDigit(string[2]))
4301f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4302f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4303f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // ".X"
4304f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 2 && string[0] == '.' && isASCIIDigit(string[1]))
4305f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4306f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4307f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return false;
4308f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
4309f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
43102bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic inline bool parseAlphaValue(const UChar*& string, const UChar* end, const char terminator, int& value)
4311f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
4312a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (string != end && isHTMLSpace(*string))
4313f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string++;
4314f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
431581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool negative = false;
431681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
431781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string != end && *string == '-') {
431881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        negative = true;
431981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        string++;
432081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
432181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4322f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    value = 0;
4323f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4324f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    int length = end - string;
4325f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length < 2)
4326f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
4327f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
432881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string[length - 1] != terminator)
4329f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
4330f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
433181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string[0] != '0' && string[0] != '1' && string[0] != '.') {
43322bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (checkForValidDouble(string, end, terminator)) {
433381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            value = negative ? 0 : 255;
433481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            string = end;
433581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
433681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
4337f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
433881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
4339f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4340f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 2 && string[0] != '.') {
434181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value = !negative && string[0] == '1' ? 255 : 0;
4342f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string = end;
4343f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4344f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4345f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4346f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (isTenthAlpha(string, length - 1)) {
4347f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static const int tenthAlphaValues[] = { 0, 25, 51, 76, 102, 127, 153, 179, 204, 230 };
434881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value = negative ? 0 : tenthAlphaValues[string[length - 2] - '0'];
4349f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string = end;
4350f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4351f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4352f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
43532bde8e466a4451c7319e3a072d118917957d6554Steve Block    double alpha = 0;
43542bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!parseDouble(string, end, terminator, alpha))
43552bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
43562bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = negative ? 0 : static_cast<int>(alpha * nextafter(256.0, 0.0));
43572bde8e466a4451c7319e3a072d118917957d6554Steve Block    string = end;
43582bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
4359f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
4360f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4361e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic inline bool mightBeRGBA(const UChar* characters, unsigned length)
4362e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
4363e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (length < 5)
4364e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return false;
4365e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return characters[4] == '('
4366e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[0] | 0x20) == 'r'
4367e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[1] | 0x20) == 'g'
4368e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[2] | 0x20) == 'b'
4369e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[3] | 0x20) == 'a';
4370e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
4371e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
4372e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic inline bool mightBeRGB(const UChar* characters, unsigned length)
4373e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
4374e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (length < 4)
4375e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return false;
4376e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return characters[3] == '('
4377e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[0] | 0x20) == 'r'
4378e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[1] | 0x20) == 'g'
4379e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[2] | 0x20) == 'b';
4380e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
4381e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(const String &name, RGBA32& rgb, bool strict)
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4384e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    const UChar* characters = name.characters();
4385e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    unsigned length = name.length();
43862bde8e466a4451c7319e3a072d118917957d6554Steve Block    CSSPrimitiveValue::UnitTypes expect = CSSPrimitiveValue::CSS_UNKNOWN;
4387e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
4388e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!strict && length >= 3) {
4389e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (name[0] == '#') {
4390e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (Color::parseHexColor(characters + 1, length - 1, rgb))
4391e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                return true;
4392e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else {
4393e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (Color::parseHexColor(characters, length, rgb))
4394e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                return true;
4395e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
4396e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4398f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Try rgba() syntax.
4399e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (mightBeRGBA(characters, length)) {
4400f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* current = characters + 5;
4401f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* end = characters + length;
4402f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int red;
4403f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int green;
4404f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int blue;
4405f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int alpha;
44062bde8e466a4451c7319e3a072d118917957d6554Steve Block
44072bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, red))
4408f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
44092bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, green))
4410f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
44112bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, blue))
4412f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4413f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!parseAlphaValue(current, end, ')', alpha))
4414f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4415f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (current != end)
4416f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4417f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        rgb = makeRGBA(red, green, blue, alpha);
4418f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4419f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4420f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Try rgb() syntax.
4422e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (mightBeRGB(characters, length)) {
4423e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const UChar* current = characters + 4;
4424e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const UChar* end = characters + length;
4425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int red;
4426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int green;
4427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int blue;
44282bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, red))
4429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
44302bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, green))
4431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
44322bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ')', expect, blue))
4433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
4434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (current != end)
4435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
4436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        rgb = makeRGB(red, green, blue);
4437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
4438e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4439f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Try named colors.
44418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color tc;
44428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tc.setNamedColor(name);
44438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tc.isValid()) {
44448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rgb = tc.rgb();
44458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
44468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4450ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic inline int colorIntFromValue(CSSParserValue* v)
4451ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
4452ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->fValue <= 0.0)
4453ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return 0;
4454ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4455ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->unit == CSSPrimitiveValue::CSS_PERCENTAGE) {
4456ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (v->fValue >= 100.0)
4457ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return 255;
4458ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return static_cast<int>(v->fValue * 256.0 / 100.0);
4459ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
4460ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4461ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->fValue >= 255.0)
4462ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return 255;
4463ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4464ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return static_cast<int>(v->fValue);
4465ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
4466ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColorParameters(CSSParserValue* value, int* colorArray, bool parseAlpha)
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Units unitType = FUnknown;
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the first value and its type
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (validUnit(v, FInteger, true))
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unitType = FInteger;
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (validUnit(v, FPercent, true))
44768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unitType = FPercent;
44778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4479ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    colorArray[0] = colorIntFromValue(v);
44808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 1; i < 3; i++) {
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, unitType, true))
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4487ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        colorArray[i] = colorIntFromValue(v);
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parseAlpha) {
44908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FNumber, true))
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Convert the floating pointer number of alpha to an integer in the range [0, 256),
4497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // with an equal distribution across all 256 values.
4498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        colorArray[3] = static_cast<int>(max(0.0, min(1.0, v->fValue)) * nextafter(256.0, 0.0));
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The CSS3 specification defines the format of a HSL color as
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hsl(<number>, <percent>, <percent>)
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// and with alpha, the format is
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hsla(<number>, <percent>, <percent>, <number>)
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The first value, HUE, is in an angle with a value between 0 and 360
45088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseHSLParameters(CSSParserValue* value, double* colorArray, bool parseAlpha)
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the first value
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!validUnit(v, FNumber, true))
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // normalize the Hue value and change it to be between 0 and 1.0
45168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    colorArray[0] = (((static_cast<int>(v->fValue) % 360) + 360) % 360) / 360.0;
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 1; i < 3; i++) {
45188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
45198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
45208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
45228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FPercent, true))
45238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        colorArray[i] = max(0.0, min(100.0, v->fValue)) / 100.0; // needs to be value between 0 and 1.0
45258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
45268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parseAlpha) {
45278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
45288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
45298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
45318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FNumber, true))
45328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        colorArray[3] = max(0.0, min(1.0, v->fValue));
45348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
45358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
45368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSPrimitiveValue> CSSParser::parseColor(CSSParserValue* value)
45398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RGBA32 c = Color::transparent;
45418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!parseColorFromValue(value ? value : m_valueList->current(), c))
45428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
454381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createColorValue(c);
45448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4546545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochbool CSSParser::parseColorFromValue(CSSParserValue* value, RGBA32& c)
45478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_strict && value->unit == CSSPrimitiveValue::CSS_NUMBER &&
45498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value->fValue >= 0. && value->fValue < 1000000.) {
45508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String str = String::format("%06d", (int)(value->fValue+.5));
45518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!CSSParser::parseColor(str, c, m_strict))
45528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (value->unit == CSSPrimitiveValue::CSS_PARSER_HEXCOLOR ||
45548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->unit == CSSPrimitiveValue::CSS_IDENT ||
45558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (!m_strict && value->unit == CSSPrimitiveValue::CSS_DIMENSION)) {
45568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!CSSParser::parseColor(value->string, c, m_strict && value->unit == CSSPrimitiveValue::CSS_IDENT))
45578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (value->unit == CSSParserValue::Function &&
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args != 0 &&
45608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args->size() == 5 /* rgb + two commas */ &&
45618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                equalIgnoringCase(value->function->name, "rgb(")) {
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int colorValues[3];
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parseColorParameters(value, colorValues, false))
45648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
45658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        c = makeRGB(colorValues[0], colorValues[1], colorValues[2]);
4566545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else {
45678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit == CSSParserValue::Function &&
45688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args != 0 &&
45698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args->size() == 7 /* rgba + three commas */ &&
45708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                equalIgnoringCase(value->function->name, "rgba(")) {
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int colorValues[4];
45728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseColorParameters(value, colorValues, true))
45738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
45748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBA(colorValues[0], colorValues[1], colorValues[2], colorValues[3]);
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSParserValue::Function &&
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args != 0 &&
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args->size() == 5 /* hsl + two commas */ &&
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    equalIgnoringCase(value->function->name, "hsl(")) {
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            double colorValues[3];
45808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseHSLParameters(value, colorValues, false))
45818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
45828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBAFromHSLA(colorValues[0], colorValues[1], colorValues[2], 1.0);
45838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSParserValue::Function &&
45848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args != 0 &&
45858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args->size() == 7 /* hsla + three commas */ &&
45868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    equalIgnoringCase(value->function->name, "hsla(")) {
45878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            double colorValues[4];
45888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseHSLParameters(value, colorValues, true))
45898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
45908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBAFromHSLA(colorValues[0], colorValues[1], colorValues[2], colorValues[3]);
45918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
45928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4593545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
45948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
45968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class tracks parsing state for shadow values.  If it goes out of scope (e.g., due to an early return)
45998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// without the allowBreak bit being set, then it will clean up all of the objects and destroy them.
46008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct ShadowParseContext {
460181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ShadowParseContext(CSSPropertyID prop, CSSPrimitiveValueCache* primitiveValueCache)
46020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        : property(prop)
460381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_primitiveValueCache(primitiveValueCache)
46040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowX(true)
46050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowY(false)
46060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowBlur(false)
46070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowSpread(false)
46080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowColor(true)
4609cad810f21b803229eb11403f9209855525a25d57Steve Block        , allowStyle(prop == CSSPropertyWebkitBoxShadow || prop == CSSPropertyBoxShadow)
46100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowBreak(true)
46110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
46120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
46138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool allowLength() { return allowX || allowY || allowBlur || allowSpread; }
46158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitValue()
46170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle the ,, case gracefully by doing nothing.
46190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (x || y || blur || spread || color || style) {
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!values)
46218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
46220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Construct the current shadow value and add it to the list.
46240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            values->append(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release()));
46258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Now reset for the next shadow value.
46280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        x = 0;
46290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        y = 0;
46300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        blur = 0;
46310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        spread = 0;
46320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        style = 0;
46330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        color = 0;
46340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowX = true;
46360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowColor = true;
46370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowBreak = true;
46380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowY = false;
46390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowBlur = false;
46400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowSpread = false;
4641cad810f21b803229eb11403f9209855525a25d57Steve Block        allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
46420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
46430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitLength(CSSParserValue* v)
46450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
464681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> val = m_primitiveValueCache->createValue(v->fValue, (CSSPrimitiveValue::UnitTypes)v->unit);
46478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowX) {
46498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            x = val.release();
46500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowX = false;
46510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowY = true;
46520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = false;
46530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowStyle = false;
46540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = false;
46550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowY) {
46568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            y = val.release();
46570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowY = false;
46580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBlur = true;
46590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = true;
4660cad810f21b803229eb11403f9209855525a25d57Steve Block            allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
46610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = true;
46620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowBlur) {
46638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            blur = val.release();
46648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBlur = false;
4665cad810f21b803229eb11403f9209855525a25d57Steve Block            allowSpread = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
46660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowSpread) {
46670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            spread = val.release();
46680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitColor(PassRefPtr<CSSPrimitiveValue> val)
46730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        color = val;
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        allowColor = false;
46760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (allowX) {
46770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowStyle = false;
46780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = false;
46790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else {
46800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBlur = false;
46810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
4682cad810f21b803229eb11403f9209855525a25d57Steve Block            allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
46830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
46840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
46850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitStyle(CSSParserValue* v)
46870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
468881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        style = m_primitiveValueCache->createIdentifierValue(v->id);
46890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowStyle = false;
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowX)
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBreak = false;
46920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else {
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBlur = false;
46940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
46950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = false;
46960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
46978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSPropertyID property;
470081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSPrimitiveValueCache* m_primitiveValueCache;
47010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
47028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
47038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> x;
47048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> y;
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> blur;
47060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> spread;
47070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> style;
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> color;
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowX;
47118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowY;
47128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBlur;
47130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool allowSpread;
47148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowColor;
4715cad810f21b803229eb11403f9209855525a25d57Steve Block    bool allowStyle; // inset or not.
47168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBreak;
47178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
47188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShadow(int propId, bool important)
47208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
472181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ShadowParseContext context(static_cast<CSSPropertyID>(propId), primitiveValueCache());
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for a comma break first.
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator) {
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->iValue != ',' || !context.allowBreak)
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Other operators aren't legal or we aren't done with the current shadow
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // value.  Treat as invalid.
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
4730cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#if ENABLE(SVG)
4731d0825bca7fe65beaee391d30da42e937db621564Steve Block            // -webkit-svg-shadow does not support multiple values.
4732d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (static_cast<CSSPropertyID>(propId) == CSSPropertyWebkitSvgShadow)
4733cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                return false;
4734e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The value is good.  Commit it.
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitValue();
47370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (validUnit(val, FLength, true)) {
47388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We required a length and didn't get one. Invalid.
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!context.allowLength())
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // A length is allowed here.  Construct the value and add it.
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitLength(val);
47440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (val->id == CSSValueInset) {
47450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!context.allowStyle)
47460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
47470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
47480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            context.commitStyle(val);
47490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else {
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The only other type of value that's ok is a color value.
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSPrimitiveValue> parsedColor;
47528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            bool isColor = ((val->id >= CSSValueAqua && val->id <= CSSValueWindowtext) || val->id == CSSValueMenu ||
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            (val->id >= CSSValueWebkitFocusRingColor && val->id <= CSSValueWebkitText && !m_strict));
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isColor) {
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!context.allowColor)
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
475781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedColor = primitiveValueCache()->createIdentifierValue(val->id);
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedColor)
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // It's not built-in. Try to parse it as a color.
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedColor = parseColor(val);
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedColor || !context.allowColor)
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false; // This value is not a color or length and is invalid or
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              // it is a color, but a color isn't allowed at this point.
4767e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitColor(parsedColor.release());
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowBreak) {
47758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context.commitValue();
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (context.values->length()) {
47778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, context.values.release(), important);
47788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
47808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseReflect(int propId, bool important)
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // box-reflect: <direction> <offset> <mask>
4789e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Direction comes first.
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val = m_valueList->current();
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSReflectionDirection direction;
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (val->id) {
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueAbove:
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionAbove;
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueBelow:
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionBelow;
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueLeft:
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionLeft;
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRight:
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionRight;
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
48078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The offset comes next.
48118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    val = m_valueList->next();
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> offset;
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!val)
481481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        offset = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_PX);
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(val, FLength | FPercent, m_strict))
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
481881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        offset = primitiveValueCache()->createValue(val->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(val->unit));
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now for the mask.
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> mask;
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    val = m_valueList->next();
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (val) {
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parseBorderImage(propId, important, mask))
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSReflectValue> reflectValue = CSSReflectValue::create(direction, offset.release(), mask.release());
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(propId, reflectValue.release(), important);
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_valueList->next();
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstruct BorderImageParseContext {
483681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    BorderImageParseContext(CSSPrimitiveValueCache* primitiveValueCache)
483781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : m_primitiveValueCache(primitiveValueCache)
483881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_allowBreak(false)
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowNumber(false)
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowSlash(false)
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowWidth(false)
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowRule(false)
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderTop(0)
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderRight(0)
48458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderBottom(0)
48468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderLeft(0)
48478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_horizontalRule(0)
48488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_verticalRule(0)
48498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {}
4850e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBreak() const { return m_allowBreak; }
48528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowNumber() const { return m_allowNumber; }
48538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowSlash() const { return m_allowSlash; }
48548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowWidth() const { return m_allowWidth; }
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowRule() const { return m_allowRule; }
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void commitImage(PassRefPtr<CSSValue> image) { m_image = image; m_allowNumber = true; }
48580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitNumber(CSSParserValue* v)
48590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
486081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        PassRefPtr<CSSPrimitiveValue> val = m_primitiveValueCache->createValue(v->fValue, (CSSPrimitiveValue::UnitTypes)v->unit);
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_top)
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_top = val;
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_right)
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_right = val;
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_bottom)
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_bottom = val;
48678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!m_left);
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_left = val;
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4871e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowBreak = m_allowSlash = m_allowRule = true;
48738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowNumber = !m_left;
48748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void commitSlash() { m_allowBreak = m_allowSlash = m_allowNumber = false; m_allowWidth = true; }
48760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitWidth(CSSParserValue* val)
48770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_borderTop)
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderTop = val;
48808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_borderRight)
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderRight = val;
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_borderBottom)
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderBottom = val;
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
48858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!m_borderLeft);
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderLeft = val;
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowBreak = m_allowRule = true;
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowWidth = !m_borderLeft;
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitRule(int keyword)
48930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_horizontalRule)
48958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalRule = keyword;
48968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_verticalRule)
48978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalRule = keyword;
48988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowRule = !m_verticalRule;
48998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
49000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<CSSValue> commitBorderImage(CSSParser* p, bool important)
49010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We need to clone and repeat values for any omissions.
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_right) {
490481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_right = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
490581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_bottom = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
490681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_left = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_bottom) {
490981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_bottom = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
491081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_left = m_primitiveValueCache->createValue(m_right->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_right->primitiveType());
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_left)
491381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch             m_left = m_primitiveValueCache->createValue(m_right->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_right->primitiveType());
4914e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now build a rect value to hold all four of our primitive values.
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<Rect> rect = Rect::create();
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setTop(m_top);
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setRight(m_right);
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setBottom(m_bottom);
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setLeft(m_left);
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fill in STRETCH as the default if it wasn't specified.
49238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_horizontalRule)
49248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalRule = CSSValueStretch;
4925e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The vertical rule should match the horizontal rule if unspecified.
49278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_verticalRule)
49288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalRule = m_horizontalRule;
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we have to deal with the border widths.  The best way to deal with these is to actually put these values into a value
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list and then make our parsing machinery do the parsing.
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_borderTop) {
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParserValueList newList;
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newList.addValue(*m_borderTop);
49358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderRight)
49368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderRight);
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderBottom)
49388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderBottom);
49398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderLeft)
49408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderLeft);
49418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParserValueList* oldList = p->m_valueList;
49428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->m_valueList = &newList;
49438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->parseValue(CSSPropertyBorderWidth, important);
49448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->m_valueList = oldList;
49458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Make our new border image value now.
49488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSBorderImageValue::create(m_image, rect.release(), m_horizontalRule, m_verticalRule);
49498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
495081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
495181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSPrimitiveValueCache* m_primitiveValueCache;
4952e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowBreak;
49548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowNumber;
49558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowSlash;
49568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowWidth;
49578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowRule;
4958e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> m_image;
49608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_top;
49628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_right;
49638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_bottom;
49648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_left;
4965e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderTop;
49678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderRight;
49688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderBottom;
49698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderLeft;
4970e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_horizontalRule;
49728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_verticalRule;
49738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
49748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseBorderImage(int propId, bool important, RefPtr<CSSValue>& result)
49768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Look for an image initially.  If the first value is not a URI, then we're done.
497881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    BorderImageParseContext context(primitiveValueCache());
49798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val = m_valueList->current();
49800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (val->unit == CSSPrimitiveValue::CSS_URI && m_styleSheet) {
49810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: The completeURL call should be done when using the CSSImageValue,
49820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // not when creating it.
49830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        context.commitImage(CSSImageValue::create(m_styleSheet->completeURL(val->string)));
4984cad810f21b803229eb11403f9209855525a25d57Steve Block    } else if (isGeneratedImageValue(val)) {
49858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> value;
4986cad810f21b803229eb11403f9209855525a25d57Steve Block        if (parseGeneratedImage(value))
49878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitImage(value);
49888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
49898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
49908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
49918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
49928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->next())) {
49948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (context.allowNumber() && validUnit(val, FInteger | FNonNeg | FPercent, true)) {
49958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitNumber(val);
49968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (propId == CSSPropertyWebkitBorderImage && context.allowSlash() && val->unit == CSSParserValue::Operator && val->iValue == '/') {
49978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitSlash();
49988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (context.allowWidth() &&
49998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (val->id == CSSValueThin || val->id == CSSValueMedium || val->id == CSSValueThick || validUnit(val, FLength, m_strict))) {
50008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitWidth(val);
50018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (context.allowRule() &&
50028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (val->id == CSSValueStretch || val->id == CSSValueRound || val->id == CSSValueRepeat)) {
50038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitRule(val->id);
50048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
50058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Something invalid was encountered.
50068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
50078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5009e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowNumber() && propId != CSSPropertyWebkitBorderImage) {
50118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Allow the slices to be omitted for images that don't fit to a border.  We just set the slices to be 0.
501281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        context.m_top = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_NUMBER);
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context.m_allowBreak = true;
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowBreak()) {
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Need to fully commit as a single value.
50188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = context.commitBorderImage(this, important);
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5021e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void completeBorderRadii(RefPtr<CSSPrimitiveValue> radii[4])
50260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
50270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (radii[3])
50280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
50290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!radii[2]) {
50300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!radii[1])
50310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1] = radii[0];
50320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        radii[2] = radii[0];
50330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
50340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    radii[3] = radii[1];
50350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
50360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSParser::parseBorderRadius(int propId, bool important)
50380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
50390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    unsigned num = m_valueList->size();
50400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (num > 9)
50410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
50420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5043cad810f21b803229eb11403f9209855525a25d57Steve Block    ShorthandScope scope(this, propId);
50440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> radii[2][4];
50450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    unsigned indexAfterSlash = 0;
50470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (unsigned i = 0; i < num; ++i) {
50480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CSSParserValue* value = m_valueList->valueAt(i);
50490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (value->unit == CSSParserValue::Operator) {
50500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (value->iValue != '/')
50510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
50520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!i || indexAfterSlash || i + 1 == num || num > i + 5)
50540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
50550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            indexAfterSlash = i + 1;
50570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            completeBorderRadii(radii[0]);
50580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
50590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
50600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (i - indexAfterSlash >= 4)
50620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
50630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (!validUnit(value, FLength | FPercent, m_strict))
50650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
50660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
506781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> radius = primitiveValueCache()->createValue(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit));
50680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!indexAfterSlash) {
50700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[0][i] = radius;
50710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2;
50730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (num == 2 && propId == CSSPropertyWebkitBorderRadius) {
50740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                indexAfterSlash = 1;
50750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                completeBorderRadii(radii[0]);
50760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
50770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else
50780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1][i - indexAfterSlash] = radius.release();
50790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
50800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!indexAfterSlash) {
50820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        completeBorderRadii(radii[0]);
50830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        for (unsigned i = 0; i < 4; ++i)
50840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1][i] = radii[0][i];
50850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else
50860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        completeBorderRadii(radii[1]);
50870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5088cad810f21b803229eb11403f9209855525a25d57Steve Block    m_implicitShorthand = true;
508981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderTopLeftRadius, primitiveValueCache()->createValue(Pair::create(radii[0][0].release(), radii[1][0].release())), important);
509081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderTopRightRadius, primitiveValueCache()->createValue(Pair::create(radii[0][1].release(), radii[1][1].release())), important);
509181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderBottomRightRadius, primitiveValueCache()->createValue(Pair::create(radii[0][2].release(), radii[1][2].release())), important);
509281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderBottomLeftRadius, primitiveValueCache()->createValue(Pair::create(radii[0][3].release(), radii[1][3].release())), important);
5093cad810f21b803229eb11403f9209855525a25d57Steve Block    m_implicitShorthand = false;
50940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
50950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
50960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseCounter(int propId, int defaultValue, bool important)
50988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum { ID, VAL } state = ID;
51008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
51028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> counterName;
5103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
51058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (state) {
51078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case ID:
51088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val && val->unit == CSSPrimitiveValue::CSS_IDENT) {
510981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    counterName = primitiveValueCache()->createValue(val->string, CSSPrimitiveValue::CSS_STRING);
51108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    state = VAL;
51118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
51138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
51148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case VAL: {
51168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int i = defaultValue;
51178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val && val->unit == CSSPrimitiveValue::CSS_NUMBER) {
51182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    i = clampToInteger(val->fValue);
51198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
51208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
51218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
512281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createValue(Pair::create(counterName.release(),
512381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createValue(i, CSSPrimitiveValue::CSS_NUMBER))));
51248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state = ID;
51258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
51268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
51278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
51298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5130e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->length() > 0) {
51328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, list.release(), important);
51338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
51348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
51378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5139cad810f21b803229eb11403f9209855525a25d57Steve Block// This should go away once we drop support for -webkit-gradient
514081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic PassRefPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CSSParserValue* a, bool horizontal, CSSPrimitiveValueCache* primitiveValueCache)
51418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> result;
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a->unit == CSSPrimitiveValue::CSS_IDENT) {
5144cad810f21b803229eb11403f9209855525a25d57Steve Block        if ((equalIgnoringCase(a->string, "left") && horizontal) ||
5145cad810f21b803229eb11403f9209855525a25d57Steve Block            (equalIgnoringCase(a->string, "top") && !horizontal))
514681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(0., CSSPrimitiveValue::CSS_PERCENTAGE);
5147cad810f21b803229eb11403f9209855525a25d57Steve Block        else if ((equalIgnoringCase(a->string, "right") && horizontal) ||
5148cad810f21b803229eb11403f9209855525a25d57Steve Block                 (equalIgnoringCase(a->string, "bottom") && !horizontal))
514981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(100., CSSPrimitiveValue::CSS_PERCENTAGE);
51508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (equalIgnoringCase(a->string, "center"))
515181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(50., CSSPrimitiveValue::CSS_PERCENTAGE);
51528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (a->unit == CSSPrimitiveValue::CSS_NUMBER || a->unit == CSSPrimitiveValue::CSS_PERCENTAGE)
515381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        result = primitiveValueCache->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit);
51548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
51558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5157cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic bool parseDeprecatedGradientColorStop(CSSParser* p, CSSParserValue* a, CSSGradientColorStop& stop)
51588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a->unit != CSSParserValue::Function)
51608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5161e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!equalIgnoringCase(a->function->name, "from(") &&
51638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        !equalIgnoringCase(a->function->name, "to(") &&
51648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        !equalIgnoringCase(a->function->name, "color-stop("))
51658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5166e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = a->function->args.get();
51688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args)
51698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
5171cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(a->function->name, "from(") ||
5172cad810f21b803229eb11403f9209855525a25d57Steve Block        equalIgnoringCase(a->function->name, "to(")) {
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The "from" and "to" stops expect 1 argument.
51748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->size() != 1)
51758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(a->function->name, "from("))
517881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_NUMBER);
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
518081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(1, CSSPrimitiveValue::CSS_NUMBER);
5181e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = args->current()->id;
51838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
518481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_color = p->primitiveValueCache()->createIdentifierValue(id);
51858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            stop.m_color = p->parseColor(args->current());
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!stop.m_color)
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
51898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5190e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The "color-stop" function expects 3 arguments.
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(a->function->name, "color-stop(")) {
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->size() != 3)
51948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5195e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* stopArg = args->current();
51978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (stopArg->unit == CSSPrimitiveValue::CSS_PERCENTAGE)
519881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(stopArg->fValue / 100, CSSPrimitiveValue::CSS_NUMBER);
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (stopArg->unit == CSSPrimitiveValue::CSS_NUMBER)
520081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(stopArg->fValue, CSSPrimitiveValue::CSS_NUMBER);
52018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        stopArg = args->next();
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (stopArg->unit != CSSParserValue::Operator || stopArg->iValue != ',')
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5207e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        stopArg = args->next();
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = stopArg->id;
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
521181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_color = p->primitiveValueCache()->createIdentifierValue(id);
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
52138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            stop.m_color = p->parseColor(stopArg);
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!stop.m_color)
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
52168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
52198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5221cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseDeprecatedGradient(RefPtr<CSSValue>& gradient)
52228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Walk the arguments.
52245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = m_valueList->current()->function->args.get();
52258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args || args->size() == 0)
52268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5227e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The first argument is the gradient type.  It is an identifier.
5229cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSGradientType gradientType;
52308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
52318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSPrimitiveValue::CSS_IDENT)
52328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
52338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(a->string, "linear"))
5234cad810f21b803229eb11403f9209855525a25d57Steve Block        gradientType = CSSLinearGradient;
52358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (equalIgnoringCase(a->string, "radial"))
5236cad810f21b803229eb11403f9209855525a25d57Steve Block        gradientType = CSSRadialGradient;
52378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
52388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5239e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
5240cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSGradientValue> result;
5241cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (gradientType) {
5242cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSLinearGradient:
5243cad810f21b803229eb11403f9209855525a25d57Steve Block            result = CSSLinearGradientValue::create(NonRepeating, true);
5244cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5245cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSRadialGradient:
5246cad810f21b803229eb11403f9209855525a25d57Steve Block            result = CSSRadialGradientValue::create(NonRepeating, true);
5247cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5248cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5249cad810f21b803229eb11403f9209855525a25d57Steve Block
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Comma.
52518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5254e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Next comes the starting point for the gradient as an x y pair.  There is no
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // comma between the x and the y values.
52578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First X.  It can be left, right, number or percent.
52588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
52608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
526181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSPrimitiveValue> point = parseDeprecatedGradientPoint(a, true, primitiveValueCache());
52628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
52638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
52648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setFirstX(point.release());
5265e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First Y.  It can be top, bottom, number or percent.
52678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
52698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
527081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, false, primitiveValueCache());
52718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
52728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
52738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setFirstY(point.release());
5274e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Comma after the first point.
52768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
52788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5279e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For radial gradients only, we now expect a numeric radius.
5281cad810f21b803229eb11403f9209855525a25d57Steve Block    if (gradientType == CSSRadialGradient) {
52828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSPrimitiveValue::CSS_NUMBER)
52848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
528581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static_cast<CSSRadialGradientValue*>(result.get())->setFirstRadius(primitiveValueCache()->createValue(a->fValue, CSSPrimitiveValue::CSS_NUMBER));
5286e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Comma after the first radius.
52888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
52908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
52918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5292e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Next is the ending point for the gradient as an x, y pair.
52948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Second X.  It can be left, right, number or percent.
52958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
52978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
529881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, true, primitiveValueCache());
52998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
53008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
53018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setSecondX(point.release());
5302e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Second Y.  It can be top, bottom, number or percent.
53048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
53058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
53068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
530781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, false, primitiveValueCache());
53088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
53098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
53108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setSecondY(point.release());
53118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For radial gradients only, we now expect the second radius.
5313cad810f21b803229eb11403f9209855525a25d57Steve Block    if (gradientType == CSSRadialGradient) {
53148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Comma after the second point.
53158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
53168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
53178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5318e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
53208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSPrimitiveValue::CSS_NUMBER)
53218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
532281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static_cast<CSSRadialGradientValue*>(result.get())->setSecondRadius(primitiveValueCache()->createValue(a->fValue, CSSPrimitiveValue::CSS_NUMBER));
53238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We now will accept any number of stops (0 or more).
53268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
53278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (a) {
53288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Look for the comma before the next stop.
53298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
53308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5331e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now examine the stop itself.
53338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
53348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a)
53358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5336e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The function name needs to be one of "from", "to", or "color-stop."
53388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSGradientColorStop stop;
5339cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!parseDeprecatedGradientColorStop(this, a, stop))
53408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
53418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->addStop(stop);
5342e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Advance
53448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
53458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5346e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
53478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gradient = result.release();
53488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
53498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
53508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
535181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic PassRefPtr<CSSPrimitiveValue> valueFromSideKeyword(CSSParserValue* a, bool& isHorizontal, CSSPrimitiveValueCache* primitiveValueCache)
5352cad810f21b803229eb11403f9209855525a25d57Steve Block{
5353cad810f21b803229eb11403f9209855525a25d57Steve Block    if (a->unit != CSSPrimitiveValue::CSS_IDENT)
5354cad810f21b803229eb11403f9209855525a25d57Steve Block        return 0;
5355cad810f21b803229eb11403f9209855525a25d57Steve Block
5356cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (a->id) {
5357cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueLeft:
5358cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueRight:
5359cad810f21b803229eb11403f9209855525a25d57Steve Block            isHorizontal = true;
5360cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5361cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueTop:
5362cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueBottom:
5363cad810f21b803229eb11403f9209855525a25d57Steve Block            isHorizontal = false;
5364cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5365cad810f21b803229eb11403f9209855525a25d57Steve Block        default:
5366cad810f21b803229eb11403f9209855525a25d57Steve Block            return 0;
5367cad810f21b803229eb11403f9209855525a25d57Steve Block    }
536881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache->createIdentifierValue(a->id);
5369cad810f21b803229eb11403f9209855525a25d57Steve Block}
5370cad810f21b803229eb11403f9209855525a25d57Steve Block
5371cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic PassRefPtr<CSSPrimitiveValue> parseGradientColorOrKeyword(CSSParser* p, CSSParserValue* value)
5372cad810f21b803229eb11403f9209855525a25d57Steve Block{
5373cad810f21b803229eb11403f9209855525a25d57Steve Block    int id = value->id;
5374cad810f21b803229eb11403f9209855525a25d57Steve Block    if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
537581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return p->primitiveValueCache()->createIdentifierValue(id);
5376cad810f21b803229eb11403f9209855525a25d57Steve Block
5377cad810f21b803229eb11403f9209855525a25d57Steve Block    return p->parseColor(value);
5378cad810f21b803229eb11403f9209855525a25d57Steve Block}
5379cad810f21b803229eb11403f9209855525a25d57Steve Block
5380cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseLinearGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
5381cad810f21b803229eb11403f9209855525a25d57Steve Block{
5382cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repeating);
5383cad810f21b803229eb11403f9209855525a25d57Steve Block
5384cad810f21b803229eb11403f9209855525a25d57Steve Block    // Walk the arguments.
5385cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValueList* args = m_valueList->current()->function->args.get();
5386cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!args || !args->size())
5387cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5388cad810f21b803229eb11403f9209855525a25d57Steve Block
5389cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* a = args->current();
5390cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!a)
5391cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5392cad810f21b803229eb11403f9209855525a25d57Steve Block
5393cad810f21b803229eb11403f9209855525a25d57Steve Block    bool expectComma = false;
5394cad810f21b803229eb11403f9209855525a25d57Steve Block    // Look for angle.
5395cad810f21b803229eb11403f9209855525a25d57Steve Block    if (validUnit(a, FAngle, true)) {
539681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        result->setAngle(primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit));
5397cad810f21b803229eb11403f9209855525a25d57Steve Block
5398cad810f21b803229eb11403f9209855525a25d57Steve Block        a = args->next();
5399cad810f21b803229eb11403f9209855525a25d57Steve Block        expectComma = true;
5400cad810f21b803229eb11403f9209855525a25d57Steve Block    } else {
5401cad810f21b803229eb11403f9209855525a25d57Steve Block        // Look one or two optional keywords that indicate a side or corner.
5402cad810f21b803229eb11403f9209855525a25d57Steve Block        RefPtr<CSSPrimitiveValue> startX, startY;
5403cad810f21b803229eb11403f9209855525a25d57Steve Block
5404cad810f21b803229eb11403f9209855525a25d57Steve Block        RefPtr<CSSPrimitiveValue> location;
5405cad810f21b803229eb11403f9209855525a25d57Steve Block        bool isHorizontal = false;
540681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if ((location = valueFromSideKeyword(a, isHorizontal, primitiveValueCache()))) {
5407cad810f21b803229eb11403f9209855525a25d57Steve Block            if (isHorizontal)
5408cad810f21b803229eb11403f9209855525a25d57Steve Block                startX = location;
5409cad810f21b803229eb11403f9209855525a25d57Steve Block            else
5410cad810f21b803229eb11403f9209855525a25d57Steve Block                startY = location;
5411cad810f21b803229eb11403f9209855525a25d57Steve Block
5412cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5413cad810f21b803229eb11403f9209855525a25d57Steve Block            if (a) {
541481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if ((location = valueFromSideKeyword(a, isHorizontal, primitiveValueCache()))) {
5415cad810f21b803229eb11403f9209855525a25d57Steve Block                    if (isHorizontal) {
5416cad810f21b803229eb11403f9209855525a25d57Steve Block                        if (startX)
5417cad810f21b803229eb11403f9209855525a25d57Steve Block                            return false;
5418cad810f21b803229eb11403f9209855525a25d57Steve Block                        startX = location;
5419cad810f21b803229eb11403f9209855525a25d57Steve Block                    } else {
5420cad810f21b803229eb11403f9209855525a25d57Steve Block                        if (startY)
5421cad810f21b803229eb11403f9209855525a25d57Steve Block                            return false;
5422cad810f21b803229eb11403f9209855525a25d57Steve Block                        startY = location;
5423cad810f21b803229eb11403f9209855525a25d57Steve Block                    }
5424cad810f21b803229eb11403f9209855525a25d57Steve Block
5425cad810f21b803229eb11403f9209855525a25d57Steve Block                    a = args->next();
5426cad810f21b803229eb11403f9209855525a25d57Steve Block                }
5427cad810f21b803229eb11403f9209855525a25d57Steve Block            }
5428cad810f21b803229eb11403f9209855525a25d57Steve Block
5429cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5430cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5431cad810f21b803229eb11403f9209855525a25d57Steve Block
5432cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!startX && !startY)
543381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            startY = primitiveValueCache()->createIdentifierValue(CSSValueTop);
5434cad810f21b803229eb11403f9209855525a25d57Steve Block
5435cad810f21b803229eb11403f9209855525a25d57Steve Block        result->setFirstX(startX.release());
5436cad810f21b803229eb11403f9209855525a25d57Steve Block        result->setFirstY(startY.release());
5437cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5438cad810f21b803229eb11403f9209855525a25d57Steve Block
543965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parseGradientColorStops(args, result.get(), expectComma))
544065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
5441cad810f21b803229eb11403f9209855525a25d57Steve Block
5442cad810f21b803229eb11403f9209855525a25d57Steve Block    Vector<CSSGradientColorStop>& stops = result->stops();
5443cad810f21b803229eb11403f9209855525a25d57Steve Block    if (stops.isEmpty())
5444cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5445cad810f21b803229eb11403f9209855525a25d57Steve Block
5446cad810f21b803229eb11403f9209855525a25d57Steve Block    gradient = result.release();
5447cad810f21b803229eb11403f9209855525a25d57Steve Block    return true;
5448cad810f21b803229eb11403f9209855525a25d57Steve Block}
5449cad810f21b803229eb11403f9209855525a25d57Steve Block
5450cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseRadialGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
5451cad810f21b803229eb11403f9209855525a25d57Steve Block{
5452cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating);
5453cad810f21b803229eb11403f9209855525a25d57Steve Block
5454cad810f21b803229eb11403f9209855525a25d57Steve Block    // Walk the arguments.
5455cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValueList* args = m_valueList->current()->function->args.get();
5456cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!args || !args->size())
5457cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5458cad810f21b803229eb11403f9209855525a25d57Steve Block
5459cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* a = args->current();
5460cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!a)
5461cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5462cad810f21b803229eb11403f9209855525a25d57Steve Block
5463cad810f21b803229eb11403f9209855525a25d57Steve Block    bool expectComma = false;
5464cad810f21b803229eb11403f9209855525a25d57Steve Block
5465cad810f21b803229eb11403f9209855525a25d57Steve Block    // Optional background-position
5466cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSValue> centerX;
5467cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSValue> centerY;
5468cad810f21b803229eb11403f9209855525a25d57Steve Block    // parseFillPosition advances the args next pointer.
5469cad810f21b803229eb11403f9209855525a25d57Steve Block    parseFillPosition(args, centerX, centerY);
5470cad810f21b803229eb11403f9209855525a25d57Steve Block    a = args->current();
5471cad810f21b803229eb11403f9209855525a25d57Steve Block
5472cad810f21b803229eb11403f9209855525a25d57Steve Block    if (centerX || centerY) {
5473cad810f21b803229eb11403f9209855525a25d57Steve Block        // Comma
5474cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
5475cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5476cad810f21b803229eb11403f9209855525a25d57Steve Block
5477cad810f21b803229eb11403f9209855525a25d57Steve Block        a = args->next();
5478cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!a)
5479cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5480cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5481cad810f21b803229eb11403f9209855525a25d57Steve Block
5482cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!centerX || centerX->isPrimitiveValue());
5483cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!centerY || centerY->isPrimitiveValue());
5484cad810f21b803229eb11403f9209855525a25d57Steve Block
5485cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setFirstX(static_cast<CSSPrimitiveValue*>(centerX.get()));
5486cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSecondX(static_cast<CSSPrimitiveValue*>(centerX.get()));
5487cad810f21b803229eb11403f9209855525a25d57Steve Block    // CSS3 radial gradients always share the same start and end point.
5488cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setFirstY(static_cast<CSSPrimitiveValue*>(centerY.get()));
5489cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSecondY(static_cast<CSSPrimitiveValue*>(centerY.get()));
5490cad810f21b803229eb11403f9209855525a25d57Steve Block
5491cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> shapeValue;
5492cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> sizeValue;
5493cad810f21b803229eb11403f9209855525a25d57Steve Block
5494cad810f21b803229eb11403f9209855525a25d57Steve Block    // Optional shape and/or size in any order.
5495cad810f21b803229eb11403f9209855525a25d57Steve Block    for (int i = 0; i < 2; ++i) {
5496cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a->unit != CSSPrimitiveValue::CSS_IDENT)
5497cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5498cad810f21b803229eb11403f9209855525a25d57Steve Block
5499cad810f21b803229eb11403f9209855525a25d57Steve Block        bool foundValue = false;
5500cad810f21b803229eb11403f9209855525a25d57Steve Block        switch (a->id) {
5501cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueCircle:
5502cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueEllipse:
550381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            shapeValue = primitiveValueCache()->createIdentifierValue(a->id);
5504cad810f21b803229eb11403f9209855525a25d57Steve Block            foundValue = true;
5505cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5506cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueClosestSide:
5507cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueClosestCorner:
5508cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueFarthestSide:
5509cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueFarthestCorner:
5510cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueContain:
5511cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueCover:
551281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            sizeValue = primitiveValueCache()->createIdentifierValue(a->id);
5513cad810f21b803229eb11403f9209855525a25d57Steve Block            foundValue = true;
5514cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5515cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5516cad810f21b803229eb11403f9209855525a25d57Steve Block
5517cad810f21b803229eb11403f9209855525a25d57Steve Block        if (foundValue) {
5518cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5519cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5520cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5521cad810f21b803229eb11403f9209855525a25d57Steve Block
5522cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5523cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5524cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5525cad810f21b803229eb11403f9209855525a25d57Steve Block
5526cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setShape(shapeValue);
5527cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSizingBehavior(sizeValue);
5528cad810f21b803229eb11403f9209855525a25d57Steve Block
5529cad810f21b803229eb11403f9209855525a25d57Steve Block    // Or, two lengths or percentages
5530cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> horizontalSize;
5531cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> verticalSize;
5532cad810f21b803229eb11403f9209855525a25d57Steve Block
5533cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!shapeValue && !sizeValue) {
5534cad810f21b803229eb11403f9209855525a25d57Steve Block        if (validUnit(a, FLength | FPercent, m_strict)) {
553581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            horizontalSize = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
5536cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5537cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5538cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5539cad810f21b803229eb11403f9209855525a25d57Steve Block
5540cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5541cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5542cad810f21b803229eb11403f9209855525a25d57Steve Block
5543cad810f21b803229eb11403f9209855525a25d57Steve Block        if (validUnit(a, FLength | FPercent, m_strict)) {
554481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            verticalSize = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
5545cad810f21b803229eb11403f9209855525a25d57Steve Block
5546cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5547cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5548cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5549cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5550cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5551cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5552cad810f21b803229eb11403f9209855525a25d57Steve Block
5553cad810f21b803229eb11403f9209855525a25d57Steve Block    // Must have neither or both.
5554cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!horizontalSize != !verticalSize)
5555cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5556cad810f21b803229eb11403f9209855525a25d57Steve Block
5557cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setEndHorizontalSize(horizontalSize);
5558cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setEndVerticalSize(verticalSize);
5559cad810f21b803229eb11403f9209855525a25d57Steve Block
556065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parseGradientColorStops(args, result.get(), expectComma))
556165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
556265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
556365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gradient = result.release();
556465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
556565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
556665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
556765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool CSSParser::parseGradientColorStops(CSSParserValueList* valueList, CSSGradientValue* gradient, bool expectComma)
556865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
556965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CSSParserValue* a = valueList->current();
557065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
557165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now look for color stops.
5572cad810f21b803229eb11403f9209855525a25d57Steve Block    while (a) {
5573cad810f21b803229eb11403f9209855525a25d57Steve Block        // Look for the comma before the next stop.
5574cad810f21b803229eb11403f9209855525a25d57Steve Block        if (expectComma) {
5575cad810f21b803229eb11403f9209855525a25d57Steve Block            if (a->unit != CSSParserValue::Operator || a->iValue != ',')
5576cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5577cad810f21b803229eb11403f9209855525a25d57Steve Block
557865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            a = valueList->next();
5579cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5580cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5581cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5582cad810f21b803229eb11403f9209855525a25d57Steve Block
5583cad810f21b803229eb11403f9209855525a25d57Steve Block        // <color-stop> = <color> [ <percentage> | <length> ]?
5584cad810f21b803229eb11403f9209855525a25d57Steve Block        CSSGradientColorStop stop;
5585cad810f21b803229eb11403f9209855525a25d57Steve Block        stop.m_color = parseGradientColorOrKeyword(this, a);
5586cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!stop.m_color)
5587cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5588cad810f21b803229eb11403f9209855525a25d57Steve Block
558965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        a = valueList->next();
5590cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a) {
5591cad810f21b803229eb11403f9209855525a25d57Steve Block            if (validUnit(a, FLength | FPercent, m_strict)) {
559281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                stop.m_position = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit);
559365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                a = valueList->next();
5594cad810f21b803229eb11403f9209855525a25d57Steve Block            }
5595cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5596cad810f21b803229eb11403f9209855525a25d57Steve Block
559765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        gradient->addStop(stop);
5598cad810f21b803229eb11403f9209855525a25d57Steve Block        expectComma = true;
5599cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5600cad810f21b803229eb11403f9209855525a25d57Steve Block
560165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Must have 2 or more stops to be valid.
560265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return gradient->stops().size() > 1;
5603cad810f21b803229eb11403f9209855525a25d57Steve Block}
5604cad810f21b803229eb11403f9209855525a25d57Steve Block
5605cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::isGeneratedImageValue(CSSParserValue* val) const
5606cad810f21b803229eb11403f9209855525a25d57Steve Block{
5607cad810f21b803229eb11403f9209855525a25d57Steve Block    if (val->unit != CSSParserValue::Function)
5608cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5609cad810f21b803229eb11403f9209855525a25d57Steve Block
5610cad810f21b803229eb11403f9209855525a25d57Steve Block    return equalIgnoringCase(val->function->name, "-webkit-gradient(")
5611cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-linear-gradient(")
5612cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient(")
5613cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-radial-gradient(")
5614cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient(")
5615cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-canvas(");
5616cad810f21b803229eb11403f9209855525a25d57Steve Block}
5617cad810f21b803229eb11403f9209855525a25d57Steve Block
5618cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseGeneratedImage(RefPtr<CSSValue>& value)
5619cad810f21b803229eb11403f9209855525a25d57Steve Block{
5620cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* val = m_valueList->current();
5621cad810f21b803229eb11403f9209855525a25d57Steve Block
5622cad810f21b803229eb11403f9209855525a25d57Steve Block    if (val->unit != CSSParserValue::Function)
5623cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5624cad810f21b803229eb11403f9209855525a25d57Steve Block
5625cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-gradient("))
5626cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseDeprecatedGradient(value);
5627cad810f21b803229eb11403f9209855525a25d57Steve Block
5628cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-linear-gradient("))
5629cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseLinearGradient(value, NonRepeating);
5630cad810f21b803229eb11403f9209855525a25d57Steve Block
5631cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient("))
5632cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseLinearGradient(value, Repeating);
5633cad810f21b803229eb11403f9209855525a25d57Steve Block
5634cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-radial-gradient("))
5635cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseRadialGradient(value, NonRepeating);
5636cad810f21b803229eb11403f9209855525a25d57Steve Block
5637cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient("))
5638cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseRadialGradient(value, Repeating);
5639cad810f21b803229eb11403f9209855525a25d57Steve Block
5640cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-canvas("))
5641cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseCanvas(value);
5642cad810f21b803229eb11403f9209855525a25d57Steve Block
5643cad810f21b803229eb11403f9209855525a25d57Steve Block    return false;
5644cad810f21b803229eb11403f9209855525a25d57Steve Block}
5645cad810f21b803229eb11403f9209855525a25d57Steve Block
56468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseCanvas(RefPtr<CSSValue>& canvas)
56478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
56488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSCanvasValue> result = CSSCanvasValue::create();
5649e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Walk the arguments.
56515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = m_valueList->current()->function->args.get();
56528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args || args->size() != 1)
56538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5654e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The first argument is the canvas name.  It is an identifier.
56568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
56578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSPrimitiveValue::CSS_IDENT)
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setName(a->string);
56608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    canvas = result;
56618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
56628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass TransformOperationInfo {
56658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
56668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TransformOperationInfo(const CSSParserString& name)
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(WebKitCSSTransformValue::UnknownTransformOperation)
56688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_argCount(1)
56698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowSingleArgument(false)
56708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_unit(CSSParser::FUnknown)
56718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
56728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (equalIgnoringCase(name, "scale(") || equalIgnoringCase(name, "scalex(") || equalIgnoringCase(name, "scaley(") || equalIgnoringCase(name, "scalez(")) {
56738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FNumber;
56748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "scale("))
56758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleTransformOperation;
56768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "scalex("))
56778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleXTransformOperation;
56788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "scaley("))
56798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleYTransformOperation;
56808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
56818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::ScaleZTransformOperation;
56828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "scale3d(")) {
56838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Scale3DTransformOperation;
56848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 5;
56858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
56868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "rotate(")) {
56878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = WebKitCSSTransformValue::RotateTransformOperation;
56888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FAngle;
56898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "rotatex(") ||
56908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                   equalIgnoringCase(name, "rotatey(") ||
56918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                   equalIgnoringCase(name, "rotatez(")) {
56928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FAngle;
56938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (equalIgnoringCase(name, "rotatex("))
56948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateXTransformOperation;
56958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "rotatey("))
56968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateYTransformOperation;
56978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
56988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateZTransformOperation;
56998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "rotate3d(")) {
57008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Rotate3DTransformOperation;
57018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 7;
57028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
57038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "skew(") || equalIgnoringCase(name, "skewx(") || equalIgnoringCase(name, "skewy(")) {
57048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FAngle;
57058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "skew("))
57068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewTransformOperation;
57078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "skewx("))
57088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewXTransformOperation;
57098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
57108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewYTransformOperation;
57118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "translate(") || equalIgnoringCase(name, "translatex(") || equalIgnoringCase(name, "translatey(") || equalIgnoringCase(name, "translatez(")) {
57128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FLength | CSSParser::FPercent;
57138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "translate("))
57148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateTransformOperation;
57158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "translatex("))
57168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateXTransformOperation;
57178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "translatey("))
57188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateYTransformOperation;
57198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
57208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::TranslateZTransformOperation;
57218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "translate3d(")) {
57228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Translate3DTransformOperation;
57238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 5;
57248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FLength | CSSParser::FPercent;
57258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "matrix(")) {
57268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = WebKitCSSTransformValue::MatrixTransformOperation;
57278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_argCount = 11;
57288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FNumber;
57298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "matrix3d(")) {
57308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Matrix3DTransformOperation;
57318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 31;
57328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
57338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "perspective(")) {
57348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::PerspectiveTransformOperation;
57358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
57368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
57388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(name, "scale(") || equalIgnoringCase(name, "skew(") || equalIgnoringCase(name, "translate(")) {
57398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_allowSingleArgument = true;
57408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_argCount = 3;
57418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5743e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSTransformValue::TransformOperationType type() const { return m_type; }
57458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned argCount() const { return m_argCount; }
57468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser::Units unit() const { return m_unit; }
57478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool unknown() const { return m_type == WebKitCSSTransformValue::UnknownTransformOperation; }
57498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasCorrectArgCount(unsigned argCount) { return m_argCount == argCount || (m_allowSingleArgument && argCount == 1); }
57508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSTransformValue::TransformOperationType m_type;
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_argCount;
57548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowSingleArgument;
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser::Units m_unit;
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
57578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValueList> CSSParser::parseTransform()
57598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_valueList)
57618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The transform is a list of functional primitives that specify transform operations.
57648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We collect a list of WebKitCSSTransformValues, where each value specifies a single operation.
57658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
57668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
57678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit != CSSParserValue::Function || !value->function)
57688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5769e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Every primitive requires at least one argument.
57715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSParserValueList* args = value->function->args.get();
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!args)
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5774e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // See if the specified primitive is one we understand.
57768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TransformOperationInfo info(value->function->name);
57778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (info.unknown())
57788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5779e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!info.hasCorrectArgCount(args->size()))
57818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
57828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Create the new WebKitCSSTransformValue for this operation and add it to our list.
57848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<WebKitCSSTransformValue> transformValue = WebKitCSSTransformValue::create(info.type());
57858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(transformValue);
57868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Snag our values.
57888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* a = args->current();
57898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned argNumber = 0;
57908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (a) {
57918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParser::Units unit = info.unit();
57928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (info.type() == WebKitCSSTransformValue::Rotate3DTransformOperation && argNumber == 3) {
5794f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 4th param of rotate3d() is an angle rather than a bare number, validate it as such
57958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!validUnit(a, FAngle, true))
57968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return 0;
5797f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            } else if (info.type() == WebKitCSSTransformValue::Translate3DTransformOperation && argNumber == 2) {
5798f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 3rd param of translate3d() cannot be a percentage
5799f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (!validUnit(a, FLength, true))
5800f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    return 0;
5801f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            } else if (info.type() == WebKitCSSTransformValue::TranslateZTransformOperation && argNumber == 0) {
5802f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 1st param of translateZ() cannot be a percentage
5803f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (!validUnit(a, FLength, true))
5804f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    return 0;
58052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            } else if (info.type() == WebKitCSSTransformValue::PerspectiveTransformOperation && argNumber == 0) {
58062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                // 1st param of perspective() must be a non-negative number (deprecated) or length.
58072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (!validUnit(a, FNumber | FLength | FNonNeg, true))
58082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    return 0;
58098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (!validUnit(a, unit, true))
58108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
5811e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Add the value to the current transform operation.
581381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            transformValue->append(primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit));
58148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            a = args->next();
58168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
58178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
58188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (a->unit != CSSParserValue::Operator || a->iValue != ',')
58198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
58208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            a = args->next();
5821e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argNumber++;
58238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
58248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5825e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list.release();
58278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSParser::parseTransformOrigin(int propId, int& propId1, int& propId2, int& propId3, RefPtr<CSSValue>& value, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)
58308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId1 = propId;
58328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId2 = propId;
58338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId3 = propId;
58348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propId == CSSPropertyWebkitTransformOrigin) {
58358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyWebkitTransformOriginX;
58368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyWebkitTransformOriginY;
58378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId3 = CSSPropertyWebkitTransformOriginZ;
58388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (propId) {
58418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOrigin:
58424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!parseTransformOriginShorthand(value, value2, value3))
58434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                return false;
58448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            // parseTransformOriginShorthand advances the m_valueList pointer
58458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
58468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOriginX: {
58472bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionX(m_valueList);
58488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value)
58498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
58508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
58518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
58528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOriginY: {
58532bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionY(m_valueList);
58548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value)
58558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
58568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
58578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
58588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitTransformOriginZ: {
58598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (validUnit(m_valueList->current(), FLength, m_strict))
586081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                value = primitiveValueCache()->createValue(m_valueList->current()->fValue, (CSSPrimitiveValue::UnitTypes)m_valueList->current()->unit);
58618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
58628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
58638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
58658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
5866e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return value;
58688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
58698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
58708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSParser::parsePerspectiveOrigin(int propId, int& propId1, int& propId2, RefPtr<CSSValue>& value, RefPtr<CSSValue>& value2)
58718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
58728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId1 = propId;
58738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId2 = propId;
58748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (propId == CSSPropertyWebkitPerspectiveOrigin) {
58758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId1 = CSSPropertyWebkitPerspectiveOriginX;
58768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId2 = CSSPropertyWebkitPerspectiveOriginY;
58778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
58788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
58798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    switch (propId) {
58808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOrigin:
5881cad810f21b803229eb11403f9209855525a25d57Steve Block            parseFillPosition(m_valueList, value, value2);
58828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOriginX: {
58842bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionX(m_valueList);
58858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
58868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
58878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
58898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOriginY: {
58902bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionY(m_valueList);
58918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
58928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
58938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
58958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5896e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value;
58988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5900f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool CSSParser::parseTextEmphasisStyle(bool important)
5901f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
5902f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    unsigned valueListSize = m_valueList->size();
5903f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5904f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSPrimitiveValue> fill;
5905f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSPrimitiveValue> shape;
5906f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5907f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
5908f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->unit == CSSPrimitiveValue::CSS_STRING) {
5909f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill || shape || (valueListSize != 1 && !inShorthand()))
5910f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
591181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            addProperty(CSSPropertyWebkitTextEmphasisStyle, primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING), important);
5912f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_valueList->next();
5913f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return true;
5914f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
5915f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5916f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->id == CSSValueNone) {
5917f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill || shape || (valueListSize != 1 && !inShorthand()))
5918f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
591981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            addProperty(CSSPropertyWebkitTextEmphasisStyle, primitiveValueCache()->createIdentifierValue(CSSValueNone), important);
5920f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_valueList->next();
5921f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return true;
5922f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
5923f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5924f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->id == CSSValueOpen || value->id == CSSValueFilled) {
5925f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill)
5926f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
592781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            fill = primitiveValueCache()->createIdentifierValue(value->id);
5928f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        } else if (value->id == CSSValueDot || value->id == CSSValueCircle || value->id == CSSValueDoubleCircle || value->id == CSSValueTriangle || value->id == CSSValueSesame) {
5929f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (shape)
5930f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
593181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            shape = primitiveValueCache()->createIdentifierValue(value->id);
5932f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        } else if (!inShorthand())
5933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return false;
5934f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else
5935f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
5936f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5937f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5938f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (fill && shape) {
5939f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
5940f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        parsedValues->append(fill.release());
5941f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        parsedValues->append(shape.release());
5942f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, parsedValues.release(), important);
5943f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5944f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5945f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (fill) {
5946f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, fill.release(), important);
5947f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5948f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5949f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (shape) {
5950f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, shape.release(), important);
5951f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5952f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5953f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5954f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
5955f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
5956f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
59572bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool CSSParser::parseLineBoxContain(bool important)
59582bde8e466a4451c7319e3a072d118917957d6554Steve Block{
59592bde8e466a4451c7319e3a072d118917957d6554Steve Block    LineBoxContain lineBoxContain = LineBoxContainNone;
59602bde8e466a4451c7319e3a072d118917957d6554Steve Block
59612bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
59622bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (value->id == CSSValueBlock) {
59632bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainBlock)
59642bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59652bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainBlock;
59662bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueInline) {
59672bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainInline)
59682bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59692bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainInline;
59702bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueFont) {
59712bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainFont)
59722bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59732bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainFont;
59742bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueGlyphs) {
59752bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainGlyphs)
59762bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59772bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainGlyphs;
59782bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueReplaced) {
59792bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainReplaced)
59802bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59812bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainReplaced;
59822bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueInlineBox) {
59832bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainInlineBox)
59842bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59852bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainInlineBox;
59862bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else
59872bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
59882bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
59892bde8e466a4451c7319e3a072d118917957d6554Steve Block
59902bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!lineBoxContain)
59912bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
59922bde8e466a4451c7319e3a072d118917957d6554Steve Block
59932bde8e466a4451c7319e3a072d118917957d6554Steve Block    addProperty(CSSPropertyWebkitLineBoxContain, CSSLineBoxContainValue::create(lineBoxContain), important);
59942bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
59952bde8e466a4451c7319e3a072d118917957d6554Steve Block}
59962bde8e466a4451c7319e3a072d118917957d6554Steve Block
59978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline int yyerror(const char*) { return 1; }
59988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define END_TOKEN 0
60008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSGrammar.h"
60028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint CSSParser::lex(void* yylvalWithoutType)
60048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    YYSTYPE* yylval = static_cast<YYSTYPE*>(yylvalWithoutType);
60068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length;
6007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    lex();
6009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
60108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* t = text(&length);
60118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (token()) {
60138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WHITESPACE:
60148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case SGML_CD:
60158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INCLUDES:
60168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DASHMATCH:
60178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case URI:
60208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case STRING:
60218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDENT:
60228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NTH:
60238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case HEX:
60248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDSEL:
60258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DIMEN:
60268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case UNICODERANGE:
60278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FUNCTION:
60282bde8e466a4451c7319e3a072d118917957d6554Steve Block    case ANYFUNCTION:
60298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NOTFUNCTION:
60308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->string.characters = t;
60318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->string.length = length;
60328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IMPORT_SYM:
60358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PAGE_SYM:
60368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MEDIA_SYM:
60378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FONT_FACE_SYM:
60388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CHARSET_SYM:
60398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NAMESPACE_SYM:
60408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WEBKIT_KEYFRAMES_SYM:
60418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IMPORTANT_SYM:
60438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case QEMS:
60468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
60478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case GRADS:
6048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case TURNS:
60498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
60508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DEGS:
60518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case RADS:
60524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    case KHERTZ:
60530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case REMS:
60548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
60558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MSECS:
60564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    case HERTZ:
60578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case EMS:
60588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case EXS:
60598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PXS:
60608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CMS:
60618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MMS:
60628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INS:
60638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PTS:
60648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PCS:
60658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
60668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case SECS:
60678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PERCENTAGE:
60688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
60698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FLOATTOKEN:
60708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INTEGER:
60718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->number = charactersToDouble(t, length);
60728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
60758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6078643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return token();
60798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6081643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CSSParser::recheckAtKeyword(const UChar* str, int len)
6082643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6083643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String ruleName(str, len);
6084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (equalIgnoringCase(ruleName, "@import"))
6085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = IMPORT_SYM;
6086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@page"))
6087643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = PAGE_SYM;
6088643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@media"))
6089643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = MEDIA_SYM;
6090643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@font-face"))
6091643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = FONT_FACE_SYM;
6092643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@charset"))
6093643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = CHARSET_SYM;
6094643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@namespace"))
6095643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = NAMESPACE_SYM;
6096643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@-webkit-keyframes"))
6097643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = WEBKIT_KEYFRAMES_SYM;
6098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@-webkit-mediaquery"))
6099643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = WEBKIT_MEDIAQUERY_SYM;
6100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
6101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
61028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUChar* CSSParser::text(int *length)
61038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* start = yytext;
61058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int l = yyleng;
61060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (yyTok) {
61078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case STRING:
61088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l--;
61098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
61108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case HEX:
61118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDSEL:
61128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        start++;
61138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l--;
61148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
61158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case URI:
61168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "url("{w}{string}{w}")"
61178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "url("{w}{url}{w}")"
61188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // strip "url(" and ")"
61198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        start += 4;
61208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l -= 5;
61218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // strip {w}
6122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        while (l && isHTMLSpace(*start)) {
61230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ++start;
61240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            --l;
61258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        while (l && isHTMLSpace(start[l - 1]))
61270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            --l;
61280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (l && (*start == '"' || *start == '\'')) {
61290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ASSERT(l >= 2 && start[l - 1] == *start);
61300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ++start;
61310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l -= 2;
61328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
61348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
61358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
61368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // process escapes
61398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* out = start;
61408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* escape = 0;
61418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool sawEscape = false;
6143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
61448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < l; i++) {
61458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar* current = start + i;
61468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape == current - 1) {
61470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (isASCIIHexDigit(*current))
61488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
61498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (yyTok == STRING &&
61508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 (*current == '\n' || *current == '\r' || *current == '\f')) {
61518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // ### handle \r\n case
61528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (*current != '\r')
61538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    escape = 0;
61548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
61558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
61568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // in all other cases copy the char to output
61578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ###
61588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *out++ = *current;
61598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
61608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
61618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape == current - 2 && yyTok == STRING &&
61638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             *(current-1) == '\r' && *current == '\n') {
61648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
61658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
61668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (escape > current - 7 && isASCIIHexDigit(*current))
61688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
61698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape) {
61708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // add escaped char
61718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned uc = 0;
61728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape++;
61738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (escape < current) {
61748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                uc *= 16;
61750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                uc += toASCIIHexValue(*escape);
61768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                escape++;
61778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
61788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // can't handle chars outside ucs2
61798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (uc > 0xffff)
61808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                uc = 0xfffd;
61818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *out++ = uc;
61828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
6183a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (isHTMLSpace(*current))
61848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
61858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!escape && *current == '\\') {
61878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = current;
6188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            sawEscape = true;
61898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
61908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *out++ = *current;
61928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (escape) {
61948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // add escaped char
61958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned uc = 0;
61968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        escape++;
61978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (escape < start+l) {
61988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uc *= 16;
61990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uc += toASCIIHexValue(*escape);
62008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape++;
62018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
62028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // can't handle chars outside ucs2
62038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (uc > 0xffff)
62048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uc = 0xfffd;
62058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *out++ = uc;
62068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6207e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
62088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *length = out - start;
6209e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
6210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If we have an unrecognized @-keyword, and if we handled any escapes at all, then
6211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // we should attempt to adjust yyTok to the correct type.
6212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (yyTok == ATKEYWORD && sawEscape)
6213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        recheckAtKeyword(start, *length);
6214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
62158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return start;
62168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSParser::countLines()
6219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (UChar* current = yytext; current < yytext + yyleng; ++current) {
6221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (*current == '\n')
6222e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ++m_lineNumber;
6223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62262fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSParserSelector* CSSParser::createFloatingSelector()
62278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector* selector = new CSSParserSelector;
62298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingSelectors.add(selector);
62308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return selector;
62318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62332fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassOwnPtr<CSSParserSelector> CSSParser::sinkFloatingSelector(CSSParserSelector* selector)
62348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (selector) {
62368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingSelectors.contains(selector));
62378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingSelectors.remove(selector);
62388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptPtr(selector);
62408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62422bde8e466a4451c7319e3a072d118917957d6554Steve BlockVector<OwnPtr<CSSParserSelector> >* CSSParser::createFloatingSelectorVector()
62432bde8e466a4451c7319e3a072d118917957d6554Steve Block{
62442bde8e466a4451c7319e3a072d118917957d6554Steve Block    Vector<OwnPtr<CSSParserSelector> >* selectorVector = new Vector<OwnPtr<CSSParserSelector> >;
62452bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_floatingSelectorVectors.add(selectorVector);
62462bde8e466a4451c7319e3a072d118917957d6554Steve Block    return selectorVector;
62472bde8e466a4451c7319e3a072d118917957d6554Steve Block}
62482bde8e466a4451c7319e3a072d118917957d6554Steve Block
62492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > CSSParser::sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectorVector)
62502bde8e466a4451c7319e3a072d118917957d6554Steve Block{
62512bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (selectorVector) {
62522bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(m_floatingSelectorVectors.contains(selectorVector));
62532bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_floatingSelectorVectors.remove(selectorVector);
62542bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
62552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return adoptPtr(selectorVector);
62562bde8e466a4451c7319e3a072d118917957d6554Steve Block}
62572bde8e466a4451c7319e3a072d118917957d6554Steve Block
62588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValueList* CSSParser::createFloatingValueList()
62598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValueList* list = new CSSParserValueList;
62618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingValueLists.add(list);
62628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list;
62638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValueList* CSSParser::sinkFloatingValueList(CSSParserValueList* list)
62668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list) {
62688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingValueLists.contains(list));
62698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingValueLists.remove(list);
62708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list;
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserFunction* CSSParser::createFloatingFunction()
62758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserFunction* function = new CSSParserFunction;
62778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingFunctions.add(function);
62788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return function;
62798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserFunction* CSSParser::sinkFloatingFunction(CSSParserFunction* function)
62828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (function) {
62848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingFunctions.contains(function));
62858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingFunctions.remove(function);
62868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return function;
62888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValue& CSSParser::sinkFloatingValue(CSSParserValue& value)
62918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value.unit == CSSParserValue::Function) {
62938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingFunctions.contains(value.function));
62948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingFunctions.remove(value.function);
62958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value;
62978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMediaQueryExp* CSSParser::createFloatingMediaQueryExp(const AtomicString& mediaFeature, CSSParserValueList* values)
63008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_floatingMediaQueryExp = MediaQueryExp::create(mediaFeature, values);
63025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExp.get();
63038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassOwnPtr<MediaQueryExp> CSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* expression)
63068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(expression, expression == m_floatingMediaQueryExp);
63085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExp.release();
63098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickVector<OwnPtr<MediaQueryExp> >* CSSParser::createFloatingMediaQueryExpList()
63128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_floatingMediaQueryExpList = adoptPtr(new Vector<OwnPtr<MediaQueryExp> >);
63145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExpList.get();
63158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > CSSParser::sinkFloatingMediaQueryExpList(Vector<OwnPtr<MediaQueryExp> >* list)
63188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(list, list == m_floatingMediaQueryExpList);
63205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExpList.release();
63218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickMediaQuery* CSSParser::createFloatingMediaQuery(MediaQuery::Restrictor restrictor, const String& mediaType, PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions)
63248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_floatingMediaQuery = adoptPtr(new MediaQuery(restrictor, mediaType, expressions));
63265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQuery.get();
63278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickMediaQuery* CSSParser::createFloatingMediaQuery(PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions)
63308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return createFloatingMediaQuery(MediaQuery::None, "all", expressions);
63328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassOwnPtr<MediaQuery> CSSParser::sinkFloatingMediaQuery(MediaQuery* query)
63358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(query, query == m_floatingMediaQuery);
63375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQuery.release();
63388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMediaList* CSSParser::createMediaList()
63418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<MediaList> list = MediaList::create();
63438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MediaList* result = list.get();
63448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(list.release());
63458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createCharsetRule(const CSSParserString& charset)
63498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_styleSheet)
63518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
63528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSCharsetRule> rule = CSSCharsetRule::create(m_styleSheet, charset);
63538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSCharsetRule* result = rule.get();
63548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createImportRule(const CSSParserString& url, MediaList* media)
63598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!media || !m_styleSheet || !m_allowImportRules)
63618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
63628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSImportRule> rule = CSSImportRule::create(m_styleSheet, url, media);
63638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSImportRule* result = rule.get();
63648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createMediaRule(MediaList* media, CSSRuleList* rules)
63698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!media || !rules || !m_styleSheet)
63718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
63726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
63738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSMediaRule> rule = CSSMediaRule::create(m_styleSheet, media, rules);
63748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSMediaRule* result = rule.get();
63758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRuleList* CSSParser::createRuleList()
63808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSRuleList> list = CSSRuleList::create();
63828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSRuleList* listPtr = list.get();
6383e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
63848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedRuleLists.append(list.release());
63858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return listPtr;
63868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebKitCSSKeyframesRule* CSSParser::createKeyframesRule()
63898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
63918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebKitCSSKeyframesRule> rule = WebKitCSSKeyframesRule::create(m_styleSheet);
63928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSKeyframesRule* rulePtr = rule.get();
63938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rulePtr;
63958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63972fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSRule* CSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors)
63988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSStyleRule* result = 0;
64005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    markRuleBodyEnd();
6401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (selectors) {
6402f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_allowImportRules = m_allowNamespaceDeclarations = false;
6403e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        RefPtr<CSSStyleRule> rule = CSSStyleRule::create(m_styleSheet, m_lastSelectorLineNumber);
6404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rule->adoptSelectorVector(*selectors);
64058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_hasFontFaceOnlyValues)
64068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            deleteFontFaceOnlyValues();
64078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
64088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = rule.get();
64098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parsedStyleObjects.append(rule.release());
641068513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_ruleRangeMap) {
6411a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(m_currentRuleData);
6412a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->styleSourceData->styleBodyRange = m_ruleBodyRange;
6413a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->selectorListRange = m_selectorListRange;
6414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_ruleRangeMap->set(result, m_currentRuleData.release());
6415a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData = CSSRuleSourceData::create();
6416a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
64174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            m_inStyleRuleOrDeclaration = false;
641868513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
64198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6420a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    resetSelectorListMarks();
64215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    resetRuleBodyMarks();
64228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
64238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
64248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createFontFaceRule()
64278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
64298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; ++i) {
64308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSProperty* property = m_parsedProperties[i];
64318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = property->id();
64328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id == CSSPropertyFontWeight || id == CSSPropertyFontStyle || id == CSSPropertyFontVariant) && property->value()->isPrimitiveValue()) {
64338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSValue> value = property->m_value.release();
64348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            property->m_value = CSSValueList::createCommaSeparated();
643554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            static_cast<CSSValueList*>(property->value())->append(value.release());
643654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        } else if (id == CSSPropertyFontFamily && (!property->value()->isValueList() || static_cast<CSSValueList*>(property->value())->length() != 1)) {
643754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // Unlike font-family property, font-family descriptor in @font-face rule
643854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // has to be a value list with exactly one family name. It cannot have a
643954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // have 'initial' value and cannot 'inherit' from parent.
6440f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            // See http://dev.w3.org/csswg/css3-fonts/#font-family-desc
6441f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            clearProperties();
6442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return 0;
64438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
64448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSFontFaceRule> rule = CSSFontFaceRule::create(m_styleSheet);
64468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
64478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
64488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSFontFaceRule* result = rule.get();
64498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
64508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
64518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6453643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CSSParser::addNamespace(const AtomicString& prefix, const AtomicString& uri)
6454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_styleSheet || !m_allowNamespaceDeclarations)
6456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
6457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_allowImportRules = false;
6458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_styleSheet->addNamespace(this, prefix, uri);
6459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
6460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
64612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSParser::updateSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector* specifiers)
646265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
646365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleSheet ? m_styleSheet->determineNamespace(namespacePrefix) : m_defaultNamespace;
646465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    QualifiedName tag = QualifiedName(namespacePrefix, elementName, determinedNamespace);
646565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!specifiers->isUnknownPseudoElement()) {
64662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        specifiers->setTag(tag);
646765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
646865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
646965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    specifiers->setRelation(CSSSelector::ShadowDescendant);
64712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (CSSParserSelector* history = specifiers->tagHistory()) {
64722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        history->setTag(tag);
647365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
647465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
647565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
647665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // No need to create an extra element name selector if we are matching any element
647765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // in any namespace.
647865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (elementName == starAtom && m_defaultNamespace == starAtom)
647965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
648065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector* elementNameSelector = new CSSParserSelector;
64822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    elementNameSelector->setTag(tag);
648365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    specifiers->setTagHistory(elementNameSelector);
648465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
648565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
648665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64872fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSRule* CSSParser::createPageRule(PassOwnPtr<CSSParserSelector> pageSelector)
648821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
648921939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: Margin at-rules are ignored.
64906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
649121939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSPageRule* pageRule = 0;
649221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (pageSelector) {
64932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RefPtr<CSSPageRule> rule = CSSPageRule::create(m_styleSheet, m_lastSelectorLineNumber);
64942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Vector<OwnPtr<CSSParserSelector> > selectorVector;
64952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        selectorVector.append(pageSelector);
64962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rule->adoptSelectorVector(selectorVector);
649721939df44de1705786c545cd1bf519d47250322dBen Murdoch        rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
649821939df44de1705786c545cd1bf519d47250322dBen Murdoch        pageRule = rule.get();
649921939df44de1705786c545cd1bf519d47250322dBen Murdoch        m_parsedStyleObjects.append(rule.release());
650021939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
650121939df44de1705786c545cd1bf519d47250322dBen Murdoch    clearProperties();
650221939df44de1705786c545cd1bf519d47250322dBen Murdoch    return pageRule;
650321939df44de1705786c545cd1bf519d47250322dBen Murdoch}
650421939df44de1705786c545cd1bf519d47250322dBen Murdoch
650521939df44de1705786c545cd1bf519d47250322dBen MurdochCSSRule* CSSParser::createMarginAtRule(CSSSelector::MarginBoxType /* marginBox */)
650621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
650721939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: Implement margin at-rule here, using:
650821939df44de1705786c545cd1bf519d47250322dBen Murdoch    //        - marginBox: margin box
650921939df44de1705786c545cd1bf519d47250322dBen Murdoch    //        - m_parsedProperties: properties at [m_numParsedPropertiesBeforeMarginBox, m_numParsedProperties) are for this at-rule.
6510e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // Don't forget to also update the action for page symbol in CSSGrammar.y such that margin at-rule data is cleared if page_selector is invalid.
651121939df44de1705786c545cd1bf519d47250322dBen Murdoch
651221939df44de1705786c545cd1bf519d47250322dBen Murdoch    endDeclarationsForMarginBox();
651321939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 0; // until this method is implemented.
651421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
651521939df44de1705786c545cd1bf519d47250322dBen Murdoch
651621939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSParser::startDeclarationsForMarginBox()
651721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
651821939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = m_numParsedProperties;
651921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
652021939df44de1705786c545cd1bf519d47250322dBen Murdoch
652121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSParser::endDeclarationsForMarginBox()
652221939df44de1705786c545cd1bf519d47250322dBen Murdoch{
652321939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(m_numParsedPropertiesBeforeMarginBox != INVALID_NUM_PARSED_PROPERTIES);
652421939df44de1705786c545cd1bf519d47250322dBen Murdoch    rollbackLastProperties(m_numParsedProperties - m_numParsedPropertiesBeforeMarginBox);
652521939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
652621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
652721939df44de1705786c545cd1bf519d47250322dBen Murdoch
65288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::deleteFontFaceOnlyValues()
65298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_hasFontFaceOnlyValues);
65318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int deletedProperties = 0;
65328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; ++i) {
65348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSProperty* property = m_parsedProperties[i];
65358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = property->id();
65368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id == CSSPropertyFontWeight || id == CSSPropertyFontStyle || id == CSSPropertyFontVariant) && property->value()->isValueList()) {
65378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete property;
65388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            deletedProperties++;
65398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (deletedProperties)
65408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_parsedProperties[i - deletedProperties] = m_parsedProperties[i];
65418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_numParsedProperties -= deletedProperties;
65448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebKitCSSKeyframeRule* CSSParser::createKeyframeRule(CSSParserValueList* keys)
65478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a key string from the passed keys
65498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String keyString;
65508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < keys->size(); ++i) {
65518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float key = (float) keys->valueAt(i)->fValue;
65528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i != 0)
65538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            keyString += ",";
65548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyString += String::number(key);
65558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyString += "%";
65568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6557e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
65588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebKitCSSKeyframeRule> keyframe = WebKitCSSKeyframeRule::create(m_styleSheet);
65598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    keyframe->setKeyText(keyString);
65608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    keyframe->setDeclaration(CSSMutableStyleDeclaration::create(0, m_parsedProperties, m_numParsedProperties));
6561e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
65628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
65638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSKeyframeRule* keyframePtr = keyframe.get();
65658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(keyframe.release());
65668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return keyframePtr;
65678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6569d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid CSSParser::invalidBlockHit()
6570d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6571d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (m_styleSheet && !m_hadSyntacticallyValidCSSRule)
6572d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_styleSheet->setHasSyntacticallyValidCSSHeader(false);
6573d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6574d0825bca7fe65beaee391d30da42e937db621564Steve Block
65755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::updateLastSelectorLineAndPosition()
65765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
6577e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_lastSelectorLineNumber = m_lineNumber;
65785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    markRuleBodyStart();
65795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
65805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
6581a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid CSSParser::markSelectorListStart()
6582a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
6583a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_selectorListRange.start = yytext - m_data;
6584a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
6585a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6586a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid CSSParser::markSelectorListEnd()
6587a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
6588a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_currentRuleData)
6589a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
6590a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    UChar* listEnd = yytext;
6591a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (listEnd > m_data + 1) {
6592a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (isHTMLSpace(*(listEnd - 1)))
6593a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            --listEnd;
6594a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        else
6595a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
6596a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
6597a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_selectorListRange.end = listEnd - m_data;
6598a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
6599a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
66005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::markRuleBodyStart()
66015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
66025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned offset = yytext - m_data;
660368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (*yytext == '{')
660468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ++offset; // Skip the rule body opening brace.
6605a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (offset > m_ruleBodyRange.start)
6606a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_ruleBodyRange.start = offset;
66074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_inStyleRuleOrDeclaration = true;
66085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
66095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
66105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::markRuleBodyEnd()
66115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
66125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned offset = yytext - m_data;
6613a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (offset > m_ruleBodyRange.end)
6614a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_ruleBodyRange.end = offset;
66155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
66165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
661768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::markPropertyStart()
661868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
66194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_inStyleRuleOrDeclaration)
66204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
6621a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_propertyRange.start = yytext - m_data;
662268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
662368513a70bcd92384395513322f1b801e7bf9c729Steve Block
662468513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::markPropertyEnd(bool isImportantFound, bool isPropertyParsed)
662568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
66264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_inStyleRuleOrDeclaration)
66274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
662868513a70bcd92384395513322f1b801e7bf9c729Steve Block    unsigned offset = yytext - m_data;
662968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (*yytext == ';') // Include semicolon into the property text.
663068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ++offset;
6631a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_propertyRange.end = offset;
6632a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_propertyRange.start != UINT_MAX && m_currentRuleData) {
663368513a70bcd92384395513322f1b801e7bf9c729Steve Block        // This stuff is only executed when the style data retrieval is requested by client.
6634a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        const unsigned start = m_propertyRange.start;
6635a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        const unsigned end = m_propertyRange.end;
663668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ASSERT(start < end);
663768513a70bcd92384395513322f1b801e7bf9c729Steve Block        String propertyString = String(m_data + start, end - start).stripWhiteSpace();
663868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (propertyString.endsWith(";", true))
663968513a70bcd92384395513322f1b801e7bf9c729Steve Block            propertyString = propertyString.left(propertyString.length() - 1);
664068513a70bcd92384395513322f1b801e7bf9c729Steve Block        Vector<String> propertyComponents;
664168513a70bcd92384395513322f1b801e7bf9c729Steve Block        size_t colonIndex = propertyString.find(":");
664268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ASSERT(colonIndex != notFound);
664368513a70bcd92384395513322f1b801e7bf9c729Steve Block
664468513a70bcd92384395513322f1b801e7bf9c729Steve Block        String name = propertyString.left(colonIndex).stripWhiteSpace();
664568513a70bcd92384395513322f1b801e7bf9c729Steve Block        String value = propertyString.substring(colonIndex + 1, propertyString.length()).stripWhiteSpace();
664668513a70bcd92384395513322f1b801e7bf9c729Steve Block        // The property range is relative to the declaration start offset.
6647a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->propertyData.append(
6648a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            CSSPropertySourceData(name, value, isImportantFound, isPropertyParsed, SourceRange(start - m_ruleBodyRange.start, end - m_ruleBodyRange.start)));
664968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
665068513a70bcd92384395513322f1b801e7bf9c729Steve Block    resetPropertyMarks();
665168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
665268513a70bcd92384395513322f1b801e7bf9c729Steve Block
66538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int cssPropertyID(const UChar* propertyName, unsigned length)
66548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length)
66568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
66578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length > maxCSSPropertyNameLength)
66588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
66598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buffer[maxCSSPropertyNameLength + 1 + 1]; // 1 to turn "apple"/"khtml" into "webkit", 1 for null character
66618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i != length; ++i) {
66638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar c = propertyName[i];
66648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (c == 0 || c >= 0x7F)
66658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0; // illegal character
66668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        buffer[i] = toASCIILower(c);
66678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffer[length] = '\0';
66698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name = buffer;
66718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (buffer[0] == '-') {
66720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        // If the prefix is -apple- or -khtml-, change it to -webkit-.
66730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        // This makes the string one character longer.
66740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        if (hasPrefix(buffer, length, "-apple-") || hasPrefix(buffer, length, "-khtml-")) {
66758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memmove(buffer + 7, buffer + 6, length + 1 - 6);
66768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memcpy(buffer, "-webkit", 7);
66778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++length;
66780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        }
66790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
66800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        if (hasPrefix(buffer, length, "-webkit")) {
668128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (!strcmp(buffer, "-webkit-box-sizing")) {
668228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                // -webkit-box-sizing worked in Safari 4 and earlier.
668328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const char* const boxSizing = "box-sizing";
668428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                name = boxSizing;
668528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                length = strlen(boxSizing);
668628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            } else if (!strcmp(buffer, "-webkit-opacity")) {
66870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // Honor -webkit-opacity as a synonym for opacity.
66880617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // This was the only syntax that worked in Safari 1.1, and may be in use on some websites and widgets.
66890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                const char* const opacity = "opacity";
66900617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                name = opacity;
66910617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                length = strlen(opacity);
669281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(IOS)
669381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            } else if (!strcmp(buffer, "-webkit-hyphenate-locale")) {
669481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // Worked in iOS 4.2.
669581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                const char* const webkitLocale = "-webkit-locale";
669681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                name = webkitLocale;
669781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                length = strlen(webkitLocale);
669881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
66990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            } else if (hasPrefix(buffer + 7, length - 7, "-border-")) {
67000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // -webkit-border-*-*-radius worked in Safari 4 and earlier. -webkit-border-radius syntax
67010617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // differs from border-radius, so it is remains as a distinct property.
67020617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                if (!strcmp(buffer + 15, "top-left-radius")
67030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "top-right-radius")
67040617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "bottom-right-radius")
67050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "bottom-left-radius")) {
67060617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    name = buffer + 8;
67070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    length -= 8;
67080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                }
67090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
67108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
67118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6713545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const Property* hashTableEntry = findProperty(name, length);
67148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hashTableEntry ? hashTableEntry->id : 0;
67158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssPropertyID(const String& string)
67188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cssPropertyID(string.characters(), string.length());
67208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssPropertyID(const CSSParserString& string)
67238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cssPropertyID(string.characters, string.length);
67258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssValueKeywordID(const CSSParserString& string)
67288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned length = string.length;
67308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length)
67318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
67328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length > maxCSSValueKeywordLength)
67338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
67348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buffer[maxCSSValueKeywordLength + 1 + 1]; // 1 to turn "apple"/"khtml" into "webkit", 1 for null character
67368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i != length; ++i) {
67388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar c = string.characters[i];
67398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (c == 0 || c >= 0x7F)
67408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0; // illegal character
67418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        buffer[i] = WTF::toASCIILower(c);
67428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffer[length] = '\0';
67448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (buffer[0] == '-') {
67468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the prefix is -apple- or -khtml-, change it to -webkit-.
67478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This makes the string one character longer.
67488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hasPrefix(buffer, length, "-apple-") || hasPrefix(buffer, length, "-khtml-")) {
67498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memmove(buffer + 7, buffer + 6, length + 1 - 6);
67508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memcpy(buffer, "-webkit", 7);
67518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++length;
67528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
67538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6755545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const Value* hashTableEntry = findValue(buffer, length);
67568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hashTableEntry ? hashTableEntry->id : 0;
67578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// "ident" from the CSS tokenizer, minus backslash-escape sequences
6760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isCSSTokenizerIdentifier(const String& string)
6761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* p = string.characters();
6763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* end = p + string.length();
6764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // -?
6766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (p != end && p[0] == '-')
6767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ++p;
6768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // {nmstart}
6770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (p == end || !(p[0] == '_' || p[0] >= 128 || isASCIIAlpha(p[0])))
6771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
6772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ++p;
6773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // {nmchar}*
6775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; p != end; ++p) {
6776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!(p[0] == '_' || p[0] == '-' || p[0] >= 128 || isASCIIAlphanumeric(p[0])))
6777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
6778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
6781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// "url" from the CSS tokenizer, minus backslash-escape sequences
6784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isCSSTokenizerURL(const String& string)
6785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* p = string.characters();
6787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* end = p + string.length();
6788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; p != end; ++p) {
6790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar c = p[0];
6791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (c) {
6792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '!':
6793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '#':
6794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '$':
6795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '%':
6796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '&':
6797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                break;
6798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            default:
6799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c < '*')
6800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return false;
6801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c <= '~')
6802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    break;
6803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c < 128)
6804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return false;
6805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
6809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// We use single quotes for now because markup.cpp uses double quotes.
6812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSString(const String& string)
6813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // For efficiency, we first pre-calculate the length of the quoted string, then we build the actual one.
6815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Please see below for the actual logic.
6816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned quotedStringSize = 2; // Two quotes surrounding the entire string.
6817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool afterEscape = false;
6818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < string.length(); ++i) {
6819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar ch = string[i];
6820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ch == '\\' || ch == '\'') {
6821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 2;
6822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (ch < 0x20 || ch == 0x7F) {
6824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 2 + (ch >= 0x10);
6825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = true;
6826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
6827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 1 + (afterEscape && (isASCIIHexDigit(ch) || ch == ' '));
6828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StringBuffer buffer(quotedStringSize);
6833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned index = 0;
6834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    buffer[index++] = '\'';
6835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    afterEscape = false;
6836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < string.length(); ++i) {
6837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar ch = string[i];
6838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ch == '\\' || ch == '\'') {
6839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = '\\';
6840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = ch;
6841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (ch < 0x20 || ch == 0x7F) { // Control characters.
6843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = '\\';
68442bde8e466a4451c7319e3a072d118917957d6554Steve Block            placeByteAsHexCompressIfPossible(ch, buffer, index, Lowercase);
6845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = true;
6846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
6847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Space character may be required to separate backslash-escape sequence and normal characters.
6848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (afterEscape && (isASCIIHexDigit(ch) || ch == ' '))
6849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                buffer[index++] = ' ';
6850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = ch;
6851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    buffer[index++] = '\'';
6855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(quotedStringSize == index);
6857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return String::adopt(buffer);
6858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSStringIfNeeded(const String& string)
6861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return isCSSTokenizerIdentifier(string) ? string : quoteCSSString(string);
6863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSURLIfNeeded(const String& string)
6866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return isCSSTokenizerURL(string) ? string : quoteCSSString(string);
6868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6870cad810f21b803229eb11403f9209855525a25d57Steve Blockbool isValidNthToken(const CSSParserString& token)
6871cad810f21b803229eb11403f9209855525a25d57Steve Block{
6872cad810f21b803229eb11403f9209855525a25d57Steve Block    // The tokenizer checks for the construct of an+b.
6873cad810f21b803229eb11403f9209855525a25d57Steve Block    // nth can also accept "odd" or "even" but should not accept any other token.
6874cad810f21b803229eb11403f9209855525a25d57Steve Block    return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even");
6875cad810f21b803229eb11403f9209855525a25d57Steve Block}
6876cad810f21b803229eb11403f9209855525a25d57Steve Block
68778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_DECL int CSSParser::lex()
68788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define yyconst const
68798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef int yy_state_type;
68808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef unsigned YY_CHAR;
68818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The following line makes sure we treat non-Latin-1 Unicode characters correctly.
68828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_SC_TO_UI(c) (c > 0xff ? 0xff : c)
68838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_DO_BEFORE_ACTION \
68848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yytext = yy_bp; \
68858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yyleng = (int) (yy_cp - yy_bp); \
68868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yy_hold_char = *yy_cp; \
68878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *yy_cp = 0; \
68888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yy_c_buf_p = yy_cp;
68898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_BREAK break;
68908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ECHO
68918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_RULE_SETUP
68928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define INITIAL 0
68938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
68948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define yyterminate() yyTok = END_TOKEN; return yyTok
68958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_FATAL_ERROR(a)
68968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The following line is needed to build the tokenizer with a condition stack.
68978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The macro is used in the tokenizer grammar with lines containing
68988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// BEGIN(mediaqueries) and BEGIN(initial). yy_start acts as index to
68998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// tokenizer transition table, and 'mediaqueries' and 'initial' are
69008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// offset multipliers that specify which transitions are active
69018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// in the tokenizer during in each condition (tokenizer state).
69028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BEGIN yy_start = 1 + 2 *
69038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "tokenizer.cpp"
69058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6907