Title: [146882] trunk
Revision
146882
Author
morr...@google.com
Date
2013-03-26 08:06:59 -0700 (Tue, 26 Mar 2013)

Log Message

remoeveAllEventListeners() should be called to shadow trees
https://bugs.webkit.org/show_bug.cgi?id=113037

Reviewed by Dimitri Glazkov.

Source/WebCore:

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):

LayoutTests:

* 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.

Modified Paths

Added Paths

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); }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to