| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) | |
| 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. | |
| 4 * | |
| 5 * This library is free software; you can redistribute it and/or | |
| 6 * modify it under the terms of the GNU Library General Public | |
| 7 * License as published by the Free Software Foundation; either | |
| 8 * version 2 of the License, or (at your option) any later version. | |
| 9 * | |
| 10 * This library is distributed in the hope that it will be useful, | |
| 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 13 * Library General Public License for more details. | |
| 14 * | |
| 15 * You should have received a copy of the GNU Library General Public License | |
| 16 * along with this library; see the file COPYING.LIB. If not, write to | |
| 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 18 * Boston, MA 02110-1301, USA. | |
| 19 */ | |
| 20 | |
| 21 #include "config.h" | |
| 22 #include "core/css/CSSParserValues.h" | |
| 23 | |
| 24 #include "core/css/CSSFunctionValue.h" | |
| 25 #include "core/css/CSSSelectorList.h" | |
| 26 #include "core/html/parser/HTMLParserIdioms.h" | |
| 27 | |
| 28 namespace blink { | |
| 29 | |
| 30 using namespace WTF; | |
| 31 | |
| 32 static void destroy(Vector<CSSParserValue, 4>& values) | |
| 33 { | |
| 34 size_t numValues = values.size(); | |
| 35 for (size_t i = 0; i < numValues; i++) { | |
| 36 if (values[i].unit == CSSParserValue::Function) | |
| 37 delete values[i].function; | |
| 38 else if (values[i].unit == CSSParserValue::ValueList) | |
| 39 delete values[i].valueList; | |
| 40 } | |
| 41 } | |
| 42 | |
| 43 void CSSParserValueList::destroyAndClear() | |
| 44 { | |
| 45 destroy(m_values); | |
| 46 clearAndLeakValues(); | |
| 47 } | |
| 48 | |
| 49 CSSParserValueList::~CSSParserValueList() | |
| 50 { | |
| 51 destroy(m_values); | |
| 52 } | |
| 53 | |
| 54 void CSSParserValueList::addValue(const CSSParserValue& v) | |
| 55 { | |
| 56 m_values.append(v); | |
| 57 } | |
| 58 | |
| 59 void CSSParserValueList::insertValueAt(unsigned i, const CSSParserValue& v) | |
| 60 { | |
| 61 m_values.insert(i, v); | |
| 62 } | |
| 63 | |
| 64 void CSSParserValueList::stealValues(CSSParserValueList& valueList) | |
| 65 { | |
| 66 for (unsigned i = 0; i < valueList.size(); ++i) | |
| 67 m_values.append(*(valueList.valueAt(i))); | |
| 68 valueList.clearAndLeakValues(); | |
| 69 } | |
| 70 | |
| 71 PassRefPtrWillBeRawPtr<CSSValue> CSSParserValue::createCSSValue() | |
| 72 { | |
| 73 if (id) | |
| 74 return CSSPrimitiveValue::createIdentifier(id); | |
| 75 | |
| 76 if (unit == CSSParserValue::Operator) | |
| 77 return CSSPrimitiveValue::createParserOperator(iValue); | |
| 78 if (unit == CSSParserValue::Function) | |
| 79 return CSSFunctionValue::create(function); | |
| 80 if (unit == CSSParserValue::ValueList) | |
| 81 return CSSValueList::createFromParserValueList(valueList); | |
| 82 if (unit >= CSSParserValue::Q_EMS) | |
| 83 return CSSPrimitiveValue::createAllowingMarginQuirk(fValue, CSSPrimitive
Value::CSS_EMS); | |
| 84 | |
| 85 CSSPrimitiveValue::UnitType primitiveUnit = static_cast<CSSPrimitiveValue::U
nitType>(unit); | |
| 86 switch (primitiveUnit) { | |
| 87 case CSSPrimitiveValue::CSS_IDENT: | |
| 88 case CSSPrimitiveValue::CSS_PROPERTY_ID: | |
| 89 case CSSPrimitiveValue::CSS_VALUE_ID: | |
| 90 return CSSPrimitiveValue::create(string, CSSPrimitiveValue::CSS_PARSER_I
DENTIFIER); | |
| 91 case CSSPrimitiveValue::CSS_NUMBER: | |
| 92 return CSSPrimitiveValue::create(fValue, isInt ? CSSPrimitiveValue::CSS_
PARSER_INTEGER : CSSPrimitiveValue::CSS_NUMBER); | |
| 93 case CSSPrimitiveValue::CSS_STRING: | |
| 94 case CSSPrimitiveValue::CSS_URI: | |
| 95 case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR: | |
| 96 return CSSPrimitiveValue::create(string, primitiveUnit); | |
| 97 case CSSPrimitiveValue::CSS_PERCENTAGE: | |
| 98 case CSSPrimitiveValue::CSS_EMS: | |
| 99 case CSSPrimitiveValue::CSS_EXS: | |
| 100 case CSSPrimitiveValue::CSS_PX: | |
| 101 case CSSPrimitiveValue::CSS_CM: | |
| 102 case CSSPrimitiveValue::CSS_MM: | |
| 103 case CSSPrimitiveValue::CSS_IN: | |
| 104 case CSSPrimitiveValue::CSS_PT: | |
| 105 case CSSPrimitiveValue::CSS_PC: | |
| 106 case CSSPrimitiveValue::CSS_DEG: | |
| 107 case CSSPrimitiveValue::CSS_RAD: | |
| 108 case CSSPrimitiveValue::CSS_GRAD: | |
| 109 case CSSPrimitiveValue::CSS_MS: | |
| 110 case CSSPrimitiveValue::CSS_S: | |
| 111 case CSSPrimitiveValue::CSS_HZ: | |
| 112 case CSSPrimitiveValue::CSS_KHZ: | |
| 113 case CSSPrimitiveValue::CSS_VW: | |
| 114 case CSSPrimitiveValue::CSS_VH: | |
| 115 case CSSPrimitiveValue::CSS_VMIN: | |
| 116 case CSSPrimitiveValue::CSS_VMAX: | |
| 117 case CSSPrimitiveValue::CSS_TURN: | |
| 118 case CSSPrimitiveValue::CSS_REMS: | |
| 119 case CSSPrimitiveValue::CSS_CHS: | |
| 120 case CSSPrimitiveValue::CSS_FR: | |
| 121 return CSSPrimitiveValue::create(fValue, primitiveUnit); | |
| 122 case CSSPrimitiveValue::CSS_UNKNOWN: | |
| 123 case CSSPrimitiveValue::CSS_DIMENSION: | |
| 124 case CSSPrimitiveValue::CSS_ATTR: | |
| 125 case CSSPrimitiveValue::CSS_COUNTER: | |
| 126 case CSSPrimitiveValue::CSS_RECT: | |
| 127 case CSSPrimitiveValue::CSS_RGBCOLOR: | |
| 128 case CSSPrimitiveValue::CSS_DPPX: | |
| 129 case CSSPrimitiveValue::CSS_DPI: | |
| 130 case CSSPrimitiveValue::CSS_DPCM: | |
| 131 case CSSPrimitiveValue::CSS_PAIR: | |
| 132 case CSSPrimitiveValue::CSS_UNICODE_RANGE: | |
| 133 case CSSPrimitiveValue::CSS_PARSER_INTEGER: | |
| 134 case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER: | |
| 135 case CSSPrimitiveValue::CSS_PARSER_OPERATOR: | |
| 136 case CSSPrimitiveValue::CSS_COUNTER_NAME: | |
| 137 case CSSPrimitiveValue::CSS_SHAPE: | |
| 138 case CSSPrimitiveValue::CSS_QUAD: | |
| 139 case CSSPrimitiveValue::CSS_CALC: | |
| 140 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER: | |
| 141 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH: | |
| 142 return nullptr; | |
| 143 } | |
| 144 | |
| 145 ASSERT_NOT_REACHED(); | |
| 146 return nullptr; | |
| 147 } | |
| 148 | |
| 149 CSSParserSelector::CSSParserSelector() | |
| 150 : m_selector(adoptPtr(new CSSSelector())) | |
| 151 { | |
| 152 } | |
| 153 | |
| 154 CSSParserSelector::CSSParserSelector(const QualifiedName& tagQName) | |
| 155 : m_selector(adoptPtr(new CSSSelector(tagQName))) | |
| 156 { | |
| 157 } | |
| 158 | |
| 159 CSSParserSelector::~CSSParserSelector() | |
| 160 { | |
| 161 if (!m_tagHistory) | |
| 162 return; | |
| 163 Vector<OwnPtr<CSSParserSelector>, 16> toDelete; | |
| 164 OwnPtr<CSSParserSelector> selector = m_tagHistory.release(); | |
| 165 while (true) { | |
| 166 OwnPtr<CSSParserSelector> next = selector->m_tagHistory.release(); | |
| 167 toDelete.append(selector.release()); | |
| 168 if (!next) | |
| 169 break; | |
| 170 selector = next.release(); | |
| 171 } | |
| 172 } | |
| 173 | |
| 174 void CSSParserSelector::adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >&
selectorVector) | |
| 175 { | |
| 176 CSSSelectorList* selectorList = new CSSSelectorList(); | |
| 177 selectorList->adoptSelectorVector(selectorVector); | |
| 178 m_selector->setSelectorList(adoptPtr(selectorList)); | |
| 179 } | |
| 180 | |
| 181 bool CSSParserSelector::isSimple() const | |
| 182 { | |
| 183 if (m_selector->selectorList() || m_selector->matchesPseudoElement()) | |
| 184 return false; | |
| 185 | |
| 186 if (!m_tagHistory) | |
| 187 return true; | |
| 188 | |
| 189 if (m_selector->match() == CSSSelector::Tag) { | |
| 190 // We can't check against anyQName() here because namespace may not be n
ullAtom. | |
| 191 // Example: | |
| 192 // @namespace "http://www.w3.org/2000/svg"; | |
| 193 // svg:not(:root) { ... | |
| 194 if (m_selector->tagQName().localName() == starAtom) | |
| 195 return m_tagHistory->isSimple(); | |
| 196 } | |
| 197 | |
| 198 return false; | |
| 199 } | |
| 200 | |
| 201 void CSSParserSelector::insertTagHistory(CSSSelector::Relation before, PassOwnPt
r<CSSParserSelector> selector, CSSSelector::Relation after) | |
| 202 { | |
| 203 if (m_tagHistory) | |
| 204 selector->setTagHistory(m_tagHistory.release()); | |
| 205 setRelation(before); | |
| 206 selector->setRelation(after); | |
| 207 m_tagHistory = selector; | |
| 208 } | |
| 209 | |
| 210 void CSSParserSelector::appendTagHistory(CSSSelector::Relation relation, PassOwn
Ptr<CSSParserSelector> selector) | |
| 211 { | |
| 212 CSSParserSelector* end = this; | |
| 213 while (end->tagHistory()) | |
| 214 end = end->tagHistory(); | |
| 215 end->setRelation(relation); | |
| 216 end->setTagHistory(selector); | |
| 217 } | |
| 218 | |
| 219 void CSSParserSelector::prependTagSelector(const QualifiedName& tagQName, bool t
agIsForNamespaceRule) | |
| 220 { | |
| 221 OwnPtr<CSSParserSelector> second = adoptPtr(new CSSParserSelector); | |
| 222 second->m_selector = m_selector.release(); | |
| 223 second->m_tagHistory = m_tagHistory.release(); | |
| 224 m_tagHistory = second.release(); | |
| 225 | |
| 226 m_selector = adoptPtr(new CSSSelector(tagQName, tagIsForNamespaceRule)); | |
| 227 m_selector->setRelation(CSSSelector::SubSelector); | |
| 228 } | |
| 229 | |
| 230 bool CSSParserSelector::hasHostPseudoSelector() const | |
| 231 { | |
| 232 for (CSSParserSelector* selector = const_cast<CSSParserSelector*>(this); sel
ector; selector = selector->tagHistory()) { | |
| 233 if (selector->pseudoType() == CSSSelector::PseudoHost || selector->pseud
oType() == CSSSelector::PseudoHostContext) | |
| 234 return true; | |
| 235 } | |
| 236 return false; | |
| 237 } | |
| 238 | |
| 239 } // namespace blink | |
| OLD | NEW |