Changeset 198216 in webkit
- Timestamp:
- Mar 15, 2016 10:26:50 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r198211 r198216 1 2016-03-15 Antti Koivisto <antti@apple.com> 2 3 Class change invalidation does not handle :not correctly 4 https://bugs.webkit.org/show_bug.cgi?id=155493 5 <rdar://problem/24846762> 6 7 Reviewed by Andreas Kling. 8 9 * fast/css/style-invalidation-attribute-change-descendants-expected.txt: 10 * fast/css/style-invalidation-attribute-change-descendants.html: 11 12 Also add :not case for attribute changes (which handles this correctly already). 13 14 * fast/css/style-invalidation-class-change-descendants-expected.txt: 15 * fast/css/style-invalidation-class-change-descendants.html: 16 17 Add :not case. 18 1 19 2016-03-14 Jer Noble <jer.noble@apple.com> 2 20 -
trunk/LayoutTests/fast/css/style-invalidation-attribute-change-descendants-expected.txt
r196636 r198216 4 4 5 5 6 Setting attribute 'mynotattr' value '' 6 7 PASS hasExpectedStyle is true 7 8 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true … … 144 145 PASS testStyleChangeType("inert", "NoStyleChange") is true 145 146 PASS hasExpectedStyle is true 147 Removing attribute 'mynotattr' 148 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true 149 PASS testStyleChangeType("target", "InlineStyleChange") is true 150 PASS testStyleChangeType("inert", "NoStyleChange") is true 151 PASS hasExpectedStyle is true 152 Setting attribute 'mynotattr' value 'value' 153 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true 154 PASS testStyleChangeType("target", "InlineStyleChange") is true 155 PASS testStyleChangeType("inert", "NoStyleChange") is true 156 PASS hasExpectedStyle is true 146 157 PASS successfullyParsed is true 147 158 -
trunk/LayoutTests/fast/css/style-invalidation-attribute-change-descendants.html
r196636 r198216 41 41 [myattr2] > target { 42 42 color: rgb(9, 0, 0); 43 } 44 45 root:not([mynotattr]) target { 46 color: rgb(10, 0, 0); 43 47 } 44 48 … … 126 130 } 127 131 132 setAttribute('mynotattr', ''); 133 128 134 checkStyle(0); 129 135 testStyleInvalidation("NoStyleChange"); … … 236 242 setAttribute('myattr2', 'foo'); 237 243 testStyleInvalidation("NoStyleChange"); 244 checkStyle(1); 245 246 removeAttribute('mynotattr'); 247 testStyleInvalidation("InlineStyleChange"); 248 checkStyle(10); 249 250 setAttribute('mynotattr', 'value'); 251 testStyleInvalidation("InlineStyleChange"); 238 252 checkStyle(1); 239 253 -
trunk/LayoutTests/fast/css/style-invalidation-class-change-descendants-expected.txt
r196575 r198216 4 4 5 5 6 Adding class style5 6 7 PASS hasExpectedStyle is true 7 8 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true … … 52 53 PASS testStyleChangeType("inert", "NoStyleChange") is true 53 54 PASS hasExpectedStyle is true 55 Removing class style5 56 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true 57 PASS testStyleChangeType("target", "InlineStyleChange") is true 58 PASS testStyleChangeType("inert", "NoStyleChange") is true 59 PASS hasExpectedStyle is true 60 Adding class style5 61 PASS testStyleChangeType("root", "NoStyleChange") || testStyleChangeType("root", "InlineStyleChange") is true 62 PASS testStyleChangeType("target", "InlineStyleChange") is true 63 PASS testStyleChangeType("inert", "NoStyleChange") is true 64 PASS hasExpectedStyle is true 54 65 PASS successfullyParsed is true 55 66 -
trunk/LayoutTests/fast/css/style-invalidation-class-change-descendants.html
r196575 r198216 21 21 root.style4 > target inert { 22 22 color: rgb(4, 4, 4); 23 } 24 25 root:not(.style5) target { 26 color: rgb(5, 5, 5); 23 27 } 24 28 … … 106 110 } 107 111 112 addClass('style5'); 113 108 114 checkStyle(0); 109 115 testStyleInvalidation("NoStyleChange"); … … 144 150 checkStyle(0); 145 151 152 removeClass('style5'); 153 testStyleInvalidation("InlineStyleChange"); 154 checkStyle(5); 155 156 addClass('style5'); 157 testStyleInvalidation("InlineStyleChange"); 158 checkStyle(0); 159 146 160 </script> 147 161 <script src="../../resources/js-test-post.js"></script> -
trunk/Source/WebCore/ChangeLog
r198211 r198216 1 2016-03-15 Antti Koivisto <antti@apple.com> 2 3 REGRESSION (196383): Class change invalidation does not handle :not correctly 4 https://bugs.webkit.org/show_bug.cgi?id=155493 5 <rdar://problem/24846762> 6 7 Reviewed by Andreas Kling. 8 9 We fail to invalidate bar style in 10 11 :not(.foo) bar { } 12 13 when class foo is added or removed. 14 15 There is a logic error in the invalidation code. It assumes that class addition can only make new selectors match 16 and removal make them not match. This is not true when :not is present. 17 18 * style/AttributeChangeInvalidation.h: 19 (WebCore::Style::AttributeChangeInvalidation::AttributeChangeInvalidation): 20 * style/ClassChangeInvalidation.cpp: 21 (WebCore::Style::ClassChangeInvalidation::invalidateStyle): 22 23 Invalidate style and collect full set of rules that may affect descendant style. 24 25 (WebCore::Style::ClassChangeInvalidation::invalidateDescendantStyle): 26 27 Invalidate with this set both before and after committing the changes. 28 29 (WebCore::Style::ClassChangeInvalidation::computeClassChange): Deleted. 30 * style/ClassChangeInvalidation.h: 31 (WebCore::Style::ClassChangeInvalidation::ClassChangeInvalidation): 32 (WebCore::Style::ClassChangeInvalidation::~ClassChangeInvalidation): 33 1 34 2016-03-14 Jer Noble <jer.noble@apple.com> 2 35 -
trunk/Source/WebCore/style/AttributeChangeInvalidation.h
r196629 r198216 47 47 Element& m_element; 48 48 49 RuleSet* m_descendantInvalidationRuleSet { nullptr };49 const RuleSet* m_descendantInvalidationRuleSet { nullptr }; 50 50 }; 51 51 -
trunk/Source/WebCore/style/ClassChangeInvalidation.cpp
r196560 r198216 35 35 namespace Style { 36 36 37 auto ClassChangeInvalidation::collectClasses(const SpaceSplitString& classes) -> ClassChangeVector 37 using ClassChangeVector = Vector<AtomicStringImpl*, 4>; 38 39 static ClassChangeVector collectClasses(const SpaceSplitString& classes) 38 40 { 39 41 ClassChangeVector result; … … 44 46 } 45 47 46 void ClassChangeInvalidation::computeClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses)48 static ClassChangeVector computeClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses) 47 49 { 48 50 unsigned oldSize = oldClasses.size(); 49 51 unsigned newSize = newClasses.size(); 50 52 51 if (!oldSize) { 52 m_addedClasses = collectClasses(newClasses); 53 return; 54 } 55 if (!newSize) { 56 m_removedClasses = collectClasses(oldClasses); 57 return; 58 } 53 if (!oldSize) 54 return collectClasses(newClasses); 55 if (!newSize) 56 return collectClasses(oldClasses); 57 58 ClassChangeVector changedClasses; 59 59 60 60 BitVector remainingClassBits; … … 71 71 if (foundFromBoth) 72 72 continue; 73 m_addedClasses.append(newClasses[i].impl());73 changedClasses.append(newClasses[i].impl()); 74 74 } 75 75 for (unsigned i = 0; i < oldSize; ++i) { … … 77 77 if (remainingClassBits.quickGet(i)) 78 78 continue; 79 m_removedClasses.append(oldClasses[i].impl());79 changedClasses.append(oldClasses[i].impl()); 80 80 } 81 82 return changedClasses; 81 83 } 82 84 83 void ClassChangeInvalidation::invalidateStyle(const ClassChangeVector& changedClasses)85 void ClassChangeInvalidation::invalidateStyle(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses) 84 86 { 87 auto changedClasses = computeClassChange(oldClasses, newClasses); 88 85 89 auto& ruleSets = m_element.styleResolver().ruleSets(); 86 90 87 Vector<AtomicStringImpl*, 4>changedClassesAffectingStyle;91 ClassChangeVector changedClassesAffectingStyle; 88 92 for (auto* changedClass : changedClasses) { 89 93 if (ruleSets.features().classesInRules.contains(changedClass)) … … 108 112 if (!ancestorClassRules) 109 113 continue; 114 m_descendantInvalidationRuleSets.append(ancestorClassRules); 115 } 116 } 117 118 void ClassChangeInvalidation::invalidateDescendantStyle() 119 { 120 for (auto* ancestorClassRules : m_descendantInvalidationRuleSets) { 110 121 StyleInvalidationAnalysis invalidationAnalysis(*ancestorClassRules); 111 122 invalidationAnalysis.invalidateStyle(m_element); -
trunk/Source/WebCore/style/ClassChangeInvalidation.h
r196629 r198216 45 45 46 46 private: 47 using ClassChangeVector = Vector<AtomicStringImpl*, 4>; 48 49 void computeClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses); 50 void invalidateStyle(const ClassChangeVector&); 51 52 static ClassChangeVector collectClasses(const SpaceSplitString&); 47 void invalidateStyle(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses); 48 void invalidateDescendantStyle(); 53 49 54 50 const bool m_isEnabled; 55 51 Element& m_element; 56 52 57 ClassChangeVector m_addedClasses; 58 ClassChangeVector m_removedClasses; 53 Vector<const RuleSet*, 4> m_descendantInvalidationRuleSets; 59 54 }; 60 55 … … 66 61 if (!m_isEnabled) 67 62 return; 68 computeClassChange(oldClasses, newClasses);69 invalidate Style(m_removedClasses);63 invalidateStyle(oldClasses, newClasses); 64 invalidateDescendantStyle(); 70 65 } 71 66 … … 74 69 if (!m_isEnabled) 75 70 return; 76 invalidate Style(m_addedClasses);71 invalidateDescendantStyle(); 77 72 } 78 73
Note: See TracChangeset
for help on using the changeset viewer.