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
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9721939df44de1705786c545cd1bf519d47250322dBen Murdochstatic const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX;
982bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const double MAX_SCALE = 1000000;
9921939df44de1705786c545cd1bf519d47250322dBen Murdoch
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool equal(const CSSParserString& a, const char* b)
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < a.length; ++i) {
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b[i])
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a.characters[i] != b[i])
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !b[a.length];
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool equalIgnoringCase(const CSSParserString& a, const char* b)
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < a.length; ++i) {
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b[i])
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!isASCIIUpper(b[i]));
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (toASCIILower(a.characters[i]) != b[i])
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !b[a.length];
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool hasPrefix(const char* string, unsigned length, const char* prefix)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < length; ++i) {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!prefix[i])
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (string[i] != prefix[i])
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParser::CSSParser(bool strictParsing)
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_strict(strictParsing)
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_important(false)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_id(0)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_styleSheet(0)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_valueList(0)
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_parsedProperties(static_cast<CSSProperty**>(fastMalloc(32 * sizeof(CSSProperty*))))
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_numParsedProperties(0)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_maxParsedProperties(32)
14321939df44de1705786c545cd1bf519d47250322dBen Murdoch    , m_numParsedPropertiesBeforeMarginBox(INVALID_NUM_PARSED_PROPERTIES)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_inParseShorthand(0)
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_currentShorthand(0)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_implicitShorthand(false)
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hasFontFaceOnlyValues(false)
148d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_hadSyntacticallyValidCSSRule(false)
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_defaultNamespace(starAtom)
1504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    , m_inStyleRuleOrDeclaration(false)
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_selectorListRange(0, 0)
152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_ruleBodyRange(0, 0)
153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_propertyRange(UINT_MAX, UINT_MAX)
15468513a70bcd92384395513322f1b801e7bf9c729Steve Block    , m_ruleRangeMap(0)
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_currentRuleData(0)
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_data(0)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , yy_start(1)
158e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    , m_lineNumber(0)
159e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    , m_lastSelectorLineNumber(0)
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_allowImportRules(true)
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_allowNamespaceDeclarations(true)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if YYDEBUG > 0
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyydebug = 1;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
16668513a70bcd92384395513322f1b801e7bf9c729Steve Block    CSSPropertySourceData::init();
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParser::~CSSParser()
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_parsedProperties);
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_valueList;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_data);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    fastDeleteAllValues(m_floatingSelectors);
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block    deleteAllValues(m_floatingSelectorVectors);
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_floatingValueLists);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_floatingFunctions);
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParserString::lower()
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: If we need Unicode lowercasing here, then we probably want the real kind
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that can potentially change the length of the string rather than the character
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by character kind. If we don't need Unicode lowercasing, it would be good to
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // simplify this function.
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (charactersAreAllASCII(characters, length)) {
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fast case for all-ASCII.
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < length; i++)
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            characters[i] = toASCIILower(characters[i]);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < length; i++)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            characters[i] = Unicode::toLower(characters[i]);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::setupParser(const char* prefix, const String& string, const char* suffix)
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = string.length() + strlen(prefix) + strlen(suffix) + 2;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fastFree(m_data);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data = static_cast<UChar*>(fastMalloc(length * sizeof(UChar)));
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < strlen(prefix); i++)
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data[i] = prefix[i];
209e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    memcpy(m_data + strlen(prefix), string.characters(), string.length() * sizeof(UChar));
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned start = strlen(prefix) + string.length();
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned end = start + strlen(suffix);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = start; i < end; i++)
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data[i] = suffix[i - start];
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data[length - 1] = 0;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data[length - 2] = 0;
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yy_hold_char = 0;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yyleng = 0;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yytext = yy_c_buf_p = m_data;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    yy_hold_char = *yy_c_buf_p;
2245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    resetRuleBodyMarks();
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::parseSheet(CSSStyleSheet* sheet, const String& string, int startLineNumber, StyleRuleRangeMap* ruleRangeMap)
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_defaultNamespace = starAtom; // Reset the default namespace.
23168513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_ruleRangeMap = ruleRangeMap;
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (ruleRangeMap) {
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = CSSRuleSourceData::create();
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
236e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
237e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_lineNumber = startLineNumber;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("", string, "");
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
24068513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_ruleRangeMap = 0;
241a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_currentRuleData = 0;
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSRule> CSSParser::parseRule(CSSStyleSheet* sheet, const String& string)
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_allowNamespaceDeclarations = false;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-rule{", string, "} ");
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_rule.release();
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSRule> CSSParser::parseKeyframeRule(CSSStyleSheet *sheet, const String &string)
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
25681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(sheet);
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-keyframe-rule{ ", string, "} ");
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_keyframe.release();
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool isColorPropertyID(int propertyId)
2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (propertyId) {
2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyColor:
2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundColor:
2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderBottomColor:
2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderLeftColor:
2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderRightColor:
2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderTopColor:
2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOutlineColor:
2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextLineThroughColor:
2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextOverlineColor:
2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextUnderlineColor:
2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderAfterColor:
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderBeforeColor:
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitColumnRuleColor:
2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextEmphasisColor:
2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextFillColor:
2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitTextStrokeColor:
2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    default:
2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool parseColorValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!string.length())
2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!isColorPropertyID(propertyId))
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSParserString cssString;
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cssString.characters = const_cast<UChar*>(string.characters());
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cssString.length = string.length();
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int valueID = cssValueKeywordID(cssString);
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool validPrimitive = false;
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (valueID == CSSValueWebkitText)
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else if (valueID == CSSValueCurrentcolor)
3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else if ((valueID >= CSSValueAqua && valueID <= CSSValueWindowtext) || valueID == CSSValueMenu
3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch             || (valueID >= CSSValueWebkitFocusRingColor && valueID < CSSValueWebkitText && !strict)) {
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        validPrimitive = true;
3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSStyleSheet* stylesheet = static_cast<CSSStyleSheet*>(declaration->stylesheet());
3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!stylesheet || !stylesheet->document())
3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (validPrimitive) {
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createIdentifierValue(valueID), important);
3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        declaration->addParsedProperty(property);
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RGBA32 color;
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!CSSParser::parseColor(string, color, strict && string[0] != '#'))
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createColorValue(color), important);
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    declaration->addParsedProperty(property);
3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool isSimpleLengthPropertyID(int propertyId, bool& acceptsNegativeNumbers)
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (propertyId) {
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyFontSize:
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyHeight:
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWidth:
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMinHeight:
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMinWidth:
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingBottom:
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingLeft:
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingRight:
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyPaddingTop:
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitLogicalWidth:
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitLogicalHeight:
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMinLogicalWidth:
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMinLogicalHeight:
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingAfter:
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingBefore:
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingEnd:
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitPaddingStart:
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        acceptsNegativeNumbers = false;
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBottom:
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyLeft:
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginBottom:
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginLeft:
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginRight:
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyMarginTop:
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyRight:
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTextIndent:
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyTop:
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginAfter:
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginBefore:
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginEnd:
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMarginStart:
3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        acceptsNegativeNumbers = true;
3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    default:
3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool parseSimpleLengthValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    const UChar* characters = string.characters();
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    unsigned length = string.length();
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!characters || !length)
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool acceptsNegativeNumbers;
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!isSimpleLengthPropertyID(propertyId, acceptsNegativeNumbers))
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSPrimitiveValue::UnitTypes unit = CSSPrimitiveValue::CSS_NUMBER;
3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (length > 2 && characters[length - 2] == 'p' && characters[length - 1] == 'x') {
3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        length -= 2;
3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PX;
3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    } else if (length > 1 && characters[length - 1] == '%') {
3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        length -= 1;
3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PERCENTAGE;
3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // We rely on charactersToDouble for validation as well. The function
3872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // will set "ok" to "false" if the entire passed-in character range does
3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // not represent a double.
3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool ok;
3902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    double number = charactersToDouble(characters, length, &ok);
3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!ok)
3922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
3932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (unit == CSSPrimitiveValue::CSS_NUMBER) {
3942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (number && strict)
3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return false;
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        unit = CSSPrimitiveValue::CSS_PX;
3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (number < 0 && !acceptsNegativeNumbers)
3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSStyleSheet* stylesheet = static_cast<CSSStyleSheet*>(declaration->stylesheet());
4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!stylesheet || !stylesheet->document())
4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSProperty property(propertyId, stylesheet->document()->cssPrimitiveValueCache()->createValue(number, unit), important);
4052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    declaration->addParsedProperty(property);
4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool CSSParser::parseValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important, bool strict)
4102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
4112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (parseSimpleLengthValue(declaration, propertyId, string, important, strict))
4122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
4132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (parseColorValue(declaration, propertyId, string, important, strict))
4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CSSParser parser(strict);
4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return parser.parseValue(declaration, propertyId, string, important);
4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool CSSParser::parseValue(CSSMutableStyleDeclaration* declaration, int propertyId, const String& string, bool important)
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-value{", string, "} ");
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_id = propertyId;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_important = important;
428e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
430e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasFontFaceOnlyValues)
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        deleteFontFaceOnlyValues();
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties) {
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        declaration->addParsedProperties(m_parsedProperties, m_numParsedProperties);
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clearProperties();
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// color will only be changed when string contains a valid css color, making it
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// possible to set up a default color.
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(RGBA32& color, const String& string, bool strict)
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
449f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // First try creating a color specified by name, rgba(), rgb() or "#" syntax.
450e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (parseColor(string, color, strict))
451e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return true;
452e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser parser(true);
454e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RefPtr<CSSMutableStyleDeclaration> dummyStyleDeclaration = CSSMutableStyleDeclaration::create();
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
456e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // Now try to create a color from rgba() syntax.
457e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!parser.parseColor(dummyStyleDeclaration.get(), string))
458e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return false;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
460e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CSSValue* value = parser.m_parsedProperties[0]->value();
4612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (value->cssValueType() != CSSValue::CSS_PRIMITIVE_VALUE)
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
4652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_RGBCOLOR)
4662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    color = primitiveValue->getRGBA32Value();
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(CSSMutableStyleDeclaration* declaration, const String& string)
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
47581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-decls{color:", string, "} ");
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (m_numParsedProperties && m_parsedProperties[0]->m_id == CSSPropertyColor);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4842fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool CSSParser::parseSystemColor(RGBA32& color, const String& string, Document* document)
4852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!document || !document->page())
4872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserString cssColor;
4902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    cssColor.characters = const_cast<UChar*>(string.characters());
4912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    cssColor.length = string.length();
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int id = cssValueKeywordID(cssColor);
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (id <= 0)
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    color = document->page()->theme()->systemColor(id).rgb();
4972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
4982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
500635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSParser::parseSelector(const String& string, Document* doc, CSSSelectorList& selectorList)
5011e6338658628fcabd955cf65687a30976c7893ceSteve Block{
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSStyleSheet> dummyStyleSheet = CSSStyleSheet::create(doc);
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(dummyStyleSheet.get());
505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_selectorListForParseSelector = &selectorList;
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-selector{", string, "}");
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_selectorListForParseSelector = 0;
5126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
5136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // The style sheet will be deleted right away, so it won't outlive the document.
5146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ASSERT(dummyStyleSheet->hasOneRef());
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
517a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool CSSParser::parseDeclaration(CSSMutableStyleDeclaration* declaration, const String& string, RefPtr<CSSStyleSourceData>* styleSourceData)
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51968513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Length of the "@-webkit-decls{" prefix.
52068513a70bcd92384395513322f1b801e7bf9c729Steve Block    static const unsigned prefixLength = 15;
52168513a70bcd92384395513322f1b801e7bf9c729Steve Block
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!declaration->stylesheet() || declaration->stylesheet()->isCSSStyleSheet());
52381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setStyleSheet(static_cast<CSSStyleSheet*>(declaration->stylesheet()));
524a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (styleSourceData) {
525a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = CSSRuleSourceData::create();
526a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
5274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_inStyleRuleOrDeclaration = true;
528a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setupParser("@-webkit-decls{", string, "} ");
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_rule = 0;
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasFontFaceOnlyValues)
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        deleteFontFaceOnlyValues();
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties) {
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        declaration->addParsedProperties(m_parsedProperties, m_numParsedProperties);
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clearProperties();
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
543a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_currentRuleData) {
544a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->styleBodyRange.start = 0;
545a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->styleBodyRange.end = string.length();
546a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (Vector<CSSPropertySourceData>::iterator it = m_currentRuleData->styleSourceData->propertyData.begin(), endIt = m_currentRuleData->styleSourceData->propertyData.end(); it != endIt; ++it) {
54768513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*it).range.start -= prefixLength;
54868513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*it).range.end -= prefixLength;
54968513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
55068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
55168513a70bcd92384395513322f1b801e7bf9c729Steve Block
552a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (styleSourceData) {
553a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        *styleSourceData = m_currentRuleData->styleSourceData.release();
554a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData = 0;
5554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_inStyleRuleOrDeclaration = false;
556a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseMediaQuery(MediaList* queries, const String& string)
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (string.isEmpty())
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(!m_mediaQuery);
5665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // can't use { because tokenizer state switches from mediaquery to initial state when it sees { token.
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // instead insert one " " (which is WHITESPACE in CSSGrammar.y)
5690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setupParser("@-webkit-mediaquery ", string, "} ");
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cssyyparse(this);
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok = false;
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_mediaQuery) {
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ok = true;
5755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        queries->appendMediaQuery(m_mediaQuery.release());
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ok;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addProperty(int propId, PassRefPtr<CSSValue> value, bool important)
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    OwnPtr<CSSProperty> prop(new CSSProperty(propId, value, important, m_currentShorthand, m_implicitShorthand));
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_numParsedProperties >= m_maxParsedProperties) {
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_maxParsedProperties += 32;
5878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (m_maxParsedProperties > UINT_MAX / sizeof(CSSProperty*))
5888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parsedProperties = static_cast<CSSProperty**>(fastRealloc(m_parsedProperties,
590e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_maxParsedProperties * sizeof(CSSProperty*)));
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
592e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_parsedProperties[m_numParsedProperties++] = prop.leakPtr();
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::rollbackLastProperties(int num)
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(num >= 0);
5988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(m_numParsedProperties >= static_cast<unsigned>(num));
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < num; ++i)
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_parsedProperties[--m_numParsedProperties];
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::clearProperties()
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; i++)
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_parsedProperties[i];
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_numParsedProperties = 0;
60921939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasFontFaceOnlyValues = false;
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
61381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid CSSParser::setStyleSheet(CSSStyleSheet* styleSheet)
61481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
61581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_styleSheet = styleSheet;
61681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_primitiveValueCache = document() ? document()->cssPrimitiveValueCache() : CSSPrimitiveValueCache::create();
61781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocument* CSSParser::document() const
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    StyleBase* root = m_styleSheet;
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (root && root->parent())
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        root = root->parent();
6245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!root)
6255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return 0;
6265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!root->isCSSStyleSheet())
6275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return 0;
6285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return static_cast<CSSStyleSheet*>(root)->document();
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict)
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool b = false;
6340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (value->unit) {
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_NUMBER:
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FNumber);
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b && ((unitflags & (FLength | FAngle | FTime)) && (value->fValue == 0 || !strict))) {
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value->unit = (unitflags & FLength) ? CSSPrimitiveValue::CSS_PX :
639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                          ((unitflags & FAngle) ? CSSPrimitiveValue::CSS_DEG : CSSPrimitiveValue::CSS_MS);
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            b = true;
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b && (unitflags & FInteger) && value->isInt)
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            b = true;
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PERCENTAGE:
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FPercent);
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSParserValue::Q_EMS:
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_EMS:
6500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPrimitiveValue::CSS_REMS:
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_EXS:
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PX:
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_CM:
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_MM:
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_IN:
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PT:
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_PC:
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FLength);
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_MS:
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_S:
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FTime);
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_DEG:
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_RAD:
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_GRAD:
667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPrimitiveValue::CSS_TURN:
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        b = (unitflags & FAngle);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_HZ:
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_KHZ:
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPrimitiveValue::CSS_DIMENSION:
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
676cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (b && unitflags & FNonNeg && value->fValue < 0)
677cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        b = false;
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return b;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int unitFromString(CSSParserValue* value)
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSPrimitiveValue::CSS_IDENT || value->id)
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "em"))
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_EMS;
6880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (equal(value->string, "rem"))
6890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return CSSPrimitiveValue::CSS_REMS;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "ex"))
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_EXS;
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "px"))
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PX;
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "cm"))
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_CM;
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "mm"))
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_MM;
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "in"))
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_IN;
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "pt"))
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PT;
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "pc"))
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_PC;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "deg"))
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_DEG;
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "rad"))
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_RAD;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "grad"))
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_GRAD;
710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (equal(value->string, "turn"))
711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return CSSPrimitiveValue::CSS_TURN;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "ms"))
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_MS;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "s"))
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_S;
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "Hz"))
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_HZ;
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(value->string, "kHz"))
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSPrimitiveValue::CSS_KHZ;
720e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::checkForOrphanedUnits()
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_strict || inShorthand())
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
728e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* numericVal = 0;
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned size = m_valueList->size();
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < size; i++) {
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* value = m_valueList->valueAt(i);
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (numericVal) {
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Change the unit type of the numeric val to match.
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int unit = unitFromString(value);
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (unit) {
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                numericVal->unit = unit;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                numericVal = 0;
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Now delete the bogus unit value.
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->deleteValueAt(i);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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).
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size--;
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
750e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        numericVal = (value->unit == CSSPrimitiveValue::CSS_NUMBER) ? value : 0;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseValue(int propId, bool important)
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_valueList)
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
760cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* value = m_valueList->current();
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value)
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int id = value->id;
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In quirks mode, we will look for units that have been incorrectly separated from the number they belong to
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by a space.  We go ahead and associate the unit with the number even though it is invalid CSS.
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForOrphanedUnits();
770e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int num = inShorthand() ? 1 : m_valueList->size();
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueInherit) {
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1)
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, CSSInheritedValue::create(), important);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (id == CSSValueInitial) {
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1)
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, CSSInitialValue::createExplicit(), important);
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    bool validPrimitive = false;
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> parsedValue;
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (static_cast<CSSPropertyID>(propId)) {
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* The comment to the left defines all valid value of this properties as defined
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * in CSS 2, Appendix F. Property index
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* All the CSS properties are not supported by the renderer at the moment.
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * Note that all the CSS2 Aural properties are only checked, if CSS_AURAL is defined
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * (see parseAuralValues). As we don't support them at all this seems reasonable.
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79921939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertySize:                 // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
80021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return parseSize(propId, important);
80121939df44de1705786c545cd1bf519d47250322dBen Murdoch
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyQuotes:               // [<string> <string>]+ | none | inherit
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id)
8048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
80581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
80681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return parseQuotes(propId, important);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8082bde8e466a4451c7319e3a072d118917957d6554Steve Block    case CSSPropertyUnicodeBidi: // normal | embed | bidi-override | isolate | inherit
8092bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueNormal
8102bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueEmbed
8112bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueBidiOverride
8122bde8e466a4451c7319e3a072d118917957d6554Steve Block            || id == CSSValueWebkitIsolate)
8138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPosition:             // static | relative | absolute | fixed | inherit
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStatic ||
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRelative ||
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAbsolute ||
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueFixed)
8218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakAfter:     // auto | always | avoid | left | right | inherit
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakBefore:
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakAfter:
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakBefore:
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto ||
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAlways ||
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueAvoid ||
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueLeft ||
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRight)
8338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakInside:    // avoid | auto | inherit
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakInside:
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueAvoid)
8398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyEmptyCells:          // show | hide | inherit
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueShow ||
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueHide)
8458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyContent:              // [ <string> | <uri> | <counter> | attr(X) | open-quote |
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // close-quote | no-open-quote | no-close-quote ]+ | inherit
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseContent(propId, important);
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWhiteSpace:          // normal | pre | nowrap | inherit
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal ||
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePre ||
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePreWrap ||
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValuePreLine ||
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueNowrap)
8588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClip:                 // <shape> | auto | inherit
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
8638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit == CSSParserValue::Function)
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseShape(propId, important);
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Start of supported CSS properties with validation. This is needed for parseShorthand to work
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * correctly and allows optimization in WebCore::applyRule(..)
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCaptionSide:         // top | bottom | left | right | inherit
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight ||
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueTop || id == CSSValueBottom)
8748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderCollapse:      // collapse | separate | inherit
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueCollapse || id == CSSValueSeparate)
8798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVisibility:           // visible | hidden | collapse | inherit
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueHidden || id == CSSValueCollapse)
8848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflow: {
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ShorthandScope scope(this, propId);
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1 || !parseValue(CSSPropertyOverflowX, important))
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValue* value = m_parsedProperties[m_numParsedProperties - 1]->value();
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyOverflowY, value, important);
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflowX:
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOverflowY:           // visible | hidden | scroll | auto | marquee | overlay | inherit
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueHidden || id == CSSValueScroll || id == CSSValueAuto ||
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueOverlay || id == CSSValueWebkitMarquee)
8998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStylePosition:  // inside | outside | inherit
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueInside || id == CSSValueOutside)
9048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleType:
908d0825bca7fe65beaee391d30da42e937db621564Steve Block        // See section CSS_PROP_LIST_STYLE_TYPE of file CSSValueKeywords.in
909d0825bca7fe65beaee391d30da42e937db621564Steve Block        // for the list of supported list-style-types.
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueDisc && id <= CSSValueKatakanaIroha) || id == CSSValueNone)
9118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDisplay:
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // inline | block | list-item | run-in | inline-block | table |
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // inline-table | table-row-group | table-header-group | table-footer-group | table-row |
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // table-column-group | table-column | table-cell | table-caption | box | inline-box | none | inherit
918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ((id >= CSSValueInline && id <= CSSValueWapMarquee) || id == CSSValueNone)
920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueInline && id <= CSSValueWebkitInlineBox) || id == CSSValueNone)
922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
9238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDirection:            // ltr | rtl | inherit
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLtr || id == CSSValueRtl)
9288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextTransform:       // capitalize | uppercase | lowercase | none | inherit
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueCapitalize && id <= CSSValueLowercase) || id == CSSValueNone)
9338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFloat:                // left | right | none | inherit + center for buggy CSS
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight ||
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueNone || id == CSSValueCenter)
9398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClear:                // none | left | right | both | inherit
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueLeft ||
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             id == CSSValueRight|| id == CSSValueBoth)
9458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextAlign:
9492bde8e466a4451c7319e3a072d118917957d6554Steve Block        // left | right | center | justify | webkit_left | webkit_right | webkit_center | webkit_match_parent |
9502bde8e466a4451c7319e3a072d118917957d6554Steve Block        // start | end | <string> | inherit
9512bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((id >= CSSValueWebkitAuto && id <= CSSValueWebkitMatchParent) || id == CSSValueStart || id == CSSValueEnd
9522bde8e466a4451c7319e3a072d118917957d6554Steve Block             || value->unit == CSSPrimitiveValue::CSS_STRING)
9538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineStyle:        // (<border-style> except hidden) | auto | inherit
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || (id >= CSSValueInset && id <= CSSValueDouble))
9588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
959e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
960e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopStyle:     //// <border-style> | inherit
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightStyle:   //   Defined as:    none | hidden | dotted | dashed |
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomStyle:  //   solid | double | groove | ridge | inset | outset
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftStyle:
965967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartStyle:
966967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndStyle:
96768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeStyle:
96868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterStyle:
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleStyle:
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueNone && id <= CSSValueDouble)
9718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontWeight:  // normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontWeight(important);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderSpacing: {
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitBorderHorizontalSpacing,
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitBorderVerticalSpacing };
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 1) {
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyBorderSpacing);
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* value = m_parsedProperties[m_numParsedProperties-1]->value();
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (num == 2) {
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyBorderSpacing);
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderHorizontalSpacing:
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderVerticalSpacing:
9988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineColor:        // <color> | invert | inherit
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Outline color has "invert" as additional keyword.
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Also, we want to allow the special focus color even in strict parsing mode.
100306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueInvert || id == CSSValueWebkitFocusRingColor) {
10048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
1008967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBackgroundColor: // <color> | inherit
1009967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderTopColor: // <color> | inherit
1010967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderRightColor:
1011967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderBottomColor:
1012967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyBorderLeftColor:
1013967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
1014967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
101568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeColor:
101668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterColor:
1017967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyColor: // <color> | inherit
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughColor: // CSS3 text decoration colors
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineColor:
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineColor:
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleColor:
1022f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasisColor:
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextFillColor:
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeColor:
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText)
10268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true; // Always allow this, even when strict parsing is on,
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    // since we use this in our UA sheets.
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (id == CSSValueCurrentcolor)
10298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if ((id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu ||
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (id >= CSSValueWebkitFocusRingColor && id < CSSValueWebkitText && !m_strict)) {
10328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = parseColor();
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (parsedValue)
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCursor: {
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [<uri>,]*  [ auto | crosshair | default | pointer | progress | move | e-resize | ne-resize |
1042e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // nw-resize | n-resize | se-resize | sw-resize | s-resize | w-resize | ew-resize |
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | text | wait | help |
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // vertical-text | cell | context-menu | alias | copy | no-drop | not-allowed | -webkit-zoom-in
104506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // -webkit-zoom-out | all-scroll | -webkit-grab | -webkit-grabbing ] ] | inherit
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValueList> list;
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (value && value->unit == CSSPrimitiveValue::CSS_URI) {
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!list)
1049e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                list = CSSValueList::createCommaSeparated();
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            String uri = value->string;
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Vector<int> coords;
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (value && value->unit == CSSPrimitiveValue::CSS_NUMBER) {
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                coords.append(int(value->fValue));
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = m_valueList->next();
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1057545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            IntPoint hotSpot(-1, -1);
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int nrcoords = coords.size();
10590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (nrcoords > 0 && nrcoords != 2)
10600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
10610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (nrcoords == 2)
1062545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                hotSpot = IntPoint(coords[0], coords[1]);
1063e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
10640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!uri.isNull() && m_styleSheet) {
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // FIXME: The completeURL call should be done when using the CSSCursorImageValue,
10660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // not when creating it.
1067545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                list->append(CSSCursorImageValue::create(m_styleSheet->completeURL(uri), hotSpot));
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
10690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((m_strict && !value) || (value && !(value->unit == CSSParserValue::Operator && value->iValue == ',')))
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next(); // comma
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list) {
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!value) { // no value after url list (MSIE 5 compatibility)
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (list->length() != 1)
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (!m_strict && value->id == CSSValueHand) // MSIE 5 compatibility :/
107981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(CSSValuePointer));
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (value && ((value->id >= CSSValueAuto && value->id <= CSSValueWebkitGrabbing) || value->id == CSSValueCopy || value->id == CSSValueNone))
108181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(value->id));
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = list.release();
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id = value->id;
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_strict && value->id == CSSValueHand) { // MSIE 5 compatibility :/
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id = CSSValuePointer;
10898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if ((value->id >= CSSValueAuto && value->id <= CSSValueWebkitGrabbing) || value->id == CSSValueCopy || value->id == CSSValueNone)
10918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundAttachment:
10960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBackgroundClip:
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundClip:
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundComposite:
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundImage:
11000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBackgroundOrigin:
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBackgroundOrigin:
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPosition:
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPositionX:
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundPositionY:
1105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundSize:
1106cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    case CSSPropertyWebkitBackgroundSize:
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackgroundRepeat:
1108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundRepeatX:
1109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyBackgroundRepeatY:
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskAttachment:
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskClip:
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskComposite:
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskImage:
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskOrigin:
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPosition:
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPositionX:
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskPositionY:
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskSize:
1119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeat:
1120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeatX:
1121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitMaskRepeatY: {
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val1;
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val2;
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int propId1, propId2;
1125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool result = false;
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parseFillProperty(propId, propId1, propId2, val1, val2)) {
1127cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            OwnPtr<ShorthandScope> shorthandScope;
1128cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if (propId == CSSPropertyBackgroundPosition ||
1129cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyBackgroundRepeat ||
1130cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyWebkitMaskPosition ||
1131cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                propId == CSSPropertyWebkitMaskRepeat) {
1132cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                shorthandScope.set(new ShorthandScope(this, propId));
1133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            }
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId1, val1.release(), important);
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val2)
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId2, val2.release(), important);
1137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            result = true;
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = false;
1140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return result;
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleImage:     // <uri> | none | inherit
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone) {
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = CSSImageValue::create();
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_URI) {
11470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (m_styleSheet) {
11480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // FIXME: The completeURL call should be done when using the CSSImageValue,
11490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // not when creating it.
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                parsedValue = CSSImageValue::create(m_styleSheet->completeURL(value->string));
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1153cad810f21b803229eb11403f9209855525a25d57Steve Block        } else if (isGeneratedImageValue(value)) {
1154cad810f21b803229eb11403f9209855525a25d57Steve Block            if (parseGeneratedImage(parsedValue))
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeWidth:
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineWidth:        // <border-width> | inherit
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopWidth:     //// <border-width> | inherit
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightWidth:   //   Which is defined as
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomWidth:  //   thin | medium | thick | <length>
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftWidth:
1167967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartWidth:
1168967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndWidth:
116968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeWidth:
117068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterWidth:
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleWidth:
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
11738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
1175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLetterSpacing:       // normal | <length> | inherit
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordSpacing:         // normal | <length> | inherit
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
11818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
11838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength, m_strict);
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordBreak:          // normal | break-all | break-word (this is a custom extension)
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueBreakAll || id == CSSValueBreakWord)
11888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordWrap:           // normal | break-word
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueBreakWord)
11938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1195a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CSSPropertySpeak:           // none | normal | spell-out | digits | literal-punctuation | no-punctuation | inherit
1196a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (id == CSSValueNone || id == CSSValueNormal || id == CSSValueSpellOut || id == CSSValueDigits
1197a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            || id == CSSValueLiteralPunctuation || id == CSSValueNoPunctuation)
1198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            validPrimitive = true;
1199a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        break;
1200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextIndent:          // <length> | <percentage> | inherit
120206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
120306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
120406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingTop:          //// <padding-width> | inherit
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingRight:        //   Which is defined as
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingBottom:       //   <length> | <percentage>
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingLeft:         ////
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitPaddingStart:
1210e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    case CSSPropertyWebkitPaddingEnd:
121168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingBefore:
121268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingAfter:
121306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxHeight:           // <length> | <percentage> | none | inherit
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxWidth:            // <length> | <percentage> | none | inherit
121868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalWidth:
121968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalHeight:
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueIntrinsic || id == CSSValueMinIntrinsic) {
12218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinHeight:           // <length> | <percentage> | inherit
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinWidth:            // <length> | <percentage> | inherit
122768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalWidth:
122868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalHeight:
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic)
12308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontSize:
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueXxSmall && id <= CSSValueLarger)
12388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (validUnit(value, FLength | FPercent | FNonNeg, m_strict));
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStyle:           // normal | italic | oblique | inherit
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontStyle(important);
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontVariant:         // normal | small-caps | inherit
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontVariant(important);
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVerticalAlign:
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // baseline | sub | super | top | text-top | middle | bottom | text-bottom |
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <percentage> | <length> | inherit
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueBaseline && id <= CSSValueWebkitBaselineMiddle)
12548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyHeight:               // <length> | <percentage> | auto | inherit
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidth:                // <length> | <percentage> | auto | inherit
126168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalWidth:
126268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalHeight:
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueIntrinsic || id == CSSValueMinIntrinsic)
12648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ### handle multilength case where we allow relative units
12678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            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 CSSPropertyBottom:               // <length> | <percentage> | auto | inherit
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLeft:                 // <length> | <percentage> | auto | inherit
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyRight:                // <length> | <percentage> | auto | inherit
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTop:                  // <length> | <percentage> | auto | inherit
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginTop:           //// <margin-width> | inherit
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginRight:         //   Which is defined as
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginBottom:        //   <length> | <percentage> | auto | inherit
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginLeft:          ////
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginStart:
1279e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    case CSSPropertyWebkitMarginEnd:
128068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginBefore:
128168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginAfter:
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
12838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
12858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FLength | FPercent, m_strict));
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZIndex:              // auto | <integer> | inherit
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto) {
12908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOrphans:              // <integer> | inherit
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidows:               // <integer> | inherit
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ### not supported later on
12978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = (!id && validUnit(value, FInteger, false));
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLineHeight:          // normal | <number> | <length> | <percentage> | inherit
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
13028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FNumber | FLength | FPercent | FNonNeg, m_strict));
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterIncrement:    // [ <identifier> <integer>? ]+ | none | inherit
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSValueNone)
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseCounter(propId, 1, important);
13098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = true;
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     case CSSPropertyCounterReset:        // [ <identifier> <integer>? ]+ | none | inherit
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSValueNone)
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseCounter(propId, 0, important);
13148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = true;
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontFamily:
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [[ <family-name> | <generic-family> ],]* [<family-name> | <generic-family>] | inherit
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parsedValue = parseFontFamily();
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextDecoration:
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextDecorationsInEffect:
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // none | [ underline || overline || line-through || blink ] | inherit
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone) {
13278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
13290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
13308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            bool isValid = true;
13318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            while (isValid && value) {
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (value->id) {
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBlink:
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueUnderline:
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueOverline:
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLineThrough:
133881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    list->append(primitiveValueCache()->createIdentifierValue(value->id));
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
13418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    isValid = false;
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = m_valueList->next();
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (list->length() && isValid) {
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = list.release();
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyZoom:          // normal | reset | document | <number> | <percentage> | inherit
1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueReset || id == CSSValueDocument)
13548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
13568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = (!id && validUnit(value, FNumber | FPercent | FNonNeg, true));
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1358e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTableLayout:         // auto | fixed | inherit
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueFixed)
13618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontFaceSrc();
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyUnicodeRange:
13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseFontFaceUnicodeRange();
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* CSS3 properties */
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAppearance:
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id >= CSSValueCheckbox && id <= CSSValueTextarea) || id == CSSValueNone)
13738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderImage:
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskBoxImage:
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
13798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSValue> result;
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (parseBorderImage(propId, important, result)) {
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId, result, important);
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
13880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopRightRadius:
13890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopLeftRadius:
13900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomLeftRadius:
13910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomRightRadius: {
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num != 1 && num != 2)
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
13945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        validPrimitive = validUnit(value, FLength | FPercent, m_strict);
13958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!validPrimitive)
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
139781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> parsedValue1 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue2;
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 2) {
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
14015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (!validPrimitive)
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
140481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue2 = parsedValue1;
14070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<Pair> pair = Pair::create(parsedValue1.release(), parsedValue2.release());
140981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> val = primitiveValueCache()->createValue(pair.release());
14100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        addProperty(propId, val.release(), important);
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderRadius:
14140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitBorderRadius:
14150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return parseBorderRadius(propId, important);
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineOffset:
14175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
1420cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSPropertyBoxShadow:
1421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitBoxShadow:
14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
14238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseShadow(propId, important);
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxReflect:
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
14298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseReflect(propId, important);
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOpacity:
14348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FNumber, m_strict);
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxAlign:
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStretch || id == CSSValueStart || id == CSSValueEnd ||
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueCenter || id == CSSValueBaseline)
14398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxDirection:
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueReverse)
14438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxLines:
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueSingle || id == CSSValueMultiple)
14478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrient:
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueHorizontal || id == CSSValueVertical ||
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueInlineAxis || id == CSSValueBlockAxis)
14528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxPack:
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueStart || id == CSSValueEnd ||
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueCenter || id == CSSValueJustify)
14578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlex:
14608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FNumber, m_strict);
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlexGroup:
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrdinalGroup:
14648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FInteger | FNonNeg, true);
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
146628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case CSSPropertyBoxSizing:
14678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = id == CSSValueBorderBox || id == CSSValueContentBox;
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case CSSPropertyWebkitColorCorrection:
14708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = id == CSSValueSrgb || id == CSSValueDefault;
1471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarquee: {
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[5] = { CSSPropertyWebkitMarqueeDirection, CSSPropertyWebkitMarqueeIncrement,
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitMarqueeRepetition,
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitMarqueeStyle, CSSPropertyWebkitMarqueeSpeed };
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 5, important);
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeDirection:
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueForwards || id == CSSValueBackwards || id == CSSValueAhead ||
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueReverse || id == CSSValueLeft || id == CSSValueRight || id == CSSValueDown ||
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueUp || id == CSSValueAuto)
14828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeIncrement:
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueSmall || id == CSSValueLarge || id == CSSValueMedium)
14868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength | FPercent, m_strict);
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeStyle:
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueSlide || id == CSSValueScroll || id == CSSValueAlternate)
14928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeRepetition:
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueInfinite)
14968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
14988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FInteger | FNonNeg, m_strict);
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeSpeed:
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueSlow || id == CSSValueFast)
15028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
15048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FTime | FInteger | FNonNeg, m_strict);
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1506231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
1507231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeDir:
1508231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueLtr || id == CSSValueRtl)
15098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1510231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1511231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeStyle:
1512231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueNone || id == CSSValueSlide || id == CSSValueScroll || id == CSSValueAlternate)
15138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1514231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1515231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeLoop:
1516231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueInfinite)
15178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1518231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else
15198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FInteger | FNonNeg, m_strict);
1520231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1521231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeSpeed:
1522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueNormal || id == CSSValueSlow || id == CSSValueFast)
15238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1524231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else
15258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FTime | FInteger | FNonNeg, m_strict);
1526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1527231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserDrag: // auto | none | element
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueElement)
15308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserModify: // read-only | read-write
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueReadOnly || id == CSSValueReadWrite || id == CSSValueReadWritePlaintextOnly)
15348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitUserSelect: // auto | none | text
15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueText)
15388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverflow: // clip | ellipsis
15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueClip || id == CSSValueEllipsis)
15428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransform:
15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone)
15468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> val = parseTransform();
15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val) {
15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId, val, important);
15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOrigin:
15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginX:
15588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginY:
15598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginZ: {
15608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val1;
15618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val2;
15628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<CSSValue> val3;
15638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int propId1, propId2, propId3;
15648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (parseTransformOrigin(propId, propId1, propId2, propId3, val1, val2, val3)) {
15658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            addProperty(propId1, val1.release(), important);
15668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (val2)
15678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                addProperty(propId2, val2.release(), important);
15688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (val3)
15698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                addProperty(propId3, val3.release(), important);
15708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return true;
15718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
15728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return false;
15738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
15748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformStyle:
15758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (value->id == CSSValueFlat || value->id == CSSValuePreserve3d)
15768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
15788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitBackfaceVisibility:
15798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (value->id == CSSValueVisible || value->id == CSSValueHidden)
15808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
15828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspective:
15838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (id == CSSValueNone)
15848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
15858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else {
15860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Accepting valueless numbers is a quirk of the -webkit prefixed version of the property.
15878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (validUnit(value, FNumber | FLength | FNonNeg, m_strict)) {
158881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                RefPtr<CSSValue> val = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
15898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (val) {
15908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    addProperty(propId, val.release(), important);
15918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return true;
15928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
15938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return false;
15948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
15958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
15968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
15978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOrigin:
15988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginX:
15998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginY: {
16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val1;
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val2;
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int propId1, propId2;
16038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (parsePerspectiveOrigin(propId, propId1, propId2, val1, val2)) {
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId1, val1.release(), important);
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val2)
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addProperty(propId2, val2.release(), important);
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDelay:
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDirection:
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDuration:
1614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSPropertyWebkitAnimationFillMode:
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationName:
16160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitAnimationPlayState:
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationIterationCount:
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationTimingFunction:
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDelay:
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDuration:
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionTimingFunction:
16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionProperty: {
16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> val;
16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parseAnimationProperty(propId, val)) {
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, val.release(), important);
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginCollapse: {
1631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const int properties[2] = { CSSPropertyWebkitMarginBeforeCollapse,
1632bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            CSSPropertyWebkitMarginAfterCollapse };
16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (num == 1) {
16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse);
16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* value = m_parsedProperties[m_numParsedProperties-1]->value();
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (num == 2) {
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse);
16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginBeforeCollapse:
1650bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginAfterCollapse:
16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginTopCollapse:
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginBottomCollapse:
16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueCollapse || id == CSSValueSeparate || id == CSSValueDiscard)
16548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughMode:
16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineMode:
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineMode:
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueContinuous || id == CSSValueSkipWhiteSpace)
16608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughStyle:
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineStyle:
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineStyle:
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueSolid || id == CSSValueDouble ||
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueDashed || id == CSSValueDotDash || id == CSSValueDotDotDash ||
16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueWave)
16688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1670231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyTextRendering: // auto | optimizeSpeed | optimizeLegibility | geometricPrecision
1671231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueOptimizelegibility
1672231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            || id == CSSValueGeometricprecision)
16738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughWidth:
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineWidth:
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineWidth:
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNormal || id == CSSValueThin ||
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            id == CSSValueMedium || id == CSSValueThick)
16808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
16828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = !id && validUnit(value, FNumber | FLength | FPercent, m_strict);
16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyResize: // none | both | horizontal | vertical | auto
16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || id == CSSValueBoth || id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValueAuto)
16868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnCount:
16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
16908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
16928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = !id && validUnit(value, FInteger | FNonNeg, false);
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnGap:         // normal | <length>
16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal)
16968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
16988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1700e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitColumnSpan:        // all | 1
1701e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (id == CSSValueAll)
1702e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            validPrimitive = true;
1703e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        else
1704e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            validPrimitive = validUnit(value, FNumber | FNonNeg, m_strict) && value->fValue == 1;
1705e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnWidth:         // auto | <length>
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto)
17088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
17108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = validUnit(value, FLength, true);
17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyPointerEvents:
1713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // none | visiblePainted | visibleFill | visibleStroke | visible |
1714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // painted | fill | stroke | auto | all | inherit
1715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (id == CSSValueVisible || id == CSSValueNone || id == CSSValueAll || id == CSSValueAuto ||
1716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            (id >= CSSValueVisiblepainted && id <= CSSValueStroke))
17178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        break;
1719e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // End of CSS3 properties
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apple specific properties.  These will never be standardized and are purely to
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // support custom WebKit-based Apple applications.
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineClamp:
1725643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // When specifying number of lines, don't allow 0 as a valid value
1726643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // When specifying either type of unit, require non-negative integers
17278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTAGE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg, false));
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSizeAdjust:
17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueAuto || id == CSSValueNone)
17318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitRtlOrdering:
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLogical || id == CSSValueVisual)
17358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1737e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitFontSizeDelta:           // <length>
17398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        validPrimitive = validUnit(value, FLength, m_strict);
17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitNbspMode:     // normal | space
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueSpace)
17448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineBreak:   // normal | after-white-space
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueAfterWhiteSpace)
17498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMatchNearestMailBlockquoteColor:   // normal | match
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNormal || id == CSSValueMatch)
17548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitHighlight:
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueNone || value->unit == CSSPrimitiveValue::CSS_STRING)
17598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1761e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
176206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphens:
176306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueNone || id == CSSValueManual || id == CSSValueAuto)
176406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            validPrimitive = true;
176506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
176606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
176706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphenateCharacter:
176806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING)
176906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            validPrimitive = true;
177006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
177106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
177281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitBefore:
177381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitAfter:
177481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (id == CSSValueAuto || validUnit(value, FInteger | FNonNeg, true))
177581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            validPrimitive = true;
177681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
177781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
177881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitLocale:
1779dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING)
1780dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            validPrimitive = true;
1781dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        break;
1782dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderFit:
17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueBorder || id == CSSValueLines)
17858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1787e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSecurity:
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // disc | circle | square | none | inherit
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueDisc || id == CSSValueCircle || id == CSSValueSquare|| id == CSSValueNone)
17918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1794231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitFontSmoothing:
1795e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (id == CSSValueAuto || id == CSSValueNone
1796231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            || id == CSSValueAntialiased || id == CSSValueSubpixelAntialiased)
17978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
1798231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
1799231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1801e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitDashboardRegion: // <dashboard-region> | <dashboard-region>
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit == CSSParserValue::Function || id == CSSValueNone)
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseDashboardRegions(propId, important);
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // End Apple-specific properties
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* shorthand properties */
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackground: {
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Position must come before color in this array because a plain old "0" is a legal color
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // in quirks mode but it's usually the X coordinate of a position.
1812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // FIXME: Add CSSPropertyBackgroundSize to the shorthand.
1813e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        const int properties[] = { CSSPropertyBackgroundImage, CSSPropertyBackgroundRepeat,
1814e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                                   CSSPropertyBackgroundAttachment, CSSPropertyBackgroundPosition, CSSPropertyBackgroundOrigin,
18152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                                   CSSPropertyBackgroundClip, CSSPropertyBackgroundColor };
18162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return parseFillShorthand(propId, properties, 7, important);
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMask: {
1819e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        const int properties[] = { CSSPropertyWebkitMaskImage, CSSPropertyWebkitMaskRepeat,
18200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                   CSSPropertyWebkitMaskAttachment, CSSPropertyWebkitMaskPosition,
18212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                                   CSSPropertyWebkitMaskOrigin, CSSPropertyWebkitMaskClip };
18222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return parseFillShorthand(propId, properties, 6, important);
18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorder:
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-width' || 'border-style' || <color> ] | inherit
18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderWidth, CSSPropertyBorderStyle,
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderColor };
18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTop:
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-top-width' || 'border-style' || <color> ] | inherit
18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderTopWidth, CSSPropertyBorderTopStyle,
18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderTopColor};
18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRight:
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-right-width' || 'border-style' || <color> ] | inherit
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderRightWidth, CSSPropertyBorderRightStyle,
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderRightColor };
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottom:
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-bottom-width' || 'border-style' || <color> ] | inherit
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderBottomWidth, CSSPropertyBorderBottomStyle,
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomColor };
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeft:
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'border-left-width' || 'border-style' || <color> ] | inherit
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyBorderLeftWidth, CSSPropertyBorderLeftStyle,
18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderLeftColor };
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1859967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStart:
1860967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    {
1861967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        const int properties[3] = { CSSPropertyWebkitBorderStartWidth, CSSPropertyWebkitBorderStartStyle,
1862967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CSSPropertyWebkitBorderStartColor };
1863967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return parseShorthand(propId, properties, 3, important);
1864967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
1865967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEnd:
1866967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    {
1867967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        const int properties[3] = { CSSPropertyWebkitBorderEndWidth, CSSPropertyWebkitBorderEndStyle,
1868967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CSSPropertyWebkitBorderEndColor };
1869967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return parseShorthand(propId, properties, 3, important);
1870967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
187168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBefore:
187268513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
187368513a70bcd92384395513322f1b801e7bf9c729Steve Block        const int properties[3] = { CSSPropertyWebkitBorderBeforeWidth, CSSPropertyWebkitBorderBeforeStyle,
187468513a70bcd92384395513322f1b801e7bf9c729Steve Block            CSSPropertyWebkitBorderBeforeColor };
187568513a70bcd92384395513322f1b801e7bf9c729Steve Block        return parseShorthand(propId, properties, 3, important);
187668513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
187768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfter:
187868513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
187968513a70bcd92384395513322f1b801e7bf9c729Steve Block        const int properties[3] = { CSSPropertyWebkitBorderAfterWidth, CSSPropertyWebkitBorderAfterStyle,
188068513a70bcd92384395513322f1b801e7bf9c729Steve Block            CSSPropertyWebkitBorderAfterColor };
188168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return parseShorthand(propId, properties, 3, important);
188268513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutline:
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ 'outline-color' || 'outline-style' || 'outline-width' ] | inherit
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyOutlineWidth, CSSPropertyOutlineStyle,
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyOutlineColor };
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderColor:
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <color>{1,4} | inherit
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor,
18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderWidth:
18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <border-width>{1,4} | inherit
18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth,
19018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderStyle:
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <border-style>{1,4} | inherit
19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle,
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMargin:
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <margin-width>{1,4} | inherit
19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight,
19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyMarginBottom, CSSPropertyMarginLeft };
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPadding:
19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // <padding-width>{1,4} | inherit
19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight,
19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parse4Values(propId, properties, important);
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFont:
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [ [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]?
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 'font-family' ] | caption | icon | menu | message-box | small-caption | status-bar | inherit
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id >= CSSValueCaption && id <= CSSValueStatusBar)
19298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            validPrimitive = true;
19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return parseFont(important);
19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyle:
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyListStyleType, CSSPropertyListStylePosition,
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyListStyleImage };
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumns: {
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitColumnWidth, CSSPropertyWebkitColumnCount };
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 2, important);
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRule: {
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[3] = { CSSPropertyWebkitColumnRuleWidth, CSSPropertyWebkitColumnRuleStyle,
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                    CSSPropertyWebkitColumnRuleColor };
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 3, important);
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStroke: {
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int properties[2] = { CSSPropertyWebkitTextStrokeWidth, CSSPropertyWebkitTextStrokeColor };
19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseShorthand(propId, properties, 2, important);
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimation:
19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseAnimationShorthand(important);
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransition:
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseTransitionShorthand(important);
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyInvalid:
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPage:
195921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return parsePage(propId, important);
196021939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyFontStretch:
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThrough:
19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverline:
19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderline:
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
196521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
196621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputFormat:
196721939df44de1705786c545cd1bf519d47250322dBen Murdoch        validPrimitive = true;
196821939df44de1705786c545cd1bf519d47250322dBen Murdoch        break;
196921939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputRequired:
197021939df44de1705786c545cd1bf519d47250322dBen Murdoch        parsedValue = parseWCSSInputProperty();
197157a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        break;
197257a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif
197357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
19748de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    // CSS Text Layout Module Level 3: Vertical writing support
19758de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    case CSSPropertyWebkitWritingMode:
1976a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (id >= CSSValueHorizontalTb && id <= CSSValueHorizontalBt)
19778de7ac488df2f39f82e56811541f4847b3f2e952Steve Block            validPrimitive = true;
19788de7ac488df2f39f82e56811541f4847b3f2e952Steve Block        break;
19798de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
1980a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    case CSSPropertyWebkitTextCombine:
1981f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (id == CSSValueNone || id == CSSValueHorizontal)
1982f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            validPrimitive = true;
1983f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        break;
1984f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1985f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasis: {
1986f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        const int properties[] = { CSSPropertyWebkitTextEmphasisStyle, CSSPropertyWebkitTextEmphasisColor };
1987f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return parseShorthand(propId, properties, WTF_ARRAY_LENGTH(properties), important);
1988f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
1989f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1990f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasisPosition:
1991f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (id == CSSValueOver || id == CSSValueUnder)
1992a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu            validPrimitive = true;
1993a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        break;
1994a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu
1995e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisStyle:
1996e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return parseTextEmphasisStyle(important);
1997e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
199874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextOrientation:
199974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        // FIXME: For now just support upright and vertical-right.
200074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (id == CSSValueVerticalRight || id == CSSValueUpright)
200174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            validPrimitive = true;
200274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        break;
200374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
200474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitLineBoxContain:
200574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (id == CSSValueNone)
200674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            validPrimitive = true;
200774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else
200874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return parseLineBoxContain(important);
200974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        break;
201074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
201157a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
201257a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    case CSSPropertyWebkitTapHighlightColor:
201357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        parsedValue = parseColor();
201457a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        if (parsedValue)
201557a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch            m_valueList->next();
20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseSVGValue(propId, important);
20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validPrimitive) {
20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != 0)
202781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createIdentifierValue(id);
20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit == CSSPrimitiveValue::CSS_STRING)
202981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->string, (CSSPrimitiveValue::UnitTypes) value->unit);
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ)
203181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
20320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (value->unit >= CSSPrimitiveValue::CSS_TURN && value->unit <= CSSPrimitiveValue::CSS_REMS)
203381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (value->unit >= CSSParserValue::Q_EMS)
20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parsedValue = CSSQuirkPrimitiveValue::create(value->fValue, CSSPrimitiveValue::CSS_EMS);
20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parsedValue) {
20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_valueList->current() || inShorthand()) {
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, parsedValue.release(), important);
20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
204721939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
204821939df44de1705786c545cd1bf519d47250322dBen MurdochPassRefPtr<CSSValue> CSSParser::parseWCSSInputProperty()
204921939df44de1705786c545cd1bf519d47250322dBen Murdoch{
205021939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<CSSValue> parsedValue = 0;
205121939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
205221939df44de1705786c545cd1bf519d47250322dBen Murdoch    String inputProperty;
205321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value->unit == CSSPrimitiveValue::CSS_STRING || value->unit == CSSPrimitiveValue::CSS_IDENT)
205421939df44de1705786c545cd1bf519d47250322dBen Murdoch        inputProperty = String(value->string);
205521939df44de1705786c545cd1bf519d47250322dBen Murdoch
205621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!inputProperty.isEmpty())
205781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch       parsedValue = primitiveValueCache()->createValue(inputProperty, CSSPrimitiveValue::CSS_STRING);
205821939df44de1705786c545cd1bf519d47250322dBen Murdoch
205921939df44de1705786c545cd1bf519d47250322dBen Murdoch    while (m_valueList->next()) {
2060e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // pass all other values, if any. If we don't do this,
2061e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // the parser will think that it's not done and won't process this property
206221939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
206321939df44de1705786c545cd1bf519d47250322dBen Murdoch
206421939df44de1705786c545cd1bf519d47250322dBen Murdoch    return parsedValue;
206521939df44de1705786c545cd1bf519d47250322dBen Murdoch}
206621939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
206721939df44de1705786c545cd1bf519d47250322dBen Murdoch
20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addFillValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval)
20698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lval) {
20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (lval->isValueList())
20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static_cast<CSSValueList*>(lval.get())->append(rval);
20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> oldlVal(lval.release());
20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(oldlVal);
20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(rval);
20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lval = list;
20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lval = rval;
20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool parseBackgroundClip(CSSParserValue* parserValue, RefPtr<CSSValue>& cssValue, CSSPrimitiveValueCache* primitiveValueCache)
2086cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2087ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (parserValue->id == CSSValueBorderBox || parserValue->id == CSSValuePaddingBox
2088ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || parserValue->id == CSSValueContentBox || parserValue->id == CSSValueWebkitText) {
208981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cssValue = primitiveValueCache->createIdentifierValue(parserValue->id);
2090cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return true;
2091cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
2092cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return false;
2093cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2094cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2095231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst int cMaxFillProperties = 9;
20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFillShorthand(int propId, const int* properties, int numProperties, bool important)
20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(numProperties <= cMaxFillProperties);
21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (numProperties > cMaxFillProperties)
21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[cMaxFillProperties] = { false };
21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[cMaxFillProperties];
21070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSValue> clipValue;
21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> positionYValue;
2109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RefPtr<CSSValue> repeatYValue;
21102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool foundClip = false;
21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (properties[i] == CSSPropertyBackgroundColor && parsedProperty[i])
21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Color is not allowed except as the last item in a list for backgrounds.
21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Reject the entire property.
21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i] && properties[i] != CSSPropertyBackgroundColor) {
21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addFillValue(values[i], CSSInitialValue::createImplicit());
21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addFillValue(positionYValue, CSSInitialValue::createImplicit());
2128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                        addFillValue(repeatYValue, CSSInitialValue::createImplicit());
21300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if ((properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) && !parsedProperty[i]) {
21310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        // If background-origin wasn't present, then reset background-clip also.
21320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        addFillValue(clipValue, CSSInitialValue::createImplicit());
21332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    }
21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2140e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val1;
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val2;
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int propId1, propId2;
2147cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                CSSParserValue* parserValue = m_valueList->current();
21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseFillProperty(properties[i], propId1, propId2, val1, val2)) {
21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addFillValue(values[i], val1.release());
21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addFillValue(positionYValue, val2.release());
2153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                        addFillValue(repeatYValue, val2.release());
21550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) {
21560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        // Reparse the value as a clip, and see if we succeed.
215781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        if (parseBackgroundClip(parserValue, val1, primitiveValueCache()))
21580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                            addFillValue(clipValue, val1.release()); // The property parsed successfully.
21590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        else
21600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                            addFillValue(clipValue, CSSInitialValue::createImplicit()); // Some value was used for origin that is not supported by clip. Just reset clip instead.
21610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    }
21622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    if (properties[i] == CSSPropertyBackgroundClip || properties[i] == CSSPropertyWebkitMaskClip) {
21632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        // Update clipValue
21642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        addFillValue(clipValue, val1.release());
21652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        foundClip = true;
21662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    }
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; ++i) {
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedProperty[i]) {
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addFillValue(values[i], CSSInitialValue::createImplicit());
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (properties[i] == CSSPropertyBackgroundPosition || properties[i] == CSSPropertyWebkitMaskPosition)
21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addFillValue(positionYValue, CSSInitialValue::createImplicit());
2183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (properties[i] == CSSPropertyBackgroundRepeat || properties[i] == CSSPropertyWebkitMaskRepeat)
2184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                addFillValue(repeatYValue, CSSInitialValue::createImplicit());
21850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if ((properties[i] == CSSPropertyBackgroundOrigin || properties[i] == CSSPropertyWebkitMaskOrigin) && !parsedProperty[i]) {
21860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // If background-origin wasn't present, then reset background-clip also.
21870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                addFillValue(clipValue, CSSInitialValue::createImplicit());
21880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2191e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++) {
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (properties[i] == CSSPropertyBackgroundPosition) {
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyBackgroundPositionX, values[i].release(), important);
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // it's OK to call positionYValue.release() since we only see CSSPropertyBackgroundPosition once
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyBackgroundPositionY, positionYValue.release(), important);
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (properties[i] == CSSPropertyWebkitMaskPosition) {
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyWebkitMaskPositionX, values[i].release(), important);
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // it's OK to call positionYValue.release() since we only see CSSPropertyWebkitMaskPosition once
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyWebkitMaskPositionY, positionYValue.release(), important);
2202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (properties[i] == CSSPropertyBackgroundRepeat) {
2203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyBackgroundRepeatX, values[i].release(), important);
2204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // it's OK to call repeatYValue.release() since we only see CSSPropertyBackgroundPosition once
2205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyBackgroundRepeatY, repeatYValue.release(), important);
2206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (properties[i] == CSSPropertyWebkitMaskRepeat) {
2207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyWebkitMaskRepeatX, values[i].release(), important);
2208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // it's OK to call repeatYValue.release() since we only see CSSPropertyBackgroundPosition once
2209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            addProperty(CSSPropertyWebkitMaskRepeatY, repeatYValue.release(), important);
22102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        } else if ((properties[i] == CSSPropertyBackgroundClip || properties[i] == CSSPropertyWebkitMaskClip) && !foundClip)
22112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // Value is already set while updating origin
22122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            continue;
22132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[i], values[i].release(), important);
2215e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Add in clip values when we hit the corresponding origin property.
22172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (properties[i] == CSSPropertyBackgroundOrigin && !foundClip)
22180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            addProperty(CSSPropertyBackgroundClip, clipValue.release(), important);
22192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else if (properties[i] == CSSPropertyWebkitMaskOrigin && !foundClip)
22200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            addProperty(CSSPropertyWebkitMaskClip, clipValue.release(), important);
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::addAnimationValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval)
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lval) {
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (lval->isValueList())
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static_cast<CSSValueList*>(lval.get())->append(rval);
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValue> oldVal(lval.release());
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PassRefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(oldVal);
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(rval);
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lval = list;
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lval = rval;
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseAnimationShorthand(bool important)
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int properties[] = {  CSSPropertyWebkitAnimationName,
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationDuration,
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationTimingFunction,
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationDelay,
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                CSSPropertyWebkitAnimationIterationCount,
2250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                CSSPropertyWebkitAnimationDirection,
2251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                CSSPropertyWebkitAnimationFillMode };
22524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const int numProperties = WTF_ARRAY_LENGTH(properties);
2253e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, CSSPropertyWebkitAnimation);
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[numProperties];
2258e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i])
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], CSSInitialValue::createImplicit());
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2273e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val;
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseAnimationProperty(properties[i], val)) {
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], val.release());
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2290e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; ++i) {
22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedProperty[i])
22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addAnimationValue(values[i], CSSInitialValue::createImplicit());
22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2296e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++)
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(properties[i], values[i].release(), important);
2300e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseTransitionShorthand(bool important)
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int properties[] = { CSSPropertyWebkitTransitionProperty,
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                               CSSPropertyWebkitTransitionDuration,
2308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                               CSSPropertyWebkitTransitionTimingFunction,
2309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                               CSSPropertyWebkitTransitionDelay };
23104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const int numProperties = WTF_ARRAY_LENGTH(properties);
2311e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, CSSPropertyWebkitTransition);
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> values[numProperties];
2316e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i;
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We hit the end.  Fill in all remaining values with the initial value.
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < numProperties; ++i) {
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedProperty[i])
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], CSSInitialValue::createImplicit());
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedProperty[i] = false;
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_valueList->current())
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2331e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool found = false;
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (i = 0; !found && i < numProperties; ++i) {
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedProperty[i]) {
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSValue> val;
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseAnimationProperty(properties[i], val)) {
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedProperty[i] = found = true;
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    addAnimationValue(values[i], val.release());
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2348e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
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    }
2354e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now add all of the properties we found.
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < numProperties; i++)
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(properties[i], values[i].release(), important);
2358e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShorthand(int propId, const int *properties, int numProperties, bool important)
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We try to match as many properties as possible
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We set up an array of booleans to mark which property has been found,
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and we try to search for properties until it makes no longer any sense.
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool found = false;
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool fnd[6]; // Trust me ;)
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < numProperties; i++)
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fnd[i] = false;
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (m_valueList->current()) {
23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        found = false;
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int propIndex = 0; !found && propIndex < numProperties; ++propIndex) {
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!fnd[propIndex]) {
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parseValue(properties[propIndex], important))
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fnd[propIndex] = found = true;
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we didn't find at least one match, this is an
23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // invalid shorthand and we have to ignore it
23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!found)
23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2388e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fill in any remaining properties with the initial value.
23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_implicitShorthand = true;
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < numProperties; ++i) {
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!fnd[i])
23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[i], CSSInitialValue::createImplicit(), important);
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_implicitShorthand = false;
23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parse4Values(int propId, const int *properties,  bool important)
24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* From the CSS 2 specs, 8.3
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * If there is only one value, it applies to all sides. If there are two values, the top and
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * bottom margins are set to the first value and the right and left margins are set to the second.
24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * second, and the bottom is set to the third. If there are four values, they apply to the top,
24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * right, bottom, and left, respectively.
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
2409e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int num = inShorthand() ? 1 : m_valueList->size();
2411e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ShorthandScope scope(this, propId);
24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the order is top, right, bottom, left
24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (num) {
24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 1: {
24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important))
24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-1]->value();
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[1], value, important);
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[2], value, important);
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 2: {
24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-2]->value();
24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[2], value, important);
24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_parsedProperties[m_numParsedProperties-2]->value();
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 3: {
24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) || !parseValue(properties[2], important))
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue *value = m_parsedProperties[m_numParsedProperties-2]->value();
24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = true;
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(properties[3], value, important);
24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_implicitShorthand = false;
24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case 4: {
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) ||
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                !parseValue(properties[2], important) || !parseValue(properties[3], important))
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: {
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2457e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
246121939df44de1705786c545cd1bf519d47250322dBen Murdoch// auto | <identifier>
246221939df44de1705786c545cd1bf519d47250322dBen Murdochbool CSSParser::parsePage(int propId, bool important)
246321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
246421939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(propId == CSSPropertyPage);
246521939df44de1705786c545cd1bf519d47250322dBen Murdoch
246621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (m_valueList->size() != 1)
246721939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
246821939df44de1705786c545cd1bf519d47250322dBen Murdoch
246921939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
247021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!value)
247121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
247221939df44de1705786c545cd1bf519d47250322dBen Murdoch
247321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value->id == CSSValueAuto) {
247481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createIdentifierValue(value->id), important);
247521939df44de1705786c545cd1bf519d47250322dBen Murdoch        return true;
247621939df44de1705786c545cd1bf519d47250322dBen Murdoch    } else if (value->id == 0 && value->unit == CSSPrimitiveValue::CSS_IDENT) {
247781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING), important);
247821939df44de1705786c545cd1bf519d47250322dBen Murdoch        return true;
247921939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
248021939df44de1705786c545cd1bf519d47250322dBen Murdoch    return false;
248121939df44de1705786c545cd1bf519d47250322dBen Murdoch}
248221939df44de1705786c545cd1bf519d47250322dBen Murdoch
248321939df44de1705786c545cd1bf519d47250322dBen Murdoch// <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
248421939df44de1705786c545cd1bf519d47250322dBen Murdochbool CSSParser::parseSize(int propId, bool important)
248521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
248621939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(propId == CSSPropertySize);
248721939df44de1705786c545cd1bf519d47250322dBen Murdoch
248821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (m_valueList->size() > 2)
248921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
249021939df44de1705786c545cd1bf519d47250322dBen Murdoch
249121939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSParserValue* value = m_valueList->current();
249221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!value)
249321939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
249421939df44de1705786c545cd1bf519d47250322dBen Murdoch
249521939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
249621939df44de1705786c545cd1bf519d47250322dBen Murdoch
249721939df44de1705786c545cd1bf519d47250322dBen Murdoch    // First parameter.
249821939df44de1705786c545cd1bf519d47250322dBen Murdoch    SizeParameterType paramType = parseSizeParameter(parsedValues.get(), value, None);
249921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (paramType == None)
250021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return false;
250121939df44de1705786c545cd1bf519d47250322dBen Murdoch
250221939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Second parameter, if any.
250321939df44de1705786c545cd1bf519d47250322dBen Murdoch    value = m_valueList->next();
250421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (value) {
250521939df44de1705786c545cd1bf519d47250322dBen Murdoch        paramType = parseSizeParameter(parsedValues.get(), value, paramType);
250621939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (paramType == None)
250721939df44de1705786c545cd1bf519d47250322dBen Murdoch            return false;
250821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
250921939df44de1705786c545cd1bf519d47250322dBen Murdoch
251021939df44de1705786c545cd1bf519d47250322dBen Murdoch    addProperty(propId, parsedValues.release(), important);
251121939df44de1705786c545cd1bf519d47250322dBen Murdoch    return true;
251221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
251321939df44de1705786c545cd1bf519d47250322dBen Murdoch
251421939df44de1705786c545cd1bf519d47250322dBen MurdochCSSParser::SizeParameterType CSSParser::parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType)
251521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
251621939df44de1705786c545cd1bf519d47250322dBen Murdoch    switch (value->id) {
251721939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueAuto:
251821939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None) {
251981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createIdentifierValue(value->id));
252021939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Auto;
252121939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
252221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
252321939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLandscape:
252421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValuePortrait:
252521939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None || prevParamType == PageSize) {
252681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createIdentifierValue(value->id));
252721939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Orientation;
252821939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
252921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
253021939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA3:
253121939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA4:
253221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueA5:
253321939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueB4:
253421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueB5:
253521939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLedger:
253621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLegal:
253721939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSValueLetter:
253821939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (prevParamType == None || prevParamType == Orientation) {
253921939df44de1705786c545cd1bf519d47250322dBen Murdoch            // Normalize to Page Size then Orientation order by prepending.
254006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // This is not specified by the CSS3 Paged Media specification, but for simpler processing later (CSSStyleSelector::applyPageSizeProperty).
254181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->prepend(primitiveValueCache()->createIdentifierValue(value->id));
254221939df44de1705786c545cd1bf519d47250322dBen Murdoch            return PageSize;
254321939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
254421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
254521939df44de1705786c545cd1bf519d47250322dBen Murdoch    case 0:
254606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (validUnit(value, FLength | FNonNeg, m_strict) && (prevParamType == None || prevParamType == Length)) {
254781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValues->append(primitiveValueCache()->createValue(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit)));
254821939df44de1705786c545cd1bf519d47250322dBen Murdoch            return Length;
254921939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
255021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
255121939df44de1705786c545cd1bf519d47250322dBen Murdoch    default:
255221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return None;
255321939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
255421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
255521939df44de1705786c545cd1bf519d47250322dBen Murdoch
255681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// [ <string> <string> ]+ | inherit | none
255781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// inherit and none are handled in parseValue.
255881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool CSSParser::parseQuotes(int propId, bool important)
255981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
256081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
256181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (CSSParserValue* val = m_valueList->current()) {
256281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSValue> parsedValue;
256381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (val->unit == CSSPrimitiveValue::CSS_STRING)
256481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = CSSPrimitiveValue::create(val->string, CSSPrimitiveValue::CSS_STRING);
256581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
256681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            break;
256781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        values->append(parsedValue.release());
256881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_valueList->next();
256981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
257081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (values->length()) {
257181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, values.release(), important);
257281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_valueList->next();
257381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
257481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
257581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
257681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
257781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ <string> | <uri> | <counter> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// in CSS 2.1 this got somewhat reduced:
25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ <string> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseContent(int propId, bool important)
25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (CSSParserValue* val = m_valueList->current()) {
25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> parsedValue;
25878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (val->unit == CSSPrimitiveValue::CSS_URI && m_styleSheet) {
25888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // url
25890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // FIXME: The completeURL call should be done when using the CSSImageValue,
25900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // not when creating it.
25910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            parsedValue = CSSImageValue::create(m_styleSheet->completeURL(val->string));
25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Function) {
25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // attr(X) | counter(X [,Y]) | counters(X, Y, [,Z]) | -webkit-gradient(...)
25945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            CSSParserValueList* args = val->function->args.get();
25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!args)
25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
25978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(val->function->name, "attr(")) {
25985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                parsedValue = parseAttr(args);
25995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!parsedValue)
26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (equalIgnoringCase(val->function->name, "counter(")) {
26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = parseCounterContent(args, false);
26035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!parsedValue)
26045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return false;
26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (equalIgnoringCase(val->function->name, "counters(")) {
26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedValue = parseCounterContent(args, true);
26078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!parsedValue)
26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
2609cad810f21b803229eb11403f9209855525a25d57Steve Block            } else if (isGeneratedImageValue(val)) {
2610cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!parseGeneratedImage(parsedValue))
26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
26128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSPrimitiveValue::CSS_IDENT) {
26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // open-quote
26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // close-quote
26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // no-open-quote
26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // no-close-quote
26196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // inherit
26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: These are not yet implemented (http://bugs.webkit.org/show_bug.cgi?id=6503).
26216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // none
26226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            // normal
26236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            switch (val->id) {
26246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueOpenQuote:
26256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueCloseQuote:
26266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNoOpenQuote:
26276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNoCloseQuote:
26286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNone:
26296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case CSSValueNormal:
263081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
26316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
26328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSPrimitiveValue::CSS_STRING) {
263381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue = primitiveValueCache()->createValue(val->string, CSSPrimitiveValue::CSS_STRING);
26348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
26368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values->append(parsedValue.release());
26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
26398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
26408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values->length()) {
26428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, values.release(), important);
26438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
26448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
26458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26505f1ab04193ad0130ca8204aadaceae083aca9881Feng QianPassRefPtr<CSSValue> CSSParser::parseAttr(CSSParserValueList* args)
26515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
26525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (args->size() != 1)
26535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
26545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
26555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CSSParserValue* a = args->current();
26565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
26575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (a->unit != CSSPrimitiveValue::CSS_IDENT)
26585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
26595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
26605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    String attrName = a->string;
26615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // CSS allows identifiers with "-" at the start, like "-webkit-mask-image".
26625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // But HTML attribute names can't have those characters, and we should not
26635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // even parse them inside attr().
26645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (attrName[0] == '-')
26655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return 0;
26665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (document() && document()->isHTMLDocument())
26685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        attrName = attrName.lower();
2669e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
267081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(attrName, CSSPrimitiveValue::CSS_ATTR);
26715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
26725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseBackgroundColor()
26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int id = m_valueList->current()->id;
26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu || id == CSSValueCurrentcolor ||
26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (id >= CSSValueGrey && id < CSSValueWebkitText && !m_strict))
267881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch       return primitiveValueCache()->createIdentifierValue(id);
26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return parseColor();
26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
26818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFillImage(RefPtr<CSSValue>& value)
26838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
26848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current()->id == CSSValueNone) {
26858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = CSSImageValue::create();
26868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
26878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
26888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current()->unit == CSSPrimitiveValue::CSS_URI) {
26890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: The completeURL call should be done when using the CSSImageValue,
26900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // not when creating it.
26910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (m_styleSheet)
26920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            value = CSSImageValue::create(m_styleSheet->completeURL(m_valueList->current()->string));
26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
26948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2696cad810f21b803229eb11403f9209855525a25d57Steve Block    if (isGeneratedImageValue(m_valueList->current()))
2697cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseGeneratedImage(value);
26980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
26998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27022bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionX(CSSParserValueList* valueList)
27032bde8e466a4451c7319e3a072d118917957d6554Steve Block{
27042bde8e466a4451c7319e3a072d118917957d6554Steve Block    int id = valueList->current()->id;
27052bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (id == CSSValueLeft || id == CSSValueRight || id == CSSValueCenter) {
27062bde8e466a4451c7319e3a072d118917957d6554Steve Block        int percent = 0;
27072bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueRight)
27082bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 100;
27092bde8e466a4451c7319e3a072d118917957d6554Steve Block        else if (id == CSSValueCenter)
27102bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 50;
27112bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
27122bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
27132bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict))
27142bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(valueList->current()->fValue,
27152bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
27162bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
27172bde8e466a4451c7319e3a072d118917957d6554Steve Block}
27182bde8e466a4451c7319e3a072d118917957d6554Steve Block
27192bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionY(CSSParserValueList* valueList)
27202bde8e466a4451c7319e3a072d118917957d6554Steve Block{
27212bde8e466a4451c7319e3a072d118917957d6554Steve Block    int id = valueList->current()->id;
27222bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (id == CSSValueTop || id == CSSValueBottom || id == CSSValueCenter) {
27232bde8e466a4451c7319e3a072d118917957d6554Steve Block        int percent = 0;
27242bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (id == CSSValueBottom)
27252bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 100;
27262bde8e466a4451c7319e3a072d118917957d6554Steve Block        else if (id == CSSValueCenter)
27272bde8e466a4451c7319e3a072d118917957d6554Steve Block            percent = 50;
27282bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
27292bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
27302bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict))
27312bde8e466a4451c7319e3a072d118917957d6554Steve Block        return primitiveValueCache()->createValue(valueList->current()->fValue,
27322bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
27332bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
27342bde8e466a4451c7319e3a072d118917957d6554Steve Block}
27352bde8e466a4451c7319e3a072d118917957d6554Steve Block
27362bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<CSSValue> CSSParser::parseFillPositionComponent(CSSParserValueList* valueList, unsigned& cumulativeFlags, FillPositionFlag& individualFlag)
27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2738cad810f21b803229eb11403f9209855525a25d57Steve Block    int id = valueList->current()->id;
27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (id == CSSValueLeft || id == CSSValueTop || id == CSSValueRight || id == CSSValueBottom || id == CSSValueCenter) {
27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int percent = 0;
27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueLeft || id == CSSValueRight) {
27422bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (cumulativeFlags & XFillPosition)
27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
27442bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= XFillPosition;
27452bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = XFillPosition;
27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueRight)
27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                percent = 100;
27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (id == CSSValueTop || id == CSSValueBottom) {
27502bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (cumulativeFlags & YFillPosition)
27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
27522bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= YFillPosition;
27532bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = YFillPosition;
27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueBottom)
27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                percent = 100;
27562bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (id == CSSValueCenter) {
27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Center is ambiguous, so we're not sure which position we've found yet, an x or a y.
27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            percent = 50;
27592bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= AmbiguousFillPosition;
27602bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = AmbiguousFillPosition;
27612bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
276281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
27642bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (validUnit(valueList->current(), FPercent | FLength, m_strict)) {
27652bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!cumulativeFlags) {
27662bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= XFillPosition;
27672bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = XFillPosition;
27682bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (cumulativeFlags & (XFillPosition | AmbiguousFillPosition)) {
27692bde8e466a4451c7319e3a072d118917957d6554Steve Block            cumulativeFlags |= YFillPosition;
27702bde8e466a4451c7319e3a072d118917957d6554Steve Block            individualFlag = YFillPosition;
27712bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else
27722bde8e466a4451c7319e3a072d118917957d6554Steve Block            return 0;
277381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(valueList->current()->fValue,
27742bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                  (CSSPrimitiveValue::UnitTypes)valueList->current()->unit);
27752bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
27768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
27778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2779cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid CSSParser::parseFillPosition(CSSParserValueList* valueList, RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2)
27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2781cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* value = valueList->current();
2782e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
27838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
27842bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned cumulativeFlags = 0;
27852bde8e466a4451c7319e3a072d118917957d6554Steve Block    FillPositionFlag value1Flag = InvalidFillPosition;
27862bde8e466a4451c7319e3a072d118917957d6554Steve Block    FillPositionFlag value2Flag = InvalidFillPosition;
27872bde8e466a4451c7319e3a072d118917957d6554Steve Block    value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag);
27888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value1)
27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2790e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
27938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value was explicitly specified for our property.
2794cad810f21b803229eb11403f9209855525a25d57Steve Block    value = valueList->next();
2795e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
27968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First check for the comma.  If so, we are finished parsing this value or value pair.
27978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
27988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = 0;
2799e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
28012bde8e466a4451c7319e3a072d118917957d6554Steve Block        value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Flag);
28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value2)
2803cad810f21b803229eb11403f9209855525a25d57Steve Block            valueList->next();
28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
28058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!inShorthand()) {
28068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value1.clear();
28078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
28088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
28108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2811e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value2)
28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // is simply 50%.  This is our default.
28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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).
28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // For left/right/center, the default of 50% in the y is still correct.
281781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createValue(50, CSSPrimitiveValue::CSS_PERCENTAGE);
28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28192bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (value1Flag == YFillPosition || value2Flag == XFillPosition)
28208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value1.swap(value2);
28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2823231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid CSSParser::parseFillRepeat(RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2)
2824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSParserValue* value = m_valueList->current();
2826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2827231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    int id = m_valueList->current()->id;
2828231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeatX) {
2829231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
283081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(CSSValueRepeat);
283181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(CSSValueNoRepeat);
2832231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2833231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2834e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
2835231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeatY) {
2836231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
283781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(CSSValueNoRepeat);
283881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(CSSValueRepeat);
2839231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2840e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
2841231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2842231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (id == CSSValueRepeat || id == CSSValueNoRepeat || id == CSSValueRound || id == CSSValueSpace)
284381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value1 = primitiveValueCache()->createIdentifierValue(id);
2844231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
2845231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        value1 = 0;
2846231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2847231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2848231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2849231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    value = m_valueList->next();
2850231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2851231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // First check for the comma.  If so, we are finished parsing this value or value pair.
2852231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
2853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        value = 0;
2854231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2855231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value)
2856231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        id = m_valueList->current()->id;
2857e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2858231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value && (id == CSSValueRepeat || id == CSSValueNoRepeat || id == CSSValueRound || id == CSSValueSpace)) {
285981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(id);
2860231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_valueList->next();
2861e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    } else {
2862231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If only one value was specified, value2 is the same as value1.
2863231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_implicitShorthand = true;
286481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value2 = primitiveValueCache()->createIdentifierValue(static_cast<CSSPrimitiveValue*>(value1.get())->getIdent());
2865231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2866231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2867231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2868cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockPassRefPtr<CSSValue> CSSParser::parseFillSize(int propId, bool& allowComma)
28698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2870231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    allowComma = true;
28718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
2872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2873231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value->id == CSSValueContain || value->id == CSSValueCover)
287481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
2875231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
28768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> parsedValue1;
2877cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueAuto)
287981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        parsedValue1 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
28818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!validUnit(value, FLength | FPercent, m_strict))
28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
288381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        parsedValue1 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
28848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2885cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2886cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    CSSPropertyID property = static_cast<CSSPropertyID>(propId);
2887cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RefPtr<CSSPrimitiveValue> parsedValue2;
28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((value = m_valueList->next())) {
28898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueAuto)
289081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
2891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (value->unit == CSSParserValue::Operator && value->iValue == ',')
2892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            allowComma = false;
28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
28948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (!validUnit(value, FLength | FPercent, m_strict))
28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
289681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2899cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!parsedValue2) {
2900cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (property == CSSPropertyWebkitBackgroundSize || property == CSSPropertyWebkitMaskSize)
2901cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            parsedValue2 = parsedValue1;
2902cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        else
290381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            parsedValue2 = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_UNKNOWN);
2904cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
2905cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
290681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(Pair::create(parsedValue1.release(), parsedValue2.release()));
29078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2909e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockbool CSSParser::parseFillProperty(int propId, int& propId1, int& propId2,
29108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  RefPtr<CSSValue>& retValue1, RefPtr<CSSValue>& retValue2)
29118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
29138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values2;
29148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
29158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value;
29168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value2;
2917e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
29188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowComma = false;
2919e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
29208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    retValue1 = retValue2 = 0;
29218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId1 = propId;
29228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId2 = propId;
29238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propId == CSSPropertyBackgroundPosition) {
29248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyBackgroundPositionX;
29258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyBackgroundPositionY;
29268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (propId == CSSPropertyWebkitMaskPosition) {
29278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyWebkitMaskPositionX;
29288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyWebkitMaskPositionY;
2929231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (propId == CSSPropertyBackgroundRepeat) {
2930231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId1 = CSSPropertyBackgroundRepeatX;
2931231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId2 = CSSPropertyBackgroundRepeatY;
2932231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (propId == CSSPropertyWebkitMaskRepeat) {
2933231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId1 = CSSPropertyWebkitMaskRepeatX;
2934231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        propId2 = CSSPropertyWebkitMaskRepeatY;
29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue;
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue2;
2940e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowComma) {
29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
29438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
29448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
29458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = false;
29468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
2947231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            allowComma = true;
29488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (propId) {
29498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundColor:
29508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseBackgroundColor();
29518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
29528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
29538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundAttachment:
29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskAttachment:
29560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (val->id == CSSValueScroll || val->id == CSSValueFixed || val->id == CSSValueLocal) {
295781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
29588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
29598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundImage:
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskImage:
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (parseFillImage(currValue))
29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundClip:
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundOrigin:
29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskClip:
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskOrigin:
29700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    // The first three values here are deprecated and do not apply to the version of the property that has
29710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    // the -webkit- prefix removed.
29728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    if (val->id == CSSValueBorder || val->id == CSSValuePadding || val->id == CSSValueContent ||
29730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        val->id == CSSValueBorderBox || val->id == CSSValuePaddingBox || val->id == CSSValueContentBox ||
29740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        ((propId == CSSPropertyWebkitBackgroundClip || propId == CSSPropertyWebkitMaskClip) &&
29750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                         (val->id == CSSValueText || val->id == CSSValueWebkitText))) {
297681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
29770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
29780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    }
29790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
29800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyBackgroundClip:
298181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    if (parseBackgroundClip(val, currValue, primitiveValueCache()))
29820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
29830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
29840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyBackgroundOrigin:
29850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (val->id == CSSValueBorderBox || val->id == CSSValuePaddingBox || val->id == CSSValueContentBox) {
298681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPosition:
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPosition:
2992cad810f21b803229eb11403f9209855525a25d57Steve Block                    parseFillPosition(m_valueList, currValue, currValue2);
29938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    // parseFillPosition advances the m_valueList pointer
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPositionX:
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPositionX: {
29972bde8e466a4451c7319e3a072d118917957d6554Steve Block                    currValue = parseFillPositionX(m_valueList);
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundPositionY:
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskPositionY: {
30042bde8e466a4451c7319e3a072d118917957d6554Steve Block                    currValue = parseFillPositionY(m_valueList);
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitBackgroundComposite:
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskComposite:
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if ((val->id >= CSSValueClear && val->id <= CSSValuePlusLighter) || val->id == CSSValueHighlight) {
301281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                        currValue = primitiveValueCache()->createIdentifierValue(val->id);
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyBackgroundRepeat:
30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitMaskRepeat:
3018231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    parseFillRepeat(currValue, currValue2);
3019231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    // parseFillRepeat advances the m_valueList pointer
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3021231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSPropertyBackgroundSize:
3022cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                case CSSPropertyWebkitBackgroundSize:
3023231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSPropertyWebkitMaskSize: {
3024cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    currValue = parseFillSize(propId, allowComma);
30258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3028231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                }
30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!currValue)
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3032e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value && !values) {
30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(value.release());
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3037e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value2 && !values2) {
30398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values2 = CSSValueList::createCommaSeparated();
30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values2->append(value2.release());
30418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3042e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (values)
30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(currValue.release());
30458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
30468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = currValue.release();
30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currValue2) {
30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (values2)
30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    values2->append(currValue2.release());
30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value2 = currValue2.release();
30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3054e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // When parsing any fill shorthand property, we let it handle building up the lists for all
30568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // properties.
30578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inShorthand())
30588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
30598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
30628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue1 = values.release();
30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values2 && values2->length())
30648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            retValue2 = values2.release();
30658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
30688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue1 = value.release();
30698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        retValue2 = value2.release();
30708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
30718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
30738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDelay()
30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
30788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (validUnit(value, FTime, m_strict))
307981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDirection()
30848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
30868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueNormal || value->id == CSSValueAlternate)
308781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
30888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
30898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationDuration()
30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
30948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validUnit(value, FTime | FNonNeg, m_strict))
309581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
30968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
30978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3099dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPassRefPtr<CSSValue> CSSParser::parseAnimationFillMode()
3100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
3101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CSSParserValue* value = m_valueList->current();
3102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (value->id == CSSValueNone || value->id == CSSValueForwards || value->id == CSSValueBackwards || value->id == CSSValueBoth)
310381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
3104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
3105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
3106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationIterationCount()
31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueInfinite)
311181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
31128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (validUnit(value, FInteger | FNonNeg, m_strict))
311381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes)value->unit);
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationName()
31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit == CSSPrimitiveValue::CSS_STRING || value->unit == CSSPrimitiveValue::CSS_IDENT) {
31218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueNone || (value->unit == CSSPrimitiveValue::CSS_STRING && equalIgnoringCase(value->string, "none"))) {
312281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return primitiveValueCache()->createIdentifierValue(CSSValueNone);
31238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
312481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING);
31258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<CSSValue> CSSParser::parseAnimationPlayState()
31310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
31320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSParserValue* value = m_valueList->current();
31330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (value->id == CSSValueRunning || value->id == CSSValuePaused)
313481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
31350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
31360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
31370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationProperty()
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSPrimitiveValue::CSS_IDENT)
31428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
31438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int result = cssPropertyID(value->string);
31448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result)
314581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(result);
31468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(value->string, "all"))
314781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(CSSValueAll);
31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(value->string, "none"))
314981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(CSSValueNone);
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangbool CSSParser::parseTransformOriginShorthand(RefPtr<CSSValue>& value1, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)
31548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
3155cad810f21b803229eb11403f9209855525a25d57Steve Block    parseFillPosition(m_valueList, value1, value2);
31568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
31578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // now get z
31584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (m_valueList->current()) {
31594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (validUnit(m_valueList->current(), FLength, m_strict)) {
316081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            value3 = primitiveValueCache()->createValue(m_valueList->current()->fValue,
31614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                             (CSSPrimitiveValue::UnitTypes)m_valueList->current()->unit);
31624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            m_valueList->next();
31634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return true;
31644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
31654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return false;
31664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
31674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return true;
31688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
31698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
31705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickbool CSSParser::parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result)
31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!validUnit(v, FNumber, m_strict))
31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = v->fValue;
31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result < 0 || result > 1.0)
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    v = args->next();
31798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!v)
31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The last number in the function has no comma after it, so we're done.
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (v->unit != CSSParserValue::Operator && v->iValue != ',')
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
31848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    v = args->next();
31858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
31868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseAnimationTimingFunction()
31898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
31915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (value->id == CSSValueEase || value->id == CSSValueLinear || value->id == CSSValueEaseIn || value->id == CSSValueEaseOut
31925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        || value->id == CSSValueEaseInOut || value->id == CSSValueStepStart || value->id == CSSValueStepEnd)
319381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return primitiveValueCache()->createIdentifierValue(value->id);
3194e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We must be a function.
31968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit != CSSParserValue::Function)
31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3198e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
31995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (equalIgnoringCase(value->function->name, "steps(")) {
32025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // For steps, 1 or 2 params must be specified (comma-separated)
32035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!args || (args->size() != 1 && args->size() != 3))
32045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // There are two values.
32075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        int numSteps;
32085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        bool stepAtStart = false;
32098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        CSSParserValue* v = args->current();
32115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!validUnit(v, FInteger, m_strict))
32125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        numSteps = (int) min(v->fValue, (double)INT_MAX);
32145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (numSteps < 1)
32155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        v = args->next();
32175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (v) {
32195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            // There is a comma so we need to parse the second value
32205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (v->unit != CSSParserValue::Operator && v->iValue != ',')
32215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return 0;
32225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            v = args->next();
32235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (v->id != CSSValueStart && v->id != CSSValueEnd)
32245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return 0;
32255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            stepAtStart = v->id == CSSValueStart;
32265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
32275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return CSSStepsTimingFunctionValue::create(numSteps, stepAtStart);
32295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
32305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (equalIgnoringCase(value->function->name, "cubic-bezier(")) {
32325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // For cubic bezier, 4 values must be specified.
32335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!args || args->size() != 7)
32345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // There are two points specified.  The values must be between 0 and 1.
32375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        double x1, y1, x2, y2;
32385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, x1))
32405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, y1))
32425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, x2))
32445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!parseCubicBezierTimingFunctionValue(args, y2))
32465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return 0;
32475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return CSSCubicBezierTimingFunctionValue::create(x1, y1, x2, y2);
32495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
32505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
32515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return 0;
32528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseAnimationProperty(int propId, RefPtr<CSSValue>& result)
32558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
32578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
32588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> value;
32598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowComma = false;
3260e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
32618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = 0;
32628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
32648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> currValue;
32658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowComma) {
32668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
32678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
32698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = false;
32708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
32718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
32728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (propId) {
32738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDelay:
32748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionDelay:
32758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDelay();
32768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
32778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
32788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
32798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDirection:
32808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDirection();
32818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
32828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
32838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
32848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationDuration:
32858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionDuration:
32868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationDuration();
32878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
32888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
32898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                case CSSPropertyWebkitAnimationFillMode:
3291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    currValue = parseAnimationFillMode();
3292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (currValue)
3293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        m_valueList->next();
3294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    break;
32958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationIterationCount:
32968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationIterationCount();
32978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
32988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
32998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationName:
33018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationName();
33028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                case CSSPropertyWebkitAnimationPlayState:
33060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    currValue = parseAnimationPlayState();
33070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (currValue)
33080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_valueList->next();
33090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    break;
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionProperty:
33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationProperty();
33128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitAnimationTimingFunction:
33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyWebkitTransitionTimingFunction:
33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currValue = parseAnimationTimingFunction();
33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (currValue)
33198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_valueList->next();
33208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
33218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3322e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!currValue)
33248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3325e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value && !values) {
33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
33288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(value.release());
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3330e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (values)
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values->append(currValue.release());
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value = currValue.release();
3335e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowComma = true;
33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3338e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // When parsing the 'transition' shorthand property, we let it handle building up the lists for all
33408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // properties.
33418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inShorthand())
33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
33438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3344e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = values.release();
33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value) {
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = value.release();
33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DASHBOARD_REGION_NUM_PARAMETERS  6
33618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DASHBOARD_REGION_SHORT_NUM_PARAMETERS  2
33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic CSSParserValue* skipCommaInDashboardRegion(CSSParserValueList *args)
33648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (args->size() == (DASHBOARD_REGION_NUM_PARAMETERS*2-1) ||
33668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         args->size() == (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1)) {
33678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* current = args->current();
33688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (current->unit == CSSParserValue::Operator && current->iValue == ',')
33698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return args->next();
33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return args->current();
33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseDashboardRegions(int propId, bool important)
33758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
3377e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id == CSSValueNone) {
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_valueList->next())
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
338381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createIdentifierValue(value->id), important);
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return valid;
33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3386e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DashboardRegion> firstRegion = DashboardRegion::create();
33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DashboardRegion* region = 0;
33898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
33918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (region == 0) {
33928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = firstRegion.get();
33938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
33948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<DashboardRegion> nextRegion = DashboardRegion::create();
33958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_next = nextRegion;
33968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = nextRegion.get();
33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit != CSSParserValue::Function) {
34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3403e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Commas count as values, so allow:
34058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type, t, r, b, l) or dashboard-region(label type t r b l)
34068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type, t, r, b, l) or dashboard-region(label type t r b l)
34078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // also allow
34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type) or dashboard-region(label type)
34098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // dashboard-region(label, type) or dashboard-region(label type)
34105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSParserValueList* args = value->function->args.get();
34118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!equalIgnoringCase(value->function->name, "dashboard-region(") || !args) {
34128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3415e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int numArgs = args->size();
34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((numArgs != DASHBOARD_REGION_NUM_PARAMETERS && numArgs != (DASHBOARD_REGION_NUM_PARAMETERS*2-1)) &&
34180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (numArgs != DASHBOARD_REGION_SHORT_NUM_PARAMETERS && numArgs != (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1))) {
34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3422e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First arg is a label.
34248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* arg = args->current();
34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (arg->unit != CSSPrimitiveValue::CSS_IDENT) {
34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3429e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        region->m_label = arg->string;
34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second arg is a type.
34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        arg = args->next();
34340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        arg = skipCommaInDashboardRegion(args);
34358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (arg->unit != CSSPrimitiveValue::CSS_IDENT) {
34368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(arg->string, "circle"))
34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_isCircle = true;
34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (equalIgnoringCase(arg->string, "rectangle"))
34438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->m_isRectangle = true;
34448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
34458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
34468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
34478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3448e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        region->m_geometryType = arg->string;
34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (numArgs == DASHBOARD_REGION_SHORT_NUM_PARAMETERS || numArgs == (DASHBOARD_REGION_SHORT_NUM_PARAMETERS*2-1)) {
34528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // This originally used CSSValueInvalid by accident. It might be more logical to use something else.
345381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            RefPtr<CSSPrimitiveValue> amount = primitiveValueCache()->createIdentifierValue(CSSValueInvalid);
3454e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setTop(amount);
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setRight(amount);
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setBottom(amount);
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region->setLeft(amount);
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Next four arguments must be offset numbers
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int i;
34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < 4; i++) {
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                arg = args->next();
34640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                arg = skipCommaInDashboardRegion(args);
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = arg->id == CSSValueAuto || validUnit(arg, FLength, m_strict);
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!valid)
34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
3469e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<CSSPrimitiveValue> amount = arg->id == CSSValueAuto ?
347181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createIdentifierValue(CSSValueAuto) :
347281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createValue(arg->fValue, (CSSPrimitiveValue::UnitTypes) arg->unit);
3473e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (i == 0)
34758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setTop(amount);
34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (i == 1)
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setRight(amount);
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (i == 2)
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setBottom(amount);
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    region->setLeft(amount);
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->next())
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (valid)
349281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(firstRegion.release()), important);
3493e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return valid;
34958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* ENABLE(DASHBOARD_SUPPORT) */
34988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValue> CSSParser::parseCounterContent(CSSParserValueList* args, bool counters)
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned numArgs = args->size();
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (counters && numArgs != 3 && numArgs != 5)
35038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!counters && numArgs != 1 && numArgs != 3)
35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3506e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* i = args->current();
35088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (i->unit != CSSPrimitiveValue::CSS_IDENT)
35098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
351081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSPrimitiveValue> identifier = primitiveValueCache()->createValue(i->string, CSSPrimitiveValue::CSS_STRING);
35118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> separator;
35138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!counters)
351481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        separator = primitiveValueCache()->createValue(String(), CSSPrimitiveValue::CSS_STRING);
35158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
35168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
35178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSParserValue::Operator || i->iValue != ',')
35188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3519e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
35218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSPrimitiveValue::CSS_STRING)
35228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3523e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
352481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        separator = primitiveValueCache()->createValue(i->string, (CSSPrimitiveValue::UnitTypes) i->unit);
35258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> listStyle;
35288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    i = args->next();
35298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!i) // Make the list style default decimal
353081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        listStyle = primitiveValueCache()->createValue(CSSValueDecimal - CSSValueDisc, CSSPrimitiveValue::CSS_NUMBER);
35318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
35328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSParserValue::Operator || i->iValue != ',')
35338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3534e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i = args->next();
35368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->unit != CSSPrimitiveValue::CSS_IDENT)
35378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3538e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short ls = 0;
35408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i->id == CSSValueNone)
35418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ls = CSSValueKatakanaIroha - CSSValueDisc + 1;
35428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i->id >= CSSValueDisc && i->id <= CSSValueKatakanaIroha)
35438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ls = i->id - CSSValueDisc;
35448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
35458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
35468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
354781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        listStyle = primitiveValueCache()->createValue(ls, (CSSPrimitiveValue::UnitTypes) i->unit);
35488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
355081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createValue(Counter::create(identifier.release(), listStyle.release(), separator.release()));
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShape(int propId, bool important)
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
35565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
3557e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!equalIgnoringCase(value->function->name, "rect(") || !args)
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // rect(t, r, b, l) || rect(t r b l)
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (args->size() != 4 && args->size() != 7)
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Rect> rect = Rect::create();
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
35668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i = 0;
35678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (a) {
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        valid = a->id == CSSValueAuto || validUnit(a, FLength, m_strict);
35708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!valid)
35718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
35728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> length = a->id == CSSValueAuto ?
357381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            primitiveValueCache()->createIdentifierValue(CSSValueAuto) :
357481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
35758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == 0)
35768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setTop(length);
35778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i == 1)
35788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setRight(length);
35798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (i == 2)
35808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setBottom(length);
35818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
35828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rect->setLeft(length);
35838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a && args->size() == 7) {
35858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (a->unit == CSSParserValue::Operator && a->iValue == ',') {
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                a = args->next();
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
35908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
35918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        i++;
35938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (valid) {
359581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        addProperty(propId, primitiveValueCache()->createValue(rect.release()), important);
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]? 'font-family'
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFont(bool important)
36048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool valid = true;
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue *value = m_valueList->current();
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<FontValue> font = FontValue::create();
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // optional font-style, font-variant and font-weight
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = value->id;
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id) {
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueNormal) {
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // do nothing, it's the inital value for all three
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id == CSSValueItalic || id == CSSValueOblique) {
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->style)
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
361781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->style = primitiveValueCache()->createIdentifierValue(id);
36188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id == CSSValueSmallCaps) {
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->variant)
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
362181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->variant = primitiveValueCache()->createIdentifierValue(id);
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (id >= CSSValueBold && id <= CSSValueLighter) {
36238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (font->weight)
36248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
362581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->weight = primitiveValueCache()->createIdentifierValue(id);
36268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
36278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
36288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
36298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } else if (!font->weight && validUnit(value, FInteger | FNonNeg, true)) {
36308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int weight = (int)value->fValue;
36318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int val = 0;
36328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (weight == 100)
36338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue100;
36348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 200)
36358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue200;
36368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 300)
36378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue300;
36388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 400)
36398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue400;
36408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 500)
36418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue500;
36428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 600)
36438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue600;
36448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 700)
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue700;
36468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 800)
36478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue800;
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (weight == 900)
36498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                val = CSSValue900;
36508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val)
365281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                font->weight = primitiveValueCache()->createIdentifierValue(val);
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                valid = false;
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            valid = false;
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!valid)
36598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value)
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // set undefined values to default
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->style)
366781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->style = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->variant)
366981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->variant = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->weight)
367181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->weight = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // now a font size _must_ come
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->id >= CSSValueXxSmall && value->id <= CSSValueLarger)
367681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->size = primitiveValueCache()->createIdentifierValue(value->id);
36778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    else if (validUnit(value, FLength | FPercent | FNonNeg, m_strict))
367881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->size = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    value = m_valueList->next();
36808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->size || !value)
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->unit == CSSParserValue::Operator && value->iValue == '/') {
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // line-height
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value)
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id == CSSValueNormal) {
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // default value, nothing to do
36908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } else if (validUnit(value, FNumber | FLength | FPercent | FNonNeg, m_strict))
369181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            font->lineHeight = primitiveValueCache()->createValue(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit);
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value = m_valueList->next();
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value)
36968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3698e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!font->lineHeight)
370081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        font->lineHeight = primitiveValueCache()->createIdentifierValue(CSSValueNormal);
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // font family must come now
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    font->family = parseFontFamily();
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->current() || !font->family)
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(CSSPropertyFont, font.release(), important);
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValueList> CSSParser::parseFontFamily()
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* value = m_valueList->current();
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontFamilyValue* currFamily = 0;
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (value) {
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* nextValue = m_valueList->next();
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool nextValBreaksFont = !nextValue ||
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                 (nextValue->unit == CSSParserValue::Operator && nextValue->iValue == ',');
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool nextValIsFontName = nextValue &&
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ((nextValue->id >= CSSValueSerif && nextValue->id <= CSSValueWebkitBody) ||
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (nextValue->unit == CSSPrimitiveValue::CSS_STRING || nextValue->unit == CSSPrimitiveValue::CSS_IDENT));
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->id >= CSSValueSerif && value->id <= CSSValueWebkitBody) {
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currFamily)
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily->appendSpaceSeparated(value->string.characters, value->string.length);
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (nextValBreaksFont || !nextValIsFontName)
373081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createIdentifierValue(value->id));
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<FontFamilyValue> newFamily = FontFamilyValue::create(value->string);
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily = newFamily.get();
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(newFamily.release());
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_STRING) {
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Strings never share in a family name.
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            currFamily = 0;
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(FontFamilyValue::create(value->string));
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSPrimitiveValue::CSS_IDENT) {
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currFamily)
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily->appendSpaceSeparated(value->string.characters, value->string.length);
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (nextValBreaksFont || !nextValIsFontName)
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(FontFamilyValue::create(value->string));
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RefPtr<FontFamilyValue> newFamily = FontFamilyValue::create(value->string);
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                currFamily = newFamily.get();
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                list->append(newFamily.release());
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3753e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!nextValue)
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (nextValBreaksFont) {
37588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = m_valueList->next();
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            currFamily = 0;
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (nextValIsFontName)
37628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            value = nextValue;
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!list->length())
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list = 0;
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list.release();
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontStyle(bool important)
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
37768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->id == CSSValueNormal || val->id == CSSValueItalic || val->id == CSSValueOblique)
378381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (val->id == CSSValueAll && !values) {
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // 'all' is only allowed in @font-face and with no other values. Make a value list to
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // indicate that we are in the @font-face case.
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
378881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
37938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
37948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
37978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
37988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
38008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
38038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
38048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontStyle, parsedValue.release(), important);
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
38068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontStyle, values.release(), important);
38128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontVariant(bool important)
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
38238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
38248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
38288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->id == CSSValueNormal || val->id == CSSValueSmallCaps)
383081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (val->id == CSSValueAll && !values) {
38328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // 'all' is only allowed in @font-face and with no other values. Make a value list to
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // indicate that we are in the @font-face case.
38348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
383581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontVariant, parsedValue.release(), important);
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
38578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
38588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontVariant, values.release(), important);
38598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
38608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontWeight(bool important)
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
38688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_valueList->size() > 1)
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        values = CSSValueList::createCommaSeparated();
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSPrimitiveValue> parsedValue;
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!expectComma) {
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->unit == CSSPrimitiveValue::CSS_IDENT) {
38778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val->id >= CSSValueNormal && val->id <= CSSValue900)
387881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (val->id == CSSValueAll && !values) {
38808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // 'all' is only allowed in @font-face and with no other values. Make a value list to
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // indicate that we are in the @font-face case.
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    values = CSSValueList::createCommaSeparated();
388381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(val->id);
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if (validUnit(val, FInteger | FNonNeg, false)) {
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int weight = static_cast<int>(val->fValue);
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!(weight % 100) && weight >= 100 && weight <= 900)
388881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    parsedValue = primitiveValueCache()->createIdentifierValue(CSSValue100 + weight / 100 - 1);
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',') {
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parsedValue)
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (values)
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(CSSPropertyFontWeight, parsedValue.release(), important);
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values && values->length()) {
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasFontFaceOnlyValues = true;
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertyFontWeight, values.release(), important);
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic bool isValidFormatFunction(CSSParserValue* val)
3919643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
39205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = val->function->args.get();
3921643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return equalIgnoringCase(val->function->name, "format(") && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT);
3922643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
3923643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontFaceSrc()
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values(CSSValueList::createCommaSeparated());
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool expectComma = false;
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowFormat = false;
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool failed = false;
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSFontFaceSrcValue> uriValue;
39328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSFontFaceSrcValue> parsedValue;
39348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (val->unit == CSSPrimitiveValue::CSS_URI && !expectComma && m_styleSheet) {
39350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // FIXME: The completeURL call should be done when using the CSSFontFaceSrcValue,
39360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // not when creating it.
39370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            parsedValue = CSSFontFaceSrcValue::create(m_styleSheet->completeURL(val->string));
39388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uriValue = parsedValue;
39398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowFormat = true;
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = true;
39418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Function) {
3942e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            // There are two allowed functions: local() and format().
39435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            CSSParserValueList* args = val->function->args.get();
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (args && args->size() == 1) {
39454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                if (equalIgnoringCase(val->function->name, "local(") && !expectComma && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT)) {
39468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    expectComma = true;
39478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    allowFormat = false;
39488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    CSSParserValue* a = args->current();
39498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue.clear();
39508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parsedValue = CSSFontFaceSrcValue::createLocal(a->string);
3951643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                } else if (allowFormat && uriValue && isValidFormatFunction(val)) {
39528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    expectComma = true;
39538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    allowFormat = false;
39548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue->setFormat(args->current()->string);
39558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    uriValue.clear();
39568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
39578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
39588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
39598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
39608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (val->unit == CSSParserValue::Operator && val->iValue == ',' && expectComma) {
39618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            expectComma = false;
39628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowFormat = false;
39638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uriValue.clear();
39648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
39658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
39668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3967e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
39688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (parsedValue)
39698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            values->append(parsedValue.release());
39708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
39718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
39728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
39758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3976e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
39778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (values->length() && !failed) {
39788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(CSSPropertySrc, values.release(), m_important);
39798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
39808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
39818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
39848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseFontFaceUnicodeRange()
39878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
39898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool failed = false;
3990e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    bool operatorExpected = false;
3991e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    for (; m_valueList->current(); m_valueList->next(), operatorExpected = !operatorExpected) {
3992e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (operatorExpected) {
3993e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (m_valueList->current()->unit == CSSParserValue::Operator && m_valueList->current()->iValue == ',')
3994e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                continue;
3995e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            failed = true;
3996e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            break;
3997e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
39988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_valueList->current()->unit != CSSPrimitiveValue::CSS_UNICODE_RANGE) {
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String rangeString = m_valueList->current()->string;
40048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar32 from = 0;
40058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar32 to = 0;
40068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned length = rangeString.length();
40078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (length < 3) {
40098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            failed = true;
40108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned i = 2;
40148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (i < length) {
40158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            UChar c = rangeString[i];
40168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (c == '-' || c == '?')
40178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
40188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            from *= 16;
40198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (c >= '0' && c <= '9')
40208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += c - '0';
40218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (c >= 'A' && c <= 'F')
40228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += 10 + c - 'A';
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (c >= 'a' && c <= 'f')
40248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from += 10 + c - 'a';
40258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
40268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
40278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
40288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            i++;
40308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (failed)
40328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == length)
40358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            to = from;
40368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (rangeString[i] == '?') {
40378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned span = 1;
40388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (i < length && rangeString[i] == '?') {
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                span *= 16;
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                from *= 16;
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                i++;
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (i < length)
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            to = from + span - 1;
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (length < i + 2) {
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                failed = true;
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            i++;
40528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (i < length) {
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                UChar c = rangeString[i];
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                to *= 16;
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (c >= '0' && c <= '9')
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += c - '0';
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (c >= 'A' && c <= 'F')
40588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += 10 + c - 'A';
40598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (c >= 'a' && c <= 'f')
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    to += 10 + c - 'a';
40618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else {
40628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    failed = true;
40638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
40648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
40658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                i++;
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (failed)
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4070ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (from <= to)
4071ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            values->append(CSSUnicodeRangeValue::create(from, to));
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (failed || !values->length())
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
40758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(CSSPropertyUnicodeRange, values.release(), m_important);
40768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
40778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40792bde8e466a4451c7319e3a072d118917957d6554Steve Block// Returns the number of characters which form a valid double
40802bde8e466a4451c7319e3a072d118917957d6554Steve Block// and are terminated by the given terminator character
40812bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic int checkForValidDouble(const UChar* string, const UChar* end, const char terminator)
40822bde8e466a4451c7319e3a072d118917957d6554Steve Block{
40832bde8e466a4451c7319e3a072d118917957d6554Steve Block    int length = end - string;
40842bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (length < 1)
40852bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
40862bde8e466a4451c7319e3a072d118917957d6554Steve Block
40872bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool decimalMarkSeen = false;
40882bde8e466a4451c7319e3a072d118917957d6554Steve Block    int processedLength = 0;
40892bde8e466a4451c7319e3a072d118917957d6554Steve Block
40902bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (int i = 0; i < length; ++i) {
40912bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (string[i] == terminator) {
40922bde8e466a4451c7319e3a072d118917957d6554Steve Block            processedLength = i;
40932bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
40942bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
40952bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!isASCIIDigit(string[i])) {
40962bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (!decimalMarkSeen && string[i] == '.')
40972bde8e466a4451c7319e3a072d118917957d6554Steve Block                decimalMarkSeen = true;
40982bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
40992bde8e466a4451c7319e3a072d118917957d6554Steve Block                return 0;
41002bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
41012bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41022bde8e466a4451c7319e3a072d118917957d6554Steve Block
41032bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (decimalMarkSeen && processedLength == 1)
41042bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
41052bde8e466a4451c7319e3a072d118917957d6554Steve Block
41062bde8e466a4451c7319e3a072d118917957d6554Steve Block    return processedLength;
41072bde8e466a4451c7319e3a072d118917957d6554Steve Block}
41082bde8e466a4451c7319e3a072d118917957d6554Steve Block
41092bde8e466a4451c7319e3a072d118917957d6554Steve Block// Returns the number of characters consumed for parsing a valid double
41102bde8e466a4451c7319e3a072d118917957d6554Steve Block// terminated by the given terminator character
41112bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic int parseDouble(const UChar* string, const UChar* end, const char terminator, double& value)
41122bde8e466a4451c7319e3a072d118917957d6554Steve Block{
41132bde8e466a4451c7319e3a072d118917957d6554Steve Block    int length = checkForValidDouble(string, end, terminator);
41142bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!length)
41152bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
41162bde8e466a4451c7319e3a072d118917957d6554Steve Block
41172bde8e466a4451c7319e3a072d118917957d6554Steve Block    int position = 0;
41182bde8e466a4451c7319e3a072d118917957d6554Steve Block    double localValue = 0;
41192bde8e466a4451c7319e3a072d118917957d6554Steve Block
41202bde8e466a4451c7319e3a072d118917957d6554Steve Block    // The consumed characters here are guaranteed to be
41212bde8e466a4451c7319e3a072d118917957d6554Steve Block    // ASCII digits with or without a decimal mark
41222bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (; position < length; ++position) {
41232bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (string[position] == '.')
41242bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
41252bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue = localValue * 10 + string[position] - '0';
41262bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41272bde8e466a4451c7319e3a072d118917957d6554Steve Block
41282bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (++position == length) {
41292bde8e466a4451c7319e3a072d118917957d6554Steve Block        value = localValue;
41302bde8e466a4451c7319e3a072d118917957d6554Steve Block        return length;
41312bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41322bde8e466a4451c7319e3a072d118917957d6554Steve Block
41332bde8e466a4451c7319e3a072d118917957d6554Steve Block    double fraction = 0;
41342bde8e466a4451c7319e3a072d118917957d6554Steve Block    double scale = 1;
41352bde8e466a4451c7319e3a072d118917957d6554Steve Block
41362bde8e466a4451c7319e3a072d118917957d6554Steve Block    while (position < length && scale < MAX_SCALE) {
41372bde8e466a4451c7319e3a072d118917957d6554Steve Block        fraction = fraction * 10 + string[position++] - '0';
41382bde8e466a4451c7319e3a072d118917957d6554Steve Block        scale *= 10;
41392bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41402bde8e466a4451c7319e3a072d118917957d6554Steve Block
41412bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = localValue + fraction / scale;
41422bde8e466a4451c7319e3a072d118917957d6554Steve Block    return length;
41432bde8e466a4451c7319e3a072d118917957d6554Steve Block}
41442bde8e466a4451c7319e3a072d118917957d6554Steve Block
41452bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic bool parseColorIntOrPercentage(const UChar*& string, const UChar* end, const char terminator, CSSPrimitiveValue::UnitTypes& expect, int& value)
4146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
4147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* current = string;
41482bde8e466a4451c7319e3a072d118917957d6554Steve Block    double localValue = 0;
4149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool negative = false;
4150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (current != end && isHTMLSpace(*current))
4151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current != end && *current == '-') {
4153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        negative = true;
4154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
4156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current == end || !isASCIIDigit(*current))
4157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
4158ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    while (current != end && isASCIIDigit(*current)) {
41592bde8e466a4451c7319e3a072d118917957d6554Steve Block        double newValue = localValue * 10 + *current++ - '0';
4160ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (newValue >= 255) {
4161ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Clamp values at 255.
4162ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            localValue = 255;
4163ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            while (current != end && isASCIIDigit(*current))
4164ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                ++current;
4165ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
4166ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
4167ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        localValue = newValue;
4168ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
41692bde8e466a4451c7319e3a072d118917957d6554Steve Block
417054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (current == end)
417154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        return false;
417254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
41732bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (expect == CSSPrimitiveValue::CSS_NUMBER && (*current == '.' || *current == '%'))
41742bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
41752bde8e466a4451c7319e3a072d118917957d6554Steve Block
41762bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (*current == '.') {
41772bde8e466a4451c7319e3a072d118917957d6554Steve Block        // We already parsed the integral part, try to parse
41782bde8e466a4451c7319e3a072d118917957d6554Steve Block        // the fraction part of the percentage value.
41792bde8e466a4451c7319e3a072d118917957d6554Steve Block        double percentage = 0;
41802bde8e466a4451c7319e3a072d118917957d6554Steve Block        int numCharactersParsed = parseDouble(current, end, '%', percentage);
41812bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!numCharactersParsed)
41822bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
41832bde8e466a4451c7319e3a072d118917957d6554Steve Block        current += numCharactersParsed;
41842bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (*current != '%')
41852bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
41862bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue += percentage;
41872bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
41882bde8e466a4451c7319e3a072d118917957d6554Steve Block
41892bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (expect == CSSPrimitiveValue::CSS_PERCENTAGE && *current != '%')
41902bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
41912bde8e466a4451c7319e3a072d118917957d6554Steve Block
41922bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (*current == '%') {
41932bde8e466a4451c7319e3a072d118917957d6554Steve Block        expect = CSSPrimitiveValue::CSS_PERCENTAGE;
41942bde8e466a4451c7319e3a072d118917957d6554Steve Block        localValue = localValue / 100.0 * 256.0;
41952bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Clamp values at 255 for percentages over 100%
41962bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (localValue > 255)
41972bde8e466a4451c7319e3a072d118917957d6554Steve Block            localValue = 255;
41982bde8e466a4451c7319e3a072d118917957d6554Steve Block        current++;
41992bde8e466a4451c7319e3a072d118917957d6554Steve Block    } else
42002bde8e466a4451c7319e3a072d118917957d6554Steve Block        expect = CSSPrimitiveValue::CSS_NUMBER;
42012bde8e466a4451c7319e3a072d118917957d6554Steve Block
4202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (current != end && isHTMLSpace(*current))
4203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        current++;
4204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (current == end || *current++ != terminator)
4205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
4206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Clamp negative values at zero.
42072bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = negative ? 0 : static_cast<int>(localValue);
4208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    string = current;
4209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
4210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
4211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4212f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickstatic inline bool isTenthAlpha(const UChar* string, const int length)
4213f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
4214f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // "0.X"
4215f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 3 && string[0] == '0' && string[1] == '.' && isASCIIDigit(string[2]))
4216f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4217f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4218f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // ".X"
4219f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 2 && string[0] == '.' && isASCIIDigit(string[1]))
4220f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4221f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4222f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return false;
4223f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
4224f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
42252bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic inline bool parseAlphaValue(const UChar*& string, const UChar* end, const char terminator, int& value)
4226f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
4227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (string != end && isHTMLSpace(*string))
4228f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string++;
4229f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
423081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool negative = false;
423181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
423281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string != end && *string == '-') {
423381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        negative = true;
423481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        string++;
423581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
423681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4237f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    value = 0;
4238f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4239f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    int length = end - string;
4240f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length < 2)
4241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
4242f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
424381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string[length - 1] != terminator)
4244f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
4245f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
424681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (string[0] != '0' && string[0] != '1' && string[0] != '.') {
42472bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (checkForValidDouble(string, end, terminator)) {
424881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            value = negative ? 0 : 255;
424981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            string = end;
425081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
425181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
4252f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
425381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
4254f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (length == 2 && string[0] != '.') {
425681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value = !negative && string[0] == '1' ? 255 : 0;
4257f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string = end;
4258f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4259f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4260f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4261f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (isTenthAlpha(string, length - 1)) {
4262f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static const int tenthAlphaValues[] = { 0, 25, 51, 76, 102, 127, 153, 179, 204, 230 };
426381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        value = negative ? 0 : tenthAlphaValues[string[length - 2] - '0'];
4264f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        string = end;
4265f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4266f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4267f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
42682bde8e466a4451c7319e3a072d118917957d6554Steve Block    double alpha = 0;
42692bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!parseDouble(string, end, terminator, alpha))
42702bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
42712bde8e466a4451c7319e3a072d118917957d6554Steve Block    value = negative ? 0 : static_cast<int>(alpha * nextafter(256.0, 0.0));
42722bde8e466a4451c7319e3a072d118917957d6554Steve Block    string = end;
42732bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
4274f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
4275f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4276e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic inline bool mightBeRGBA(const UChar* characters, unsigned length)
4277e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
4278e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (length < 5)
4279e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return false;
4280e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return characters[4] == '('
4281e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[0] | 0x20) == 'r'
4282e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[1] | 0x20) == 'g'
4283e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[2] | 0x20) == 'b'
4284e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[3] | 0x20) == 'a';
4285e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
4286e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
4287e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic inline bool mightBeRGB(const UChar* characters, unsigned length)
4288e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
4289e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (length < 4)
4290e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return false;
4291e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return characters[3] == '('
4292e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[0] | 0x20) == 'r'
4293e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[1] | 0x20) == 'g'
4294e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        && (characters[2] | 0x20) == 'b';
4295e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
4296e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
42978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColor(const String &name, RGBA32& rgb, bool strict)
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4299e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    const UChar* characters = name.characters();
4300e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    unsigned length = name.length();
43012bde8e466a4451c7319e3a072d118917957d6554Steve Block    CSSPrimitiveValue::UnitTypes expect = CSSPrimitiveValue::CSS_UNKNOWN;
4302e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
4303e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!strict && length >= 3) {
4304e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (name[0] == '#') {
4305e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (Color::parseHexColor(characters + 1, length - 1, rgb))
4306e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                return true;
4307e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else {
4308e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (Color::parseHexColor(characters, length, rgb))
4309e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                return true;
4310e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
4311e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
43128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4313f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Try rgba() syntax.
4314e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (mightBeRGBA(characters, length)) {
4315f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* current = characters + 5;
4316f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* end = characters + length;
4317f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int red;
4318f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int green;
4319f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int blue;
4320f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int alpha;
43212bde8e466a4451c7319e3a072d118917957d6554Steve Block
43222bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, red))
4323f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
43242bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, green))
4325f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
43262bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, blue))
4327f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4328f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!parseAlphaValue(current, end, ')', alpha))
4329f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4330f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (current != end)
4331f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
4332f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        rgb = makeRGBA(red, green, blue, alpha);
4333f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
4334f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
4335f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Try rgb() syntax.
4337e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (mightBeRGB(characters, length)) {
4338e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const UChar* current = characters + 4;
4339e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const UChar* end = characters + length;
4340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int red;
4341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int green;
4342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int blue;
43432bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, red))
4344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
43452bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ',', expect, green))
4346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
43472bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!parseColorIntOrPercentage(current, end, ')', expect, blue))
4348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
4349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (current != end)
4350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
4351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        rgb = makeRGB(red, green, blue);
4352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
4353e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4354f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Try named colors.
43568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color tc;
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tc.setNamedColor(name);
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tc.isValid()) {
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rgb = tc.rgb();
43608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4365ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic inline int colorIntFromValue(CSSParserValue* v)
4366ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
4367ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->fValue <= 0.0)
4368ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return 0;
4369ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4370ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->unit == CSSPrimitiveValue::CSS_PERCENTAGE) {
4371ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (v->fValue >= 100.0)
4372ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return 255;
4373ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return static_cast<int>(v->fValue * 256.0 / 100.0);
4374ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
4375ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4376ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (v->fValue >= 255.0)
4377ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return 255;
4378ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
4379ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return static_cast<int>(v->fValue);
4380ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
4381ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseColorParameters(CSSParserValue* value, int* colorArray, bool parseAlpha)
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Units unitType = FUnknown;
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the first value and its type
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (validUnit(v, FInteger, true))
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unitType = FInteger;
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (validUnit(v, FPercent, true))
43918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unitType = FPercent;
43928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
43938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4394ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    colorArray[0] = colorIntFromValue(v);
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 1; i < 3; i++) {
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
43988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, unitType, true))
44018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4402ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        colorArray[i] = colorIntFromValue(v);
44038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parseAlpha) {
44058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
44078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FNumber, true))
44108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Convert the floating pointer number of alpha to an integer in the range [0, 256),
4412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // with an equal distribution across all 256 values.
4413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        colorArray[3] = static_cast<int>(max(0.0, min(1.0, v->fValue)) * nextafter(256.0, 0.0));
44148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
44168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The CSS3 specification defines the format of a HSL color as
44198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hsl(<number>, <percent>, <percent>)
44208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// and with alpha, the format is
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hsla(<number>, <percent>, <percent>, <number>)
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The first value, HUE, is in an angle with a value between 0 and 360
44238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseHSLParameters(CSSParserValue* value, double* colorArray, bool parseAlpha)
44248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = value->function->args.get();
44268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* v = args->current();
44278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the first value
44288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!validUnit(v, FNumber, true))
44298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
44308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // normalize the Hue value and change it to be between 0 and 1.0
44318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    colorArray[0] = (((static_cast<int>(v->fValue) % 360) + 360) % 360) / 360.0;
44328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 1; i < 3; i++) {
44338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
44358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FPercent, true))
44388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
44408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parseAlpha) {
44428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (v->unit != CSSParserValue::Operator && v->iValue != ',')
44448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        v = args->next();
44468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(v, FNumber, true))
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        colorArray[3] = max(0.0, min(1.0, v->fValue));
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
44518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSPrimitiveValue> CSSParser::parseColor(CSSParserValue* value)
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RGBA32 c = Color::transparent;
44568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!parseColorFromValue(value ? value : m_valueList->current(), c))
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
445881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache()->createColorValue(c);
44598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4461545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochbool CSSParser::parseColorFromValue(CSSParserValue* value, RGBA32& c)
44628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_strict && value->unit == CSSPrimitiveValue::CSS_NUMBER &&
44648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        value->fValue >= 0. && value->fValue < 1000000.) {
44658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String str = String::format("%06d", (int)(value->fValue+.5));
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!CSSParser::parseColor(str, c, m_strict))
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (value->unit == CSSPrimitiveValue::CSS_PARSER_HEXCOLOR ||
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->unit == CSSPrimitiveValue::CSS_IDENT ||
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (!m_strict && value->unit == CSSPrimitiveValue::CSS_DIMENSION)) {
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!CSSParser::parseColor(value->string, c, m_strict && value->unit == CSSPrimitiveValue::CSS_IDENT))
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (value->unit == CSSParserValue::Function &&
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args != 0 &&
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args->size() == 5 /* rgb + two commas */ &&
44768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                equalIgnoringCase(value->function->name, "rgb(")) {
44778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int colorValues[3];
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parseColorParameters(value, colorValues, false))
44798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
44808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        c = makeRGB(colorValues[0], colorValues[1], colorValues[2]);
4481545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else {
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit == CSSParserValue::Function &&
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args != 0 &&
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                value->function->args->size() == 7 /* rgba + three commas */ &&
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                equalIgnoringCase(value->function->name, "rgba(")) {
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int colorValues[4];
44878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseColorParameters(value, colorValues, true))
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBA(colorValues[0], colorValues[1], colorValues[2], colorValues[3]);
44908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSParserValue::Function &&
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args != 0 &&
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args->size() == 5 /* hsl + two commas */ &&
44938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    equalIgnoringCase(value->function->name, "hsl(")) {
44948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            double colorValues[3];
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseHSLParameters(value, colorValues, false))
44968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
44978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBAFromHSLA(colorValues[0], colorValues[1], colorValues[2], 1.0);
44988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->unit == CSSParserValue::Function &&
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args != 0 &&
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    value->function->args->size() == 7 /* hsla + three commas */ &&
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    equalIgnoringCase(value->function->name, "hsla(")) {
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            double colorValues[4];
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parseHSLParameters(value, colorValues, true))
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            c = makeRGBAFromHSLA(colorValues[0], colorValues[1], colorValues[2], colorValues[3]);
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4508545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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)
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// without the allowBreak bit being set, then it will clean up all of the objects and destroy them.
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct ShadowParseContext {
451681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ShadowParseContext(CSSPropertyID prop, CSSPrimitiveValueCache* primitiveValueCache)
45170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        : property(prop)
451881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_primitiveValueCache(primitiveValueCache)
45190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowX(true)
45200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowY(false)
45210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowBlur(false)
45220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowSpread(false)
45230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowColor(true)
4524cad810f21b803229eb11403f9209855525a25d57Steve Block        , allowStyle(prop == CSSPropertyWebkitBoxShadow || prop == CSSPropertyBoxShadow)
45250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , allowBreak(true)
45260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
45270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
45288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool allowLength() { return allowX || allowY || allowBlur || allowSpread; }
45308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitValue()
45320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
45338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle the ,, case gracefully by doing nothing.
45340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (x || y || blur || spread || color || style) {
45358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!values)
45368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                values = CSSValueList::createCommaSeparated();
45370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
45388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Construct the current shadow value and add it to the list.
45390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            values->append(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release()));
45408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Now reset for the next shadow value.
45430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        x = 0;
45440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        y = 0;
45450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        blur = 0;
45460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        spread = 0;
45470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        style = 0;
45480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        color = 0;
45490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
45500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowX = true;
45510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowColor = true;
45520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowBreak = true;
45530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowY = false;
45540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowBlur = false;
45550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowSpread = false;
4556cad810f21b803229eb11403f9209855525a25d57Steve Block        allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
45570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
45580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
45590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitLength(CSSParserValue* v)
45600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
456181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> val = m_primitiveValueCache->createValue(v->fValue, (CSSPrimitiveValue::UnitTypes)v->unit);
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowX) {
45648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            x = val.release();
45650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowX = false;
45660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowY = true;
45670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = false;
45680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowStyle = false;
45690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = false;
45700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowY) {
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            y = val.release();
45720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowY = false;
45730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBlur = true;
45740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = true;
4575cad810f21b803229eb11403f9209855525a25d57Steve Block            allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
45760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = true;
45770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowBlur) {
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            blur = val.release();
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBlur = false;
4580cad810f21b803229eb11403f9209855525a25d57Steve Block            allowSpread = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
45810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (allowSpread) {
45820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            spread = val.release();
45830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
45848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
45868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitColor(PassRefPtr<CSSPrimitiveValue> val)
45880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
45898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        color = val;
45908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        allowColor = false;
45910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (allowX) {
45920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowStyle = false;
45930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBreak = false;
45940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else {
45950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowBlur = false;
45960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
4597cad810f21b803229eb11403f9209855525a25d57Steve Block            allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
45980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
45990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
46000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitStyle(CSSParserValue* v)
46020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
460381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        style = m_primitiveValueCache->createIdentifierValue(v->id);
46040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        allowStyle = false;
46058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (allowX)
46068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBreak = false;
46070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else {
46088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowBlur = false;
46090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowSpread = false;
46100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            allowColor = false;
46110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSPropertyID property;
461581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSPrimitiveValueCache* m_primitiveValueCache;
46160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> values;
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> x;
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> y;
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> blur;
46210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> spread;
46220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> style;
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> color;
46248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowX;
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowY;
46278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBlur;
46280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool allowSpread;
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowColor;
4630cad810f21b803229eb11403f9209855525a25d57Steve Block    bool allowStyle; // inset or not.
46318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBreak;
46328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
46338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseShadow(int propId, bool important)
46358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
463681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ShadowParseContext context(static_cast<CSSPropertyID>(propId), primitiveValueCache());
46378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val;
46388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->current())) {
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for a comma break first.
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val->unit == CSSParserValue::Operator) {
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (val->iValue != ',' || !context.allowBreak)
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Other operators aren't legal or we aren't done with the current shadow
46438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // value.  Treat as invalid.
46448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
4645cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#if ENABLE(SVG)
4646d0825bca7fe65beaee391d30da42e937db621564Steve Block            // -webkit-svg-shadow does not support multiple values.
4647d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (static_cast<CSSPropertyID>(propId) == CSSPropertyWebkitSvgShadow)
4648cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                return false;
4649e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
46508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The value is good.  Commit it.
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitValue();
46520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (validUnit(val, FLength, true)) {
46538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We required a length and didn't get one. Invalid.
46548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!context.allowLength())
46558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
46568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // A length is allowed here.  Construct the value and add it.
46588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitLength(val);
46590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (val->id == CSSValueInset) {
46600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!context.allowStyle)
46610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
46620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            context.commitStyle(val);
46640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else {
46658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The only other type of value that's ok is a color value.
46668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSPrimitiveValue> parsedColor;
46678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            bool isColor = ((val->id >= CSSValueAqua && val->id <= CSSValueWindowtext) || val->id == CSSValueMenu ||
46688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            (val->id >= CSSValueWebkitFocusRingColor && val->id <= CSSValueWebkitText && !m_strict));
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isColor) {
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!context.allowColor)
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
467281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                parsedColor = primitiveValueCache()->createIdentifierValue(val->id);
46738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedColor)
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // It's not built-in. Try to parse it as a color.
46778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parsedColor = parseColor(val);
46788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!parsedColor || !context.allowColor)
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false; // This value is not a color or length and is invalid or
46818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              // it is a color, but a color isn't allowed at this point.
4682e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
46838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitColor(parsedColor.release());
46848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_valueList->next();
46878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowBreak) {
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context.commitValue();
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (context.values->length()) {
46928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addProperty(propId, context.values.release(), important);
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_valueList->next();
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseReflect(int propId, bool important)
47028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // box-reflect: <direction> <offset> <mask>
4704e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Direction comes first.
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val = m_valueList->current();
47078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSReflectionDirection direction;
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (val->id) {
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueAbove:
47108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionAbove;
47118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
47128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueBelow:
47138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionBelow;
47148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
47158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueLeft:
47168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionLeft;
47178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
47188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRight:
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction = ReflectionRight;
47208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
47218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The offset comes next.
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    val = m_valueList->next();
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> offset;
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!val)
472981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        offset = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_PX);
47308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
47318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!validUnit(val, FLength | FPercent, m_strict))
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
473381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        offset = primitiveValueCache()->createValue(val->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(val->unit));
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now for the mask.
47378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> mask;
47388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    val = m_valueList->next();
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (val) {
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!parseBorderImage(propId, important, mask))
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSReflectValue> reflectValue = CSSReflectValue::create(direction, offset.release(), mask.release());
47458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addProperty(propId, reflectValue.release(), important);
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_valueList->next();
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstruct BorderImageParseContext {
475181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    BorderImageParseContext(CSSPrimitiveValueCache* primitiveValueCache)
475281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : m_primitiveValueCache(primitiveValueCache)
475381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_allowBreak(false)
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowNumber(false)
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowSlash(false)
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowWidth(false)
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowRule(false)
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderTop(0)
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderRight(0)
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderBottom(0)
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_borderLeft(0)
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_horizontalRule(0)
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_verticalRule(0)
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {}
4765e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowBreak() const { return m_allowBreak; }
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowNumber() const { return m_allowNumber; }
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowSlash() const { return m_allowSlash; }
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowWidth() const { return m_allowWidth; }
47708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allowRule() const { return m_allowRule; }
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void commitImage(PassRefPtr<CSSValue> image) { m_image = image; m_allowNumber = true; }
47730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitNumber(CSSParserValue* v)
47740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
477581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        PassRefPtr<CSSPrimitiveValue> val = m_primitiveValueCache->createValue(v->fValue, (CSSPrimitiveValue::UnitTypes)v->unit);
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_top)
47778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_top = val;
47788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_right)
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_right = val;
47808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_bottom)
47818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_bottom = val;
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!m_left);
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_left = val;
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4786e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowBreak = m_allowSlash = m_allowRule = true;
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowNumber = !m_left;
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void commitSlash() { m_allowBreak = m_allowSlash = m_allowNumber = false; m_allowWidth = true; }
47910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitWidth(CSSParserValue* val)
47920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_borderTop)
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderTop = val;
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_borderRight)
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderRight = val;
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_borderBottom)
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderBottom = val;
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!m_borderLeft);
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_borderLeft = val;
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowBreak = m_allowRule = true;
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowWidth = !m_borderLeft;
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void commitRule(int keyword)
48080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_horizontalRule)
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalRule = keyword;
48118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!m_verticalRule)
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalRule = keyword;
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_allowRule = !m_verticalRule;
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<CSSValue> commitBorderImage(CSSParser* p, bool important)
48160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We need to clone and repeat values for any omissions.
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_right) {
481981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_right = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
482081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_bottom = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
482181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_left = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_bottom) {
482481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_bottom = m_primitiveValueCache->createValue(m_top->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_top->primitiveType());
482581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_left = m_primitiveValueCache->createValue(m_right->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_right->primitiveType());
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_left)
482881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch             m_left = m_primitiveValueCache->createValue(m_right->getDoubleValue(), (CSSPrimitiveValue::UnitTypes)m_right->primitiveType());
4829e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now build a rect value to hold all four of our primitive values.
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<Rect> rect = Rect::create();
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setTop(m_top);
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setRight(m_right);
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setBottom(m_bottom);
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect->setLeft(m_left);
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fill in STRETCH as the default if it wasn't specified.
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_horizontalRule)
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalRule = CSSValueStretch;
4840e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The vertical rule should match the horizontal rule if unspecified.
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_verticalRule)
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalRule = m_horizontalRule;
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
48468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list and then make our parsing machinery do the parsing.
48478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_borderTop) {
48488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParserValueList newList;
48498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newList.addValue(*m_borderTop);
48508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderRight)
48518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderRight);
48528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderBottom)
48538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderBottom);
48548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_borderLeft)
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newList.addValue(*m_borderLeft);
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParserValueList* oldList = p->m_valueList;
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->m_valueList = &newList;
48588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->parseValue(CSSPropertyBorderWidth, important);
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            p->m_valueList = oldList;
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Make our new border image value now.
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CSSBorderImageValue::create(m_image, rect.release(), m_horizontalRule, m_verticalRule);
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
486581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
486681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSPrimitiveValueCache* m_primitiveValueCache;
4867e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowBreak;
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowNumber;
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowSlash;
48718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowWidth;
48728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowRule;
4873e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValue> m_image;
48758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_top;
48778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_right;
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_bottom;
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> m_left;
4880e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderTop;
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderRight;
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderBottom;
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* m_borderLeft;
4885e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_horizontalRule;
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_verticalRule;
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseBorderImage(int propId, bool important, RefPtr<CSSValue>& result)
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Look for an image initially.  If the first value is not a URI, then we're done.
489381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    BorderImageParseContext context(primitiveValueCache());
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* val = m_valueList->current();
48950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (val->unit == CSSPrimitiveValue::CSS_URI && m_styleSheet) {
48960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: The completeURL call should be done when using the CSSImageValue,
48970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // not when creating it.
48980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        context.commitImage(CSSImageValue::create(m_styleSheet->completeURL(val->string)));
4899cad810f21b803229eb11403f9209855525a25d57Steve Block    } else if (isGeneratedImageValue(val)) {
49008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CSSValue> value;
4901cad810f21b803229eb11403f9209855525a25d57Steve Block        if (parseGeneratedImage(value))
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitImage(value);
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
49048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
49058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
49068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((val = m_valueList->next())) {
49098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (context.allowNumber() && validUnit(val, FInteger | FNonNeg | FPercent, true)) {
49108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitNumber(val);
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (propId == CSSPropertyWebkitBorderImage && context.allowSlash() && val->unit == CSSParserValue::Operator && val->iValue == '/') {
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitSlash();
49138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (context.allowWidth() &&
49148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (val->id == CSSValueThin || val->id == CSSValueMedium || val->id == CSSValueThick || validUnit(val, FLength, m_strict))) {
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitWidth(val);
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (context.allowRule() &&
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (val->id == CSSValueStretch || val->id == CSSValueRound || val->id == CSSValueRepeat)) {
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context.commitRule(val->id);
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Something invalid was encountered.
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
49228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4924e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowNumber() && propId != CSSPropertyWebkitBorderImage) {
49268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
492781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        context.m_top = primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_NUMBER);
49288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context.m_allowBreak = true;
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context.allowBreak()) {
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Need to fully commit as a single value.
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = context.commitBorderImage(this, important);
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
49358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4936e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
49388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void completeBorderRadii(RefPtr<CSSPrimitiveValue> radii[4])
49410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
49420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (radii[3])
49430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
49440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!radii[2]) {
49450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!radii[1])
49460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1] = radii[0];
49470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        radii[2] = radii[0];
49480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
49490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    radii[3] = radii[1];
49500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
49510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSParser::parseBorderRadius(int propId, bool important)
49530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
49540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    unsigned num = m_valueList->size();
49550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (num > 9)
49560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
49570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4958cad810f21b803229eb11403f9209855525a25d57Steve Block    ShorthandScope scope(this, propId);
49590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<CSSPrimitiveValue> radii[2][4];
49600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    unsigned indexAfterSlash = 0;
49620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (unsigned i = 0; i < num; ++i) {
49630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CSSParserValue* value = m_valueList->valueAt(i);
49640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (value->unit == CSSParserValue::Operator) {
49650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (value->iValue != '/')
49660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
49670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!i || indexAfterSlash || i + 1 == num || num > i + 5)
49690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return false;
49700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            indexAfterSlash = i + 1;
49720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            completeBorderRadii(radii[0]);
49730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
49740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
49750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (i - indexAfterSlash >= 4)
49770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
49780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (!validUnit(value, FLength | FPercent, m_strict))
49800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
49810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
498281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<CSSPrimitiveValue> radius = primitiveValueCache()->createValue(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit));
49830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!indexAfterSlash) {
49850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[0][i] = radius;
49860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2;
49880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (num == 2 && propId == CSSPropertyWebkitBorderRadius) {
49890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                indexAfterSlash = 1;
49900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                completeBorderRadii(radii[0]);
49910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
49920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else
49930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1][i - indexAfterSlash] = radius.release();
49940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
49950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
49960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!indexAfterSlash) {
49970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        completeBorderRadii(radii[0]);
49980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        for (unsigned i = 0; i < 4; ++i)
49990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            radii[1][i] = radii[0][i];
50000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else
50010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        completeBorderRadii(radii[1]);
50020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5003cad810f21b803229eb11403f9209855525a25d57Steve Block    m_implicitShorthand = true;
500481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderTopLeftRadius, primitiveValueCache()->createValue(Pair::create(radii[0][0].release(), radii[1][0].release())), important);
500581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderTopRightRadius, primitiveValueCache()->createValue(Pair::create(radii[0][1].release(), radii[1][1].release())), important);
500681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderBottomRightRadius, primitiveValueCache()->createValue(Pair::create(radii[0][2].release(), radii[1][2].release())), important);
500781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    addProperty(CSSPropertyBorderBottomLeftRadius, primitiveValueCache()->createValue(Pair::create(radii[0][3].release(), radii[1][3].release())), important);
5008cad810f21b803229eb11403f9209855525a25d57Steve Block    m_implicitShorthand = false;
50090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
50100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
50110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseCounter(int propId, int defaultValue, bool important)
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum { ID, VAL } state = ID;
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> counterName;
5018e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* val = m_valueList->current();
50218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (state) {
50228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case ID:
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val && val->unit == CSSPrimitiveValue::CSS_IDENT) {
502481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    counterName = primitiveValueCache()->createValue(val->string, CSSPrimitiveValue::CSS_STRING);
50258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    state = VAL;
50268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
50278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
50288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
50298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
50308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case VAL: {
50318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int i = defaultValue;
50328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (val && val->unit == CSSPrimitiveValue::CSS_NUMBER) {
50332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    i = clampToInteger(val->fValue);
50348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_valueList->next();
50358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
50368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
503781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                list->append(primitiveValueCache()->createValue(Pair::create(counterName.release(),
503881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    primitiveValueCache()->createValue(i, CSSPrimitiveValue::CSS_NUMBER))));
50398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state = ID;
50408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
50418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
50428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
50448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5045e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->length() > 0) {
50478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addProperty(propId, list.release(), important);
50488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
50498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
50528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5054cad810f21b803229eb11403f9209855525a25d57Steve Block// This should go away once we drop support for -webkit-gradient
505581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic PassRefPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CSSParserValue* a, bool horizontal, CSSPrimitiveValueCache* primitiveValueCache)
50568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSPrimitiveValue> result;
50588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a->unit == CSSPrimitiveValue::CSS_IDENT) {
5059cad810f21b803229eb11403f9209855525a25d57Steve Block        if ((equalIgnoringCase(a->string, "left") && horizontal) ||
5060cad810f21b803229eb11403f9209855525a25d57Steve Block            (equalIgnoringCase(a->string, "top") && !horizontal))
506181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(0., CSSPrimitiveValue::CSS_PERCENTAGE);
5062cad810f21b803229eb11403f9209855525a25d57Steve Block        else if ((equalIgnoringCase(a->string, "right") && horizontal) ||
5063cad810f21b803229eb11403f9209855525a25d57Steve Block                 (equalIgnoringCase(a->string, "bottom") && !horizontal))
506481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(100., CSSPrimitiveValue::CSS_PERCENTAGE);
50658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (equalIgnoringCase(a->string, "center"))
506681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            result = primitiveValueCache->createValue(50., CSSPrimitiveValue::CSS_PERCENTAGE);
50678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (a->unit == CSSPrimitiveValue::CSS_NUMBER || a->unit == CSSPrimitiveValue::CSS_PERCENTAGE)
506881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        result = primitiveValueCache->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit);
50698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
50708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5072cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic bool parseDeprecatedGradientColorStop(CSSParser* p, CSSParserValue* a, CSSGradientColorStop& stop)
50738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a->unit != CSSParserValue::Function)
50758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5076e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!equalIgnoringCase(a->function->name, "from(") &&
50788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        !equalIgnoringCase(a->function->name, "to(") &&
50798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        !equalIgnoringCase(a->function->name, "color-stop("))
50808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5081e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = a->function->args.get();
50838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args)
50848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5085e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
5086cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(a->function->name, "from(") ||
5087cad810f21b803229eb11403f9209855525a25d57Steve Block        equalIgnoringCase(a->function->name, "to(")) {
50888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The "from" and "to" stops expect 1 argument.
50898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->size() != 1)
50908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5091e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(a->function->name, "from("))
509381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(0, CSSPrimitiveValue::CSS_NUMBER);
50948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
509581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(1, CSSPrimitiveValue::CSS_NUMBER);
5096e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
50978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = args->current()->id;
50988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
509981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_color = p->primitiveValueCache()->createIdentifierValue(id);
51008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            stop.m_color = p->parseColor(args->current());
51028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!stop.m_color)
51038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
51048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5105e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The "color-stop" function expects 3 arguments.
51078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(a->function->name, "color-stop(")) {
51088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (args->size() != 3)
51098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5110e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* stopArg = args->current();
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (stopArg->unit == CSSPrimitiveValue::CSS_PERCENTAGE)
511381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(stopArg->fValue / 100, CSSPrimitiveValue::CSS_NUMBER);
51148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (stopArg->unit == CSSPrimitiveValue::CSS_NUMBER)
511581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_position = p->primitiveValueCache()->createValue(stopArg->fValue, CSSPrimitiveValue::CSS_NUMBER);
51168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
51188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        stopArg = args->next();
51208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (stopArg->unit != CSSParserValue::Operator || stopArg->iValue != ',')
51218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5122e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        stopArg = args->next();
51248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = stopArg->id;
51258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
512681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            stop.m_color = p->primitiveValueCache()->createIdentifierValue(id);
51278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            stop.m_color = p->parseColor(stopArg);
51298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!stop.m_color)
51308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
51318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
51348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5136cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseDeprecatedGradient(RefPtr<CSSValue>& gradient)
51378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Walk the arguments.
51395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = m_valueList->current()->function->args.get();
51408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args || args->size() == 0)
51418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5142e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The first argument is the gradient type.  It is an identifier.
5144cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSGradientType gradientType;
51458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
51468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSPrimitiveValue::CSS_IDENT)
51478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
51488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringCase(a->string, "linear"))
5149cad810f21b803229eb11403f9209855525a25d57Steve Block        gradientType = CSSLinearGradient;
51508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (equalIgnoringCase(a->string, "radial"))
5151cad810f21b803229eb11403f9209855525a25d57Steve Block        gradientType = CSSRadialGradient;
51528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
51538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5154e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
5155cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSGradientValue> result;
5156cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (gradientType) {
5157cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSLinearGradient:
5158cad810f21b803229eb11403f9209855525a25d57Steve Block            result = CSSLinearGradientValue::create(NonRepeating, true);
5159cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5160cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSRadialGradient:
5161cad810f21b803229eb11403f9209855525a25d57Steve Block            result = CSSRadialGradientValue::create(NonRepeating, true);
5162cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5163cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5164cad810f21b803229eb11403f9209855525a25d57Steve Block
51658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Comma.
51668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
51678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
51688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Next comes the starting point for the gradient as an x y pair.  There is no
51718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // comma between the x and the y values.
51728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First X.  It can be left, right, number or percent.
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
51748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
51758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
517681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<CSSPrimitiveValue> point = parseDeprecatedGradientPoint(a, true, primitiveValueCache());
51778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
51788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setFirstX(point.release());
5180e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First Y.  It can be top, bottom, number or percent.
51828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
51838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
51848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
518581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, false, primitiveValueCache());
51868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setFirstY(point.release());
5189e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Comma after the first point.
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5194e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
51958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For radial gradients only, we now expect a numeric radius.
5196cad810f21b803229eb11403f9209855525a25d57Steve Block    if (gradientType == CSSRadialGradient) {
51978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
51988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSPrimitiveValue::CSS_NUMBER)
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
520081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static_cast<CSSRadialGradientValue*>(result.get())->setFirstRadius(primitiveValueCache()->createValue(a->fValue, CSSPrimitiveValue::CSS_NUMBER));
5201e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Comma after the first radius.
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5207e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Next is the ending point for the gradient as an x, y pair.
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Second X.  It can be left, right, number or percent.
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
521381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, true, primitiveValueCache());
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
52168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setSecondX(point.release());
5217e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Second Y.  It can be top, bottom, number or percent.
52198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
52218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
522281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    point = parseDeprecatedGradientPoint(a, false, primitiveValueCache());
52238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!point)
52248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
52258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setSecondY(point.release());
52268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For radial gradients only, we now expect the second radius.
5228cad810f21b803229eb11403f9209855525a25d57Steve Block    if (gradientType == CSSRadialGradient) {
52298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Comma after the second point.
52308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
52328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5233e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a || a->unit != CSSPrimitiveValue::CSS_NUMBER)
52368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
523781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static_cast<CSSRadialGradientValue*>(result.get())->setSecondRadius(primitiveValueCache()->createValue(a->fValue, CSSPrimitiveValue::CSS_NUMBER));
52388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We now will accept any number of stops (0 or more).
52418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a = args->next();
52428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (a) {
52438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Look for the comma before the next stop.
52448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
52458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5246e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now examine the stop itself.
52488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!a)
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
5251e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The function name needs to be one of "from", "to", or "color-stop."
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSGradientColorStop stop;
5254cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!parseDeprecatedGradientColorStop(this, a, stop))
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->addStop(stop);
5257e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Advance
52598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        a = args->next();
52608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5261e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
52628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gradient = result.release();
52638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
52648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
526681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic PassRefPtr<CSSPrimitiveValue> valueFromSideKeyword(CSSParserValue* a, bool& isHorizontal, CSSPrimitiveValueCache* primitiveValueCache)
5267cad810f21b803229eb11403f9209855525a25d57Steve Block{
5268cad810f21b803229eb11403f9209855525a25d57Steve Block    if (a->unit != CSSPrimitiveValue::CSS_IDENT)
5269cad810f21b803229eb11403f9209855525a25d57Steve Block        return 0;
5270cad810f21b803229eb11403f9209855525a25d57Steve Block
5271cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (a->id) {
5272cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueLeft:
5273cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueRight:
5274cad810f21b803229eb11403f9209855525a25d57Steve Block            isHorizontal = true;
5275cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5276cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueTop:
5277cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueBottom:
5278cad810f21b803229eb11403f9209855525a25d57Steve Block            isHorizontal = false;
5279cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5280cad810f21b803229eb11403f9209855525a25d57Steve Block        default:
5281cad810f21b803229eb11403f9209855525a25d57Steve Block            return 0;
5282cad810f21b803229eb11403f9209855525a25d57Steve Block    }
528381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return primitiveValueCache->createIdentifierValue(a->id);
5284cad810f21b803229eb11403f9209855525a25d57Steve Block}
5285cad810f21b803229eb11403f9209855525a25d57Steve Block
5286cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic PassRefPtr<CSSPrimitiveValue> parseGradientColorOrKeyword(CSSParser* p, CSSParserValue* value)
5287cad810f21b803229eb11403f9209855525a25d57Steve Block{
5288cad810f21b803229eb11403f9209855525a25d57Steve Block    int id = value->id;
5289cad810f21b803229eb11403f9209855525a25d57Steve Block    if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
529081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return p->primitiveValueCache()->createIdentifierValue(id);
5291cad810f21b803229eb11403f9209855525a25d57Steve Block
5292cad810f21b803229eb11403f9209855525a25d57Steve Block    return p->parseColor(value);
5293cad810f21b803229eb11403f9209855525a25d57Steve Block}
5294cad810f21b803229eb11403f9209855525a25d57Steve Block
5295cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseLinearGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
5296cad810f21b803229eb11403f9209855525a25d57Steve Block{
5297cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repeating);
5298cad810f21b803229eb11403f9209855525a25d57Steve Block
5299cad810f21b803229eb11403f9209855525a25d57Steve Block    // Walk the arguments.
5300cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValueList* args = m_valueList->current()->function->args.get();
5301cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!args || !args->size())
5302cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5303cad810f21b803229eb11403f9209855525a25d57Steve Block
5304cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* a = args->current();
5305cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!a)
5306cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5307cad810f21b803229eb11403f9209855525a25d57Steve Block
5308cad810f21b803229eb11403f9209855525a25d57Steve Block    bool expectComma = false;
5309cad810f21b803229eb11403f9209855525a25d57Steve Block    // Look for angle.
5310cad810f21b803229eb11403f9209855525a25d57Steve Block    if (validUnit(a, FAngle, true)) {
531181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        result->setAngle(primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit));
5312cad810f21b803229eb11403f9209855525a25d57Steve Block
5313cad810f21b803229eb11403f9209855525a25d57Steve Block        a = args->next();
5314cad810f21b803229eb11403f9209855525a25d57Steve Block        expectComma = true;
5315cad810f21b803229eb11403f9209855525a25d57Steve Block    } else {
5316cad810f21b803229eb11403f9209855525a25d57Steve Block        // Look one or two optional keywords that indicate a side or corner.
5317cad810f21b803229eb11403f9209855525a25d57Steve Block        RefPtr<CSSPrimitiveValue> startX, startY;
5318cad810f21b803229eb11403f9209855525a25d57Steve Block
5319cad810f21b803229eb11403f9209855525a25d57Steve Block        RefPtr<CSSPrimitiveValue> location;
5320cad810f21b803229eb11403f9209855525a25d57Steve Block        bool isHorizontal = false;
532181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if ((location = valueFromSideKeyword(a, isHorizontal, primitiveValueCache()))) {
5322cad810f21b803229eb11403f9209855525a25d57Steve Block            if (isHorizontal)
5323cad810f21b803229eb11403f9209855525a25d57Steve Block                startX = location;
5324cad810f21b803229eb11403f9209855525a25d57Steve Block            else
5325cad810f21b803229eb11403f9209855525a25d57Steve Block                startY = location;
5326cad810f21b803229eb11403f9209855525a25d57Steve Block
5327cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5328cad810f21b803229eb11403f9209855525a25d57Steve Block            if (a) {
532981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if ((location = valueFromSideKeyword(a, isHorizontal, primitiveValueCache()))) {
5330cad810f21b803229eb11403f9209855525a25d57Steve Block                    if (isHorizontal) {
5331cad810f21b803229eb11403f9209855525a25d57Steve Block                        if (startX)
5332cad810f21b803229eb11403f9209855525a25d57Steve Block                            return false;
5333cad810f21b803229eb11403f9209855525a25d57Steve Block                        startX = location;
5334cad810f21b803229eb11403f9209855525a25d57Steve Block                    } else {
5335cad810f21b803229eb11403f9209855525a25d57Steve Block                        if (startY)
5336cad810f21b803229eb11403f9209855525a25d57Steve Block                            return false;
5337cad810f21b803229eb11403f9209855525a25d57Steve Block                        startY = location;
5338cad810f21b803229eb11403f9209855525a25d57Steve Block                    }
5339cad810f21b803229eb11403f9209855525a25d57Steve Block
5340cad810f21b803229eb11403f9209855525a25d57Steve Block                    a = args->next();
5341cad810f21b803229eb11403f9209855525a25d57Steve Block                }
5342cad810f21b803229eb11403f9209855525a25d57Steve Block            }
5343cad810f21b803229eb11403f9209855525a25d57Steve Block
5344cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5345cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5346cad810f21b803229eb11403f9209855525a25d57Steve Block
5347cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!startX && !startY)
534881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            startY = primitiveValueCache()->createIdentifierValue(CSSValueTop);
5349cad810f21b803229eb11403f9209855525a25d57Steve Block
5350cad810f21b803229eb11403f9209855525a25d57Steve Block        result->setFirstX(startX.release());
5351cad810f21b803229eb11403f9209855525a25d57Steve Block        result->setFirstY(startY.release());
5352cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5353cad810f21b803229eb11403f9209855525a25d57Steve Block
535465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parseGradientColorStops(args, result.get(), expectComma))
535565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
5356cad810f21b803229eb11403f9209855525a25d57Steve Block
5357cad810f21b803229eb11403f9209855525a25d57Steve Block    Vector<CSSGradientColorStop>& stops = result->stops();
5358cad810f21b803229eb11403f9209855525a25d57Steve Block    if (stops.isEmpty())
5359cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5360cad810f21b803229eb11403f9209855525a25d57Steve Block
5361cad810f21b803229eb11403f9209855525a25d57Steve Block    gradient = result.release();
5362cad810f21b803229eb11403f9209855525a25d57Steve Block    return true;
5363cad810f21b803229eb11403f9209855525a25d57Steve Block}
5364cad810f21b803229eb11403f9209855525a25d57Steve Block
5365cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseRadialGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
5366cad810f21b803229eb11403f9209855525a25d57Steve Block{
5367cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating);
5368cad810f21b803229eb11403f9209855525a25d57Steve Block
5369cad810f21b803229eb11403f9209855525a25d57Steve Block    // Walk the arguments.
5370cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValueList* args = m_valueList->current()->function->args.get();
5371cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!args || !args->size())
5372cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5373cad810f21b803229eb11403f9209855525a25d57Steve Block
5374cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* a = args->current();
5375cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!a)
5376cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5377cad810f21b803229eb11403f9209855525a25d57Steve Block
5378cad810f21b803229eb11403f9209855525a25d57Steve Block    bool expectComma = false;
5379cad810f21b803229eb11403f9209855525a25d57Steve Block
5380cad810f21b803229eb11403f9209855525a25d57Steve Block    // Optional background-position
5381cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSValue> centerX;
5382cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSValue> centerY;
5383cad810f21b803229eb11403f9209855525a25d57Steve Block    // parseFillPosition advances the args next pointer.
5384cad810f21b803229eb11403f9209855525a25d57Steve Block    parseFillPosition(args, centerX, centerY);
5385cad810f21b803229eb11403f9209855525a25d57Steve Block    a = args->current();
538665f5521b69d0cfd5e011e73412b6c69ffcf0a897Steve Block    if (!a)
538765f5521b69d0cfd5e011e73412b6c69ffcf0a897Steve Block        return false;
5388cad810f21b803229eb11403f9209855525a25d57Steve Block
5389cad810f21b803229eb11403f9209855525a25d57Steve Block    if (centerX || centerY) {
5390cad810f21b803229eb11403f9209855525a25d57Steve Block        // Comma
5391cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
5392cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5393cad810f21b803229eb11403f9209855525a25d57Steve Block
5394cad810f21b803229eb11403f9209855525a25d57Steve Block        a = args->next();
5395cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!a)
5396cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5397cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5398cad810f21b803229eb11403f9209855525a25d57Steve Block
5399cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!centerX || centerX->isPrimitiveValue());
5400cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!centerY || centerY->isPrimitiveValue());
5401cad810f21b803229eb11403f9209855525a25d57Steve Block
5402cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setFirstX(static_cast<CSSPrimitiveValue*>(centerX.get()));
5403cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSecondX(static_cast<CSSPrimitiveValue*>(centerX.get()));
5404cad810f21b803229eb11403f9209855525a25d57Steve Block    // CSS3 radial gradients always share the same start and end point.
5405cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setFirstY(static_cast<CSSPrimitiveValue*>(centerY.get()));
5406cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSecondY(static_cast<CSSPrimitiveValue*>(centerY.get()));
5407cad810f21b803229eb11403f9209855525a25d57Steve Block
5408cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> shapeValue;
5409cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> sizeValue;
5410cad810f21b803229eb11403f9209855525a25d57Steve Block
5411cad810f21b803229eb11403f9209855525a25d57Steve Block    // Optional shape and/or size in any order.
5412cad810f21b803229eb11403f9209855525a25d57Steve Block    for (int i = 0; i < 2; ++i) {
5413cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a->unit != CSSPrimitiveValue::CSS_IDENT)
5414cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5415cad810f21b803229eb11403f9209855525a25d57Steve Block
5416cad810f21b803229eb11403f9209855525a25d57Steve Block        bool foundValue = false;
5417cad810f21b803229eb11403f9209855525a25d57Steve Block        switch (a->id) {
5418cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueCircle:
5419cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueEllipse:
542081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            shapeValue = primitiveValueCache()->createIdentifierValue(a->id);
5421cad810f21b803229eb11403f9209855525a25d57Steve Block            foundValue = true;
5422cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5423cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueClosestSide:
5424cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueClosestCorner:
5425cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueFarthestSide:
5426cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueFarthestCorner:
5427cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueContain:
5428cad810f21b803229eb11403f9209855525a25d57Steve Block        case CSSValueCover:
542981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            sizeValue = primitiveValueCache()->createIdentifierValue(a->id);
5430cad810f21b803229eb11403f9209855525a25d57Steve Block            foundValue = true;
5431cad810f21b803229eb11403f9209855525a25d57Steve Block            break;
5432cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5433cad810f21b803229eb11403f9209855525a25d57Steve Block
5434cad810f21b803229eb11403f9209855525a25d57Steve Block        if (foundValue) {
5435cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5436cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5437cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5438cad810f21b803229eb11403f9209855525a25d57Steve Block
5439cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5440cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5441cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5442cad810f21b803229eb11403f9209855525a25d57Steve Block
5443cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setShape(shapeValue);
5444cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setSizingBehavior(sizeValue);
5445cad810f21b803229eb11403f9209855525a25d57Steve Block
5446cad810f21b803229eb11403f9209855525a25d57Steve Block    // Or, two lengths or percentages
5447cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> horizontalSize;
5448cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<CSSPrimitiveValue> verticalSize;
5449cad810f21b803229eb11403f9209855525a25d57Steve Block
5450cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!shapeValue && !sizeValue) {
5451cad810f21b803229eb11403f9209855525a25d57Steve Block        if (validUnit(a, FLength | FPercent, m_strict)) {
545281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            horizontalSize = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
5453cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5454cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5455cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5456cad810f21b803229eb11403f9209855525a25d57Steve Block
5457cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5458cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5459cad810f21b803229eb11403f9209855525a25d57Steve Block
5460cad810f21b803229eb11403f9209855525a25d57Steve Block        if (validUnit(a, FLength | FPercent, m_strict)) {
546181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            verticalSize = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit);
5462cad810f21b803229eb11403f9209855525a25d57Steve Block
5463cad810f21b803229eb11403f9209855525a25d57Steve Block            a = args->next();
5464cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5465cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5466cad810f21b803229eb11403f9209855525a25d57Steve Block            expectComma = true;
5467cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5468cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5469cad810f21b803229eb11403f9209855525a25d57Steve Block
5470cad810f21b803229eb11403f9209855525a25d57Steve Block    // Must have neither or both.
5471cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!horizontalSize != !verticalSize)
5472cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5473cad810f21b803229eb11403f9209855525a25d57Steve Block
5474cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setEndHorizontalSize(horizontalSize);
5475cad810f21b803229eb11403f9209855525a25d57Steve Block    result->setEndVerticalSize(verticalSize);
5476cad810f21b803229eb11403f9209855525a25d57Steve Block
547765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parseGradientColorStops(args, result.get(), expectComma))
547865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
547965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
548065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gradient = result.release();
548165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
548265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
548365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
548465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool CSSParser::parseGradientColorStops(CSSParserValueList* valueList, CSSGradientValue* gradient, bool expectComma)
548565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
548665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CSSParserValue* a = valueList->current();
548765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
548865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now look for color stops.
5489cad810f21b803229eb11403f9209855525a25d57Steve Block    while (a) {
5490cad810f21b803229eb11403f9209855525a25d57Steve Block        // Look for the comma before the next stop.
5491cad810f21b803229eb11403f9209855525a25d57Steve Block        if (expectComma) {
5492cad810f21b803229eb11403f9209855525a25d57Steve Block            if (a->unit != CSSParserValue::Operator || a->iValue != ',')
5493cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5494cad810f21b803229eb11403f9209855525a25d57Steve Block
549565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            a = valueList->next();
5496cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!a)
5497cad810f21b803229eb11403f9209855525a25d57Steve Block                return false;
5498cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5499cad810f21b803229eb11403f9209855525a25d57Steve Block
5500cad810f21b803229eb11403f9209855525a25d57Steve Block        // <color-stop> = <color> [ <percentage> | <length> ]?
5501cad810f21b803229eb11403f9209855525a25d57Steve Block        CSSGradientColorStop stop;
5502cad810f21b803229eb11403f9209855525a25d57Steve Block        stop.m_color = parseGradientColorOrKeyword(this, a);
5503cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!stop.m_color)
5504cad810f21b803229eb11403f9209855525a25d57Steve Block            return false;
5505cad810f21b803229eb11403f9209855525a25d57Steve Block
550665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        a = valueList->next();
5507cad810f21b803229eb11403f9209855525a25d57Steve Block        if (a) {
5508cad810f21b803229eb11403f9209855525a25d57Steve Block            if (validUnit(a, FLength | FPercent, m_strict)) {
550981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                stop.m_position = primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes)a->unit);
551065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                a = valueList->next();
5511cad810f21b803229eb11403f9209855525a25d57Steve Block            }
5512cad810f21b803229eb11403f9209855525a25d57Steve Block        }
5513cad810f21b803229eb11403f9209855525a25d57Steve Block
551465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        gradient->addStop(stop);
5515cad810f21b803229eb11403f9209855525a25d57Steve Block        expectComma = true;
5516cad810f21b803229eb11403f9209855525a25d57Steve Block    }
5517cad810f21b803229eb11403f9209855525a25d57Steve Block
551865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Must have 2 or more stops to be valid.
551965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return gradient->stops().size() > 1;
5520cad810f21b803229eb11403f9209855525a25d57Steve Block}
5521cad810f21b803229eb11403f9209855525a25d57Steve Block
5522cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::isGeneratedImageValue(CSSParserValue* val) const
5523cad810f21b803229eb11403f9209855525a25d57Steve Block{
5524cad810f21b803229eb11403f9209855525a25d57Steve Block    if (val->unit != CSSParserValue::Function)
5525cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5526cad810f21b803229eb11403f9209855525a25d57Steve Block
5527cad810f21b803229eb11403f9209855525a25d57Steve Block    return equalIgnoringCase(val->function->name, "-webkit-gradient(")
5528cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-linear-gradient(")
5529cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient(")
5530cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-radial-gradient(")
5531cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient(")
5532cad810f21b803229eb11403f9209855525a25d57Steve Block        || equalIgnoringCase(val->function->name, "-webkit-canvas(");
5533cad810f21b803229eb11403f9209855525a25d57Steve Block}
5534cad810f21b803229eb11403f9209855525a25d57Steve Block
5535cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSParser::parseGeneratedImage(RefPtr<CSSValue>& value)
5536cad810f21b803229eb11403f9209855525a25d57Steve Block{
5537cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSParserValue* val = m_valueList->current();
5538cad810f21b803229eb11403f9209855525a25d57Steve Block
5539cad810f21b803229eb11403f9209855525a25d57Steve Block    if (val->unit != CSSParserValue::Function)
5540cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
5541cad810f21b803229eb11403f9209855525a25d57Steve Block
5542cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-gradient("))
5543cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseDeprecatedGradient(value);
5544cad810f21b803229eb11403f9209855525a25d57Steve Block
5545cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-linear-gradient("))
5546cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseLinearGradient(value, NonRepeating);
5547cad810f21b803229eb11403f9209855525a25d57Steve Block
5548cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient("))
5549cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseLinearGradient(value, Repeating);
5550cad810f21b803229eb11403f9209855525a25d57Steve Block
5551cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-radial-gradient("))
5552cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseRadialGradient(value, NonRepeating);
5553cad810f21b803229eb11403f9209855525a25d57Steve Block
5554cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient("))
5555cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseRadialGradient(value, Repeating);
5556cad810f21b803229eb11403f9209855525a25d57Steve Block
5557cad810f21b803229eb11403f9209855525a25d57Steve Block    if (equalIgnoringCase(val->function->name, "-webkit-canvas("))
5558cad810f21b803229eb11403f9209855525a25d57Steve Block        return parseCanvas(value);
5559cad810f21b803229eb11403f9209855525a25d57Steve Block
5560cad810f21b803229eb11403f9209855525a25d57Steve Block    return false;
5561cad810f21b803229eb11403f9209855525a25d57Steve Block}
5562cad810f21b803229eb11403f9209855525a25d57Steve Block
55638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSParser::parseCanvas(RefPtr<CSSValue>& canvas)
55648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
55658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSCanvasValue> result = CSSCanvasValue::create();
5566e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
55678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Walk the arguments.
55685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CSSParserValueList* args = m_valueList->current()->function->args.get();
55698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!args || args->size() != 1)
55708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5571e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
55728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The first argument is the canvas name.  It is an identifier.
55738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* a = args->current();
55748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a || a->unit != CSSPrimitiveValue::CSS_IDENT)
55758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
55768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result->setName(a->string);
55778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    canvas = result;
55788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
55798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
55808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass TransformOperationInfo {
55828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
55838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TransformOperationInfo(const CSSParserString& name)
55848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(WebKitCSSTransformValue::UnknownTransformOperation)
55858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_argCount(1)
55868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_allowSingleArgument(false)
55878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_unit(CSSParser::FUnknown)
55888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
55898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (equalIgnoringCase(name, "scale(") || equalIgnoringCase(name, "scalex(") || equalIgnoringCase(name, "scaley(") || equalIgnoringCase(name, "scalez(")) {
55908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FNumber;
55918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "scale("))
55928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleTransformOperation;
55938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "scalex("))
55948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleXTransformOperation;
55958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "scaley("))
55968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::ScaleYTransformOperation;
55978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
55988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::ScaleZTransformOperation;
55998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "scale3d(")) {
56008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Scale3DTransformOperation;
56018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 5;
56028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
56038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "rotate(")) {
56048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = WebKitCSSTransformValue::RotateTransformOperation;
56058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FAngle;
56068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "rotatex(") ||
56078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                   equalIgnoringCase(name, "rotatey(") ||
56088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                   equalIgnoringCase(name, "rotatez(")) {
56098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FAngle;
56108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (equalIgnoringCase(name, "rotatex("))
56118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateXTransformOperation;
56128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "rotatey("))
56138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateYTransformOperation;
56148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
56158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::RotateZTransformOperation;
56168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "rotate3d(")) {
56178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Rotate3DTransformOperation;
56188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 7;
56198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
56208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "skew(") || equalIgnoringCase(name, "skewx(") || equalIgnoringCase(name, "skewy(")) {
56218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FAngle;
56228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "skew("))
56238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewTransformOperation;
56248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "skewx("))
56258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewXTransformOperation;
56268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
56278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::SkewYTransformOperation;
56288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "translate(") || equalIgnoringCase(name, "translatex(") || equalIgnoringCase(name, "translatey(") || equalIgnoringCase(name, "translatez(")) {
56298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FLength | CSSParser::FPercent;
56308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(name, "translate("))
56318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateTransformOperation;
56328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(name, "translatex("))
56338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateXTransformOperation;
56348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (equalIgnoringCase(name, "translatey("))
56358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_type = WebKitCSSTransformValue::TranslateYTransformOperation;
56368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else
56378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_type = WebKitCSSTransformValue::TranslateZTransformOperation;
56388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "translate3d(")) {
56398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Translate3DTransformOperation;
56408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 5;
56418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FLength | CSSParser::FPercent;
56428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (equalIgnoringCase(name, "matrix(")) {
56438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = WebKitCSSTransformValue::MatrixTransformOperation;
56448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_argCount = 11;
56458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_unit = CSSParser::FNumber;
56468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "matrix3d(")) {
56478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::Matrix3DTransformOperation;
56488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_argCount = 31;
56498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
56508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (equalIgnoringCase(name, "perspective(")) {
56518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_type = WebKitCSSTransformValue::PerspectiveTransformOperation;
56528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_unit = CSSParser::FNumber;
56538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
56558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalIgnoringCase(name, "scale(") || equalIgnoringCase(name, "skew(") || equalIgnoringCase(name, "translate(")) {
56568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_allowSingleArgument = true;
56578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_argCount = 3;
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5660e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSTransformValue::TransformOperationType type() const { return m_type; }
56628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned argCount() const { return m_argCount; }
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser::Units unit() const { return m_unit; }
56648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool unknown() const { return m_type == WebKitCSSTransformValue::UnknownTransformOperation; }
56668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasCorrectArgCount(unsigned argCount) { return m_argCount == argCount || (m_allowSingleArgument && argCount == 1); }
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
56698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSTransformValue::TransformOperationType m_type;
56708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_argCount;
56718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_allowSingleArgument;
56728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParser::Units m_unit;
56738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
56748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSValueList> CSSParser::parseTransform()
56768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
56778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_valueList)
56788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
56798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The transform is a list of functional primitives that specify transform operations.
56818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We collect a list of WebKitCSSTransformValues, where each value specifies a single operation.
56828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
56838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
56848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->unit != CSSParserValue::Function || !value->function)
56858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5686e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Every primitive requires at least one argument.
56885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSParserValueList* args = value->function->args.get();
56898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!args)
56908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5691e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // See if the specified primitive is one we understand.
56938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TransformOperationInfo info(value->function->name);
56948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (info.unknown())
56958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
5696e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
56978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!info.hasCorrectArgCount(args->size()))
56988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
56998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Create the new WebKitCSSTransformValue for this operation and add it to our list.
57018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<WebKitCSSTransformValue> transformValue = WebKitCSSTransformValue::create(info.type());
57028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(transformValue);
57038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Snag our values.
57058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserValue* a = args->current();
57068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned argNumber = 0;
57078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (a) {
57088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSParser::Units unit = info.unit();
57098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (info.type() == WebKitCSSTransformValue::Rotate3DTransformOperation && argNumber == 3) {
5711f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 4th param of rotate3d() is an angle rather than a bare number, validate it as such
57128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!validUnit(a, FAngle, true))
57138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return 0;
5714f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            } else if (info.type() == WebKitCSSTransformValue::Translate3DTransformOperation && argNumber == 2) {
5715f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 3rd param of translate3d() cannot be a percentage
5716f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (!validUnit(a, FLength, true))
5717f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    return 0;
5718f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            } else if (info.type() == WebKitCSSTransformValue::TranslateZTransformOperation && argNumber == 0) {
5719f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                // 1st param of translateZ() cannot be a percentage
5720f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (!validUnit(a, FLength, true))
5721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    return 0;
57222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            } else if (info.type() == WebKitCSSTransformValue::PerspectiveTransformOperation && argNumber == 0) {
57232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                // 1st param of perspective() must be a non-negative number (deprecated) or length.
57242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (!validUnit(a, FNumber | FLength | FNonNeg, true))
57252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    return 0;
57268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (!validUnit(a, unit, true))
57278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
5728e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Add the value to the current transform operation.
573081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            transformValue->append(primitiveValueCache()->createValue(a->fValue, (CSSPrimitiveValue::UnitTypes) a->unit));
57318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            a = args->next();
57338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
57348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
57358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (a->unit != CSSParserValue::Operator || a->iValue != ',')
57368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
57378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            a = args->next();
5738e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argNumber++;
57408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5742e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list.release();
57448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSParser::parseTransformOrigin(int propId, int& propId1, int& propId2, int& propId3, RefPtr<CSSValue>& value, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)
57478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId1 = propId;
57498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    propId2 = propId;
57508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId3 = propId;
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propId == CSSPropertyWebkitTransformOrigin) {
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId1 = CSSPropertyWebkitTransformOriginX;
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        propId2 = CSSPropertyWebkitTransformOriginY;
57548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId3 = CSSPropertyWebkitTransformOriginZ;
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (propId) {
57588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOrigin:
57594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!parseTransformOriginShorthand(value, value2, value3))
57604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                return false;
57618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            // parseTransformOriginShorthand advances the m_valueList pointer
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOriginX: {
57642bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionX(m_valueList);
57658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value)
57668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
57678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
57688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitTransformOriginY: {
57702bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionY(m_valueList);
57718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value)
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_valueList->next();
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
57748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitTransformOriginZ: {
57768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (validUnit(m_valueList->current(), FLength, m_strict))
577781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                value = primitiveValueCache()->createValue(m_valueList->current()->fValue, (CSSPrimitiveValue::UnitTypes)m_valueList->current()->unit);
57788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
57798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
57808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
57818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
57828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
5783e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
57848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return value;
57858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
57868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
57878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSParser::parsePerspectiveOrigin(int propId, int& propId1, int& propId2, RefPtr<CSSValue>& value, RefPtr<CSSValue>& value2)
57888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
57898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId1 = propId;
57908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    propId2 = propId;
57918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (propId == CSSPropertyWebkitPerspectiveOrigin) {
57928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId1 = CSSPropertyWebkitPerspectiveOriginX;
57938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        propId2 = CSSPropertyWebkitPerspectiveOriginY;
57948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
57968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    switch (propId) {
57978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOrigin:
5798cad810f21b803229eb11403f9209855525a25d57Steve Block            parseFillPosition(m_valueList, value, value2);
57998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOriginX: {
58012bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionX(m_valueList);
58028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
58038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
58048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
58068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case CSSPropertyWebkitPerspectiveOriginY: {
58072bde8e466a4451c7319e3a072d118917957d6554Steve Block            value = parseFillPositionY(m_valueList);
58088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (value)
58098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_valueList->next();
58108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
58118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
58128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5813e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
58148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value;
58158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5817f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool CSSParser::parseTextEmphasisStyle(bool important)
5818f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
5819f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    unsigned valueListSize = m_valueList->size();
5820f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5821f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSPrimitiveValue> fill;
5822f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSPrimitiveValue> shape;
5823f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5824f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
5825f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->unit == CSSPrimitiveValue::CSS_STRING) {
5826f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill || shape || (valueListSize != 1 && !inShorthand()))
5827f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
582881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            addProperty(CSSPropertyWebkitTextEmphasisStyle, primitiveValueCache()->createValue(value->string, CSSPrimitiveValue::CSS_STRING), important);
5829f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_valueList->next();
5830f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return true;
5831f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
5832f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5833f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->id == CSSValueNone) {
5834f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill || shape || (valueListSize != 1 && !inShorthand()))
5835f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
583681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            addProperty(CSSPropertyWebkitTextEmphasisStyle, primitiveValueCache()->createIdentifierValue(CSSValueNone), important);
5837f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_valueList->next();
5838f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return true;
5839f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
5840f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5841f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (value->id == CSSValueOpen || value->id == CSSValueFilled) {
5842f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (fill)
5843f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
584481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            fill = primitiveValueCache()->createIdentifierValue(value->id);
5845f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        } else if (value->id == CSSValueDot || value->id == CSSValueCircle || value->id == CSSValueDoubleCircle || value->id == CSSValueTriangle || value->id == CSSValueSesame) {
5846f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (shape)
5847f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return false;
584881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            shape = primitiveValueCache()->createIdentifierValue(value->id);
5849f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        } else if (!inShorthand())
5850f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return false;
5851f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else
5852f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
5853f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5854f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5855f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (fill && shape) {
5856f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
5857f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        parsedValues->append(fill.release());
5858f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        parsedValues->append(shape.release());
5859f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, parsedValues.release(), important);
5860f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5861f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5862f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (fill) {
5863f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, fill.release(), important);
5864f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5865f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5866f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (shape) {
5867f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addProperty(CSSPropertyWebkitTextEmphasisStyle, shape.release(), important);
5868f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
5869f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
5870f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5871f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
5872f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
5873f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
58742bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool CSSParser::parseLineBoxContain(bool important)
58752bde8e466a4451c7319e3a072d118917957d6554Steve Block{
58762bde8e466a4451c7319e3a072d118917957d6554Steve Block    LineBoxContain lineBoxContain = LineBoxContainNone;
58772bde8e466a4451c7319e3a072d118917957d6554Steve Block
58782bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
58792bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (value->id == CSSValueBlock) {
58802bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainBlock)
58812bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
58822bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainBlock;
58832bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueInline) {
58842bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainInline)
58852bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
58862bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainInline;
58872bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueFont) {
58882bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainFont)
58892bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
58902bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainFont;
58912bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueGlyphs) {
58922bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainGlyphs)
58932bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
58942bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainGlyphs;
58952bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueReplaced) {
58962bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainReplaced)
58972bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
58982bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainReplaced;
58992bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (value->id == CSSValueInlineBox) {
59002bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (lineBoxContain & LineBoxContainInlineBox)
59012bde8e466a4451c7319e3a072d118917957d6554Steve Block                return false;
59022bde8e466a4451c7319e3a072d118917957d6554Steve Block            lineBoxContain |= LineBoxContainInlineBox;
59032bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else
59042bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
59052bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
59062bde8e466a4451c7319e3a072d118917957d6554Steve Block
59072bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!lineBoxContain)
59082bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
59092bde8e466a4451c7319e3a072d118917957d6554Steve Block
59102bde8e466a4451c7319e3a072d118917957d6554Steve Block    addProperty(CSSPropertyWebkitLineBoxContain, CSSLineBoxContainValue::create(lineBoxContain), important);
59112bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
59122bde8e466a4451c7319e3a072d118917957d6554Steve Block}
59132bde8e466a4451c7319e3a072d118917957d6554Steve Block
59148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline int yyerror(const char*) { return 1; }
59158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define END_TOKEN 0
59178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSGrammar.h"
59198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint CSSParser::lex(void* yylvalWithoutType)
59218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    YYSTYPE* yylval = static_cast<YYSTYPE*>(yylvalWithoutType);
59238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length;
5924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5925643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    lex();
5926643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
59278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* t = text(&length);
59288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5929643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (token()) {
59308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WHITESPACE:
59318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case SGML_CD:
59328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INCLUDES:
59338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DASHMATCH:
59348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
59358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case URI:
59378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case STRING:
59388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDENT:
59398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NTH:
59408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case HEX:
59418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDSEL:
59428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DIMEN:
59438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case UNICODERANGE:
59448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FUNCTION:
59452bde8e466a4451c7319e3a072d118917957d6554Steve Block    case ANYFUNCTION:
59468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NOTFUNCTION:
5947d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch    case CALCFUNCTION:
5948d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch    case MINFUNCTION:
5949d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch    case MAXFUNCTION:
59508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->string.characters = t;
59518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->string.length = length;
59528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
59538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IMPORT_SYM:
59558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PAGE_SYM:
59568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MEDIA_SYM:
59578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FONT_FACE_SYM:
59588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CHARSET_SYM:
59598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NAMESPACE_SYM:
59608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WEBKIT_KEYFRAMES_SYM:
59618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IMPORTANT_SYM:
59638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
59648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case QEMS:
59668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
59678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case GRADS:
5968635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case TURNS:
59698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
59708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case DEGS:
59718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case RADS:
59724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    case KHERTZ:
59730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case REMS:
59748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
59758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MSECS:
59764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    case HERTZ:
59778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case EMS:
59788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case EXS:
59798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PXS:
59808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CMS:
59818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MMS:
59828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INS:
59838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PTS:
59848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PCS:
59858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
59868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case SECS:
59878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PERCENTAGE:
59888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        length--;
59898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case FLOATTOKEN:
59908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case INTEGER:
59918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yylval->number = charactersToDouble(t, length);
59928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
59938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
59958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
59968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
59978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5998643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return token();
59998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6001643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CSSParser::recheckAtKeyword(const UChar* str, int len)
6002643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6003643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String ruleName(str, len);
6004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (equalIgnoringCase(ruleName, "@import"))
6005643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = IMPORT_SYM;
6006643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@page"))
6007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = PAGE_SYM;
6008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@media"))
6009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = MEDIA_SYM;
6010643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@font-face"))
6011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = FONT_FACE_SYM;
6012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@charset"))
6013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = CHARSET_SYM;
6014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@namespace"))
6015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = NAMESPACE_SYM;
6016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@-webkit-keyframes"))
6017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = WEBKIT_KEYFRAMES_SYM;
6018643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (equalIgnoringCase(ruleName, "@-webkit-mediaquery"))
6019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        yyTok = WEBKIT_MEDIAQUERY_SYM;
6020643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
6021643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
60228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUChar* CSSParser::text(int *length)
60238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* start = yytext;
60258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int l = yyleng;
60260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (yyTok) {
60278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case STRING:
60288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l--;
60298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nobreak */
60308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case HEX:
60318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case IDSEL:
60328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        start++;
60338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l--;
60348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case URI:
60368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "url("{w}{string}{w}")"
60378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "url("{w}{url}{w}")"
60388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // strip "url(" and ")"
60398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        start += 4;
60408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l -= 5;
60418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // strip {w}
6042a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        while (l && isHTMLSpace(*start)) {
60430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ++start;
60440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            --l;
60458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6046a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        while (l && isHTMLSpace(start[l - 1]))
60470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            --l;
60480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (l && (*start == '"' || *start == '\'')) {
60490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ASSERT(l >= 2 && start[l - 1] == *start);
60500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ++start;
60510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l -= 2;
60528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
60538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
60558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
60568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // process escapes
60598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* out = start;
60608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* escape = 0;
60618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6062643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool sawEscape = false;
6063643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
60648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < l; i++) {
60658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar* current = start + i;
60668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape == current - 1) {
60670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (isASCIIHexDigit(*current))
60688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
60698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (yyTok == STRING &&
60708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 (*current == '\n' || *current == '\r' || *current == '\f')) {
60718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // ### handle \r\n case
60728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (*current != '\r')
60738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    escape = 0;
60748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
60758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
60768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // in all other cases copy the char to output
60778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ###
60788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *out++ = *current;
60798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
60808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
60818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
60828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape == current - 2 && yyTok == STRING &&
60838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             *(current-1) == '\r' && *current == '\n') {
60848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
60858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
60868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
60870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (escape > current - 7 && isASCIIHexDigit(*current))
60888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
60898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (escape) {
60908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // add escaped char
60918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned uc = 0;
60928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape++;
60938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (escape < current) {
60948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                uc *= 16;
60950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                uc += toASCIIHexValue(*escape);
60968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                escape++;
60978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
60988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // can't handle chars outside ucs2
60998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (uc > 0xffff)
61008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                uc = 0xfffd;
61018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *out++ = uc;
61028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = 0;
6103a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (isHTMLSpace(*current))
61048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
61058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!escape && *current == '\\') {
61078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape = current;
6108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            sawEscape = true;
61098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
61108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *out++ = *current;
61128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (escape) {
61148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // add escaped char
61158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned uc = 0;
61168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        escape++;
61178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (escape < start+l) {
61188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uc *= 16;
61190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uc += toASCIIHexValue(*escape);
61208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            escape++;
61218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
61228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // can't handle chars outside ucs2
61238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (uc > 0xffff)
61248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uc = 0xfffd;
61258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *out++ = uc;
61268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
61288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *length = out - start;
6129e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
6130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If we have an unrecognized @-keyword, and if we handled any escapes at all, then
6131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // we should attempt to adjust yyTok to the correct type.
6132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (yyTok == ATKEYWORD && sawEscape)
6133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        recheckAtKeyword(start, *length);
6134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
61358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return start;
61368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSParser::countLines()
6139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (UChar* current = yytext; current < yytext + yyleng; ++current) {
6141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (*current == '\n')
6142e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ++m_lineNumber;
6143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSParserSelector* CSSParser::createFloatingSelector()
61478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector* selector = new CSSParserSelector;
61498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingSelectors.add(selector);
61508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return selector;
61518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61532fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassOwnPtr<CSSParserSelector> CSSParser::sinkFloatingSelector(CSSParserSelector* selector)
61548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (selector) {
61568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingSelectors.contains(selector));
61578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingSelectors.remove(selector);
61588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptPtr(selector);
61608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61622bde8e466a4451c7319e3a072d118917957d6554Steve BlockVector<OwnPtr<CSSParserSelector> >* CSSParser::createFloatingSelectorVector()
61632bde8e466a4451c7319e3a072d118917957d6554Steve Block{
61642bde8e466a4451c7319e3a072d118917957d6554Steve Block    Vector<OwnPtr<CSSParserSelector> >* selectorVector = new Vector<OwnPtr<CSSParserSelector> >;
61652bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_floatingSelectorVectors.add(selectorVector);
61662bde8e466a4451c7319e3a072d118917957d6554Steve Block    return selectorVector;
61672bde8e466a4451c7319e3a072d118917957d6554Steve Block}
61682bde8e466a4451c7319e3a072d118917957d6554Steve Block
61692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > CSSParser::sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectorVector)
61702bde8e466a4451c7319e3a072d118917957d6554Steve Block{
61712bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (selectorVector) {
61722bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(m_floatingSelectorVectors.contains(selectorVector));
61732bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_floatingSelectorVectors.remove(selectorVector);
61742bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
61752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return adoptPtr(selectorVector);
61762bde8e466a4451c7319e3a072d118917957d6554Steve Block}
61772bde8e466a4451c7319e3a072d118917957d6554Steve Block
61788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValueList* CSSParser::createFloatingValueList()
61798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValueList* list = new CSSParserValueList;
61818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingValueLists.add(list);
61828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list;
61838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValueList* CSSParser::sinkFloatingValueList(CSSParserValueList* list)
61868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list) {
61888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingValueLists.contains(list));
61898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingValueLists.remove(list);
61908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return list;
61928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserFunction* CSSParser::createFloatingFunction()
61958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
61968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserFunction* function = new CSSParserFunction;
61978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_floatingFunctions.add(function);
61988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return function;
61998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserFunction* CSSParser::sinkFloatingFunction(CSSParserFunction* function)
62028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (function) {
62048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingFunctions.contains(function));
62058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingFunctions.remove(function);
62068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return function;
62088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSParserValue& CSSParser::sinkFloatingValue(CSSParserValue& value)
62118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value.unit == CSSParserValue::Function) {
62138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_floatingFunctions.contains(value.function));
62148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_floatingFunctions.remove(value.function);
62158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value;
62178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMediaQueryExp* CSSParser::createFloatingMediaQueryExp(const AtomicString& mediaFeature, CSSParserValueList* values)
62208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_floatingMediaQueryExp = MediaQueryExp::create(mediaFeature, values);
62225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExp.get();
62238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassOwnPtr<MediaQueryExp> CSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* expression)
62268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(expression, expression == m_floatingMediaQueryExp);
62285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExp.release();
62298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickVector<OwnPtr<MediaQueryExp> >* CSSParser::createFloatingMediaQueryExpList()
62328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_floatingMediaQueryExpList = adoptPtr(new Vector<OwnPtr<MediaQueryExp> >);
62345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExpList.get();
62358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > CSSParser::sinkFloatingMediaQueryExpList(Vector<OwnPtr<MediaQueryExp> >* list)
62388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(list, list == m_floatingMediaQueryExpList);
62405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQueryExpList.release();
62418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickMediaQuery* CSSParser::createFloatingMediaQuery(MediaQuery::Restrictor restrictor, const String& mediaType, PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions)
62448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_floatingMediaQuery = adoptPtr(new MediaQuery(restrictor, mediaType, expressions));
62465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQuery.get();
62478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickMediaQuery* CSSParser::createFloatingMediaQuery(PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions)
62508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return createFloatingMediaQuery(MediaQuery::None, "all", expressions);
62528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassOwnPtr<MediaQuery> CSSParser::sinkFloatingMediaQuery(MediaQuery* query)
62558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT_UNUSED(query, query == m_floatingMediaQuery);
62575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_floatingMediaQuery.release();
62588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMediaList* CSSParser::createMediaList()
62618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<MediaList> list = MediaList::create();
62638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MediaList* result = list.get();
62648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(list.release());
62658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
62668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createCharsetRule(const CSSParserString& charset)
62698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_styleSheet)
62718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSCharsetRule> rule = CSSCharsetRule::create(m_styleSheet, charset);
62738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSCharsetRule* result = rule.get();
62748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
62758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
62768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createImportRule(const CSSParserString& url, MediaList* media)
62798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!media || !m_styleSheet || !m_allowImportRules)
62818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
62828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSImportRule> rule = CSSImportRule::create(m_styleSheet, url, media);
62838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSImportRule* result = rule.get();
62848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
62858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
62868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createMediaRule(MediaList* media, CSSRuleList* rules)
62898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!media || !rules || !m_styleSheet)
62918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
62926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
62938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSMediaRule> rule = CSSMediaRule::create(m_styleSheet, media, rules);
62948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSMediaRule* result = rule.get();
62958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
62968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
62978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRuleList* CSSParser::createRuleList()
63008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSRuleList> list = CSSRuleList::create();
63028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSRuleList* listPtr = list.get();
6303e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
63048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedRuleLists.append(list.release());
63058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return listPtr;
63068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebKitCSSKeyframesRule* CSSParser::createKeyframesRule()
63098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
63118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebKitCSSKeyframesRule> rule = WebKitCSSKeyframesRule::create(m_styleSheet);
63128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSKeyframesRule* rulePtr = rule.get();
63138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rulePtr;
63158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63172fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSRule* CSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors)
63188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSStyleRule* result = 0;
63205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    markRuleBodyEnd();
6321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (selectors) {
6322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_allowImportRules = m_allowNamespaceDeclarations = false;
6323e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        RefPtr<CSSStyleRule> rule = CSSStyleRule::create(m_styleSheet, m_lastSelectorLineNumber);
6324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rule->adoptSelectorVector(*selectors);
63258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_hasFontFaceOnlyValues)
63268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            deleteFontFaceOnlyValues();
63278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
63288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = rule.get();
63298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parsedStyleObjects.append(rule.release());
633068513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_ruleRangeMap) {
6331a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(m_currentRuleData);
6332a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->styleSourceData->styleBodyRange = m_ruleBodyRange;
6333a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->selectorListRange = m_selectorListRange;
6334a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_ruleRangeMap->set(result, m_currentRuleData.release());
6335a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData = CSSRuleSourceData::create();
6336a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_currentRuleData->styleSourceData = CSSStyleSourceData::create();
63374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            m_inStyleRuleOrDeclaration = false;
633868513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
63398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6340a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    resetSelectorListMarks();
63415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    resetRuleBodyMarks();
63428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
63438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSRule* CSSParser::createFontFaceRule()
63478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
63498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; ++i) {
63508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSProperty* property = m_parsedProperties[i];
63518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = property->id();
63528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id == CSSPropertyFontWeight || id == CSSPropertyFontStyle || id == CSSPropertyFontVariant) && property->value()->isPrimitiveValue()) {
63538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RefPtr<CSSValue> value = property->m_value.release();
63548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            property->m_value = CSSValueList::createCommaSeparated();
635554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            static_cast<CSSValueList*>(property->value())->append(value.release());
635654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        } else if (id == CSSPropertyFontFamily && (!property->value()->isValueList() || static_cast<CSSValueList*>(property->value())->length() != 1)) {
635754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // Unlike font-family property, font-family descriptor in @font-face rule
635854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // has to be a value list with exactly one family name. It cannot have a
635954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            // have 'initial' value and cannot 'inherit' from parent.
6360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            // See http://dev.w3.org/csswg/css3-fonts/#font-family-desc
6361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            clearProperties();
6362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return 0;
63638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
63648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6365f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<CSSFontFaceRule> rule = CSSFontFaceRule::create(m_styleSheet);
63668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
63678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
63688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSFontFaceRule* result = rule.get();
63698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(rule.release());
63708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
63718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6373643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CSSParser::addNamespace(const AtomicString& prefix, const AtomicString& uri)
6374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6375643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_styleSheet || !m_allowNamespaceDeclarations)
6376643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
6377643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_allowImportRules = false;
6378643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_styleSheet->addNamespace(this, prefix, uri);
6379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
6380643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
63812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSParser::updateSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector* specifiers)
638265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
638365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleSheet ? m_styleSheet->determineNamespace(namespacePrefix) : m_defaultNamespace;
638465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    QualifiedName tag = QualifiedName(namespacePrefix, elementName, determinedNamespace);
638565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!specifiers->isUnknownPseudoElement()) {
63862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        specifiers->setTag(tag);
638765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
638865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
638965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    specifiers->setRelation(CSSSelector::ShadowDescendant);
63912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (CSSParserSelector* history = specifiers->tagHistory()) {
63922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        history->setTag(tag);
639365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
639465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
639565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
639665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // No need to create an extra element name selector if we are matching any element
639765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // in any namespace.
639865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (elementName == starAtom && m_defaultNamespace == starAtom)
639965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
640065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector* elementNameSelector = new CSSParserSelector;
64022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    elementNameSelector->setTag(tag);
640365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    specifiers->setTagHistory(elementNameSelector);
640465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
640565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
640665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64072fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCSSRule* CSSParser::createPageRule(PassOwnPtr<CSSParserSelector> pageSelector)
640821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
640921939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: Margin at-rules are ignored.
64106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_allowImportRules = m_allowNamespaceDeclarations = false;
641121939df44de1705786c545cd1bf519d47250322dBen Murdoch    CSSPageRule* pageRule = 0;
641221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (pageSelector) {
64132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RefPtr<CSSPageRule> rule = CSSPageRule::create(m_styleSheet, m_lastSelectorLineNumber);
64142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Vector<OwnPtr<CSSParserSelector> > selectorVector;
64152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        selectorVector.append(pageSelector);
64162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rule->adoptSelectorVector(selectorVector);
641721939df44de1705786c545cd1bf519d47250322dBen Murdoch        rule->setDeclaration(CSSMutableStyleDeclaration::create(rule.get(), m_parsedProperties, m_numParsedProperties));
641821939df44de1705786c545cd1bf519d47250322dBen Murdoch        pageRule = rule.get();
641921939df44de1705786c545cd1bf519d47250322dBen Murdoch        m_parsedStyleObjects.append(rule.release());
642021939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
642121939df44de1705786c545cd1bf519d47250322dBen Murdoch    clearProperties();
642221939df44de1705786c545cd1bf519d47250322dBen Murdoch    return pageRule;
642321939df44de1705786c545cd1bf519d47250322dBen Murdoch}
642421939df44de1705786c545cd1bf519d47250322dBen Murdoch
642521939df44de1705786c545cd1bf519d47250322dBen MurdochCSSRule* CSSParser::createMarginAtRule(CSSSelector::MarginBoxType /* marginBox */)
642621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
642721939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: Implement margin at-rule here, using:
642821939df44de1705786c545cd1bf519d47250322dBen Murdoch    //        - marginBox: margin box
642921939df44de1705786c545cd1bf519d47250322dBen Murdoch    //        - m_parsedProperties: properties at [m_numParsedPropertiesBeforeMarginBox, m_numParsedProperties) are for this at-rule.
6430e78cbe89e6f337f2f1fe40315be88f742b547151Steve 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.
643121939df44de1705786c545cd1bf519d47250322dBen Murdoch
643221939df44de1705786c545cd1bf519d47250322dBen Murdoch    endDeclarationsForMarginBox();
643321939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 0; // until this method is implemented.
643421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
643521939df44de1705786c545cd1bf519d47250322dBen Murdoch
643621939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSParser::startDeclarationsForMarginBox()
643721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
643821939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = m_numParsedProperties;
643921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
644021939df44de1705786c545cd1bf519d47250322dBen Murdoch
644121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSParser::endDeclarationsForMarginBox()
644221939df44de1705786c545cd1bf519d47250322dBen Murdoch{
644321939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(m_numParsedPropertiesBeforeMarginBox != INVALID_NUM_PARSED_PROPERTIES);
644421939df44de1705786c545cd1bf519d47250322dBen Murdoch    rollbackLastProperties(m_numParsedProperties - m_numParsedPropertiesBeforeMarginBox);
644521939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
644621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
644721939df44de1705786c545cd1bf519d47250322dBen Murdoch
64488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSParser::deleteFontFaceOnlyValues()
64498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_hasFontFaceOnlyValues);
64518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int deletedProperties = 0;
64528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (unsigned i = 0; i < m_numParsedProperties; ++i) {
64548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSProperty* property = m_parsedProperties[i];
64558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int id = property->id();
64568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((id == CSSPropertyFontWeight || id == CSSPropertyFontStyle || id == CSSPropertyFontVariant) && property->value()->isValueList()) {
64578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete property;
64588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            deletedProperties++;
64598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (deletedProperties)
64608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_parsedProperties[i - deletedProperties] = m_parsedProperties[i];
64618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_numParsedProperties -= deletedProperties;
64648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebKitCSSKeyframeRule* CSSParser::createKeyframeRule(CSSParserValueList* keys)
64678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a key string from the passed keys
64698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String keyString;
64708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < keys->size(); ++i) {
64718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float key = (float) keys->valueAt(i)->fValue;
64728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i != 0)
64738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            keyString += ",";
64748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyString += String::number(key);
64758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyString += "%";
64768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6477e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
64788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebKitCSSKeyframeRule> keyframe = WebKitCSSKeyframeRule::create(m_styleSheet);
64798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    keyframe->setKeyText(keyString);
64808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    keyframe->setDeclaration(CSSMutableStyleDeclaration::create(0, m_parsedProperties, m_numParsedProperties));
6481e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
64828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clearProperties();
64838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebKitCSSKeyframeRule* keyframePtr = keyframe.get();
64858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_parsedStyleObjects.append(keyframe.release());
64868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return keyframePtr;
64878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6489d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid CSSParser::invalidBlockHit()
6490d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6491d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (m_styleSheet && !m_hadSyntacticallyValidCSSRule)
6492d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_styleSheet->setHasSyntacticallyValidCSSHeader(false);
6493d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6494d0825bca7fe65beaee391d30da42e937db621564Steve Block
64955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::updateLastSelectorLineAndPosition()
64965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
6497e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_lastSelectorLineNumber = m_lineNumber;
64985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    markRuleBodyStart();
64995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
65005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
6501a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid CSSParser::markSelectorListStart()
6502a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
6503a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_selectorListRange.start = yytext - m_data;
6504a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
6505a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6506a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid CSSParser::markSelectorListEnd()
6507a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
6508a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_currentRuleData)
6509a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
6510a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    UChar* listEnd = yytext;
6511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    while (listEnd > m_data + 1) {
6512a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (isHTMLSpace(*(listEnd - 1)))
6513a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            --listEnd;
6514a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        else
6515a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
6516a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
6517a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_selectorListRange.end = listEnd - m_data;
6518a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
6519a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
65205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::markRuleBodyStart()
65215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
65225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned offset = yytext - m_data;
652368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (*yytext == '{')
652468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ++offset; // Skip the rule body opening brace.
6525a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (offset > m_ruleBodyRange.start)
6526a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_ruleBodyRange.start = offset;
65274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_inStyleRuleOrDeclaration = true;
65285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
65295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
65305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid CSSParser::markRuleBodyEnd()
65315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
65325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned offset = yytext - m_data;
6533a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (offset > m_ruleBodyRange.end)
6534a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_ruleBodyRange.end = offset;
65355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
65365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
653768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::markPropertyStart()
653868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
65394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_inStyleRuleOrDeclaration)
65404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
6541a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_propertyRange.start = yytext - m_data;
654268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
654368513a70bcd92384395513322f1b801e7bf9c729Steve Block
654468513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSParser::markPropertyEnd(bool isImportantFound, bool isPropertyParsed)
654568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
65464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_inStyleRuleOrDeclaration)
65474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
654868513a70bcd92384395513322f1b801e7bf9c729Steve Block    unsigned offset = yytext - m_data;
654968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (*yytext == ';') // Include semicolon into the property text.
655068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ++offset;
6551a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_propertyRange.end = offset;
6552a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_propertyRange.start != UINT_MAX && m_currentRuleData) {
655368513a70bcd92384395513322f1b801e7bf9c729Steve Block        // This stuff is only executed when the style data retrieval is requested by client.
6554a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        const unsigned start = m_propertyRange.start;
6555a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        const unsigned end = m_propertyRange.end;
655668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ASSERT(start < end);
655768513a70bcd92384395513322f1b801e7bf9c729Steve Block        String propertyString = String(m_data + start, end - start).stripWhiteSpace();
655868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (propertyString.endsWith(";", true))
655968513a70bcd92384395513322f1b801e7bf9c729Steve Block            propertyString = propertyString.left(propertyString.length() - 1);
656068513a70bcd92384395513322f1b801e7bf9c729Steve Block        Vector<String> propertyComponents;
656168513a70bcd92384395513322f1b801e7bf9c729Steve Block        size_t colonIndex = propertyString.find(":");
656268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ASSERT(colonIndex != notFound);
656368513a70bcd92384395513322f1b801e7bf9c729Steve Block
656468513a70bcd92384395513322f1b801e7bf9c729Steve Block        String name = propertyString.left(colonIndex).stripWhiteSpace();
656568513a70bcd92384395513322f1b801e7bf9c729Steve Block        String value = propertyString.substring(colonIndex + 1, propertyString.length()).stripWhiteSpace();
656668513a70bcd92384395513322f1b801e7bf9c729Steve Block        // The property range is relative to the declaration start offset.
6567a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_currentRuleData->styleSourceData->propertyData.append(
6568a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            CSSPropertySourceData(name, value, isImportantFound, isPropertyParsed, SourceRange(start - m_ruleBodyRange.start, end - m_ruleBodyRange.start)));
656968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
657068513a70bcd92384395513322f1b801e7bf9c729Steve Block    resetPropertyMarks();
657168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
657268513a70bcd92384395513322f1b801e7bf9c729Steve Block
65738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int cssPropertyID(const UChar* propertyName, unsigned length)
65748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length)
65768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
65778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length > maxCSSPropertyNameLength)
65788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
65798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buffer[maxCSSPropertyNameLength + 1 + 1]; // 1 to turn "apple"/"khtml" into "webkit", 1 for null character
65818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i != length; ++i) {
65838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar c = propertyName[i];
65848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (c == 0 || c >= 0x7F)
65858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0; // illegal character
65868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        buffer[i] = toASCIILower(c);
65878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffer[length] = '\0';
65898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name = buffer;
65918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (buffer[0] == '-') {
65920617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        // If the prefix is -apple- or -khtml-, change it to -webkit-.
65930617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        // This makes the string one character longer.
65940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        if (hasPrefix(buffer, length, "-apple-") || hasPrefix(buffer, length, "-khtml-")) {
65958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memmove(buffer + 7, buffer + 6, length + 1 - 6);
65968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memcpy(buffer, "-webkit", 7);
65978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++length;
65980617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        }
65990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
66000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        if (hasPrefix(buffer, length, "-webkit")) {
660128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (!strcmp(buffer, "-webkit-box-sizing")) {
660228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                // -webkit-box-sizing worked in Safari 4 and earlier.
660328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const char* const boxSizing = "box-sizing";
660428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                name = boxSizing;
660528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                length = strlen(boxSizing);
660628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            } else if (!strcmp(buffer, "-webkit-opacity")) {
66070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // Honor -webkit-opacity as a synonym for opacity.
66080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // This was the only syntax that worked in Safari 1.1, and may be in use on some websites and widgets.
66090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                const char* const opacity = "opacity";
66100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                name = opacity;
66110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                length = strlen(opacity);
661281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(IOS)
661381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            } else if (!strcmp(buffer, "-webkit-hyphenate-locale")) {
661481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // Worked in iOS 4.2.
661581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                const char* const webkitLocale = "-webkit-locale";
661681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                name = webkitLocale;
661781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                length = strlen(webkitLocale);
661881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
66190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            } else if (hasPrefix(buffer + 7, length - 7, "-border-")) {
66200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // -webkit-border-*-*-radius worked in Safari 4 and earlier. -webkit-border-radius syntax
66210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                // differs from border-radius, so it is remains as a distinct property.
66220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                if (!strcmp(buffer + 15, "top-left-radius")
66230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "top-right-radius")
66240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "bottom-right-radius")
66250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        || !strcmp(buffer + 15, "bottom-left-radius")) {
66260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    name = buffer + 8;
66270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    length -= 8;
66280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                }
66290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
66308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
66318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6633545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const Property* hashTableEntry = findProperty(name, length);
66348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hashTableEntry ? hashTableEntry->id : 0;
66358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssPropertyID(const String& string)
66388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cssPropertyID(string.characters(), string.length());
66408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssPropertyID(const CSSParserString& string)
66438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cssPropertyID(string.characters, string.length);
66458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint cssValueKeywordID(const CSSParserString& string)
66488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned length = string.length;
66508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length)
66518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
66528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length > maxCSSValueKeywordLength)
66538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
66548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buffer[maxCSSValueKeywordLength + 1 + 1]; // 1 to turn "apple"/"khtml" into "webkit", 1 for null character
66568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i != length; ++i) {
66588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UChar c = string.characters[i];
66598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (c == 0 || c >= 0x7F)
66608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0; // illegal character
66618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        buffer[i] = WTF::toASCIILower(c);
66628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffer[length] = '\0';
66648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (buffer[0] == '-') {
66668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the prefix is -apple- or -khtml-, change it to -webkit-.
66678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This makes the string one character longer.
66688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hasPrefix(buffer, length, "-apple-") || hasPrefix(buffer, length, "-khtml-")) {
66698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memmove(buffer + 7, buffer + 6, length + 1 - 6);
66708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            memcpy(buffer, "-webkit", 7);
66718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++length;
66728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
66738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6675545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const Value* hashTableEntry = findValue(buffer, length);
66768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hashTableEntry ? hashTableEntry->id : 0;
66778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// "ident" from the CSS tokenizer, minus backslash-escape sequences
6680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isCSSTokenizerIdentifier(const String& string)
6681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* p = string.characters();
6683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* end = p + string.length();
6684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // -?
6686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (p != end && p[0] == '-')
6687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ++p;
6688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // {nmstart}
6690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (p == end || !(p[0] == '_' || p[0] >= 128 || isASCIIAlpha(p[0])))
6691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
6692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ++p;
6693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // {nmchar}*
6695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; p != end; ++p) {
6696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!(p[0] == '_' || p[0] == '-' || p[0] >= 128 || isASCIIAlphanumeric(p[0])))
6697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
6698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
6701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// "url" from the CSS tokenizer, minus backslash-escape sequences
6704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isCSSTokenizerURL(const String& string)
6705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* p = string.characters();
6707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const UChar* end = p + string.length();
6708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; p != end; ++p) {
6710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar c = p[0];
6711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (c) {
6712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '!':
6713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '#':
6714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '$':
6715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '%':
6716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            case '&':
6717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                break;
6718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            default:
6719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c < '*')
6720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return false;
6721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c <= '~')
6722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    break;
6723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (c < 128)
6724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return false;
6725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
6729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// We use single quotes for now because markup.cpp uses double quotes.
6732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSString(const String& string)
6733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // For efficiency, we first pre-calculate the length of the quoted string, then we build the actual one.
6735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Please see below for the actual logic.
6736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned quotedStringSize = 2; // Two quotes surrounding the entire string.
6737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool afterEscape = false;
6738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < string.length(); ++i) {
6739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar ch = string[i];
6740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ch == '\\' || ch == '\'') {
6741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 2;
6742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (ch < 0x20 || ch == 0x7F) {
6744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 2 + (ch >= 0x10);
6745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = true;
6746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
6747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            quotedStringSize += 1 + (afterEscape && (isASCIIHexDigit(ch) || ch == ' '));
6748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StringBuffer buffer(quotedStringSize);
6753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned index = 0;
6754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    buffer[index++] = '\'';
6755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    afterEscape = false;
6756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < string.length(); ++i) {
6757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        UChar ch = string[i];
6758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ch == '\\' || ch == '\'') {
6759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = '\\';
6760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = ch;
6761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (ch < 0x20 || ch == 0x7F) { // Control characters.
6763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = '\\';
67642bde8e466a4451c7319e3a072d118917957d6554Steve Block            placeByteAsHexCompressIfPossible(ch, buffer, index, Lowercase);
6765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = true;
6766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
6767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Space character may be required to separate backslash-escape sequence and normal characters.
6768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (afterEscape && (isASCIIHexDigit(ch) || ch == ' '))
6769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                buffer[index++] = ' ';
6770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer[index++] = ch;
6771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            afterEscape = false;
6772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
6773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    buffer[index++] = '\'';
6775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(quotedStringSize == index);
6777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return String::adopt(buffer);
6778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSStringIfNeeded(const String& string)
6781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return isCSSTokenizerIdentifier(string) ? string : quoteCSSString(string);
6783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString quoteCSSURLIfNeeded(const String& string)
6786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return isCSSTokenizerURL(string) ? string : quoteCSSString(string);
6788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6790cad810f21b803229eb11403f9209855525a25d57Steve Blockbool isValidNthToken(const CSSParserString& token)
6791cad810f21b803229eb11403f9209855525a25d57Steve Block{
6792cad810f21b803229eb11403f9209855525a25d57Steve Block    // The tokenizer checks for the construct of an+b.
6793cad810f21b803229eb11403f9209855525a25d57Steve Block    // nth can also accept "odd" or "even" but should not accept any other token.
6794cad810f21b803229eb11403f9209855525a25d57Steve Block    return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even");
6795cad810f21b803229eb11403f9209855525a25d57Steve Block}
6796cad810f21b803229eb11403f9209855525a25d57Steve Block
67978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_DECL int CSSParser::lex()
67988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define yyconst const
67998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef int yy_state_type;
68008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef unsigned YY_CHAR;
68018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The following line makes sure we treat non-Latin-1 Unicode characters correctly.
68028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_SC_TO_UI(c) (c > 0xff ? 0xff : c)
68038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_DO_BEFORE_ACTION \
68048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yytext = yy_bp; \
68058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yyleng = (int) (yy_cp - yy_bp); \
68068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yy_hold_char = *yy_cp; \
68078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *yy_cp = 0; \
68088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        yy_c_buf_p = yy_cp;
68098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_BREAK break;
68108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ECHO
68118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_RULE_SETUP
68128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define INITIAL 0
68138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
68148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define yyterminate() yyTok = END_TOKEN; return yyTok
68158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define YY_FATAL_ERROR(a)
68168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The following line is needed to build the tokenizer with a condition stack.
68178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The macro is used in the tokenizer grammar with lines containing
68188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// BEGIN(mediaqueries) and BEGIN(initial). yy_start acts as index to
68198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// tokenizer transition table, and 'mediaqueries' and 'initial' are
68208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// offset multipliers that specify which transitions are active
68218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// in the tokenizer during in each condition (tokenizer state).
68228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BEGIN yy_start = 1 + 2 *
68238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "tokenizer.cpp"
68258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6827