Commit 503331b0 authored by dglazkov@chromium.org's avatar 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.

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: http://svn.webkit.org/repository/webkit/trunk@134443 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 8f37d180
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.
<!DOCTYPE html>
<html>
<body>
<div id="host">
<div>F</div>
</div>
</html>
<!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>
<!DOCTYPE html>
<html>
<body>
<div id="host">
<div>A</div>
<div>D</div>
<div>F</div>
</div>
</html>
<!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>
<!DOCTYPE html>
<html>
<body>
<div id="host">
<div>F</div>
</div>
</html>
<!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>
<!DOCTYPE html>
<html>
<body>
<div id="host"><div>
<div>F</div>
</div></div>
</html>
<!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>
<!DOCTYPE html>
<html>
<body>
<div id="host"><div>
<div>A</div>
<div>D</div>
<div>F</div>
</div></div>
</html>
<!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>
<!DOCTYPE html>
<html>
<body>
<div id="host"><div>
<div>F</div>
</div></div>
</html>
<!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>
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
......
<!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>
/*
* 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)
]);
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.
......@@ -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.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment