Diff
Modified: trunk/LayoutTests/ChangeLog (146881 => 146882)
--- trunk/LayoutTests/ChangeLog 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/LayoutTests/ChangeLog 2013-03-26 15:06:59 UTC (rev 146882)
@@ -1,3 +1,14 @@
+2013-03-26 Hajime Morrita <morr...@google.com>
+
+ remoeveAllEventListeners() should be called to shadow trees
+ https://bugs.webkit.org/show_bug.cgi?id=113037
+
+ Reviewed by Dimitri Glazkov.
+
+ * fast/dom/shadow/resources/shadow-tree-listener-clearance-frame.html: Added.
+ * fast/dom/shadow/shadow-tree-listener-clearance-expected.txt: Added.
+ * fast/dom/shadow/shadow-tree-listener-clearance.html: Added.
+
2013-03-26 Yury Semikhatsky <yu...@chromium.org>
Unreviewed. Updated test expectations for compositing/geometry/fixed-in-composited.html
Added: trunk/LayoutTests/fast/dom/shadow/resources/shadow-tree-listener-clearance-frame.html (0 => 146882)
--- trunk/LayoutTests/fast/dom/shadow/resources/shadow-tree-listener-clearance-frame.html (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/resources/shadow-tree-listener-clearance-frame.html 2013-03-26 15:06:59 UTC (rev 146882)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div id="host"></div>
+<script>
+(function() {
+ var shadow = document.getElementById("host").webkitCreateShadowRoot();
+ shadow.innerHTML = "<article id='target'></article>";
+ document.targetInShadow = shadow.getElementById("target");
+})();
+</script>
+</body>
+</html>
Added: trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance-expected.txt (0 => 146882)
--- trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance-expected.txt 2013-03-26 15:06:59 UTC (rev 146882)
@@ -0,0 +1,6 @@
+PASS firedCount is 1
+PASS firedCount is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance.html (0 => 146882)
--- trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance.html (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-tree-listener-clearance.html 2013-03-26 15:06:59 UTC (rev 146882)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<iframe id="childFrame" src=""
+<script>
+
+var child = document.getElementById("childFrame");
+var firedCount = 0;
+
+function getChildTarget()
+{
+ return child.contentDocument.targetInShadow;
+}
+
+function test()
+{
+ var toBeListened = getChildTarget();
+ toBeListened.addEventListener("test", function(event) { firedCount++; });
+
+ toBeListened.dispatchEvent(new CustomEvent("test"));
+ shouldBe("firedCount", "1");
+
+ window.child.contentDocument.open(); // This should clear event listeners
+ toBeListened.dispatchEvent(new CustomEvent("test"));
+ shouldBe("firedCount", "1");
+
+ finishJSTest();
+}
+
+jsTestIsAsync = true;
+child.addEventListener("load", test);
+
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (146881 => 146882)
--- trunk/Source/WebCore/ChangeLog 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/Source/WebCore/ChangeLog 2013-03-26 15:06:59 UTC (rev 146882)
@@ -1,3 +1,26 @@
+2013-03-26 Hajime Morrita <morr...@google.com>
+
+ remoeveAllEventListeners() should be called to shadow trees
+ https://bugs.webkit.org/show_bug.cgi?id=113037
+
+ Reviewed by Dimitri Glazkov.
+
+ Document::removeAllEventListeners() doesn't traverse shadow tree, but we should.
+ This change override Element::removeAllEventListeners() so that it cleans its shadow trees up.
+
+ Test: fast/dom/shadow/shadow-tree-listener-clearance.html
+
+ * dom/Element.cpp:
+ (WebCore::Element::removeAllEventListeners):
+ (WebCore):
+ * dom/Element.h:
+ (Element):
+ * dom/ElementShadow.cpp:
+ (WebCore::ElementShadow::removeAllEventListeners): Added.
+ (WebCore):
+ * dom/ElementShadow.h:
+ (ElementShadow):
+
2013-03-26 Andrei Bucur <abu...@adobe.com>
Use DOM ordering for list counts
Modified: trunk/Source/WebCore/dom/Element.cpp (146881 => 146882)
--- trunk/Source/WebCore/dom/Element.cpp 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/Source/WebCore/dom/Element.cpp 2013-03-26 15:06:59 UTC (rev 146882)
@@ -1693,6 +1693,13 @@
shadow->invalidateDistribution();
}
+void Element::removeAllEventListeners()
+{
+ ContainerNode::removeAllEventListeners();
+ if (ElementShadow* shadow = this->shadow())
+ shadow->removeAllEventListeners();
+}
+
void Element::beginParsingChildren()
{
clearIsParsingChildrenFinished();
Modified: trunk/Source/WebCore/dom/Element.h (146881 => 146882)
--- trunk/Source/WebCore/dom/Element.h 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/Source/WebCore/dom/Element.h 2013-03-26 15:06:59 UTC (rev 146882)
@@ -627,6 +627,7 @@
virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
virtual void removedFrom(ContainerNode*) OVERRIDE;
virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
+ virtual void removeAllEventListeners() OVERRIDE;
virtual bool willRecalcStyle(StyleChange);
virtual void didRecalcStyle(StyleChange);
Modified: trunk/Source/WebCore/dom/ElementShadow.cpp (146881 => 146882)
--- trunk/Source/WebCore/dom/ElementShadow.cpp 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/Source/WebCore/dom/ElementShadow.cpp 2013-03-26 15:06:59 UTC (rev 146882)
@@ -123,6 +123,14 @@
root->recalcStyle(change);
}
+void ElementShadow::removeAllEventListeners()
+{
+ for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
+ for (Node* node = root; node; node = NodeTraversal::next(node))
+ node->removeAllEventListeners();
+ }
+}
+
void ElementShadow::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM);
Modified: trunk/Source/WebCore/dom/ElementShadow.h (146881 => 146882)
--- trunk/Source/WebCore/dom/ElementShadow.h 2013-03-26 15:04:06 UTC (rev 146881)
+++ trunk/Source/WebCore/dom/ElementShadow.h 2013-03-26 15:06:59 UTC (rev 146882)
@@ -64,6 +64,7 @@
bool childNeedsStyleRecalc() const;
bool needsStyleRecalc() const;
void recalcStyle(Node::StyleChange);
+ void removeAllEventListeners();
void invalidateDistribution() { m_distributor.invalidateDistribution(host()); }
void didAffectSelector(AffectedSelectorMask mask) { m_distributor.didAffectSelector(host(), mask); }