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); |