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

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
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/css/variables/resolve-duplicate-variables-in-style-attribute.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/css/variables/resolve-duplicate-variables-in-style-attribute.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698