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