| Index: third_party/WebKit/Source/core/css/StylePropertySet.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/StylePropertySet.cpp b/third_party/WebKit/Source/core/css/StylePropertySet.cpp
|
| index e0eaf6b7ba7c5f72b5a65eae77c77bed7f827454..3efac37118cb8ef463f753c7544b222a878dd61a 100644
|
| --- a/third_party/WebKit/Source/core/css/StylePropertySet.cpp
|
| +++ b/third_party/WebKit/Source/core/css/StylePropertySet.cpp
|
| @@ -24,6 +24,7 @@
|
| #include "core/css/StylePropertySet.h"
|
|
|
| #include "core/StylePropertyShorthand.h"
|
| +#include "core/css/CSSCustomPropertyDeclaration.h"
|
| #include "core/css/CSSPropertyMetadata.h"
|
| #include "core/css/CSSValuePool.h"
|
| #include "core/css/StylePropertySerializer.h"
|
| @@ -103,31 +104,40 @@ ImmutableStylePropertySet::~ImmutableStylePropertySet()
|
| #endif
|
| }
|
|
|
| -int ImmutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const
|
| +// Convert property into an uint16_t for comparison with metadata's m_propertyID to avoid
|
| +// the compiler converting it to an int multiple times in a loop.
|
| +static uint16_t getConvertedCSSPropertyID(CSSPropertyID propertyID)
|
| {
|
| - // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
|
| - // the compiler converting it to an int multiple times in the loop.
|
| - uint16_t id = static_cast<uint16_t>(propertyID);
|
| - for (int n = m_arraySize - 1 ; n >= 0; --n) {
|
| - if (metadataArray()[n].m_propertyID == id) {
|
| - // Only enabled properties should be part of the style.
|
| - ASSERT(CSSPropertyMetadata::isEnabledProperty(propertyID));
|
| - return n;
|
| - }
|
| - }
|
| + return static_cast<uint16_t>(propertyID);
|
| +}
|
|
|
| - return -1;
|
| +static uint16_t getConvertedCSSPropertyID(const AtomicString&)
|
| +{
|
| + return static_cast<uint16_t>(CSSPropertyVariable);
|
| +}
|
| +
|
| +static bool isPropertyMatch(const StylePropertyMetadata& metadata, const CSSValue&, uint16_t id, CSSPropertyID propertyID)
|
| +{
|
| + ASSERT(id == propertyID);
|
| + bool result = metadata.m_propertyID == id;
|
| + // Only enabled properties should be part of the style.
|
| + ASSERT(!result || CSSPropertyMetadata::isEnabledProperty(propertyID));
|
| + return result;
|
| }
|
|
|
| -int ImmutableStylePropertySet::findCustomPropertyIndex(const AtomicString& propertyName) const
|
| +static bool isPropertyMatch(const StylePropertyMetadata& metadata, const CSSValue& value, uint16_t id, const AtomicString& customPropertyName)
|
| {
|
| - // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
|
| - // the compiler converting it to an int multiple times in the loop.
|
| - const uint16_t variableId = static_cast<uint16_t>(CSSPropertyVariable);
|
| + ASSERT(id == CSSPropertyVariable);
|
| + return metadata.m_propertyID == id
|
| + && toCSSCustomPropertyDeclaration(value).name() == customPropertyName;
|
| +}
|
|
|
| +template<typename T>
|
| +int ImmutableStylePropertySet::findPropertyIndex(T property) const
|
| +{
|
| + uint16_t id = getConvertedCSSPropertyID(property);
|
| for (int n = m_arraySize - 1 ; n >= 0; --n) {
|
| - if (metadataArray()[n].m_propertyID == variableId
|
| - && toCSSCustomPropertyDeclaration(valueArray()[n])->name() == propertyName)
|
| + if (isPropertyMatch(metadataArray()[n], *valueArray()[n], id, property))
|
| return n;
|
| }
|
|
|
| @@ -154,35 +164,35 @@ MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other)
|
| }
|
| }
|
|
|
| -String StylePropertySet::getPropertyValue(CSSPropertyID propertyID) const
|
| +static String serializeShorthand(const StylePropertySet& propertySet, CSSPropertyID propertyID)
|
| {
|
| - RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(propertyID);
|
| - if (value)
|
| - return value->cssText();
|
| -
|
| - return StylePropertySerializer(*this).getPropertyValue(propertyID);
|
| + return StylePropertySerializer(propertySet).getPropertyValue(propertyID);
|
| }
|
|
|
| -String StylePropertySet::getCustomPropertyValue(const AtomicString& propertyName) const
|
| +static String serializeShorthand(const StylePropertySet&, const AtomicString& customPropertyName)
|
| {
|
| - RefPtrWillBeRawPtr<CSSValue> value = getCustomPropertyCSSValue(propertyName);
|
| - return value ? value->cssText() : "";
|
| + // Custom properties are never shorthands.
|
| + return "";
|
| }
|
|
|
| -PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSPropertyID propertyID) const
|
| +template<typename T>
|
| +String StylePropertySet::getPropertyValue(T property) const
|
| {
|
| - int foundPropertyIndex = findPropertyIndex(propertyID);
|
| - if (foundPropertyIndex == -1)
|
| - return nullptr;
|
| - return propertyAt(foundPropertyIndex).value();
|
| + RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(property);
|
| + if (value)
|
| + return value->cssText();
|
| + return serializeShorthand(*this, property);
|
| }
|
| +template String StylePropertySet::getPropertyValue<CSSPropertyID>(CSSPropertyID) const;
|
| +template String StylePropertySet::getPropertyValue<AtomicString>(AtomicString) const;
|
|
|
| -PassRefPtrWillBeRawPtr<CSSCustomPropertyDeclaration> StylePropertySet::getCustomPropertyCSSValue(const AtomicString& propertyName) const
|
| +template<typename T>
|
| +PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(T property) const
|
| {
|
| - int foundPropertyIndex = findCustomPropertyIndex(propertyName);
|
| + int foundPropertyIndex = findPropertyIndex(property);
|
| if (foundPropertyIndex == -1)
|
| return nullptr;
|
| - return toCSSCustomPropertyDeclaration(propertyAt(foundPropertyIndex).value());
|
| + return propertyAt(foundPropertyIndex).value();
|
| }
|
|
|
| DEFINE_TRACE(StylePropertySet)
|
| @@ -230,31 +240,33 @@ bool MutableStylePropertySet::removePropertyAtIndex(int propertyIndex, String* r
|
| return true;
|
| }
|
|
|
| -bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* returnText)
|
| +template<typename T>
|
| +bool MutableStylePropertySet::removeProperty(T property, String* returnText)
|
| {
|
| - if (removeShorthandProperty(propertyID)) {
|
| + if (removeShorthandProperty(property)) {
|
| // FIXME: Return an equivalent shorthand when possible.
|
| if (returnText)
|
| *returnText = "";
|
| return true;
|
| }
|
|
|
| - int foundPropertyIndex = findPropertyIndex(propertyID);
|
| + int foundPropertyIndex = findPropertyIndex(property);
|
| return removePropertyAtIndex(foundPropertyIndex, returnText);
|
| }
|
|
|
| -bool MutableStylePropertySet::removeCustomProperty(const AtomicString& propertyName, String* returnText)
|
| +template<typename T>
|
| +bool StylePropertySet::propertyIsImportant(T property) const
|
| {
|
| - int foundPropertyIndex = findCustomPropertyIndex(propertyName);
|
| - return removePropertyAtIndex(foundPropertyIndex, returnText);
|
| -}
|
| -
|
| -bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const
|
| -{
|
| - int foundPropertyIndex = findPropertyIndex(propertyID);
|
| + int foundPropertyIndex = findPropertyIndex(property);
|
| if (foundPropertyIndex != -1)
|
| return propertyAt(foundPropertyIndex).isImportant();
|
| + return shorthandIsImportant(property);
|
| +}
|
| +template bool StylePropertySet::propertyIsImportant<CSSPropertyID>(CSSPropertyID) const;
|
| +template bool StylePropertySet::propertyIsImportant<AtomicString>(AtomicString) const;
|
|
|
| +bool StylePropertySet::shorthandIsImportant(CSSPropertyID propertyID) const
|
| +{
|
| StylePropertyShorthand shorthand = shorthandForProperty(propertyID);
|
| if (!shorthand.length())
|
| return false;
|
| @@ -266,11 +278,9 @@ bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const
|
| return true;
|
| }
|
|
|
| -bool StylePropertySet::customPropertyIsImportant(const AtomicString& propertyName) const
|
| +bool StylePropertySet::shorthandIsImportant(const AtomicString& customPropertyName) const
|
| {
|
| - int foundPropertyIndex = findCustomPropertyIndex(propertyName);
|
| - if (foundPropertyIndex != -1)
|
| - return propertyAt(foundPropertyIndex).isImportant();
|
| + // Custom properties are never shorthands.
|
| return false;
|
| }
|
|
|
| @@ -302,11 +312,11 @@ bool MutableStylePropertySet::setProperty(CSSPropertyID unresolvedProperty, cons
|
| return CSSParser::parseValue(this, unresolvedProperty, value, important, contextStyleSheet);
|
| }
|
|
|
| -bool MutableStylePropertySet::setCustomProperty(const AtomicString& propertyName, const String& value, bool important, StyleSheetContents* contextStyleSheet)
|
| +bool MutableStylePropertySet::setProperty(const AtomicString& customPropertyName, const String& value, bool important, StyleSheetContents* contextStyleSheet)
|
| {
|
| if (value.isEmpty())
|
| - return removeCustomProperty(propertyName);
|
| - return CSSParser::parseValueForCustomProperty(this, propertyName, value, important, contextStyleSheet);
|
| + return removeProperty(customPropertyName);
|
| + return CSSParser::parseValueForCustomProperty(this, customPropertyName, value, important, contextStyleSheet);
|
| }
|
|
|
| void MutableStylePropertySet::setProperty(CSSPropertyID propertyID, PassRefPtrWillBeRawPtr<CSSValue> prpValue, bool important)
|
| @@ -520,44 +530,17 @@ CSSStyleDeclaration* MutableStylePropertySet::ensureCSSStyleDeclaration()
|
| return m_cssomWrapper.get();
|
| }
|
|
|
| -int MutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const
|
| -{
|
| - const CSSProperty* begin = m_propertyVector.data();
|
| - const CSSProperty* end = begin + m_propertyVector.size();
|
| - // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
|
| - // the compiler converting it to an int multiple times in the loop.
|
| - uint16_t id = static_cast<uint16_t>(propertyID);
|
| -
|
| - auto compare = [propertyID, id](const CSSProperty& property) -> bool {
|
| - if (property.metadata().m_propertyID == id) {
|
| - // Only enabled properties should be part of the style.
|
| - ASSERT(CSSPropertyMetadata::isEnabledProperty(propertyID));
|
| - return true;
|
| - }
|
| - return false;
|
| - };
|
| -
|
| - const CSSProperty* it = std::find_if(begin, end, compare);
|
| -
|
| - return (it == end) ? -1 : it - begin;
|
| -}
|
| -
|
| -int MutableStylePropertySet::findCustomPropertyIndex(const AtomicString& propertyName) const
|
| +template<typename T>
|
| +int MutableStylePropertySet::findPropertyIndex(T property) const
|
| {
|
| const CSSProperty* begin = m_propertyVector.data();
|
| const CSSProperty* end = begin + m_propertyVector.size();
|
| - // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
|
| - // the compiler converting it to an int multiple times in the loop.
|
| - const uint16_t variableId = static_cast<uint16_t>(CSSPropertyVariable);
|
|
|
| - auto compare = [variableId, propertyName](const CSSProperty& property) -> bool {
|
| - if (property.metadata().m_propertyID == variableId) {
|
| - return toCSSCustomPropertyDeclaration(property.value())->name() == propertyName;
|
| - }
|
| - return false;
|
| - };
|
| + uint16_t id = getConvertedCSSPropertyID(property);
|
|
|
| - const CSSProperty* it = std::find_if(begin, end, compare);
|
| + const CSSProperty* it = std::find_if(begin, end, [property, id](const CSSProperty& cssProperty) -> bool {
|
| + return isPropertyMatch(cssProperty.metadata(), *cssProperty.value(), id, property);
|
| + });
|
|
|
| return (it == end) ? -1 : it - begin;
|
| }
|
|
|