Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp

Issue 1709843002: Correctly filter duplicate variable references in styles. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698