Chromium Code Reviews| 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..9e43f7b08291c46bfb47bbd11a4a6457414ab567 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,11 +69,16 @@ 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) { |
|
Timothy Loh
2016/02/18 01:19:32
uhhh... I think it's better to negate this conditi
shans
2016/02/18 04:28:59
Done.
|
| if (seenProperties.get(propertyIDIndex)) |
| continue; |
| seenProperties.set(propertyIDIndex); |
| + } else { |
| + const AtomicString& name = toCSSCustomPropertyDeclaration(property.value())->name(); |
| + if (seenCustomProperties.contains(name)) |
| + continue; |
| + seenCustomProperties.add(name); |
| } |
| output[--unusedEntries] = property; |
| } |
| @@ -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); |