+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.
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
- <div>F</div>
-</div>
-
-</html>
+++ /dev/null
-<!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>
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
- <div>A</div>
- <div>D</div>
- <div>F</div>
-</div>
-
-</html>
+++ /dev/null
-<!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>
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host">
- <div>F</div>
-</div>
-
-</html>
+++ /dev/null
-<!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>
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
- <div>F</div>
-</div></div>
-
-</html>
+++ /dev/null
-<!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>
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
- <div>A</div>
- <div>D</div>
- <div>F</div>
-</div></div>
-
-</html>
+++ /dev/null
-<!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>
+++ /dev/null
-<!DOCTYPE html>
-
-<html>
-<body>
-
-<div id="host"><div>
- <div>F</div>
-</div></div>
-
-</html>
+++ /dev/null
-<!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
+++ /dev/null
-<!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>
+++ /dev/null
-/*
- * 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.
#include "HTMLOptionsCollection.h"
#include "HTMLParserIdioms.h"
#include "HTMLTableRowsCollection.h"
-#include "InsertionPoint.h"
#include "InspectorInstrumentation.h"
#include "MutationObserverInterestGroup.h"
#include "MutationRecord.h"
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();
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());
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);
}
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.
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();
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();
}
if (shouldInvalidateStyle)
setNeedsStyleRecalc();
- if (shouldInvalidateDistribution)
- elementShadow->invalidateDistribution();
}
// Returns true is the given attribute is an event handler.