| Index: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
|
| index 760ac1d91ea2eda0282ec80fb9a373038605bae0..7c76bf15786982aa349a8f6977d526a33e35c956 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
|
| @@ -61,7 +61,7 @@ bool CSSParserImpl::parseVariableValue(MutableStylePropertySet* declaration, con
|
| return declaration->addParsedProperties(parser.m_parsedProperties);
|
| }
|
|
|
| -static inline void filterProperties(bool important, const WillBeHeapVector<CSSProperty, 256>& input, WillBeHeapVector<CSSProperty, 256>& output, size_t& unusedEntries, BitArray<numCSSProperties>& seenProperties)
|
| +static inline void filterProperties(bool important, const WillBeHeapVector<CSSProperty, 256>& input, WillBeHeapVector<CSSProperty, 256>& output, size_t& unusedEntries, BitArray<numCSSProperties>& seenProperties, HashSet<AtomicString>& seenCustomProperties)
|
| {
|
| // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found.
|
| for (size_t i = input.size(); i--; ) {
|
| @@ -69,8 +69,13 @@ static inline void filterProperties(bool important, const WillBeHeapVector<CSSPr
|
| if (property.isImportant() != important)
|
| continue;
|
| const unsigned propertyIDIndex = property.id() - firstCSSProperty;
|
| - // All custom properties use the same CSSPropertyID so we can't remove repeated definitions
|
| - if (property.id() != CSSPropertyVariable) {
|
| +
|
| + if (property.id() == CSSPropertyVariable) {
|
| + const AtomicString& name = toCSSCustomPropertyDeclaration(property.value())->name();
|
| + if (seenCustomProperties.contains(name))
|
| + continue;
|
| + seenCustomProperties.add(name);
|
| + } else {
|
| if (seenProperties.get(propertyIDIndex))
|
| continue;
|
| seenProperties.set(propertyIDIndex);
|
| @@ -84,9 +89,10 @@ static PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> createStylePropertySet(
|
| BitArray<numCSSProperties> seenProperties;
|
| size_t unusedEntries = parsedProperties.size();
|
| WillBeHeapVector<CSSProperty, 256> results(unusedEntries);
|
| + HashSet<AtomicString> seenCustomProperties;
|
|
|
| - filterProperties(true, parsedProperties, results, unusedEntries, seenProperties);
|
| - filterProperties(false, parsedProperties, results, unusedEntries, seenProperties);
|
| + filterProperties(true, parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
|
| + filterProperties(false, parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
|
|
|
| RefPtrWillBeRawPtr<ImmutableStylePropertySet> result = ImmutableStylePropertySet::create(results.data() + unusedEntries, results.size() - unusedEntries, mode);
|
| parsedProperties.clear();
|
| @@ -119,8 +125,9 @@ bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, c
|
| BitArray<numCSSProperties> seenProperties;
|
| size_t unusedEntries = parser.m_parsedProperties.size();
|
| WillBeHeapVector<CSSProperty, 256> results(unusedEntries);
|
| - filterProperties(true, parser.m_parsedProperties, results, unusedEntries, seenProperties);
|
| - filterProperties(false, parser.m_parsedProperties, results, unusedEntries, seenProperties);
|
| + HashSet<AtomicString> seenCustomProperties;
|
| + filterProperties(true, parser.m_parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
|
| + filterProperties(false, parser.m_parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
|
| if (unusedEntries)
|
| results.remove(0, unusedEntries);
|
| return declaration->addParsedProperties(results);
|
|
|