| OLD | NEW |
| 1 /* | 1 /* |
| 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. |
| 4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. | 4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. |
| 5 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 5 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| 11 * | 11 * |
| 12 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Library General Public License for more details. | 15 * Library General Public License for more details. |
| 16 * | 16 * |
| 17 * You should have received a copy of the GNU Library General Public License | 17 * You should have received a copy of the GNU Library General Public License |
| 18 * along with this library; see the file COPYING.LIB. If not, write to | 18 * along with this library; see the file COPYING.LIB. If not, write to |
| 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 * Boston, MA 02110-1301, USA. | 20 * Boston, MA 02110-1301, USA. |
| 21 */ | 21 */ |
| 22 | 22 |
| 23 #include "config.h" | 23 #include "config.h" |
| 24 #include "core/css/StylePropertySet.h" | 24 #include "core/css/StylePropertySet.h" |
| 25 | 25 |
| 26 #include "core/StylePropertyShorthand.h" | 26 #include "core/StylePropertyShorthand.h" |
| 27 #include "core/css/CSSCustomPropertyDeclaration.h" |
| 27 #include "core/css/CSSPropertyMetadata.h" | 28 #include "core/css/CSSPropertyMetadata.h" |
| 28 #include "core/css/CSSValuePool.h" | 29 #include "core/css/CSSValuePool.h" |
| 29 #include "core/css/StylePropertySerializer.h" | 30 #include "core/css/StylePropertySerializer.h" |
| 30 #include "core/css/StyleSheetContents.h" | 31 #include "core/css/StyleSheetContents.h" |
| 31 #include "core/css/parser/CSSParser.h" | 32 #include "core/css/parser/CSSParser.h" |
| 32 #include "core/frame/UseCounter.h" | 33 #include "core/frame/UseCounter.h" |
| 33 #include "platform/RuntimeEnabledFeatures.h" | 34 #include "platform/RuntimeEnabledFeatures.h" |
| 34 #include "wtf/text/StringBuilder.h" | 35 #include "wtf/text/StringBuilder.h" |
| 35 | 36 |
| 36 #ifndef NDEBUG | 37 #ifndef NDEBUG |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 #if !ENABLE(OILPAN) | 97 #if !ENABLE(OILPAN) |
| 97 RawPtrWillBeMember<CSSValue>* valueArray = const_cast<RawPtrWillBeMember<CSS
Value>*>(this->valueArray()); | 98 RawPtrWillBeMember<CSSValue>* valueArray = const_cast<RawPtrWillBeMember<CSS
Value>*>(this->valueArray()); |
| 98 for (unsigned i = 0; i < m_arraySize; ++i) { | 99 for (unsigned i = 0; i < m_arraySize; ++i) { |
| 99 // Checking for nullptr here is a workaround to prevent crashing. http:
//crbug.com/449032 | 100 // Checking for nullptr here is a workaround to prevent crashing. http:
//crbug.com/449032 |
| 100 if (valueArray[i]) | 101 if (valueArray[i]) |
| 101 valueArray[i]->deref(); | 102 valueArray[i]->deref(); |
| 102 } | 103 } |
| 103 #endif | 104 #endif |
| 104 } | 105 } |
| 105 | 106 |
| 106 int ImmutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const | 107 // Convert property into an uint16_t for comparison with metadata's m_propertyID
to avoid |
| 108 // the compiler converting it to an int multiple times in a loop. |
| 109 static uint16_t getConvertedCSSPropertyID(CSSPropertyID propertyID) |
| 107 { | 110 { |
| 108 // Convert here propertyID into an uint16_t to compare it with the metadata'
s m_propertyID to avoid | 111 return static_cast<uint16_t>(propertyID); |
| 109 // the compiler converting it to an int multiple times in the loop. | 112 } |
| 110 uint16_t id = static_cast<uint16_t>(propertyID); | 113 |
| 114 static uint16_t getConvertedCSSPropertyID(const AtomicString&) |
| 115 { |
| 116 return static_cast<uint16_t>(CSSPropertyVariable); |
| 117 } |
| 118 |
| 119 static bool isPropertyMatch(const StylePropertyMetadata& metadata, const CSSValu
e&, uint16_t id, CSSPropertyID propertyID) |
| 120 { |
| 121 ASSERT(id == propertyID); |
| 122 bool result = metadata.m_propertyID == id; |
| 123 // Only enabled properties should be part of the style. |
| 124 ASSERT(!result || CSSPropertyMetadata::isEnabledProperty(propertyID)); |
| 125 return result; |
| 126 } |
| 127 |
| 128 static bool isPropertyMatch(const StylePropertyMetadata& metadata, const CSSValu
e& value, uint16_t id, const AtomicString& customPropertyName) |
| 129 { |
| 130 ASSERT(id == CSSPropertyVariable); |
| 131 return metadata.m_propertyID == id |
| 132 && toCSSCustomPropertyDeclaration(value).name() == customPropertyName; |
| 133 } |
| 134 |
| 135 template<typename T> |
| 136 int ImmutableStylePropertySet::findPropertyIndex(T property) const |
| 137 { |
| 138 uint16_t id = getConvertedCSSPropertyID(property); |
| 111 for (int n = m_arraySize - 1 ; n >= 0; --n) { | 139 for (int n = m_arraySize - 1 ; n >= 0; --n) { |
| 112 if (metadataArray()[n].m_propertyID == id) { | 140 if (isPropertyMatch(metadataArray()[n], *valueArray()[n], id, property)) |
| 113 // Only enabled properties should be part of the style. | |
| 114 ASSERT(CSSPropertyMetadata::isEnabledProperty(propertyID)); | |
| 115 return n; | 141 return n; |
| 116 } | |
| 117 } | 142 } |
| 118 | 143 |
| 119 return -1; | 144 return -1; |
| 120 } | 145 } |
| 146 template CORE_EXPORT int ImmutableStylePropertySet::findPropertyIndex(CSSPropert
yID) const; |
| 147 template CORE_EXPORT int ImmutableStylePropertySet::findPropertyIndex(AtomicStri
ng) const; |
| 121 | 148 |
| 122 DEFINE_TRACE_AFTER_DISPATCH(ImmutableStylePropertySet) | 149 DEFINE_TRACE_AFTER_DISPATCH(ImmutableStylePropertySet) |
| 123 { | 150 { |
| 124 const RawPtrWillBeMember<CSSValue>* values = valueArray(); | 151 const RawPtrWillBeMember<CSSValue>* values = valueArray(); |
| 125 for (unsigned i = 0; i < m_arraySize; i++) | 152 for (unsigned i = 0; i < m_arraySize; i++) |
| 126 visitor->trace(values[i]); | 153 visitor->trace(values[i]); |
| 127 StylePropertySet::traceAfterDispatch(visitor); | 154 StylePropertySet::traceAfterDispatch(visitor); |
| 128 } | 155 } |
| 129 | 156 |
| 130 MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other) | 157 MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other) |
| 131 : StylePropertySet(other.cssParserMode()) | 158 : StylePropertySet(other.cssParserMode()) |
| 132 { | 159 { |
| 133 if (other.isMutable()) { | 160 if (other.isMutable()) { |
| 134 m_propertyVector = toMutableStylePropertySet(other).m_propertyVector; | 161 m_propertyVector = toMutableStylePropertySet(other).m_propertyVector; |
| 135 } else { | 162 } else { |
| 136 m_propertyVector.reserveInitialCapacity(other.propertyCount()); | 163 m_propertyVector.reserveInitialCapacity(other.propertyCount()); |
| 137 for (unsigned i = 0; i < other.propertyCount(); ++i) | 164 for (unsigned i = 0; i < other.propertyCount(); ++i) |
| 138 m_propertyVector.uncheckedAppend(other.propertyAt(i).toCSSProperty()
); | 165 m_propertyVector.uncheckedAppend(other.propertyAt(i).toCSSProperty()
); |
| 139 } | 166 } |
| 140 } | 167 } |
| 141 | 168 |
| 142 String StylePropertySet::getPropertyValue(CSSPropertyID propertyID) const | 169 static String serializeShorthand(const StylePropertySet& propertySet, CSSPropert
yID propertyID) |
| 143 { | 170 { |
| 144 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(propertyID); | 171 return StylePropertySerializer(propertySet).getPropertyValue(propertyID); |
| 172 } |
| 173 |
| 174 static String serializeShorthand(const StylePropertySet&, const AtomicString& cu
stomPropertyName) |
| 175 { |
| 176 // Custom properties are never shorthands. |
| 177 return ""; |
| 178 } |
| 179 |
| 180 template<typename T> |
| 181 String StylePropertySet::getPropertyValue(T property) const |
| 182 { |
| 183 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(property); |
| 145 if (value) | 184 if (value) |
| 146 return value->cssText(); | 185 return value->cssText(); |
| 186 return serializeShorthand(*this, property); |
| 187 } |
| 188 template CORE_EXPORT String StylePropertySet::getPropertyValue<CSSPropertyID>(CS
SPropertyID) const; |
| 189 template CORE_EXPORT String StylePropertySet::getPropertyValue<AtomicString>(Ato
micString) const; |
| 147 | 190 |
| 148 return StylePropertySerializer(*this).getPropertyValue(propertyID); | 191 template<typename T> |
| 149 } | 192 PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(T propert
y) const |
| 150 | |
| 151 PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSProper
tyID propertyID) const | |
| 152 { | 193 { |
| 153 int foundPropertyIndex = findPropertyIndex(propertyID); | 194 int foundPropertyIndex = findPropertyIndex(property); |
| 154 if (foundPropertyIndex == -1) | 195 if (foundPropertyIndex == -1) |
| 155 return nullptr; | 196 return nullptr; |
| 156 return propertyAt(foundPropertyIndex).value(); | 197 return propertyAt(foundPropertyIndex).value(); |
| 157 } | 198 } |
| 199 template CORE_EXPORT PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPrope
rtyCSSValue<CSSPropertyID>(CSSPropertyID) const; |
| 200 template CORE_EXPORT PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPrope
rtyCSSValue<AtomicString>(AtomicString) const; |
| 158 | 201 |
| 159 DEFINE_TRACE(StylePropertySet) | 202 DEFINE_TRACE(StylePropertySet) |
| 160 { | 203 { |
| 161 if (m_isMutable) | 204 if (m_isMutable) |
| 162 toMutableStylePropertySet(this)->traceAfterDispatch(visitor); | 205 toMutableStylePropertySet(this)->traceAfterDispatch(visitor); |
| 163 else | 206 else |
| 164 toImmutableStylePropertySet(this)->traceAfterDispatch(visitor); | 207 toImmutableStylePropertySet(this)->traceAfterDispatch(visitor); |
| 165 } | 208 } |
| 166 | 209 |
| 167 #if ENABLE(OILPAN) | 210 #if ENABLE(OILPAN) |
| 168 void StylePropertySet::finalizeGarbageCollectedObject() | 211 void StylePropertySet::finalizeGarbageCollectedObject() |
| 169 { | 212 { |
| 170 if (m_isMutable) | 213 if (m_isMutable) |
| 171 toMutableStylePropertySet(this)->~MutableStylePropertySet(); | 214 toMutableStylePropertySet(this)->~MutableStylePropertySet(); |
| 172 else | 215 else |
| 173 toImmutableStylePropertySet(this)->~ImmutableStylePropertySet(); | 216 toImmutableStylePropertySet(this)->~ImmutableStylePropertySet(); |
| 174 } | 217 } |
| 175 #endif | 218 #endif |
| 176 | 219 |
| 177 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) | 220 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) |
| 178 { | 221 { |
| 179 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 222 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
| 180 if (!shorthand.length()) | 223 if (!shorthand.length()) |
| 181 return false; | 224 return false; |
| 182 | 225 |
| 183 return removePropertiesInSet(shorthand.properties(), shorthand.length()); | 226 return removePropertiesInSet(shorthand.properties(), shorthand.length()); |
| 184 } | 227 } |
| 185 | 228 |
| 186 bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* r
eturnText) | 229 bool MutableStylePropertySet::removePropertyAtIndex(int propertyIndex, String* r
eturnText) |
| 187 { | 230 { |
| 188 if (removeShorthandProperty(propertyID)) { | 231 if (propertyIndex == -1) { |
| 232 if (returnText) |
| 233 *returnText = ""; |
| 234 return false; |
| 235 } |
| 236 |
| 237 if (returnText) |
| 238 *returnText = propertyAt(propertyIndex).value()->cssText(); |
| 239 |
| 240 // A more efficient removal strategy would involve marking entries as empty |
| 241 // and sweeping them when the vector grows too big. |
| 242 m_propertyVector.remove(propertyIndex); |
| 243 |
| 244 return true; |
| 245 } |
| 246 |
| 247 template<typename T> |
| 248 bool MutableStylePropertySet::removeProperty(T property, String* returnText) |
| 249 { |
| 250 if (removeShorthandProperty(property)) { |
| 189 // FIXME: Return an equivalent shorthand when possible. | 251 // FIXME: Return an equivalent shorthand when possible. |
| 190 if (returnText) | 252 if (returnText) |
| 191 *returnText = ""; | 253 *returnText = ""; |
| 192 return true; | 254 return true; |
| 193 } | 255 } |
| 194 | 256 |
| 195 int foundPropertyIndex = findPropertyIndex(propertyID); | 257 int foundPropertyIndex = findPropertyIndex(property); |
| 196 if (foundPropertyIndex == -1) { | 258 return removePropertyAtIndex(foundPropertyIndex, returnText); |
| 197 if (returnText) | 259 } |
| 198 *returnText = ""; | 260 template CORE_EXPORT bool MutableStylePropertySet::removeProperty(CSSPropertyID,
String*); |
| 199 return false; | 261 template CORE_EXPORT bool MutableStylePropertySet::removeProperty(AtomicString,
String*); |
| 200 } | |
| 201 | 262 |
| 202 if (returnText) | 263 template<typename T> |
| 203 *returnText = propertyAt(foundPropertyIndex).value()->cssText(); | 264 bool StylePropertySet::propertyIsImportant(T property) const |
| 204 | |
| 205 // A more efficient removal strategy would involve marking entries as empty | |
| 206 // and sweeping them when the vector grows too big. | |
| 207 m_propertyVector.remove(foundPropertyIndex); | |
| 208 | |
| 209 return true; | |
| 210 } | |
| 211 | |
| 212 bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const | |
| 213 { | 265 { |
| 214 int foundPropertyIndex = findPropertyIndex(propertyID); | 266 int foundPropertyIndex = findPropertyIndex(property); |
| 215 if (foundPropertyIndex != -1) | 267 if (foundPropertyIndex != -1) |
| 216 return propertyAt(foundPropertyIndex).isImportant(); | 268 return propertyAt(foundPropertyIndex).isImportant(); |
| 269 return shorthandIsImportant(property); |
| 270 } |
| 271 template bool StylePropertySet::propertyIsImportant<CSSPropertyID>(CSSPropertyID
) const; |
| 272 template bool StylePropertySet::propertyIsImportant<AtomicString>(AtomicString)
const; |
| 217 | 273 |
| 274 bool StylePropertySet::shorthandIsImportant(CSSPropertyID propertyID) const |
| 275 { |
| 218 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 276 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
| 219 if (!shorthand.length()) | 277 if (!shorthand.length()) |
| 220 return false; | 278 return false; |
| 221 | 279 |
| 222 for (unsigned i = 0; i < shorthand.length(); ++i) { | 280 for (unsigned i = 0; i < shorthand.length(); ++i) { |
| 223 if (!propertyIsImportant(shorthand.properties()[i])) | 281 if (!propertyIsImportant(shorthand.properties()[i])) |
| 224 return false; | 282 return false; |
| 225 } | 283 } |
| 226 return true; | 284 return true; |
| 227 } | 285 } |
| 228 | 286 |
| 287 bool StylePropertySet::shorthandIsImportant(AtomicString customPropertyName) con
st |
| 288 { |
| 289 // Custom properties are never shorthands. |
| 290 return false; |
| 291 } |
| 292 |
| 229 CSSPropertyID StylePropertySet::getPropertyShorthand(CSSPropertyID propertyID) c
onst | 293 CSSPropertyID StylePropertySet::getPropertyShorthand(CSSPropertyID propertyID) c
onst |
| 230 { | 294 { |
| 231 int foundPropertyIndex = findPropertyIndex(propertyID); | 295 int foundPropertyIndex = findPropertyIndex(propertyID); |
| 232 if (foundPropertyIndex == -1) | 296 if (foundPropertyIndex == -1) |
| 233 return CSSPropertyInvalid; | 297 return CSSPropertyInvalid; |
| 234 return propertyAt(foundPropertyIndex).shorthandID(); | 298 return propertyAt(foundPropertyIndex).shorthandID(); |
| 235 } | 299 } |
| 236 | 300 |
| 237 bool StylePropertySet::isPropertyImplicit(CSSPropertyID propertyID) const | 301 bool StylePropertySet::isPropertyImplicit(CSSPropertyID propertyID) const |
| 238 { | 302 { |
| 239 int foundPropertyIndex = findPropertyIndex(propertyID); | 303 int foundPropertyIndex = findPropertyIndex(propertyID); |
| 240 if (foundPropertyIndex == -1) | 304 if (foundPropertyIndex == -1) |
| 241 return false; | 305 return false; |
| 242 return propertyAt(foundPropertyIndex).isImplicit(); | 306 return propertyAt(foundPropertyIndex).isImplicit(); |
| 243 } | 307 } |
| 244 | 308 |
| 245 bool MutableStylePropertySet::setProperty(CSSPropertyID unresolvedProperty, cons
t String& value, bool important, StyleSheetContents* contextStyleSheet) | 309 bool MutableStylePropertySet::setProperty(CSSPropertyID unresolvedProperty, cons
t String& value, bool important, StyleSheetContents* contextStyleSheet) |
| 246 { | 310 { |
| 247 // Setting the value to an empty string just removes the property in both IE
and Gecko. | 311 // Setting the value to an empty string just removes the property in both IE
and Gecko. |
| 248 // Setting it to null seems to produce less consistent results, but we treat
it just the same. | 312 // Setting it to null seems to produce less consistent results, but we treat
it just the same. |
| 249 if (value.isEmpty()) | 313 if (value.isEmpty()) |
| 250 return removeProperty(resolveCSSPropertyID(unresolvedProperty)); | 314 return removeProperty(resolveCSSPropertyID(unresolvedProperty)); |
| 251 | 315 |
| 252 // When replacing an existing property value, this moves the property to the
end of the list. | 316 // When replacing an existing property value, this moves the property to the
end of the list. |
| 253 // Firefox preserves the position, and MSIE moves the property to the beginn
ing. | 317 // Firefox preserves the position, and MSIE moves the property to the beginn
ing. |
| 254 return CSSParser::parseValue(this, unresolvedProperty, value, important, con
textStyleSheet); | 318 return CSSParser::parseValue(this, unresolvedProperty, value, important, con
textStyleSheet); |
| 255 } | 319 } |
| 256 | 320 |
| 321 bool MutableStylePropertySet::setProperty(const AtomicString& customPropertyName
, const String& value, bool important, StyleSheetContents* contextStyleSheet) |
| 322 { |
| 323 if (value.isEmpty()) |
| 324 return removeProperty(customPropertyName); |
| 325 return CSSParser::parseValueForCustomProperty(this, customPropertyName, valu
e, important, contextStyleSheet); |
| 326 } |
| 327 |
| 257 void MutableStylePropertySet::setProperty(CSSPropertyID propertyID, PassRefPtrWi
llBeRawPtr<CSSValue> prpValue, bool important) | 328 void MutableStylePropertySet::setProperty(CSSPropertyID propertyID, PassRefPtrWi
llBeRawPtr<CSSValue> prpValue, bool important) |
| 258 { | 329 { |
| 259 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 330 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
| 260 if (!shorthand.length()) { | 331 if (!shorthand.length()) { |
| 261 setProperty(CSSProperty(propertyID, prpValue, important)); | 332 setProperty(CSSProperty(propertyID, prpValue, important)); |
| 262 return; | 333 return; |
| 263 } | 334 } |
| 264 | 335 |
| 265 removePropertiesInSet(shorthand.properties(), shorthand.length()); | 336 removePropertiesInSet(shorthand.properties(), shorthand.length()); |
| 266 | 337 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 String StylePropertySet::asText() const | 394 String StylePropertySet::asText() const |
| 324 { | 395 { |
| 325 return StylePropertySerializer(*this).asText(); | 396 return StylePropertySerializer(*this).asText(); |
| 326 } | 397 } |
| 327 | 398 |
| 328 void MutableStylePropertySet::mergeAndOverrideOnConflict(const StylePropertySet*
other) | 399 void MutableStylePropertySet::mergeAndOverrideOnConflict(const StylePropertySet*
other) |
| 329 { | 400 { |
| 330 unsigned size = other->propertyCount(); | 401 unsigned size = other->propertyCount(); |
| 331 for (unsigned n = 0; n < size; ++n) { | 402 for (unsigned n = 0; n < size; ++n) { |
| 332 PropertyReference toMerge = other->propertyAt(n); | 403 PropertyReference toMerge = other->propertyAt(n); |
| 404 // TODO(leviw): This probably doesn't work correctly with Custom Propert
ies |
| 333 CSSProperty* old = findCSSPropertyWithID(toMerge.id()); | 405 CSSProperty* old = findCSSPropertyWithID(toMerge.id()); |
| 334 if (old) | 406 if (old) |
| 335 setProperty(toMerge.toCSSProperty(), old); | 407 setProperty(toMerge.toCSSProperty(), old); |
| 336 else | 408 else |
| 337 m_propertyVector.append(toMerge.toCSSProperty()); | 409 m_propertyVector.append(toMerge.toCSSProperty()); |
| 338 } | 410 } |
| 339 } | 411 } |
| 340 | 412 |
| 341 bool StylePropertySet::hasFailedOrCanceledSubresources() const | 413 bool StylePropertySet::hasFailedOrCanceledSubresources() const |
| 342 { | 414 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 } | 451 } |
| 380 if (newIndex != oldSize) { | 452 if (newIndex != oldSize) { |
| 381 m_propertyVector.shrink(newIndex); | 453 m_propertyVector.shrink(newIndex); |
| 382 return true; | 454 return true; |
| 383 } | 455 } |
| 384 return false; | 456 return false; |
| 385 } | 457 } |
| 386 | 458 |
| 387 CSSProperty* MutableStylePropertySet::findCSSPropertyWithID(CSSPropertyID proper
tyID) | 459 CSSProperty* MutableStylePropertySet::findCSSPropertyWithID(CSSPropertyID proper
tyID) |
| 388 { | 460 { |
| 461 // TODO(leviw): Calling this with a custom property should probably assert,
or this |
| 462 // method should alternatively take a string used for custom properties and
check it |
| 463 // in that case. |
| 464 if (propertyID == CSSPropertyVariable) |
| 465 return nullptr; |
| 466 |
| 389 int foundPropertyIndex = findPropertyIndex(propertyID); | 467 int foundPropertyIndex = findPropertyIndex(propertyID); |
| 390 if (foundPropertyIndex == -1) | 468 if (foundPropertyIndex == -1) |
| 391 return nullptr; | 469 return nullptr; |
| 392 return &m_propertyVector.at(foundPropertyIndex); | 470 return &m_propertyVector.at(foundPropertyIndex); |
| 393 } | 471 } |
| 394 | 472 |
| 395 bool StylePropertySet::propertyMatches(CSSPropertyID propertyID, const CSSValue*
propertyValue) const | 473 bool StylePropertySet::propertyMatches(CSSPropertyID propertyID, const CSSValue*
propertyValue) const |
| 396 { | 474 { |
| 397 int foundPropertyIndex = findPropertyIndex(propertyID); | 475 int foundPropertyIndex = findPropertyIndex(propertyID); |
| 398 if (foundPropertyIndex == -1) | 476 if (foundPropertyIndex == -1) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 // style property set. | 529 // style property set. |
| 452 if (m_cssomWrapper) { | 530 if (m_cssomWrapper) { |
| 453 ASSERT(!static_cast<CSSStyleDeclaration*>(m_cssomWrapper.get())->parentR
ule()); | 531 ASSERT(!static_cast<CSSStyleDeclaration*>(m_cssomWrapper.get())->parentR
ule()); |
| 454 ASSERT(!m_cssomWrapper->parentElement()); | 532 ASSERT(!m_cssomWrapper->parentElement()); |
| 455 return m_cssomWrapper.get(); | 533 return m_cssomWrapper.get(); |
| 456 } | 534 } |
| 457 m_cssomWrapper = adoptPtrWillBeNoop(new PropertySetCSSStyleDeclaration(*this
)); | 535 m_cssomWrapper = adoptPtrWillBeNoop(new PropertySetCSSStyleDeclaration(*this
)); |
| 458 return m_cssomWrapper.get(); | 536 return m_cssomWrapper.get(); |
| 459 } | 537 } |
| 460 | 538 |
| 461 int MutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const | 539 template<typename T> |
| 540 int MutableStylePropertySet::findPropertyIndex(T property) const |
| 462 { | 541 { |
| 463 const CSSProperty* begin = m_propertyVector.data(); | 542 const CSSProperty* begin = m_propertyVector.data(); |
| 464 const CSSProperty* end = begin + m_propertyVector.size(); | 543 const CSSProperty* end = begin + m_propertyVector.size(); |
| 465 // Convert here propertyID into an uint16_t to compare it with the metadata'
s m_propertyID to avoid | |
| 466 // the compiler converting it to an int multiple times in the loop. | |
| 467 uint16_t id = static_cast<uint16_t>(propertyID); | |
| 468 | 544 |
| 469 auto compare = [propertyID, id](const CSSProperty& property) -> bool { | 545 uint16_t id = getConvertedCSSPropertyID(property); |
| 470 if (property.metadata().m_propertyID == id) { | |
| 471 // Only enabled properties should be part of the style. | |
| 472 ASSERT(CSSPropertyMetadata::isEnabledProperty(propertyID)); | |
| 473 return true; | |
| 474 } | |
| 475 return false; | |
| 476 }; | |
| 477 | 546 |
| 478 const CSSProperty* it = std::find_if(begin, end, compare); | 547 const CSSProperty* it = std::find_if(begin, end, [property, id](const CSSPro
perty& cssProperty) -> bool { |
| 548 return isPropertyMatch(cssProperty.metadata(), *cssProperty.value(), id,
property); |
| 549 }); |
| 479 | 550 |
| 480 return (it == end) ? -1 : it - begin; | 551 return (it == end) ? -1 : it - begin; |
| 481 } | 552 } |
| 553 template CORE_EXPORT int MutableStylePropertySet::findPropertyIndex(CSSPropertyI
D) const; |
| 554 template CORE_EXPORT int MutableStylePropertySet::findPropertyIndex(AtomicString
) const; |
| 482 | 555 |
| 483 DEFINE_TRACE_AFTER_DISPATCH(MutableStylePropertySet) | 556 DEFINE_TRACE_AFTER_DISPATCH(MutableStylePropertySet) |
| 484 { | 557 { |
| 485 #if ENABLE(OILPAN) | 558 #if ENABLE(OILPAN) |
| 486 visitor->trace(m_cssomWrapper); | 559 visitor->trace(m_cssomWrapper); |
| 487 visitor->trace(m_propertyVector); | 560 visitor->trace(m_propertyVector); |
| 488 #endif | 561 #endif |
| 489 StylePropertySet::traceAfterDispatch(visitor); | 562 StylePropertySet::traceAfterDispatch(visitor); |
| 490 } | 563 } |
| 491 | 564 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 512 { | 585 { |
| 513 return adoptRefWillBeNoop(new MutableStylePropertySet(cssParserMode)); | 586 return adoptRefWillBeNoop(new MutableStylePropertySet(cssParserMode)); |
| 514 } | 587 } |
| 515 | 588 |
| 516 PassRefPtrWillBeRawPtr<MutableStylePropertySet> MutableStylePropertySet::create(
const CSSProperty* properties, unsigned count) | 589 PassRefPtrWillBeRawPtr<MutableStylePropertySet> MutableStylePropertySet::create(
const CSSProperty* properties, unsigned count) |
| 517 { | 590 { |
| 518 return adoptRefWillBeNoop(new MutableStylePropertySet(properties, count)); | 591 return adoptRefWillBeNoop(new MutableStylePropertySet(properties, count)); |
| 519 } | 592 } |
| 520 | 593 |
| 521 } // namespace blink | 594 } // namespace blink |
| OLD | NEW |