Title: [122801] trunk
Revision
122801
Author
[email protected]
Date
2012-07-16 20:24:33 -0700 (Mon, 16 Jul 2012)

Log Message

Some events should be always stopped at shadow boundary.
https://bugs.webkit.org/show_bug.cgi?id=90436

Reviewed by Ryosuke Niwa.

Source/WebCore:

The spec is here:
https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#events-that-are-always-stopped

Test: fast/dom/shadow/events-stopped-at-shadow-boundary.html

* dom/EventDispatcher.cpp:
(WebCore::EventDispatcher::determineDispatchBehavior):

LayoutTests:

* fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt: Added.
* fast/dom/shadow/events-stopped-at-shadow-boundary.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (122800 => 122801)


--- trunk/LayoutTests/ChangeLog	2012-07-17 03:20:42 UTC (rev 122800)
+++ trunk/LayoutTests/ChangeLog	2012-07-17 03:24:33 UTC (rev 122801)
@@ -1,3 +1,13 @@
+2012-07-16  Hayato Ito  <[email protected]>
+
+        Some events should be always stopped at shadow boundary.
+        https://bugs.webkit.org/show_bug.cgi?id=90436
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt: Added.
+        * fast/dom/shadow/events-stopped-at-shadow-boundary.html: Added.
+
 2012-07-16  Ryuan Choi  <[email protected]>
 
         [EFL][DRT] Implement dumpFrameScrollPosition

Added: trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt (0 => 122801)


--- trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt	2012-07-17 03:24:33 UTC (rev 122801)
@@ -0,0 +1,44 @@
+Tests to ensure that some kinds of events are stopeed at shadow boundary.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Other events than "click" should be stopped at shadow boundary.  A "click" is added for the purpose of comparing results.
+
+  abort
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  select
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  change
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  reset
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  resize
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  scroll
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  selectstart
+     @target (target: target)
+     @parent-of-target (target: target)
+
+  click
+     @target (target: target)
+     @parent-of-target (target: target)
+     @host (target: host)
+     @top (target: host)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary.html (0 => 122801)


--- trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary.html	2012-07-17 03:24:33 UTC (rev 122801)
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<p id="description"></p>
+<div id="sandbox"></div>
+<pre id="console"></pre>
+<script>
+description("Tests to ensure that some kinds of events are stopeed at shadow boundary.");
+
+var eventRecords = {};
+
+function dispatchedEvent(eventType)
+{
+    var events = eventRecords[eventType];
+    if (!events)
+        return [];
+    return events;
+}
+
+function dumpDispatchedEvent(eventType)
+{
+    debug('\n  ' + eventType);
+    var events = dispatchedEvent(eventType);
+    for (var i = 0; i < events.length; ++i)
+        debug('    ' + events[i])
+}
+
+function recordEvent(event)
+{
+    var eventType = event.type
+    if (!eventRecords[eventType]) {
+        eventRecords[eventType] = []
+    }
+    var eventString = '';
+    if (event.currentTarget)
+        eventString += ' @' + event.currentTarget.id;
+    if (event.target)
+        eventString += ' (target: ' + event.target.id + ')';
+    if (event.relatedTarget)
+        eventString += ' (related: ' + event.relatedTarget.id + ')';
+    if (event.eventPhase == 1)
+        eventString += '(capturing phase)';
+    if (event.target && event.currentTarget && event.target.id == event.currentTarget.id)
+        shouldBe("event.eventPhase", "2", true);
+    eventRecords[eventType].push(eventString);
+}
+
+debug('Other events than "click" should be stopped at shadow boundary.  A "click" is added for the purpose of comparing results.'); 
+
+var events = ['abort', 'select', 'change', 'reset', 'resize', 'scroll', 'selectstart', 'click'];
+
+function addEventListeners(nodes)
+{
+    for (var i = 0; i < nodes.length; ++i) {
+        var node = getNodeInShadowTreeStack(nodes[i]);
+        for (var j = 0; j < events.length; ++j)
+            node.addEventListener(events[j], recordEvent, false);
+    }
+}
+
+function test()
+{
+    if (window.testRunner)
+        testRunner.dumpAsText();
+
+    var sandbox = document.getElementById('sandbox');
+    sandbox.appendChild(
+        createDOM('div', {'id': 'top'},
+                  createDOM('div', {'id': 'host'},
+                            createShadowRoot(
+                                createDOM('div', {'id': 'parent-of-target'},
+                                          createDOM('div', {'id': 'target'}))))));
+
+    addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target']);
+
+    for (var i = 0; i < events.length; ++i) {
+        var event = document.createEvent('UIEvent');
+        event.initEvent(events[i], true, false);
+        getNodeInShadowTreeStack('host/target').dispatchEvent(event);
+        dumpDispatchedEvent(events[i]);
+    }
+}
+
+test();
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (122800 => 122801)


--- trunk/Source/WebCore/ChangeLog	2012-07-17 03:20:42 UTC (rev 122800)
+++ trunk/Source/WebCore/ChangeLog	2012-07-17 03:24:33 UTC (rev 122801)
@@ -1,3 +1,18 @@
+2012-07-16  Hayato Ito  <[email protected]>
+
+        Some events should be always stopped at shadow boundary.
+        https://bugs.webkit.org/show_bug.cgi?id=90436
+
+        Reviewed by Ryosuke Niwa.
+
+        The spec is here:
+        https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#events-that-are-always-stopped
+
+        Test: fast/dom/shadow/events-stopped-at-shadow-boundary.html
+
+        * dom/EventDispatcher.cpp:
+        (WebCore::EventDispatcher::determineDispatchBehavior):
+
 2012-07-16  Yoshifumi Inoue  <[email protected]>
 
         REGRESSION(r119948): [Form] HTMLInputElement.valueAsNumber for input type "month" should return number of month since January 1970

Modified: trunk/Source/WebCore/dom/EventDispatcher.cpp (122800 => 122801)


--- trunk/Source/WebCore/dom/EventDispatcher.cpp	2012-07-17 03:20:42 UTC (rev 122800)
+++ trunk/Source/WebCore/dom/EventDispatcher.cpp	2012-07-17 03:24:33 UTC (rev 122801)
@@ -365,7 +365,14 @@
     // WebKit never allowed selectstart event to cross the the shadow DOM boundary.
     // Changing this breaks existing sites.
     // See https://bugs.webkit.org/show_bug.cgi?id=52195 for details.
-    if (event->type() == eventNames().selectstartEvent)
+    const AtomicString eventType = event->type();
+    if (eventType == eventNames().abortEvent
+            || eventType == eventNames().changeEvent
+            || eventType == eventNames().resetEvent
+            || eventType == eventNames().resizeEvent
+            || eventType == eventNames().scrollEvent
+            || eventType == eventNames().selectEvent
+            || eventType == eventNames().selectstartEvent)
         return StayInsideShadowDOM;
 
     return RetargetEvent;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to