Unreviewed, rolling out r134367.
authordglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2012 18:53:36 +0000 (18:53 +0000)
committerdglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2012 18:53:36 +0000 (18:53 +0000)
http://trac.webkit.org/changeset/134367
https://bugs.webkit.org/show_bug.cgi?id=100738

Speculative rollout, could have cause Dromaeo setAttribute
perf regression.

PerformanceTests:

* DOM/ModifyAttribute.html: Removed.
* DOM/resources/dom-perf/modify-attribute.js: Removed.

Source/WebCore:

* dom/Element.cpp:
(WebCore::Element::attributeChanged):
(WebCore::checkNeedsStyleInvalidationForClassChange):
(WebCore::Element::classAttributeChanged):

LayoutTests:

* fast/dom/shadow/distribution-attribute-modified-expected.html: Removed.
* fast/dom/shadow/distribution-attribute-modified.html: Removed.
* fast/dom/shadow/distribution-className-modified-expected.html: Removed.
* fast/dom/shadow/distribution-className-modified.html: Removed.
* fast/dom/shadow/distribution-id-modified-expected.html: Removed.
* fast/dom/shadow/distribution-id-modified.html: Removed.
* fast/dom/shadow/reprojection-attribute-modified-expected.html: Removed.
* fast/dom/shadow/reprojection-attribute-modified.html: Removed.
* fast/dom/shadow/reprojection-className-modified-expected.html: Removed.
* fast/dom/shadow/reprojection-className-modified.html: Removed.
* fast/dom/shadow/reprojection-id-modified-expected.html: Removed.
* fast/dom/shadow/reprojection-id-modified.html: Removed.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@134443 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/shadow/distribution-attribute-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/distribution-attribute-modified.html [deleted file]
LayoutTests/fast/dom/shadow/distribution-className-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/distribution-className-modified.html [deleted file]
LayoutTests/fast/dom/shadow/distribution-id-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/distribution-id-modified.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-attribute-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-attribute-modified.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-className-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-className-modified.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-id-modified-expected.html [deleted file]
LayoutTests/fast/dom/shadow/reprojection-id-modified.html [deleted file]
PerformanceTests/ChangeLog
PerformanceTests/DOM/ModifyAttribute.html [deleted file]
PerformanceTests/DOM/resources/dom-perf/modify-attribute.js [deleted file]
Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp

index b966212..4f17e00 100644 (file)
@@ -1,3 +1,25 @@
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134367.
+        http://trac.webkit.org/changeset/134367
+        https://bugs.webkit.org/show_bug.cgi?id=100738
+
+        Speculative rollout, could have cause Dromaeo setAttribute
+        perf regression.
+
+        * fast/dom/shadow/distribution-attribute-modified-expected.html: Removed.
+        * fast/dom/shadow/distribution-attribute-modified.html: Removed.
+        * fast/dom/shadow/distribution-className-modified-expected.html: Removed.
+        * fast/dom/shadow/distribution-className-modified.html: Removed.
+        * fast/dom/shadow/distribution-id-modified-expected.html: Removed.
+        * fast/dom/shadow/distribution-id-modified.html: Removed.
+        * fast/dom/shadow/reprojection-attribute-modified-expected.html: Removed.
+        * fast/dom/shadow/reprojection-attribute-modified.html: Removed.
+        * fast/dom/shadow/reprojection-className-modified-expected.html: Removed.
+        * fast/dom/shadow/reprojection-className-modified.html: Removed.
+        * fast/dom/shadow/reprojection-id-modified-expected.html: Removed.
+        * fast/dom/shadow/reprojection-id-modified.html: Removed.
+
 2012-11-13  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
 
         [EFL] More unreviewed gardening.
diff --git a/LayoutTests/fast/dom/shadow/distribution-attribute-modified-expected.html b/LayoutTests/fast/dom/shadow/distribution-attribute-modified-expected.html
deleted file mode 100644 (file)
index 4c282c7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
-    <div>F</div>
-</div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/distribution-attribute-modified.html b/LayoutTests/fast/dom/shadow/distribution-attribute-modified.html
deleted file mode 100644 (file)
index b7c0e62..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host">
-    <div>A</div>
-    <div>B</div>
-    <div>C</div>
-    <div>D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot = new WebKitShadowRoot(host);
-shadowRoot.innerHTML = '<content select="div[title]"></content>';
-
-setTimeout(function() {
-    F.title = 'something';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
diff --git a/LayoutTests/fast/dom/shadow/distribution-className-modified-expected.html b/LayoutTests/fast/dom/shadow/distribution-className-modified-expected.html
deleted file mode 100644 (file)
index d9a695c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
-    <div>A</div>
-    <div>D</div>
-    <div>F</div>
-</div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/distribution-className-modified.html b/LayoutTests/fast/dom/shadow/distribution-className-modified.html
deleted file mode 100644 (file)
index d548e0d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host">
-    <div class="selected">A</div>
-    <div>B</div>
-    <div>C</div>
-    <div class="selected">D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot = new WebKitShadowRoot(host);
-shadowRoot.innerHTML = '<content select=".selected"></content>';
-
-setTimeout(function() {
-    F.className = 'selected';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
diff --git a/LayoutTests/fast/dom/shadow/distribution-id-modified-expected.html b/LayoutTests/fast/dom/shadow/distribution-id-modified-expected.html
deleted file mode 100644 (file)
index 4c282c7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
-    <div>F</div>
-</div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/distribution-id-modified.html b/LayoutTests/fast/dom/shadow/distribution-id-modified.html
deleted file mode 100644 (file)
index 4e35ce7..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host">
-    <div id="selected">A</div>
-    <div>B</div>
-    <div>C</div>
-    <div>D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot = new WebKitShadowRoot(host);
-shadowRoot.innerHTML = '<content select="#selected"></content>';
-
-setTimeout(function() {
-    A = selected;
-    F.id = 'selected';    
-    A.id = '';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-attribute-modified-expected.html b/LayoutTests/fast/dom/shadow/reprojection-attribute-modified-expected.html
deleted file mode 100644 (file)
index 2e5a421..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
-    <div>F</div>
-</div></div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-attribute-modified.html b/LayoutTests/fast/dom/shadow/reprojection-attribute-modified.html
deleted file mode 100644 (file)
index 335165b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host1">
-    <div>A</div>
-    <div>B</div>
-    <div>C</div>
-    <div>D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot1 = new WebKitShadowRoot(host1);
-shadowRoot1.innerHTML = '<div id="host2"><shadow></shadow></div>';
-
-var host2 = shadowRoot1.getElementById('host2');
-var shadowRoot2 = new WebKitShadowRoot(host2);
-shadowRoot2.innerHTML = '<content select="div[title=selected]"></content>';
-
-setTimeout(function() {
-    F.title = 'selected';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-className-modified-expected.html b/LayoutTests/fast/dom/shadow/reprojection-className-modified-expected.html
deleted file mode 100644 (file)
index 0ee8a60..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
-    <div>A</div>
-    <div>D</div>
-    <div>F</div>
-</div></div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-className-modified.html b/LayoutTests/fast/dom/shadow/reprojection-className-modified.html
deleted file mode 100644 (file)
index 973da66..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host1">
-    <div class="selected">A</div>
-    <div>B</div>
-    <div>C</div>
-    <div class="selected">D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot1 = new WebKitShadowRoot(host1);
-shadowRoot1.innerHTML = '<div id="host2"><shadow></shadow></div>';
-
-var host2 = shadowRoot1.getElementById('host2');
-var shadowRoot2 = new WebKitShadowRoot(host2);
-shadowRoot2.innerHTML = '<content select=".selected"></content>';
-
-setTimeout(function() {
-    F.className = 'selected';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-id-modified-expected.html b/LayoutTests/fast/dom/shadow/reprojection-id-modified-expected.html
deleted file mode 100644 (file)
index 2e5a421..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
-    <div>F</div>
-</div></div>
-
-</html>
diff --git a/LayoutTests/fast/dom/shadow/reprojection-id-modified.html b/LayoutTests/fast/dom/shadow/reprojection-id-modified.html
deleted file mode 100644 (file)
index 4000b84..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<script src="resources/polyfill.js"></script>
-
-<div id="host1">
-    <div id="selected">A</div>
-    <div>B</div>
-    <div>C</div>
-    <div>D</div>
-    <div>E</div>
-    <div id="F">F</div>
-</div>
-
-<script>
-if (window.testRunner)
-    testRunner.waitUntilDone();
-
-var shadowRoot1 = new WebKitShadowRoot(host1);
-shadowRoot1.innerHTML = '<div id="host2"><shadow></shadow></div>';
-
-var host2 = shadowRoot1.getElementById('host2');
-var shadowRoot2 = new WebKitShadowRoot(host2);
-shadowRoot2.innerHTML = '<content select="#selected"></content>';
-
-setTimeout(function() {
-    A = selected;
-    A.id = '';
-    F.id = 'selected';
-    if (window.testRunner)
-        testRunner.notifyDone();
-}, 0);
-</script>
-</html>
index 7be7211..f90fe98 100644 (file)
@@ -1,3 +1,15 @@
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134367.
+        http://trac.webkit.org/changeset/134367
+        https://bugs.webkit.org/show_bug.cgi?id=100738
+
+        Speculative rollout, could have cause Dromaeo setAttribute
+        perf regression.
+
+        * DOM/ModifyAttribute.html: Removed.
+        * DOM/resources/dom-perf/modify-attribute.js: Removed.
+
 2012-11-12  Shinya Kawanaka  <shinyak@chromium.org>
 
         Changing id, className, or attribute should invalidate distribution
diff --git a/PerformanceTests/DOM/ModifyAttribute.html b/PerformanceTests/DOM/ModifyAttribute.html
deleted file mode 100644 (file)
index d1e259c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-<body>
-<div id="container"><span id="benchmark_content"></span></div>
-<script type="text/javascript" src="../resources/runner.js"></script>
-<script type="text/javascript" src="resources/dom-perf.js"></script>
-<script type="text/javascript" src="resources/dom-perf/modify-attribute.js"></script>
-<script>runBenchmarkSuite(ModifyAttributeTest);</script>
-</body>
-</html>
diff --git a/PerformanceTests/DOM/resources/dom-perf/modify-attribute.js b/PerformanceTests/DOM/resources/dom-perf/modify-attribute.js
deleted file mode 100644 (file)
index 3b6e419..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// ModifyAttribute - measure attribute modification performance
-
-var ModifyAttribute = {};
-var nLoops = 100000;
-
-ModifyAttribute.CreateElementToSetUp = function() {
-    return document.createElement('div');
-}
-
-ModifyAttribute.ModifyId = function(element) {
-    var nLoops = window.nLoops;
-    var idValue1 = 'id1';
-    var idValue2 = 'id2';
-
-    for (var i = 0; i < nLoops; ++i) {
-        element.id = idValue1;
-        element.id = idValue2;                        
-    }
-}
-
-ModifyAttribute.ModifyClass = function(element) {
-    var nLoops = window.nLoops;
-    var className1 = 'class1';
-    var className2 = 'class2';
-
-    for (var i = 0; i < nLoops; ++i) {
-        element.className = className1;
-        element.className = className2;
-    }
-}
-
-ModifyAttribute.ModifyTitle = function(element) {
-    var nLoops = window.nLoops;
-    var title1 = 'title1';
-    var title2 = 'title2';
-
-    for (var i = 0; i < nLoops; ++i) {
-        element.title = title1;
-        element.title = title2;
-    }
-}
-
-var ModifyAttributeTest = new BenchmarkSuite('ModifyAttribute', [
-    new Benchmark("Modify id", ModifyAttribute.ModifyId, ModifyAttribute.CreateElementToSetUp),
-    new Benchmark("Modify class", ModifyAttribute.ModifyClass, ModifyAttribute.CreateElementToSetUp),
-    new Benchmark("Modify title", ModifyAttribute.ModifyTitle, ModifyAttribute.CreateElementToSetUp)
-]);
index 675ddfe..835eb19 100644 (file)
@@ -1,3 +1,17 @@
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134367.
+        http://trac.webkit.org/changeset/134367
+        https://bugs.webkit.org/show_bug.cgi?id=100738
+
+        Speculative rollout, could have cause Dromaeo setAttribute
+        perf regression.
+
+        * dom/Element.cpp:
+        (WebCore::Element::attributeChanged):
+        (WebCore::checkNeedsStyleInvalidationForClassChange):
+        (WebCore::Element::classAttributeChanged):
+
 2012-11-13  Marja Hölttä  <marja@chromium.org>
 
         Add initiator to CachedResourceRequest.
index d4d5f94..bc55408 100644 (file)
@@ -53,7 +53,6 @@
 #include "HTMLOptionsCollection.h"
 #include "HTMLParserIdioms.h"
 #include "HTMLTableRowsCollection.h"
-#include "InsertionPoint.h"
 #include "InspectorInstrumentation.h"
 #include "MutationObserverInterestGroup.h"
 #include "MutationRecord.h"
@@ -764,13 +763,8 @@ void Element::attributeChanged(const QualifiedName& name, const AtomicString& ne
     document()->incDOMTreeVersion();
 
     StyleResolver* styleResolver = document()->styleResolverIfExists();
-    ElementShadow* elementShadow = shadowOfParentForDistribution(this);
-    if (elementShadow)
-        elementShadow->ensureSelectFeatureSetCollected();
-
     bool testShouldInvalidateStyle = attached() && styleResolver && styleChangeType() < FullStyleChange;
     bool shouldInvalidateStyle = false;
-    bool shouldInvalidateDistribution = false;
 
     if (isIdAttributeName(name)) {
         AtomicString oldId = attributeData()->idForStyleResolution();
@@ -778,8 +772,6 @@ void Element::attributeChanged(const QualifiedName& name, const AtomicString& ne
         if (newId != oldId) {
             attributeData()->setIdForStyleResolution(newId);
             shouldInvalidateStyle = testShouldInvalidateStyle && checkNeedsStyleInvalidationForIdChange(oldId, newId, styleResolver);
-            shouldInvalidateDistribution |= elementShadow && !oldId.isEmpty() && elementShadow->selectRuleFeatureSet().hasSelectorForId(oldId);
-            shouldInvalidateDistribution |= elementShadow && !newId.isEmpty() && elementShadow->selectRuleFeatureSet().hasSelectorForId(newId);  
         }
     } else if (name == HTMLNames::nameAttr)
         setHasName(!newValue.isNull());
@@ -787,15 +779,12 @@ void Element::attributeChanged(const QualifiedName& name, const AtomicString& ne
         shouldInvalidateStyle |= testShouldInvalidateStyle && isInShadowTree();
 
     shouldInvalidateStyle |= testShouldInvalidateStyle && styleResolver->hasSelectorForAttribute(name.localName());
-    shouldInvalidateDistribution |= elementShadow && elementShadow->selectRuleFeatureSet().hasSelectorForAttribute(name.localName());
 
     invalidateNodeListCachesInAncestors(&name, this);
 
     if (shouldInvalidateStyle)
         setNeedsStyleRecalc();
-    if (shouldInvalidateDistribution)
-        elementShadow->invalidateDistribution();
-        
+
     if (AXObjectCache::accessibilityEnabled())
         document()->axObjectCache()->handleAttributeChanged(name, this);
 }
@@ -833,49 +822,21 @@ static inline bool classStringHasClassName(const AtomicString& newClassString)
     return classStringHasClassName(newClassString.characters16(), length);
 }
 
-struct HasSelectorForClassStyleFunctor {
-    explicit HasSelectorForClassStyleFunctor(StyleResolver* resolver)
-        : styleResolver(resolver)
-    { }
-
-    bool operator()(const AtomicString& className) const
-    {
-        return styleResolver->hasSelectorForClass(className);
-    }
-
-    StyleResolver* styleResolver;
-};
-
-struct HasSelectorForClassDistributionFunctor {
-    explicit HasSelectorForClassDistributionFunctor(ElementShadow* elementShadow)
-        : elementShadow(elementShadow)
-    { }
-
-    bool operator()(const AtomicString& className) const
-    {
-        return elementShadow->selectRuleFeatureSet().hasSelectorForClass(className);
-    }
-
-    ElementShadow* elementShadow;
-};
-
-template<typename Functor>
-static bool checkFunctorForClassChange(const SpaceSplitString& changedClasses, Functor functor)
+static bool checkNeedsStyleInvalidationForClassChange(const SpaceSplitString& changedClasses, StyleResolver* styleResolver)
 {
     unsigned changedSize = changedClasses.size();
     for (unsigned i = 0; i < changedSize; ++i) {
-        if (functor(changedClasses[i]))
+        if (styleResolver->hasSelectorForClass(changedClasses[i]))
             return true;
     }
     return false;
 }
 
-template<typename Functor>
-static bool checkFunctorForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Functor functor)
+static bool checkNeedsStyleInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, StyleResolver* styleResolver)
 {
     unsigned oldSize = oldClasses.size();
     if (!oldSize)
-        return checkFunctorForClassChange(newClasses, functor);
+        return checkNeedsStyleInvalidationForClassChange(newClasses, styleResolver);
     BitVector remainingClassBits;
     remainingClassBits.ensureSize(oldSize);
     // Class vectors tend to be very short. This is faster than using a hash table.
@@ -887,50 +848,25 @@ static bool checkFunctorForClassChange(const SpaceSplitString& oldClasses, const
                 continue;
             }
         }
-        if (functor(newClasses[i]))
+        if (styleResolver->hasSelectorForClass(newClasses[i]))
             return true;
     }
     for (unsigned i = 0; i < oldSize; ++i) {
         // If the bit is not set the the corresponding class has been removed.
         if (remainingClassBits.quickGet(i))
             continue;
-        if (functor(oldClasses[i]))
+        if (styleResolver->hasSelectorForClass(oldClasses[i]))
             return true;
     }
     return false;
 }
 
-static inline bool checkNeedsStyleInvalidationForClassChange(const SpaceSplitString& changedClasses, StyleResolver* styleResolver)
-{
-    return checkFunctorForClassChange(changedClasses, HasSelectorForClassStyleFunctor(styleResolver));
-}
-
-static inline bool checkNeedsStyleInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, StyleResolver* styleResolver)
-{
-    return checkFunctorForClassChange(oldClasses, newClasses, HasSelectorForClassStyleFunctor(styleResolver));
-}
-
-static inline bool checkNeedsDistributionInvalidationForClassChange(const SpaceSplitString& changedClasses, ElementShadow* elementShadow)
-{
-    return checkFunctorForClassChange(changedClasses, HasSelectorForClassDistributionFunctor(elementShadow));
-}
-
-static inline bool checkNeedsDistributionInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, ElementShadow* elementShadow)
-{
-    return checkFunctorForClassChange(oldClasses, newClasses, HasSelectorForClassDistributionFunctor(elementShadow));
-}
-
 void Element::classAttributeChanged(const AtomicString& newClassString)
 {
     StyleResolver* styleResolver = document()->styleResolverIfExists();
     bool testShouldInvalidateStyle = attached() && styleResolver && styleChangeType() < FullStyleChange;
     bool shouldInvalidateStyle = false;
 
-    ElementShadow* elementShadow = shadowOfParentForDistribution(this);
-    if (elementShadow)
-        elementShadow->ensureSelectFeatureSetCollected();
-    bool shouldInvalidateDistribution = false;
-
     if (classStringHasClassName(newClassString)) {
         const ElementAttributeData* attributeData = ensureAttributeData();
         const bool shouldFoldCase = document()->inQuirksMode();
@@ -940,11 +876,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString)
 
         const SpaceSplitString& newClasses = attributeData->classNames();
         shouldInvalidateStyle = testShouldInvalidateStyle && checkNeedsStyleInvalidationForClassChange(oldClasses, newClasses, styleResolver);
-        shouldInvalidateDistribution = elementShadow && checkNeedsDistributionInvalidationForClassChange(oldClasses, newClasses, elementShadow);
     } else if (const ElementAttributeData* attributeData = this->attributeData()) {
         const SpaceSplitString& oldClasses = attributeData->classNames();
         shouldInvalidateStyle = testShouldInvalidateStyle && checkNeedsStyleInvalidationForClassChange(oldClasses, styleResolver);
-        shouldInvalidateDistribution = elementShadow && checkNeedsDistributionInvalidationForClassChange(oldClasses, elementShadow);
+
         attributeData->clearClass();
     }
 
@@ -953,8 +888,6 @@ void Element::classAttributeChanged(const AtomicString& newClassString)
 
     if (shouldInvalidateStyle)
         setNeedsStyleRecalc();
-    if (shouldInvalidateDistribution)
-        elementShadow->invalidateDistribution();
 }
 
 // Returns true is the given attribute is an event handler.