15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Intel Corporation. All rights reserved.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/parser/BisonCSSParser.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/MediaTypeNames.h"
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/StylePropertyShorthand.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSAspectRatioValue.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSBasicShapes.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSBorderImage.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSCanvasValue.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSCrossfadeValue.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSCursorImageValue.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSFontFaceSrcValue.h"
401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/css/CSSFontFeatureValue.h"
41c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/css/CSSFunctionValue.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSGradientValue.h"
4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/css/CSSGridLineNamesValue.h"
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/CSSGridTemplateAreasValue.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSImageSetValue.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSImageValue.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSInheritedValue.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSInitialValue.h"
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/css/CSSKeyframeRule.h"
505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/css/CSSKeyframesRule.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSLineBoxContainValue.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPrimitiveValue.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPropertySourceData.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSReflectValue.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSSelector.h"
561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/css/CSSShadowValue.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleSheet.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSTimingFunctionValue.h"
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/css/CSSTransformValue.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSUnicodeRangeValue.h"
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValuePool.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Counter.h"
64f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/css/HashTools.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/MediaList.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/MediaQueryExp.h"
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Pair.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Rect.h"
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StylePropertySet.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleRule.h"
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleRuleImport.h"
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetContents.h"
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/parser/CSSParserIdioms.h"
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "core/frame/FrameConsole.h"
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h"
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/frame/UseCounter.h"
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
80e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
81e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/FloatConversion.h"
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
8581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/BitArray.h"
8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/HexNumber.h"
8781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/StringBuffer.h"
8881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/StringBuilder.h"
8981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/StringImpl.h"
9081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/TextEncoding.h"
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits.h>
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define YYDEBUG 0
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if YYDEBUG > 0
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern int cssyydebug;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)int cssyyparse(blink::BisonCSSParser*);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX;
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)BisonCSSParser::BisonCSSParser(const CSSParserContext& context)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_context(context)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_important(false)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_id(CSSPropertyInvalid)
111aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    , m_styleSheet(nullptr)
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_supportsCondition(false)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_selectorListForParseSelector(0)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_numParsedPropertiesBeforeMarginBox(INVALID_NUM_PARSED_PROPERTIES)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hadSyntacticallyValidCSSRule(false)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_logErrors(false)
11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    , m_ignoreErrors(false)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_defaultNamespace(starAtom)
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_observer(0)
12093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    , m_source(0)
12193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    , m_ruleHeaderType(CSSRuleSourceData::UNKNOWN_RULE)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_allowImportRules(true)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_allowNamespaceDeclarations(true)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inViewport(false)
12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    , m_tokenizer(*this)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if YYDEBUG > 0
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyydebug = 1;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)BisonCSSParser::~BisonCSSParser()
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deleteAllValues(m_floatingSelectors);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deleteAllValues(m_floatingSelectorVectors);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deleteAllValues(m_floatingValueLists);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deleteAllValues(m_floatingFunctions);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::setupParser(const char* prefix, unsigned prefixLength, const String& string, const char* suffix, unsigned suffixLength)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_tokenizer.setupTokenizer(prefix, prefixLength, string, suffix, suffixLength);
14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_ruleHasHeader = true;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::parseSheet(StyleSheetContents* sheet, const String& string, const TextPosition& startPosition, CSSParserObserver* observer, bool logErrors)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(sheet);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_defaultNamespace = starAtom; // Reset the default namespace.
15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TemporaryChange<CSSParserObserver*> scopedObsever(m_observer, observer);
15309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_logErrors = logErrors && sheet->singleOwnerDocument() && !sheet->baseURL().isEmpty() && sheet->singleOwnerDocument()->frameHost();
15493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_ignoreErrors = false;
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_tokenizer.m_lineNumber = 0;
156e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_startPosition = startPosition;
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_source = &string;
15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_tokenizer.m_internal = false;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setupParser("", string, "");
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sheet->shrinkToFit();
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_source = 0;
163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_rule = nullptr;
164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_lineEndings.clear();
16593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_ignoreErrors = false;
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_logErrors = false;
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_tokenizer.m_internal = true;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<StyleRuleBase> BisonCSSParser::parseRule(StyleSheetContents* sheet, const String& string)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(sheet);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowNamespaceDeclarations = false;
174591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-rule ", string, "");
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_rule.release();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochPassRefPtrWillBeRawPtr<StyleKeyframe> BisonCSSParser::parseKeyframeRule(StyleSheetContents* sheet, const String& string)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(sheet);
182591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-keyframe-rule ", string, "");
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_keyframe.release();
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<Vector<double> > BisonCSSParser::parseKeyframeKeyList(const String& string)
1888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
1898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    setupParser("@-internal-keyframe-key-list ", string, "");
1908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    cssyyparse(this);
1918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(m_valueList);
1928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return StyleKeyframe::createKeyList(m_valueList.get());
1938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseSupportsCondition(const String& string)
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_supportsCondition = false;
198591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-supports-condition ", string, "");
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    cssyyparse(this);
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_supportsCondition;
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isColorPropertyID(CSSPropertyID propertyId)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (propertyId) {
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyColor:
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBackgroundColor:
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderBottomColor:
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderLeftColor:
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderRightColor:
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderTopColor:
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOutlineColor:
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderAfterColor:
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderBeforeColor:
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderEndColor:
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderStartColor:
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnRuleColor:
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextEmphasisColor:
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextFillColor:
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextStrokeColor:
2215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSSPropertyTextDecorationColor:
2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return true;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static bool parseColorValue(MutableStylePropertySet* declaration, CSSPropertyID propertyId, const String& string, bool important, CSSParserMode cssParserMode)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!string.isEmpty());
231f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool quirksMode = isQuirksModeBehavior(cssParserMode);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isColorPropertyID(propertyId))
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserString cssString;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssString.init(string);
2365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSValueID valueID = cssValueKeywordID(cssString);
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool validPrimitive = false;
238f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (valueID == CSSValueWebkitText) {
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        validPrimitive = true;
240f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    } else if (valueID == CSSValueCurrentcolor) {
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        validPrimitive = true;
242f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    } else if ((valueID >= CSSValueAqua && valueID <= CSSValueWindowtext) || valueID == CSSValueMenu
243f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        || (quirksMode && valueID >= CSSValueWebkitFocusRingColor && valueID < CSSValueWebkitText)) {
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        validPrimitive = true;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (validPrimitive) {
248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RefPtrWillBeRawPtr<CSSValue> value = cssValuePool().createIdentifierValue(valueID);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        declaration->addParsedProperty(CSSProperty(propertyId, value.release(), important));
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RGBA32 color;
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!CSSPropertyParser::fastParseColor(color, string, !quirksMode && string[0] != '#'))
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<CSSValue> value = cssValuePool().createColorValue(color);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    declaration->addParsedProperty(CSSProperty(propertyId, value.release(), important));
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isSimpleLengthPropertyID(CSSPropertyID propertyId, bool& acceptsNegativeNumbers)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (propertyId) {
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyFontSize:
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyHeight:
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWidth:
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMinHeight:
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMinWidth:
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPaddingBottom:
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPaddingLeft:
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPaddingRight:
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPaddingTop:
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitLogicalWidth:
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitLogicalHeight:
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMinLogicalWidth:
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMinLogicalHeight:
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPaddingAfter:
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPaddingBefore:
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPaddingEnd:
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPaddingStart:
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        acceptsNegativeNumbers = false;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
282bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case CSSPropertyShapeMargin:
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        acceptsNegativeNumbers = false;
284197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return true;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBottom:
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyLeft:
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMarginBottom:
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMarginLeft:
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMarginRight:
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyMarginTop:
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyRight:
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTop:
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginAfter:
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginBefore:
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginEnd:
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginStart:
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        acceptsNegativeNumbers = true;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <typename CharacterType>
305d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static inline bool parseSimpleLength(const CharacterType* characters, unsigned length, CSSPrimitiveValue::UnitType& unit, double& number)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (length > 2 && (characters[length - 2] | 0x20) == 'p' && (characters[length - 1] | 0x20) == 'x') {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length -= 2;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unit = CSSPrimitiveValue::CSS_PX;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (length > 1 && characters[length - 1] == '%') {
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length -= 1;
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unit = CSSPrimitiveValue::CSS_PERCENTAGE;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We rely on charactersToDouble for validation as well. The function
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // will set "ok" to "false" if the entire passed-in character range does
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // not represent a double.
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ok;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    number = charactersToDouble(characters, length, &ok);
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ok;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static bool parseSimpleLengthValue(MutableStylePropertySet* declaration, CSSPropertyID propertyId, const String& string, bool important, CSSParserMode cssParserMode)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!string.isEmpty());
326aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    bool acceptsNegativeNumbers = false;
327f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
328f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // In @viewport, width and height are shorthands, not simple length values.
329f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (isCSSViewportParsingEnabledForMode(cssParserMode) || !isSimpleLengthPropertyID(propertyId, acceptsNegativeNumbers))
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = string.length();
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double number;
334d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CSSPrimitiveValue::UnitType unit = CSSPrimitiveValue::CSS_NUMBER;
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (string.is8Bit()) {
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!parseSimpleLength(string.characters8(), length, unit, number))
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!parseSimpleLength(string.characters16(), length, unit, number))
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (unit == CSSPrimitiveValue::CSS_NUMBER) {
345f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        bool quirksMode = isQuirksModeBehavior(cssParserMode);
346f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (number && !quirksMode)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unit = CSSPrimitiveValue::CSS_PX;
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (number < 0 && !acceptsNegativeNumbers)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<CSSValue> value = cssValuePool().createValue(number, unit);
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    declaration->addParsedProperty(CSSProperty(propertyId, value.release(), important));
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
358d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool isValidKeywordPropertyAndValue(CSSPropertyID propertyId, CSSValueID valueID, const CSSParserContext& parserContext)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
360d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (valueID == CSSValueInvalid)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (propertyId) {
3649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case CSSPropertyAll:
3659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return valueID == CSSValueUnset;
366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBackgroundRepeatX: // repeat | no-repeat
367d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBackgroundRepeatY: // repeat | no-repeat
368d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueRepeat || valueID == CSSValueNoRepeat;
369d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderCollapse: // collapse | separate
370d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueCollapse || valueID == CSSValueSeparate;
371d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderTopStyle: // <border-style>
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderRightStyle: // Defined as: none | hidden | dotted | dashed |
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderBottomStyle: // solid | double | groove | ridge | inset | outset
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderLeftStyle:
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderAfterStyle:
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderBeforeStyle:
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderEndStyle:
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderStartStyle:
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnRuleStyle:
380d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID >= CSSValueNone && valueID <= CSSValueDouble;
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBoxSizing:
382d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueBorderBox || valueID == CSSValueContentBox;
383d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyCaptionSide: // top | bottom | left | right
384d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueTop || valueID == CSSValueBottom;
385d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyClear: // none | left | right | both
386d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNone || valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueBoth;
387d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyDirection: // ltr | rtl
388d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueLtr || valueID == CSSValueRtl;
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyDisplay:
39019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        // inline | block | list-item | inline-block | table |
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // inline-table | table-row-group | table-header-group | table-footer-group | table-row |
392d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // table-column-group | table-column | table-cell | table-caption | -webkit-box | -webkit-inline-box | none
393c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // flex | inline-flex | -webkit-flex | -webkit-inline-flex | grid | inline-grid
394d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return (valueID >= CSSValueInline && valueID <= CSSValueInlineFlex) || valueID == CSSValueWebkitFlex || valueID == CSSValueWebkitInlineFlex || valueID == CSSValueNone
395d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            || (RuntimeEnabledFeatures::cssGridLayoutEnabled() && (valueID == CSSValueGrid || valueID == CSSValueInlineGrid));
396d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyEmptyCells: // show | hide
397d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueShow || valueID == CSSValueHide;
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyFloat: // left | right | none | center (for buggy CSS, maps to none)
399d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueNone || valueID == CSSValueCenter;
400d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyFontStyle: // normal | italic | oblique
401d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValueItalic || valueID == CSSValueOblique;
402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    case CSSPropertyFontStretch: // normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded
4039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return valueID == CSSValueNormal || (valueID >= CSSValueUltraCondensed && valueID <= CSSValueUltraExpanded);
404197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSPropertyImageRendering: // auto | optimizeContrast | pixelated
405197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return valueID == CSSValueAuto || valueID == CSSValueWebkitOptimizeContrast || (RuntimeEnabledFeatures::imageRenderingPixelatedEnabled() && valueID == CSSValuePixelated);
40606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    case CSSPropertyIsolation: // auto | isolate
4077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::cssCompositingEnabled());
4087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueAuto || valueID == CSSValueIsolate;
409d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyListStylePosition: // inside | outside
410d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueInside || valueID == CSSValueOutside;
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyListStyleType:
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // See section CSS_PROP_LIST_STYLE_TYPE of file CSSValueKeywords.in
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // for the list of supported list-style-types.
414d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return (valueID >= CSSValueDisc && valueID <= CSSValueKatakanaIroha) || valueID == CSSValueNone;
415e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    case CSSPropertyObjectFit:
4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueFill || valueID == CSSValueContain || valueID == CSSValueCover || valueID == CSSValueNone || valueID == CSSValueScaleDown;
417d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyOutlineStyle: // (<border-style> except hidden) | auto
418d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueNone || (valueID >= CSSValueInset && valueID <= CSSValueDouble);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOverflowWrap: // normal | break-word
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWordWrap:
421d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValueBreakWord;
422d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyOverflowX: // visible | hidden | scroll | auto | overlay
423d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueScroll || valueID == CSSValueAuto || valueID == CSSValueOverlay;
424d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyOverflowY: // visible | hidden | scroll | auto | overlay | -webkit-paged-x | -webkit-paged-y
425d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueScroll || valueID == CSSValueAuto || valueID == CSSValueOverlay || valueID == CSSValueWebkitPagedX || valueID == CSSValueWebkitPagedY;
426d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyPageBreakAfter: // auto | always | avoid | left | right
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPageBreakBefore:
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakAfter:
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakBefore:
430d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueAlways || valueID == CSSValueAvoid || valueID == CSSValueLeft || valueID == CSSValueRight;
431d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyPageBreakInside: // avoid | auto
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakInside:
433d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueAvoid;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPointerEvents:
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // none | visiblePainted | visibleFill | visibleStroke | visible |
436d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // painted | fill | stroke | auto | all | bounding-box
437d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueVisible || valueID == CSSValueNone || valueID == CSSValueAll || valueID == CSSValueAuto || (valueID >= CSSValueVisiblepainted && valueID <= CSSValueBoundingBox);
438197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSPropertyPosition: // static | relative | absolute | fixed
439197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return valueID == CSSValueStatic || valueID == CSSValueRelative || valueID == CSSValueAbsolute || valueID == CSSValueFixed;
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyResize: // none | both | horizontal | vertical | auto
441d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNone || valueID == CSSValueBoth || valueID == CSSValueHorizontal || valueID == CSSValueVertical || valueID == CSSValueAuto;
44209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSSPropertyScrollBehavior: // instant | smooth
4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::cssomSmoothScrollEnabled());
4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueInstant || valueID == CSSValueSmooth;
445d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertySpeak: // none | normal | spell-out | digits | literal-punctuation | no-punctuation
446d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNone || valueID == CSSValueNormal || valueID == CSSValueSpellOut || valueID == CSSValueDigits || valueID == CSSValueLiteralPunctuation || valueID == CSSValueNoPunctuation;
447d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyTableLayout: // auto | fixed
448d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueFixed;
449e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSPropertyTextAlignLast:
450e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // auto | start | end | left | right | center | justify
4517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::css3TextEnabled());
4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return (valueID >= CSSValueLeft && valueID <= CSSValueJustify) || valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueAuto;
4537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSPropertyTextDecorationStyle:
4547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // solid | double | dotted | dashed | wavy
4557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::css3TextDecorationsEnabled());
4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueSolid || valueID == CSSValueDouble || valueID == CSSValueDotted || valueID == CSSValueDashed || valueID == CSSValueWavy;
4571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case CSSPropertyTextJustify:
4581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // auto | none | inter-word | distribute
4597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::css3TextEnabled());
4607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueInterWord || valueID == CSSValueDistribute || valueID == CSSValueAuto || valueID == CSSValueNone;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTextOverflow: // clip | ellipsis
462d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueClip || valueID == CSSValueEllipsis;
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTextRendering: // auto | optimizeSpeed | optimizeLegibility | geometricPrecision
464d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueOptimizespeed || valueID == CSSValueOptimizelegibility || valueID == CSSValueGeometricprecision;
465d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyTextTransform: // capitalize | uppercase | lowercase | none
466d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return (valueID >= CSSValueCapitalize && valueID <= CSSValueLowercase) || valueID == CSSValueNone;
4679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case CSSPropertyUnicodeBidi:
4689e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValueEmbed
4699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            || valueID == CSSValueBidiOverride || valueID == CSSValueWebkitIsolate
4709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            || valueID == CSSValueWebkitIsolateOverride || valueID == CSSValueWebkitPlaintext;
4717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSPropertyTouchActionDelay: // none | script
4727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::cssTouchActionDelayEnabled());
4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueScript || valueID == CSSValueNone;
474d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyVisibility: // visible | hidden | collapse
475d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueCollapse;
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitAppearance:
477d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return (valueID >= CSSValueCheckbox && valueID <= CSSValueTextarea) || valueID == CSSValueNone;
47807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    case CSSPropertyBackfaceVisibility:
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBackfaceVisibility:
480d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueVisible || valueID == CSSValueHidden;
48153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case CSSPropertyMixBlendMode:
4827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::cssCompositingEnabled());
4837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueNormal || valueID == CSSValueMultiply || valueID == CSSValueScreen || valueID == CSSValueOverlay
484d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            || valueID == CSSValueDarken || valueID == CSSValueLighten || valueID == CSSValueColorDodge || valueID == CSSValueColorBurn
485d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            || valueID == CSSValueHardLight || valueID == CSSValueSoftLight || valueID == CSSValueDifference || valueID == CSSValueExclusion
4867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            || valueID == CSSValueHue || valueID == CSSValueSaturation || valueID == CSSValueColor || valueID == CSSValueLuminosity;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderFit:
488d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueBorder || valueID == CSSValueLines;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxAlign:
490d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueStretch || valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline;
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxDecorationBreak:
492d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueClone || valueID == CSSValueSlice;
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxDirection:
494d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValueReverse;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxLines:
496d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueSingle || valueID == CSSValueMultiple;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxOrient:
498d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueHorizontal || valueID == CSSValueVertical || valueID == CSSValueInlineAxis || valueID == CSSValueBlockAxis;
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxPack:
500d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueCenter || valueID == CSSValueJustify;
5011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case CSSPropertyColumnFill:
5027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(RuntimeEnabledFeatures::regionBasedColumnsEnabled());
5037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return valueID == CSSValueAuto || valueID == CSSValueBalance;
504591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyAlignContent:
50509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: Per CSS alignment, this property should accept an optional <overflow-position>. We should share this parsing code with 'justify-self'.
506d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueSpaceBetween || valueID == CSSValueSpaceAround || valueID == CSSValueStretch;
507591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyAlignItems:
50809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: Per CSS alignment, this property should accept the same arguments as 'justify-self' so we should share its parsing code.
509d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline || valueID == CSSValueStretch;
510591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyAlignSelf:
51109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: Per CSS alignment, this property should accept the same arguments as 'justify-self' so we should share its parsing code.
512d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline || valueID == CSSValueStretch;
513591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyFlexDirection:
514d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueRow || valueID == CSSValueRowReverse || valueID == CSSValueColumn || valueID == CSSValueColumnReverse;
515591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyFlexWrap:
516d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNowrap || valueID == CSSValueWrap || valueID == CSSValueWrapReverse;
517591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyJustifyContent:
51809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: Per CSS alignment, this property should accept an optional <overflow-position>. We should share this parsing code with 'justify-self'.
519d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueSpaceBetween || valueID == CSSValueSpaceAround;
520a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case CSSPropertyFontKerning:
521d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueNormal || valueID == CSSValueNone;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitFontSmoothing:
523d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueAntialiased || valueID == CSSValueSubpixelAntialiased;
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitLineBreak: // auto | loose | normal | strict | after-white-space
525d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueLoose || valueID == CSSValueNormal || valueID == CSSValueStrict || valueID == CSSValueAfterWhiteSpace;
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginAfterCollapse:
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginBeforeCollapse:
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginBottomCollapse:
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginTopCollapse:
530d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueCollapse || valueID == CSSValueSeparate || valueID == CSSValueDiscard;
531e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    case CSSPropertyInternalMarqueeDirection:
532d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueForwards || valueID == CSSValueBackwards || valueID == CSSValueAhead || valueID == CSSValueReverse || valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueDown
533d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            || valueID == CSSValueUp || valueID == CSSValueAuto;
53406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    case CSSPropertyInternalMarqueeStyle:
535d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNone || valueID == CSSValueSlide || valueID == CSSValueScroll || valueID == CSSValueAlternate;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPrintColorAdjust:
537d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueExact || valueID == CSSValueEconomy;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitRtlOrdering:
539d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueLogical || valueID == CSSValueVisual;
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSPropertyWebkitRubyPosition:
541d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueBefore || valueID == CSSValueAfter;
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextCombine:
543d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNone || valueID == CSSValueHorizontal;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextEmphasisPosition:
545d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueOver || valueID == CSSValueUnder;
546d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWebkitTextSecurity: // disc | circle | square | none
547d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueDisc || valueID == CSSValueCircle || valueID == CSSValueSquare || valueID == CSSValueNone;
54807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    case CSSPropertyTransformStyle:
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTransformStyle:
550d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueFlat || valueID == CSSValuePreserve3d;
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserDrag: // auto | none | element
552d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueElement;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserModify: // read-only | read-write
554d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueReadOnly || valueID == CSSValueReadWrite || valueID == CSSValueReadWritePlaintextOnly;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserSelect: // auto | none | text | all
556d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueText || valueID == CSSValueAll;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitWritingMode:
558d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID >= CSSValueHorizontalTb && valueID <= CSSValueHorizontalBt;
559d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWhiteSpace: // normal | pre | nowrap
560d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValuePre || valueID == CSSValuePreWrap || valueID == CSSValuePreLine || valueID == CSSValueNowrap;
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWordBreak: // normal | break-all | break-word (this is a custom extension)
562d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return valueID == CSSValueNormal || valueID == CSSValueBreakAll || valueID == CSSValueBreakWord;
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool isKeywordPropertyID(CSSPropertyID propertyId)
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (propertyId) {
5739e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case CSSPropertyAll:
57481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    case CSSPropertyMixBlendMode:
57506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    case CSSPropertyIsolation:
57610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case CSSPropertyBackgroundRepeatX:
57710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case CSSPropertyBackgroundRepeatY:
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderBottomStyle:
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderCollapse:
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderLeftStyle:
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderRightStyle:
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderTopStyle:
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBoxSizing:
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyCaptionSide:
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyClear:
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyDirection:
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyDisplay:
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyEmptyCells:
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyFloat:
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyFontStyle:
591c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    case CSSPropertyFontStretch:
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyImageRendering:
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyListStylePosition:
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyListStyleType:
595e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    case CSSPropertyObjectFit:
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOutlineStyle:
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOverflowWrap:
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOverflowX:
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOverflowY:
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPageBreakAfter:
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPageBreakBefore:
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPageBreakInside:
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPointerEvents:
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyPosition:
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyResize:
60609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSSPropertyScrollBehavior:
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertySpeak:
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTableLayout:
6091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case CSSPropertyTextAlignLast:
6107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSPropertyTextDecorationStyle:
6111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case CSSPropertyTextJustify:
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTextOverflow:
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTextRendering:
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyTextTransform:
615bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case CSSPropertyTouchActionDelay:
6169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case CSSPropertyUnicodeBidi:
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyVisibility:
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitAppearance:
61907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    case CSSPropertyBackfaceVisibility:
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBackfaceVisibility:
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderAfterStyle:
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderBeforeStyle:
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderEndStyle:
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderFit:
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBorderStartStyle:
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxAlign:
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxDecorationBreak:
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxDirection:
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxLines:
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxOrient:
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitBoxPack:
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakAfter:
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakBefore:
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnBreakInside:
6351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case CSSPropertyColumnFill:
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnRuleStyle:
637591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyAlignContent:
638591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyFlexDirection:
639591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyFlexWrap:
640591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSPropertyJustifyContent:
641a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case CSSPropertyFontKerning:
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitFontSmoothing:
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitLineBreak:
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginAfterCollapse:
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginBeforeCollapse:
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginBottomCollapse:
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitMarginTopCollapse:
648e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    case CSSPropertyInternalMarqueeDirection:
64906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    case CSSPropertyInternalMarqueeStyle:
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitPrintColorAdjust:
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitRtlOrdering:
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSPropertyWebkitRubyPosition:
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextCombine:
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextEmphasisPosition:
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextSecurity:
65607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    case CSSPropertyTransformStyle:
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTransformStyle:
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserDrag:
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserModify:
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitUserSelect:
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitWritingMode:
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWhiteSpace:
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWordBreak:
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWordWrap:
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
66609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSSPropertyAlignItems:
66709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSSPropertyAlignSelf:
66809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return !RuntimeEnabledFeatures::cssGridLayoutEnabled();
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static bool parseKeywordValue(MutableStylePropertySet* declaration, CSSPropertyID propertyId, const String& string, bool important, const CSSParserContext& parserContext)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!string.isEmpty());
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isKeywordPropertyID(propertyId)) {
679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // All properties accept the values of "initial" and "inherit".
680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        String lowerCaseString = string.lower();
681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (lowerCaseString != "initial" && lowerCaseString != "inherit")
682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Parse initial/inherit shorthands using the BisonCSSParser.
685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (shorthandForProperty(propertyId).length())
686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserString cssString;
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssString.init(string);
6915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSValueID valueID = cssValueKeywordID(cssString);
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!valueID)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<CSSValue> value = nullptr;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (valueID == CSSValueInherit)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = cssValuePool().createInheritedValue();
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (valueID == CSSValueInitial)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = cssValuePool().createExplicitInitialValue();
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isValidKeywordPropertyAndValue(propertyId, valueID, parserContext))
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = cssValuePool().createIdentifierValue(valueID);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    declaration->addParsedProperty(CSSProperty(propertyId, value.release(), important));
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template <typename CharType>
71109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static bool parseTransformTranslateArguments(CharType*& pos, CharType* end, unsigned expectedCount, CSSTransformValue* transformValue)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (expectedCount) {
71409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        size_t delimiter = WTF::find(pos, end - pos, expectedCount == 1 ? ')' : ',');
71509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (delimiter == kNotFound)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
71709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        unsigned argumentLength = static_cast<unsigned>(delimiter);
718d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        CSSPrimitiveValue::UnitType unit = CSSPrimitiveValue::CSS_NUMBER;
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double number;
72009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!parseSimpleLength(pos, argumentLength, unit, number))
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (unit != CSSPrimitiveValue::CSS_PX && (number || unit != CSSPrimitiveValue::CSS_NUMBER))
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
72451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        transformValue->append(cssValuePool().createValue(number, CSSPrimitiveValue::CSS_PX));
72509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        pos += argumentLength + 1;
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        --expectedCount;
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template <typename CharType>
7326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic bool parseTransformNumberArguments(CharType*& pos, CharType* end, unsigned expectedCount, CSSTransformValue* transformValue)
7336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
7346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    while (expectedCount) {
7356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        size_t delimiter = WTF::find(pos, end - pos, expectedCount == 1 ? ')' : ',');
7366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (delimiter == kNotFound)
7376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return false;
7386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        unsigned argumentLength = static_cast<unsigned>(delimiter);
7396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        bool ok;
7406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        double number = charactersToDouble(pos, argumentLength, &ok);
7416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!ok)
7426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return false;
7436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        transformValue->append(cssValuePool().createValue(number, CSSPrimitiveValue::CSS_NUMBER));
7446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        pos += argumentLength + 1;
7456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        --expectedCount;
7466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
7476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return true;
7486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
7496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
7506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochtemplate <typename CharType>
7516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic PassRefPtrWillBeRawPtr<CSSTransformValue> parseSimpleTransformValue(CharType*& pos, CharType* end)
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
75309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static const int shortestValidTransformStringLength = 12;
75409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
75509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (end - pos < shortestValidTransformStringLength)
756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
75709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    const bool isTranslate = toASCIILower(pos[0]) == 't'
7596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[1]) == 'r'
7606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[2]) == 'a'
7616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[3]) == 'n'
7626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[4]) == 's'
7636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[5]) == 'l'
7646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[6]) == 'a'
7656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[7]) == 't'
7666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[8]) == 'e';
7676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
7686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (isTranslate) {
7696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        CSSTransformValue::TransformOperationType transformType;
7706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        unsigned expectedArgumentCount = 1;
7716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        unsigned argumentStart = 11;
7726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        CharType c9 = toASCIILower(pos[9]);
7736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (c9 == 'x' && pos[10] == '(') {
7746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            transformType = CSSTransformValue::TranslateXTransformOperation;
7756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        } else if (c9 == 'y' && pos[10] == '(') {
7766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            transformType = CSSTransformValue::TranslateYTransformOperation;
7776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        } else if (c9 == 'z' && pos[10] == '(') {
7786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            transformType = CSSTransformValue::TranslateZTransformOperation;
7796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        } else if (c9 == '(') {
7806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            transformType = CSSTransformValue::TranslateTransformOperation;
7816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            expectedArgumentCount = 2;
7826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            argumentStart = 10;
7836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        } else if (c9 == '3' && toASCIILower(pos[10]) == 'd' && pos[11] == '(') {
7846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            transformType = CSSTransformValue::Translate3DTransformOperation;
7856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            expectedArgumentCount = 3;
7866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            argumentStart = 12;
7876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        } else {
7886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return nullptr;
7896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        }
7906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        pos += argumentStart;
7916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        RefPtrWillBeRawPtr<CSSTransformValue> transformValue = CSSTransformValue::create(transformType);
7926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!parseTransformTranslateArguments(pos, end, expectedArgumentCount, transformValue.get()))
7936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return nullptr;
7946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return transformValue.release();
7956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    const bool isMatrix3d = toASCIILower(pos[0]) == 'm'
7986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[1]) == 'a'
7996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[2]) == 't'
8006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[3]) == 'r'
8016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[4]) == 'i'
8026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[5]) == 'x'
8036f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && pos[6] == '3'
8046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[7]) == 'd'
8056f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && pos[8] == '(';
8066f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
8076f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (isMatrix3d) {
8086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        pos += 9;
8096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        RefPtrWillBeRawPtr<CSSTransformValue> transformValue = CSSTransformValue::create(CSSTransformValue::Matrix3DTransformOperation);
8106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!parseTransformNumberArguments(pos, end, 16, transformValue.get()))
8116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return nullptr;
8126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return transformValue.release();
81309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    const bool isScale3d = toASCIILower(pos[0]) == 's'
8166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[1]) == 'c'
8176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[2]) == 'a'
8186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[3]) == 'l'
8196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[4]) == 'e'
8206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && pos[5] == '3'
8216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && toASCIILower(pos[6]) == 'd'
8226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        && pos[7] == '(';
8236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
8246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (isScale3d) {
8256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        pos += 8;
8266f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        RefPtrWillBeRawPtr<CSSTransformValue> transformValue = CSSTransformValue::create(CSSTransformValue::Scale3DTransformOperation);
8276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!parseTransformNumberArguments(pos, end, 3, transformValue.get()))
8286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return nullptr;
8296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return transformValue.release();
8306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
8316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
8326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return nullptr;
83309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
83409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
83509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template <typename CharType>
8366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic PassRefPtrWillBeRawPtr<CSSValueList> parseSimpleTransformList(CharType*& pos, CharType* end)
83709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
83807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<CSSValueList> transformList = nullptr;
83909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    while (pos < end) {
84009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        while (pos < end && isCSSSpace(*pos))
84109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            ++pos;
8426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        RefPtrWillBeRawPtr<CSSTransformValue> transformValue = parseSimpleTransformValue(pos, end);
84309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!transformValue)
844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
84509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!transformList)
84609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            transformList = CSSValueList::createSpaceSeparated();
84709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        transformList->append(transformValue.release());
84809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (pos < end) {
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (isCSSSpace(*pos))
850d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
85109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
85209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
85309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return transformList.release();
85409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
85509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic bool parseSimpleTransform(MutableStylePropertySet* properties, CSSPropertyID propertyID, const String& string, bool important)
85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
858aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (propertyID != CSSPropertyTransform && propertyID != CSSPropertyWebkitTransform)
85909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
86009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (string.isEmpty())
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
86207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<CSSValueList> transformList = nullptr;
86309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (string.is8Bit()) {
86409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const LChar* pos = string.characters8();
86509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const LChar* end = pos + string.length();
8666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        transformList = parseSimpleTransformList(pos, end);
86709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!transformList)
86809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
86909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
87009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const UChar* pos = string.characters16();
87109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const UChar* end = pos + string.length();
8726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        transformList = parseSimpleTransformList(pos, end);
87309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!transformList)
87409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
87509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
876aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    properties->addParsedProperty(CSSProperty(propertyID, transformList.release(), important));
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropertyID propertyID, const String& string, bool important, const CSSParserContext& context)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!string.isEmpty());
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (parseSimpleLengthValue(declaration, propertyID, string, important, context.mode()))
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
88651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (parseColorValue(declaration, propertyID, string, important, context.mode()))
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parseKeywordValue(declaration, propertyID, string, important, context))
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    BisonCSSParser parser(context);
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parser.parseValue(declaration, propertyID, string, important, static_cast<StyleSheetContents*>(0));
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropertyID propertyID, const String& string, bool important, CSSParserMode cssParserMode, StyleSheetContents* contextStyleSheet)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!string.isEmpty());
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parseSimpleLengthValue(declaration, propertyID, string, important, cssParserMode))
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parseColorValue(declaration, propertyID, string, important, cssParserMode))
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CSSParserContext context(cssParserMode, 0);
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (contextStyleSheet) {
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context = contextStyleSheet->parserContext();
90651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        context.setMode(cssParserMode);
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (parseKeywordValue(declaration, propertyID, string, important, context))
910926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
9116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (parseSimpleTransform(declaration, propertyID, string, important))
912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
91409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    BisonCSSParser parser(context);
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parser.parseValue(declaration, propertyID, string, important, contextStyleSheet);
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropertyID propertyID, const String& string, bool important, StyleSheetContents* contextStyleSheet)
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
92009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_context.useCounter())
92109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_context.useCounter()->count(m_context, propertyID);
92293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(contextStyleSheet);
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-value ", string, "");
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_id = propertyID;
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_important = important;
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
9319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        StyleDeclarationScope scope(this, declaration);
9329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        cssyyparse(this);
9339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_rule = nullptr;
93693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_id = CSSPropertyInvalid;
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ok = false;
939926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_parsedProperties.isEmpty()) {
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ok = true;
941926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        declaration->addParsedProperties(m_parsedProperties);
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clearProperties();
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ok;
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The color will only be changed when string contains a valid CSS color, so callers
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// can set it to a default color and ignore the boolean result.
95009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseColor(RGBA32& color, const String& string, bool strict)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First try creating a color specified by name, rgba(), rgb() or "#" syntax.
953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (CSSPropertyParser::fastParseColor(color, string, strict))
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    BisonCSSParser parser(strictCSSParserContext());
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In case the fast-path parser didn't understand the color, try the full parser.
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parser.parseColor(string))
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
962926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    CSSValue* value = parser.m_parsedProperties.first().value();
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value->isPrimitiveValue())
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
966e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!primitiveValue->isRGBColor())
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    color = primitiveValue->getRGBA32Value();
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
974197021e6b966cfb06891637935ef33fff06433d1Ben MurdochStyleColor BisonCSSParser::colorFromRGBColorString(const String& colorString)
975197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
976197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: Rework css parser so it is more SVG aware.
977197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RGBA32 color;
978197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (parseColor(color, colorString.stripWhiteSpace()))
979197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return StyleColor(color);
980197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: This branch catches the string currentColor, but we should error if we have an illegal color value.
981197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return StyleColor::currentColor();
982197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
983197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
98409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseColor(const String& string)
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
986591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-decls color:", string, "");
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_rule = nullptr;
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
990926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !m_parsedProperties.isEmpty() && m_parsedProperties.first().id() == CSSPropertyColor;
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
993d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool BisonCSSParser::parseSystemColor(RGBA32& color, const String& string)
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserString cssColor;
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssColor.init(string);
9975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSValueID id = cssValueKeywordID(cssColor);
998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!CSSPropertyParser::isSystemColor(id))
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color parsedColor = RenderTheme::theme().systemColor(id);
100209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    color = parsedColor.rgb();
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::parseSelector(const String& string, CSSSelectorList& selectorList)
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_selectorListForParseSelector = &selectorList;
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1010591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-selector ", string, "");
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_selectorListForParseSelector = 0;
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1017197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<ImmutableStylePropertySet> BisonCSSParser::parseInlineStyleDeclaration(const String& string, Element* element)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document& document = element->document();
1020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSParserContext context = CSSParserContext(document.elementSheet().contents()->parserContext(), UseCounter::getFrom(&document));
102151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    context.setMode((element->isHTMLElement() && !document.inQuirksMode()) ? HTMLStandardMode : HTMLQuirksMode);
1022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return BisonCSSParser(context).parseDeclaration(string, document.elementSheet().contents());
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<ImmutableStylePropertySet> BisonCSSParser::parseDeclaration(const String& string, StyleSheetContents* contextStyleSheet)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(contextStyleSheet);
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1029591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-decls ", string, "");
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssyyparse(this);
1031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_rule = nullptr;
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1033197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtrWillBeRawPtr<ImmutableStylePropertySet> style = createStylePropertySet();
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return style.release();
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::parseDeclaration(MutableStylePropertySet* declaration, const String& string, CSSParserObserver* observer, StyleSheetContents* contextStyleSheet)
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStyleSheet(contextStyleSheet);
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TemporaryChange<CSSParserObserver*> scopedObsever(m_observer, observer);
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setupParser("@-internal-decls ", string, "");
104609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer) {
104709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startRuleHeader(CSSRuleSourceData::STYLE_RULE, 0);
104809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endRuleHeader(1);
104909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startRuleBody(0);
105053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
10519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
10529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
10539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        StyleDeclarationScope scope(this, declaration);
10549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        cssyyparse(this);
10559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
10569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_rule = nullptr;
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ok = false;
1060926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_parsedProperties.isEmpty()) {
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ok = true;
1062926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        declaration->addParsedProperties(m_parsedProperties);
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clearProperties();
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
106709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endRuleBody(string.length(), false);
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ok;
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1072c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool BisonCSSParser::parseAttributeMatchType(CSSSelector::AttributeMatchType& matchType, const String& string)
1073c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1074c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!RuntimeEnabledFeatures::cssAttributeCaseSensitivityEnabled() && !isUASheetBehavior(m_context.mode()))
1075c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
1076c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (string == "i") {
1077c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        matchType = CSSSelector::CaseInsensitive;
1078c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return true;
1079c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1080c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return false;
1081c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1082c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static inline void filterProperties(bool important, const WillBeHeapVector<CSSProperty, 256>& input, WillBeHeapVector<CSSProperty, 256>& output, size_t& unusedEntries, BitArray<numCSSProperties>& seenProperties)
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found.
1086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int i = input.size() - 1; i >= 0; --i) {
1087926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const CSSProperty& property = input[i];
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (property.isImportant() != important)
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const unsigned propertyIDIndex = property.id() - firstCSSProperty;
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (seenProperties.get(propertyIDIndex))
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        seenProperties.set(propertyIDIndex);
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        output[--unusedEntries] = property;
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1098197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<ImmutableStylePropertySet> BisonCSSParser::createStylePropertySet()
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BitArray<numCSSProperties> seenProperties;
1101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t unusedEntries = m_parsedProperties.size();
1102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WillBeHeapVector<CSSProperty, 256> results(unusedEntries);
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Important properties have higher priority, so add them first. Duplicate definitions can then be ignored when found.
110509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    filterProperties(true, m_parsedProperties, results, unusedEntries, seenProperties);
110609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    filterProperties(false, m_parsedProperties, results, unusedEntries, seenProperties);
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (unusedEntries)
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.remove(0, unusedEntries);
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserMode mode = inViewport() ? CSSViewportRuleMode : m_context.mode();
11119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
11129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return ImmutableStylePropertySet::create(results.data(), results.size(), mode);
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::rollbackLastProperties(int num)
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(num >= 0);
1118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_parsedProperties.size() >= static_cast<unsigned>(num));
1119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_parsedProperties.shrink(m_parsedProperties.size() - num);
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::clearProperties()
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_parsedProperties.clear();
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void BisonCSSParser::setCurrentProperty(CSSPropertyID propId)
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_id = propId;
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool BisonCSSParser::parseValue(CSSPropertyID propId, bool important)
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return CSSPropertyParser::parseValue(propId, important, m_valueList.get(), m_context, m_inViewport, m_parsedProperties, m_ruleHeaderType);
1136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class TransformOperationInfo {
1140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
1141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TransformOperationInfo(const CSSParserString& name)
1142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : m_type(CSSTransformValue::UnknownTransformOperation)
1143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , m_argCount(1)
1144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , m_allowSingleArgument(false)
1145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , m_unit(CSSPropertyParser::FUnknown)
1146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
1147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const UChar* characters;
1148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unsigned nameLength = name.length();
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const unsigned longestNameLength = 11;
1151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        UChar characterBuffer[longestNameLength];
1152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (name.is8Bit()) {
1153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            unsigned length = std::min(longestNameLength, nameLength);
1154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const LChar* characters8 = name.characters8();
1155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            for (unsigned i = 0; i < length; ++i)
1156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                characterBuffer[i] = characters8[i];
1157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            characters = characterBuffer;
1158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else
1159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            characters = name.characters16();
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        SWITCH(characters, nameLength) {
11627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("skew") {
1163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::SkewTransformOperation;
1165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_allowSingleArgument = true;
1166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 3;
1167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("scale") {
1169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::ScaleTransformOperation;
1171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_allowSingleArgument = true;
1172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 3;
1173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("skewx") {
1175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::SkewXTransformOperation;
1177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("skewy") {
1179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::SkewYTransformOperation;
1181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("matrix") {
1183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::MatrixTransformOperation;
1185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 11;
1186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("rotate") {
1188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::RotateTransformOperation;
1190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("scalex") {
1192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::ScaleXTransformOperation;
1194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("scaley") {
1196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::ScaleYTransformOperation;
1198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
11997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("scalez") {
1200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::ScaleZTransformOperation;
1202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("scale3d") {
1204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::Scale3DTransformOperation;
1206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 5;
1207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("rotatex") {
1209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::RotateXTransformOperation;
1211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("rotatey") {
1213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::RotateYTransformOperation;
1215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("rotatez") {
1217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FAngle;
1218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::RotateZTransformOperation;
1219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("matrix3d") {
1221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::Matrix3DTransformOperation;
1223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 31;
1224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("rotate3d") {
1226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::Rotate3DTransformOperation;
1228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 7;
1229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("translate") {
1231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent;
1232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::TranslateTransformOperation;
1233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_allowSingleArgument = true;
1234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 3;
1235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("translatex") {
1237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent;
1238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::TranslateXTransformOperation;
1239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("translatey") {
1241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent;
1242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::TranslateYTransformOperation;
1243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("translatez") {
1245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent;
1246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::TranslateZTransformOperation;
1247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("perspective") {
1249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FNumber;
1250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::PerspectiveTransformOperation;
1251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            CASE("translate3d") {
1253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent;
1254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_type = CSSTransformValue::Translate3DTransformOperation;
1255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_argCount = 5;
1256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSTransformValue::TransformOperationType type() const { return m_type; }
1261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned argCount() const { return m_argCount; }
1262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSPropertyParser::Units unit() const { return m_unit; }
1263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool unknown() const { return m_type == CSSTransformValue::UnknownTransformOperation; }
1265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool hasCorrectArgCount(unsigned argCount) { return m_argCount == argCount || (m_allowSingleArgument && argCount == 1); }
126651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
1268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSTransformValue::TransformOperationType m_type;
1269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned m_argCount;
1270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool m_allowSingleArgument;
1271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSPropertyParser::Units m_unit;
1272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
127351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1274aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochPassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseTransform(CSSPropertyID propId)
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_valueList)
1277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (CSSParserValue* value = m_valueList->current(); value; value = m_valueList->next()) {
1281aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        RefPtrWillBeRawPtr<CSSValue> parsedTransformValue = parseTransformValue(propId, value);
1282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!parsedTransformValue)
1283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        list->append(parsedTransformValue.release());
1286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return list.release();
128993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
129093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1291aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochPassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseTransformValue(CSSPropertyID propId, CSSParserValue *value)
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value->unit != CSSParserValue::Function || !value->function)
1294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1295e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Every primitive requires at least one argument.
1297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSParserValueList* args = value->function->args.get();
1298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!args)
1299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
130093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // See if the specified primitive is one we understand.
1302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TransformOperationInfo info(value->function->name);
1303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (info.unknown())
1304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!info.hasCorrectArgCount(args->size()))
1307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The transform is a list of functional primitives that specify transform operations.
1310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We collect a list of CSSTransformValues, where each value specifies a single operation.
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Create the new CSSTransformValue for this operation and add it to our list.
1313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<CSSTransformValue> transformValue = CSSTransformValue::create(info.type());
13148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Snag our values.
1316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSParserValue* a = args->current();
1317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned argNumber = 0;
1318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    while (a) {
1319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        CSSPropertyParser::Units unit = info.unit();
13208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (info.type() == CSSTransformValue::Rotate3DTransformOperation && argNumber == 3) {
1322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // 4th param of rotate3d() is an angle rather than a bare number, validate it as such
1323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!validUnit(a, FAngle, HTMLStandardMode))
1324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
1325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else if (info.type() == CSSTransformValue::Translate3DTransformOperation && argNumber == 2) {
1326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // 3rd param of translate3d() cannot be a percentage
1327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!validUnit(a, FLength, HTMLStandardMode))
1328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
1329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else if (info.type() == CSSTransformValue::TranslateZTransformOperation && !argNumber) {
1330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // 1st param of translateZ() cannot be a percentage
1331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!validUnit(a, FLength, HTMLStandardMode))
1332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
1333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else if (info.type() == CSSTransformValue::PerspectiveTransformOperation && !argNumber) {
1334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // 1st param of perspective() must be a non-negative number (deprecated) or length.
1335aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if ((propId == CSSPropertyWebkitTransform && !validUnit(a, FNumber | FLength | FNonNeg, HTMLStandardMode))
1336aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (propId == CSSPropertyTransform && !validUnit(a, FLength | FNonNeg, HTMLStandardMode)))
1337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
1338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else if (!validUnit(a, unit, HTMLStandardMode)) {
1339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Add the value to the current transform operation.
1343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        transformValue->append(createPrimitiveNumericValue(a));
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        a = args->next();
1346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!a)
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
1348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
1349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
1350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        a = args->next();
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        argNumber++;
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return transformValue.release();
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::ensureLineEndings()
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
136051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_lineEndings)
136151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_lineEndings = lineEndings(*m_source);
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::createFloatingSelectorWithTagName(const QualifiedName& tagQName)
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
136651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserSelector* selector = new CSSParserSelector(tagQName);
1367a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_floatingSelectors.append(selector);
136851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return selector;
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::createFloatingSelector()
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
137351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserSelector* selector = new CSSParserSelector;
1374a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_floatingSelectors.append(selector);
137551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return selector;
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<CSSParserSelector> BisonCSSParser::sinkFloatingSelector(CSSParserSelector* selector)
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
138051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (selector) {
1381a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        size_t index = m_floatingSelectors.reverseFind(selector);
1382a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(index != kNotFound);
1383a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_floatingSelectors.remove(index);
138451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
138551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(selector);
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Vector<OwnPtr<CSSParserSelector> >* BisonCSSParser::createFloatingSelectorVector()
138951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
139051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Vector<OwnPtr<CSSParserSelector> >* selectorVector = new Vector<OwnPtr<CSSParserSelector> >;
1391a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_floatingSelectorVectors.append(selectorVector);
139251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return selectorVector;
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > BisonCSSParser::sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectorVector)
13965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
139751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (selectorVector) {
1398a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        size_t index = m_floatingSelectorVectors.reverseFind(selectorVector);
1399a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(index != kNotFound);
1400a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_floatingSelectorVectors.remove(index);
140151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
140251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(selectorVector);
14035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
14045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
140509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserValueList* BisonCSSParser::createFloatingValueList()
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
140751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserValueList* list = new CSSParserValueList;
1408a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_floatingValueLists.append(list);
140951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return list;
141051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
141209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<CSSParserValueList> BisonCSSParser::sinkFloatingValueList(CSSParserValueList* list)
141351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
141451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (list) {
1415a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        size_t index = m_floatingValueLists.reverseFind(list);
1416a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(index != kNotFound);
1417a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_floatingValueLists.remove(index);
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
141951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(list);
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserFunction* BisonCSSParser::createFloatingFunction()
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
142451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserFunction* function = new CSSParserFunction;
1425a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_floatingFunctions.append(function);
142651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return function;
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserFunction* BisonCSSParser::createFloatingFunction(const CSSParserString& name, PassOwnPtr<CSSParserValueList> args)
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
143151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CSSParserFunction* function = createFloatingFunction();
143251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    function->name = name;
143351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    function->args = args;
143451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return function;
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
143709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<CSSParserFunction> BisonCSSParser::sinkFloatingFunction(CSSParserFunction* function)
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
143951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (function) {
1440a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        size_t index = m_floatingFunctions.reverseFind(function);
1441a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(index != kNotFound);
1442a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_floatingFunctions.remove(index);
144351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
144451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(function);
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserValue& BisonCSSParser::sinkFloatingValue(CSSParserValue& value)
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
144951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (value.unit == CSSParserValue::Function) {
1450a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        size_t index = m_floatingFunctions.reverseFind(value.function);
1451a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(index != kNotFound);
1452a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_floatingFunctions.remove(index);
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
145451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return value;
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)MediaQueryExp* BisonCSSParser::createFloatingMediaQueryExp(const AtomicString& mediaFeature, CSSParserValueList* values)
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
145907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_floatingMediaQueryExp = MediaQueryExp::createIfValid(mediaFeature, values);
146051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQueryExp.get();
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassOwnPtrWillBeRawPtr<MediaQueryExp> BisonCSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* expression)
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
146551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT_UNUSED(expression, expression == m_floatingMediaQueryExp);
146651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQueryExp.release();
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> >* BisonCSSParser::createFloatingMediaQueryExpList()
1470521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_floatingMediaQueryExpList = adoptPtrWillBeNoop(new WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> >);
147251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQueryExpList.get();
1473521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
1474521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassOwnPtrWillBeRawPtr<WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> > > BisonCSSParser::sinkFloatingMediaQueryExpList(WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> >* list)
1476521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
147751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT_UNUSED(list, list == m_floatingMediaQueryExpList);
147851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQueryExpList.release();
1479521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
1480521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaQuery* BisonCSSParser::createFloatingMediaQuery(MediaQuery::Restrictor restrictor, const AtomicString& mediaType, PassOwnPtrWillBeRawPtr<WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> > > expressions)
1482e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_floatingMediaQuery = adoptPtrWillBeNoop(new MediaQuery(restrictor, mediaType, expressions));
148451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQuery.get();
1485e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1486e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaQuery* BisonCSSParser::createFloatingMediaQuery(PassOwnPtrWillBeRawPtr<WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> > > expressions)
1488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
14897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return createFloatingMediaQuery(MediaQuery::None, MediaTypeNames::all, expressions);
1490e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1491e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
149209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)MediaQuery* BisonCSSParser::createFloatingNotAllQuery()
1493e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
14947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return createFloatingMediaQuery(MediaQuery::Not, MediaTypeNames::all, sinkFloatingMediaQueryExpList(createFloatingMediaQueryExpList()));
1495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassOwnPtrWillBeRawPtr<MediaQuery> BisonCSSParser::sinkFloatingMediaQuery(MediaQuery* query)
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
149951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT_UNUSED(query, query == m_floatingMediaQuery);
150051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingMediaQuery.release();
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> >* BisonCSSParser::createFloatingKeyframeVector()
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
150507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_floatingKeyframeVector = adoptPtrWillBeNoop(new WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> >());
150651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingKeyframeVector.get();
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochPassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> > > BisonCSSParser::sinkFloatingKeyframeVector(WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> >* keyframeVector)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
151151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT_UNUSED(keyframeVector, m_floatingKeyframeVector == keyframeVector);
151251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_floatingKeyframeVector.release();
151351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)MediaQuerySet* BisonCSSParser::createMediaQuerySet()
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaQuerySet> queries = MediaQuerySet::create();
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaQuerySet* result = queries.get();
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedMediaQuerySets.append(queries.release());
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createImportRule(const CSSParserString& url, MediaQuerySet* media)
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
152551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!media || !m_allowImportRules)
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<StyleRuleImport> rule = StyleRuleImport::create(url, media);
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRuleImport* result = rule.get();
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRules.append(rule.release());
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createMediaRule(MediaQuerySet* media, RuleList* rules)
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
153607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<StyleRuleMedia> rule = nullptr;
153751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (rules) {
1538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        rule = StyleRuleMedia::create(media ? media : MediaQuerySet::create().get(), *rules);
153951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RuleList emptyRules;
1541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        rule = StyleRuleMedia::create(media ? media : MediaQuerySet::create().get(), emptyRules);
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRuleMedia* result = rule.get();
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRules.append(rule.release());
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
154809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createSupportsRule(bool conditionIsSupported, RuleList* rules)
1549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
1551926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1552aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtrWillBeRawPtr<CSSRuleSourceData> data = popSupportsRuleData();
155307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<StyleRuleSupports> rule = nullptr;
1554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String conditionText;
1555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned conditionOffset = data->ruleHeaderRange.start + 9;
1556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned conditionLength = data->ruleHeaderRange.length() - 9;
1557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
155851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_tokenizer.is8BitSource())
155951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        conditionText = String(m_tokenizer.m_dataStart8.get() + conditionOffset, conditionLength).stripWhiteSpace();
1560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
156151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        conditionText = String(m_tokenizer.m_dataStart16.get() + conditionOffset, conditionLength).stripWhiteSpace();
1562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
156351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (rules) {
1564926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rule = StyleRuleSupports::create(conditionText, conditionIsSupported, *rules);
156551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
1566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RuleList emptyRules;
1567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rule = StyleRuleSupports::create(conditionText, conditionIsSupported, emptyRules);
1568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    StyleRuleSupports* result = rule.get();
1571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_parsedRules.append(rule.release());
1572926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1573926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return result;
1574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
157609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::markSupportsRuleHeaderStart()
1577926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_supportsRuleDataStack)
1579aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        m_supportsRuleDataStack = adoptPtrWillBeNoop(new RuleSourceDataList());
1580926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1581aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtrWillBeRawPtr<CSSRuleSourceData> data = CSSRuleSourceData::create(CSSRuleSourceData::SUPPORTS_RULE);
158251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    data->ruleHeaderRange.start = m_tokenizer.tokenStartOffset();
1583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_supportsRuleDataStack->append(data);
1584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
158609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::markSupportsRuleHeaderEnd()
1587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_supportsRuleDataStack && !m_supportsRuleDataStack->isEmpty());
1589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
159051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_tokenizer.is8BitSource())
159151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_supportsRuleDataStack->last()->ruleHeaderRange.end = m_tokenizer.tokenStart<LChar>() - m_tokenizer.m_dataStart8.get();
1592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
159351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_supportsRuleDataStack->last()->ruleHeaderRange.end = m_tokenizer.tokenStart<UChar>() - m_tokenizer.m_dataStart16.get();
1594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1596aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochPassRefPtrWillBeRawPtr<CSSRuleSourceData> BisonCSSParser::popSupportsRuleData()
1597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_supportsRuleDataStack && !m_supportsRuleDataStack->isEmpty());
1599aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtrWillBeRawPtr<CSSRuleSourceData> data = m_supportsRuleDataStack->last();
1600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_supportsRuleDataStack->removeLast();
1601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return data.release();
1602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
160409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)BisonCSSParser::RuleList* BisonCSSParser::createRuleList()
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    OwnPtrWillBeRawPtr<RuleList> list = adoptPtrWillBeNoop(new RuleList);
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RuleList* listPtr = list.get();
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRuleLists.append(list.release());
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return listPtr;
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)BisonCSSParser::RuleList* BisonCSSParser::appendRule(RuleList* ruleList, StyleRuleBase* rule)
161451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
161551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (rule) {
161651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!ruleList)
161751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            ruleList = createRuleList();
161851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ruleList->append(rule);
161951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
162051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return ruleList;
162151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
162293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
162393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)template <typename CharacterType>
162493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)ALWAYS_INLINE static void makeLower(const CharacterType* input, CharacterType* output, unsigned length)
162593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
162693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // FIXME: If we need Unicode lowercasing here, then we probably want the real kind
162793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // that can potentially change the length of the string rather than the character
162893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // by character kind. If we don't need Unicode lowercasing, it would be good to
162993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // simplify this function.
163093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
163193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (charactersAreAllASCII(input, length)) {
163293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // Fast case for all-ASCII.
163393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        for (unsigned i = 0; i < length; i++)
163493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            output[i] = toASCIILower(input[i]);
163593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else {
163693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        for (unsigned i = 0; i < length; i++)
163793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            output[i] = Unicode::toLower(input[i]);
163893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
163993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
164093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1641a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid BisonCSSParser::tokenToLowerCase(CSSParserString& token)
1642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1643a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // Since it's our internal token, we know that we created it out
1644a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // of our writable work buffers. Therefore the const_cast is just
1645a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // ugly and not a potential crash.
164693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    size_t length = token.length();
1647a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (token.is8Bit()) {
1648a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        makeLower(token.characters8(), const_cast<LChar*>(token.characters8()), length);
164993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else {
1650a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        makeLower(token.characters16(), const_cast<UChar*>(token.characters16()), length);
165193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
165293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
165393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
165409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endInvalidRuleHeader()
165593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
165693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (m_ruleHeaderType == CSSRuleSourceData::UNKNOWN_RULE)
1657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
165893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
165993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    CSSParserLocation location;
166051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    location.lineNumber = m_tokenizer.m_lineNumber;
1661e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    location.offset = m_ruleHeaderStartOffset;
166251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_tokenizer.is8BitSource())
166351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        location.token.init(m_tokenizer.m_dataStart8.get() + m_ruleHeaderStartOffset, 0);
166493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
166551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        location.token.init(m_tokenizer.m_dataStart16.get() + m_ruleHeaderStartOffset, 0);
166693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
166709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    reportError(location, m_ruleHeaderType == CSSRuleSourceData::STYLE_RULE ? InvalidSelectorCSSError : InvalidRuleCSSError);
166893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
166993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    endRuleHeader();
167093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
167193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
167209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::reportError(const CSSParserLocation&, CSSParserError)
167393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
167419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // FIXME: error reporting temporatily disabled.
1675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
167709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool BisonCSSParser::isLoggingErrors()
1678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
167993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return m_logErrors && !m_ignoreErrors;
1680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
168209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::logError(const String& message, const CSSParserLocation& location)
1683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1684e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    unsigned lineNumberInStyleSheet;
1685e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    unsigned columnNumber = 0;
1686e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (InspectorInstrumentation::hasFrontends()) {
1687e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ensureLineEndings();
1688e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        TextPosition tokenPosition = TextPosition::fromOffsetAndLineEndings(location.offset, *m_lineEndings);
1689e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        lineNumberInStyleSheet = tokenPosition.m_line.zeroBasedInt();
1690e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        columnNumber = (lineNumberInStyleSheet ? 0 : m_startPosition.m_column.zeroBasedInt()) + tokenPosition.m_column.zeroBasedInt();
1691e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else {
1692e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        lineNumberInStyleSheet = location.lineNumber;
1693e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
16946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    FrameConsole& console = m_styleSheet->singleOwnerDocument()->frame()->console();
1695e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    console.addMessage(ConsoleMessage::create(CSSMessageSource, WarningMessageLevel, message, m_styleSheet->baseURL().string(), lineNumberInStyleSheet + m_startPosition.m_line.zeroBasedInt() + 1, columnNumber + 1));
1696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
169807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochStyleRuleKeyframes* BisonCSSParser::createKeyframesRule(const String& name, PassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> > > popKeyframes, bool isPrefixed)
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
170007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> > > keyframes = popKeyframes;
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
1702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<StyleRuleKeyframes> rule = StyleRuleKeyframes::create();
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < keyframes->size(); ++i)
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rule->parserAppendKeyframe(keyframes->at(i));
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rule->setName(name);
1706e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    rule->setVendorPrefixed(isPrefixed);
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRuleKeyframes* rulePtr = rule.get();
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRules.append(rule.release());
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rulePtr;
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)static void recordSelectorStats(const CSSParserContext& context, const CSSSelectorList& selectorList)
171376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
171476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (!context.useCounter())
171576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return;
171676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
171776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    for (const CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(*selector)) {
171876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        for (const CSSSelector* current = selector; current ; current = current->tagHistory()) {
171976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            UseCounter::Feature feature = UseCounter::NumberOfFeatures;
172076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            switch (current->pseudoType()) {
172176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            case CSSSelector::PseudoUnresolved:
172276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                feature = UseCounter::CSSSelectorPseudoUnresolved;
172376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
172476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            case CSSSelector::PseudoShadow:
172576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                feature = UseCounter::CSSSelectorPseudoShadow;
172676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
172776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            case CSSSelector::PseudoContent:
172876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                feature = UseCounter::CSSSelectorPseudoContent;
172976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
173076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            case CSSSelector::PseudoHost:
173176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                feature = UseCounter::CSSSelectorPseudoHost;
173276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
173376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            case CSSSelector::PseudoHostContext:
173476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                feature = UseCounter::CSSSelectorPseudoHostContext;
173576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
173676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            default:
173776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                break;
173876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            }
173976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            if (feature != UseCounter::NumberOfFeatures)
174076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                context.useCounter()->count(feature);
174176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            if (current->relation() == CSSSelector::ShadowDeep)
174276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                context.useCounter()->count(UseCounter::CSSDeepCombinator);
174376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            if (current->selectorList())
174476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                recordSelectorStats(context, *current->selectorList());
174576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        }
174676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    }
174776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
174876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
174909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors)
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRule* result = 0;
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (selectors) {
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_allowImportRules = m_allowNamespaceDeclarations = false;
1754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RefPtrWillBeRawPtr<StyleRule> rule = StyleRule::create();
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rule->parserAdoptSelectorVector(*selectors);
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rule->setProperties(createStylePropertySet());
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = rule.get();
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_parsedRules.append(rule.release());
175976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        recordSelectorStats(m_context, result->selectorList());
176051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createFontFaceRule()
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
1768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (unsigned i = 0; i < m_parsedProperties.size(); ++i) {
1769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CSSProperty& property = m_parsedProperties[i];
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (property.id() == CSSPropertyFontVariant && property.value()->isPrimitiveValue())
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            property.wrapValueInCommaSeparatedList();
1772e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        else if (property.id() == CSSPropertyFontFamily && (!property.value()->isValueList() || toCSSValueList(property.value())->length() != 1)) {
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Unlike font-family property, font-family descriptor in @font-face rule
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // has to be a value list with exactly one family name. It cannot have a
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // have 'initial' value and cannot 'inherit' from parent.
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // See http://dev.w3.org/csswg/css3-fonts/#font-family-desc
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            clearProperties();
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1781d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<StyleRuleFontFace> rule = StyleRuleFontFace::create();
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rule->setProperties(createStylePropertySet());
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRuleFontFace* result = rule.get();
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRules.append(rule.release());
178651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_styleSheet)
178751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_styleSheet->setHasFontFaceRule(true);
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
179109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::addNamespace(const AtomicString& prefix, const AtomicString& uri)
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_styleSheet || !m_allowNamespaceDeclarations)
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = false;
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_styleSheet->parserAddNamespace(prefix, uri);
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (prefix.isEmpty() && !uri.isNull())
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_defaultNamespace = uri;
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)QualifiedName BisonCSSParser::determineNameInNamespace(const AtomicString& prefix, const AtomicString& localName)
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_styleSheet)
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return QualifiedName(prefix, localName, m_defaultNamespace);
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return QualifiedName(prefix, localName, m_styleSheet->determineNamespace(prefix));
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector* specifiers)
1809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
181007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_defaultNamespace != starAtom || specifiers->crossesTreeScopes())
1811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return rewriteSpecifiersWithElementName(nullAtom, starAtom, specifiers, /*tagIsForNamespaceRule*/true);
1812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return specifiers;
1813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
181509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule)
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleSheet ? m_styleSheet->determineNamespace(namespacePrefix) : m_defaultNamespace;
1818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    QualifiedName tag(namespacePrefix, elementName, determinedNamespace);
1819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
182007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (specifiers->crossesTreeScopes())
1821df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return rewriteSpecifiersWithElementNameForCustomPseudoElement(tag, elementName, specifiers, tagIsForNamespaceRule);
1822df95704c49daea886ddad70775bda23618d6274dBen Murdoch
182307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (specifiers->isContentPseudoElement())
182407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return rewriteSpecifiersWithElementNameForContentPseudoElement(tag, elementName, specifiers, tagIsForNamespaceRule);
182507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
182607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // *:host never matches, so we can't discard the * otherwise we can't tell the
182707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // difference between *:host and just :host.
182807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (tag == anyQName() && !specifiers->hasHostPseudoSelector())
1829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return specifiers;
183007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (specifiers->pseudoType() != CSSSelector::PseudoCue)
1831df95704c49daea886ddad70775bda23618d6274dBen Murdoch        specifiers->prependTagSelector(tag, tagIsForNamespaceRule);
1832df95704c49daea886ddad70775bda23618d6274dBen Murdoch    return specifiers;
1833df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithElementNameForCustomPseudoElement(const QualifiedName& tag, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule)
1836df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
183709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_context.useCounter() && specifiers->pseudoType() == CSSSelector::PseudoUserAgentCustomElement)
183809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_context.useCounter()->count(UseCounter::CSSPseudoElementUserAgentCustomPseudo);
183900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch
184093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    CSSParserSelector* lastShadowPseudo = specifiers;
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserSelector* history = specifiers;
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (history->tagHistory()) {
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        history = history->tagHistory();
184407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (history->crossesTreeScopes() || history->hasShadowPseudo())
184593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            lastShadowPseudo = history;
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
184893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (lastShadowPseudo->tagHistory()) {
1849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (tag != anyQName())
185093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            lastShadowPseudo->tagHistory()->prependTagSelector(tag, tagIsForNamespaceRule);
1851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return specifiers;
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // For shadow-ID pseudo-elements to be correctly matched, the ShadowPseudo combinator has to be used.
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We therefore create a new Selector with that combinator here in any case, even if matching any (host) element in any namespace (i.e. '*').
1856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<CSSParserSelector> elementNameSelector = adoptPtr(new CSSParserSelector(tag));
185793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    lastShadowPseudo->setTagHistory(elementNameSelector.release());
185893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    lastShadowPseudo->setRelation(CSSSelector::ShadowPseudo);
1859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return specifiers;
1860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
186209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithElementNameForContentPseudoElement(const QualifiedName& tag, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule)
1863df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
1864df95704c49daea886ddad70775bda23618d6274dBen Murdoch    CSSParserSelector* last = specifiers;
1865df95704c49daea886ddad70775bda23618d6274dBen Murdoch    CSSParserSelector* history = specifiers;
1866df95704c49daea886ddad70775bda23618d6274dBen Murdoch    while (history->tagHistory()) {
1867df95704c49daea886ddad70775bda23618d6274dBen Murdoch        history = history->tagHistory();
186807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (history->isContentPseudoElement() || history->relationIsAffectedByPseudoContent())
1869df95704c49daea886ddad70775bda23618d6274dBen Murdoch            last = history;
1870df95704c49daea886ddad70775bda23618d6274dBen Murdoch    }
1871df95704c49daea886ddad70775bda23618d6274dBen Murdoch
1872df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (last->tagHistory()) {
1873df95704c49daea886ddad70775bda23618d6274dBen Murdoch        if (tag != anyQName())
1874df95704c49daea886ddad70775bda23618d6274dBen Murdoch            last->tagHistory()->prependTagSelector(tag, tagIsForNamespaceRule);
1875df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return specifiers;
1876df95704c49daea886ddad70775bda23618d6274dBen Murdoch    }
1877df95704c49daea886ddad70775bda23618d6274dBen Murdoch
1878df95704c49daea886ddad70775bda23618d6274dBen Murdoch    // For shadow-ID pseudo-elements to be correctly matched, the ShadowPseudo combinator has to be used.
1879df95704c49daea886ddad70775bda23618d6274dBen Murdoch    // We therefore create a new Selector with that combinator here in any case, even if matching any (host) element in any namespace (i.e. '*').
1880df95704c49daea886ddad70775bda23618d6274dBen Murdoch    OwnPtr<CSSParserSelector> elementNameSelector = adoptPtr(new CSSParserSelector(tag));
1881df95704c49daea886ddad70775bda23618d6274dBen Murdoch    last->setTagHistory(elementNameSelector.release());
1882df95704c49daea886ddad70775bda23618d6274dBen Murdoch    last->setRelation(CSSSelector::SubSelector);
1883df95704c49daea886ddad70775bda23618d6274dBen Murdoch    return specifiers;
1884df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
1885df95704c49daea886ddad70775bda23618d6274dBen Murdoch
188609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CSSParserSelector* BisonCSSParser::rewriteSpecifiers(CSSParserSelector* specifiers, CSSParserSelector* newSpecifier)
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
188807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (newSpecifier->crossesTreeScopes()) {
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Unknown pseudo element always goes at the top of selector chain.
189093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        newSpecifier->appendTagHistory(CSSSelector::ShadowPseudo, sinkFloatingSelector(specifiers));
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return newSpecifier;
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
189307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (newSpecifier->isContentPseudoElement()) {
189407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        newSpecifier->appendTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(specifiers));
189507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return newSpecifier;
189607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
189707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (specifiers->crossesTreeScopes()) {
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Specifiers for unknown pseudo element go right behind it in the chain.
189993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        specifiers->insertTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier), CSSSelector::ShadowPseudo);
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return specifiers;
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
190207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (specifiers->isContentPseudoElement()) {
190307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        specifiers->insertTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier), CSSSelector::SubSelector);
190407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return specifiers;
190507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    specifiers->appendTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier));
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return specifiers;
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createPageRule(PassOwnPtr<CSSParserSelector> pageSelector)
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Margin at-rules are ignored.
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRulePage* pageRule = 0;
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pageSelector) {
1916d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RefPtrWillBeRawPtr<StyleRulePage> rule = StyleRulePage::create();
1917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Vector<OwnPtr<CSSParserSelector> > selectorVector;
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        selectorVector.append(pageSelector);
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rule->parserAdoptSelectorVector(selectorVector);
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rule->setProperties(createStylePropertySet());
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pageRule = rule.get();
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_parsedRules.append(rule.release());
192351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return pageRule;
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
192809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createMarginAtRule(CSSSelector::MarginBoxType /* marginBox */)
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Implement margin at-rule here, using:
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //        - marginBox: margin box
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //        - m_parsedProperties: properties at [m_numParsedPropertiesBeforeMarginBox, m_parsedProperties.size()] are for this at-rule.
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 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.
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    endDeclarationsForMarginBox();
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0; // until this method is implemented.
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
193909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startDeclarationsForMarginBox()
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1941926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_numParsedPropertiesBeforeMarginBox = m_parsedProperties.size();
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
194409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endDeclarationsForMarginBox()
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rollbackLastProperties(m_parsedProperties.size() - m_numParsedPropertiesBeforeMarginBox);
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_numParsedPropertiesBeforeMarginBox = INVALID_NUM_PARSED_PROPERTIES;
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleKeyframe* BisonCSSParser::createKeyframe(CSSParserValueList* keys)
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    OwnPtr<Vector<double> > keyVector = StyleKeyframe::createKeyList(keys);
19538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (keyVector->isEmpty())
19548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return 0;
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<StyleKeyframe> keyframe = StyleKeyframe::create();
19578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    keyframe->setKeys(keyVector.release());
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    keyframe->setProperties(createStylePropertySet());
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleKeyframe* keyframePtr = keyframe.get();
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedKeyframes.append(keyframe.release());
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return keyframePtr;
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::invalidBlockHit()
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_styleSheet && !m_hadSyntacticallyValidCSSRule)
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_styleSheet->setHasSyntacticallyValidCSSHeader(false);
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startRule()
197451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
197509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_observer)
197651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
197751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
197851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(m_ruleHasHeader);
197951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_ruleHasHeader = false;
198051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
198151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
198209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endRule(bool valid)
198351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
198409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_observer)
198551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
198651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
198751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_ruleHasHeader)
198809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endRuleBody(m_tokenizer.safeUserStringTokenOffset(), !valid);
198951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_ruleHasHeader = true;
199051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
199151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
199209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startRuleHeader(CSSRuleSourceData::Type ruleType)
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
199493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    resumeErrorLogging();
199593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_ruleHeaderType = ruleType;
199651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_ruleHeaderStartOffset = m_tokenizer.safeUserStringTokenOffset();
199751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_ruleHeaderStartLineNumber = m_tokenizer.m_tokenStartLineNumber;
199809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer) {
199951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(!m_ruleHasHeader);
200009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startRuleHeader(ruleType, m_ruleHeaderStartOffset);
200151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_ruleHasHeader = true;
200251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
200509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endRuleHeader()
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
200751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(m_ruleHeaderType != CSSRuleSourceData::UNKNOWN_RULE);
200893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_ruleHeaderType = CSSRuleSourceData::UNKNOWN_RULE;
200909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer) {
201051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(m_ruleHasHeader);
201109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endRuleHeader(m_tokenizer.safeUserStringTokenOffset());
201251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
201509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startSelector()
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
201709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
201809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startSelector(m_tokenizer.safeUserStringTokenOffset());
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endSelector()
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
202309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
202409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endSelector(m_tokenizer.safeUserStringTokenOffset());
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startRuleBody()
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
202909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
203009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startRuleBody(m_tokenizer.safeUserStringTokenOffset());
2031926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2032926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
203309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::startProperty()
2034926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
203593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    resumeErrorLogging();
203609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
203709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->startProperty(m_tokenizer.safeUserStringTokenOffset());
2038926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2039926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
204009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BisonCSSParser::endProperty(bool isImportantFound, bool isPropertyParsed, CSSParserError errorType)
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
204293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_id = CSSPropertyInvalid;
204309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_observer)
204409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_observer->endProperty(isImportantFound, isPropertyParsed, m_tokenizer.safeUserStringTokenOffset(), errorType);
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
204709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleRuleBase* BisonCSSParser::createViewportRule()
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // Allow @viewport rules from UA stylesheets even if the feature is disabled.
205051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!RuntimeEnabledFeatures::cssViewportEnabled() && !isUASheetBehavior(m_context.mode()))
2051521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return 0;
2052521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_allowImportRules = m_allowNamespaceDeclarations = false;
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeRawPtr<StyleRuleViewport> rule = StyleRuleViewport::create();
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rule->setProperties(createStylePropertySet());
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearProperties();
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleRuleViewport* result = rule.get();
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsedRules.append(rule.release());
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2067