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