15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CSSParserValues_h 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSParserValues_h 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h" 2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/css/CSSPrimitiveValue.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSSelector.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h" 285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/AtomicString.h" 295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/WTFString.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QualifiedName; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserString { 3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) void init(const LChar* characters, unsigned length) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.characters8 = characters; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_length = length; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_is8Bit = true; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) void init(const UChar* characters, unsigned length) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.characters16 = characters; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_length = length; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_is8Bit = false; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void init(const String& string) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) init(string, 0, string.length()); 5393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 5493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 5593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) void init(const String& string, unsigned startOffset, unsigned length) 5693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 5793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_length = length; 58fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!m_length) { 59fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_data.characters8 = 0; 60fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_is8Bit = true; 61fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return; 62fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch } 63fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (string.is8Bit()) { 6493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_data.characters8 = const_cast<LChar*>(string.characters8()) + startOffset; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_is8Bit = true; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_data.characters16 = const_cast<UChar*>(string.characters16()) + startOffset; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_is8Bit = false; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clear() 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.characters8 = 0; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_length = 0; 76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_is8Bit = true; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is8Bit() const { return m_is8Bit; } 8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const LChar* characters8() const { ASSERT(is8Bit()); return m_data.characters8; } 8193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const UChar* characters16() const { ASSERT(!is8Bit()); return m_data.characters16; } 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template <typename CharacterType> 8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const CharacterType* characters() const; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned length() const { return m_length; } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setLength(unsigned length) { m_length = length; } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) UChar operator[](unsigned i) const 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(i < m_length); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (is8Bit()) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_data.characters8[i]; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_data.characters16[i]; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) bool equalIgnoringCase(const char* str) const 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool match = is8Bit() ? WTF::equalIgnoringCase(str, characters8(), length()) : WTF::equalIgnoringCase(str, characters16(), length()); 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!match) 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(strlen(str) >= length()); 102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return str[length()] == '\0'; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) template <size_t strLength> 10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) bool startsWithIgnoringCase(const char (&str)[strLength]) const 10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return startsWithIgnoringCase(str, strLength - 1); 10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 11193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) bool startsWithIgnoringCase(const char* str, size_t strLength) const 11293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (length() < strLength) 11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 11593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return is8Bit() ? WTF::equalIgnoringCase(str, characters8(), strLength) : WTF::equalIgnoringCase(str, characters16(), strLength); 11693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch operator String() const { return is8Bit() ? String(m_data.characters8, m_length) : StringImpl::create8BitIfPossible(m_data.characters16, m_length); } 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator AtomicString() const { return is8Bit() ? AtomicString(m_data.characters8, m_length) : AtomicString(m_data.characters16, m_length); } 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) bool isFunction() const { return length() > 0 && (*this)[length() - 1] == '('; } 1229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) union { 12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const LChar* characters8; 12593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const UChar* characters16; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } m_data; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_length; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_is8Bit; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <> 13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline const LChar* CSSParserString::characters<LChar>() const { return characters8(); } 13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <> 13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline const UChar* CSSParserString::characters<UChar>() const { return characters16(); } 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserFunction; 138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class CSSParserValueList; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserValue { 1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) CSSValueID id; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isInt; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) union { 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double fValue; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int iValue; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserString string; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserFunction* function; 14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSParserValueList* valueList; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum { 15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Operator = 0x100000, 15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Function = 0x100001, 15351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ValueList = 0x100002, 15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Q_EMS = 0x100003, 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int unit; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) inline void setFromNumber(double value, int unit = CSSPrimitiveValue::CSS_NUMBER); 159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) inline void setFromFunction(CSSParserFunction*); 16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void setFromValueList(PassOwnPtr<CSSParserValueList>); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParserValueList { 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserValueList() 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_current(0) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~CSSParserValueList(); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addValue(const CSSParserValue&); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void insertValueAt(unsigned, const CSSParserValue&); 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void stealValues(CSSParserValueList&); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned size() const { return m_values.size(); } 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned currentIndex() { return m_current; } 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserValue* current() { return m_current < m_values.size() ? &m_values[m_current] : 0; } 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserValue* next() { ++m_current; return current(); } 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserValue* previous() 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_current) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) --m_current; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return current(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 187aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch void setCurrentIndex(unsigned index) 188aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch { 189aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch ASSERT(index < m_values.size()); 190aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (index < m_values.size()) 191aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch m_current = index; 192aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserValue* valueAt(unsigned i) { return i < m_values.size() ? &m_values[i] : 0; } 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 196323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) void clearAndLeakValues() { m_values.clear(); m_current = 0;} 197323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) void destroyAndClear(); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_current; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<CSSParserValue, 4> m_values; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserFunction { 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserString name; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<CSSParserValueList> args; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParserSelector { 21293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(CSSParserSelector); WTF_MAKE_FAST_ALLOCATED; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserSelector(); 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit CSSParserSelector(const QualifiedName&); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~CSSParserSelector(); 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PassOwnPtr<CSSSelector> releaseSelector() { return m_selector.release(); } 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) CSSSelector::Relation relation() const { return m_selector->relation(); } 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setValue(const AtomicString& value) { m_selector->setValue(value); } 222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void setAttribute(const QualifiedName& value, CSSSelector::AttributeMatchType matchType) { m_selector->setAttribute(value, matchType); } 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setArgument(const AtomicString& value) { m_selector->setArgument(value); } 2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void setMatch(CSSSelector::Match value) { m_selector->setMatch(value); } 2255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void setRelation(CSSSelector::Relation value) { m_selector->setRelation(value); } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setForPage() { m_selector->setForPage(); } 227df95704c49daea886ddad70775bda23618d6274dBen Murdoch void setRelationIsAffectedByPseudoContent() { m_selector->setRelationIsAffectedByPseudoContent(); } 228df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool relationIsAffectedByPseudoContent() const { return m_selector->relationIsAffectedByPseudoContent(); } 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >& selectorVector); 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool hasHostPseudoSelector() const; 23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool isContentPseudoElement() const { return m_selector->isContentPseudoElement(); } 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSSelector::PseudoType pseudoType() const { return m_selector->pseudoType(); } 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isCustomPseudoElement() const { return m_selector->isCustomPseudoElement(); } 23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool crossesTreeScopes() const { return isCustomPseudoElement() || pseudoType() == CSSSelector::PseudoCue || pseudoType() == CSSSelector::PseudoShadow; } 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isSimple() const; 24093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) bool hasShadowPseudo() const; 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSParserSelector* tagHistory() const { return m_tagHistory.get(); } 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setTagHistory(PassOwnPtr<CSSParserSelector> selector) { m_tagHistory = selector; } 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void clearTagHistory() { m_tagHistory.clear(); } 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void insertTagHistory(CSSSelector::Relation before, PassOwnPtr<CSSParserSelector>, CSSSelector::Relation after); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void appendTagHistory(CSSSelector::Relation, PassOwnPtr<CSSParserSelector>); 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void prependTagSelector(const QualifiedName&, bool tagIsForNamespaceRule = false); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<CSSSelector> m_selector; 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<CSSParserSelector> m_tagHistory; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline bool CSSParserSelector::hasShadowPseudo() const 25593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 25693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_selector->relation() == CSSSelector::ShadowPseudo; 25793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 25893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 25993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline void CSSParserValue::setFromNumber(double value, int unit) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) id = CSSValueInvalid; 26293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) isInt = false; 26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (std::isfinite(value)) 26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) fValue = value; 26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else 26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) fValue = 0; 26793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) this->unit = unit; 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 270521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)inline void CSSParserValue::setFromFunction(CSSParserFunction* function) 271521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 272521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) id = CSSValueInvalid; 273521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) this->function = function; 274521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) unit = Function; 2755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) isInt = false; 276521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 277521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline void CSSParserValue::setFromValueList(PassOwnPtr<CSSParserValueList> valueList) 27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) id = CSSValueInvalid; 28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) this->valueList = valueList.leakPtr(); 28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unit = ValueList; 2835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) isInt = false; 28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 28551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 289