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