Changeset 143439 in webkit


Ignore:
Timestamp:
Feb 20, 2013 1:43:11 AM (11 years ago)
Author:
mkwst@chromium.org
Message:

Use EventPathWalker rather than parentNode() to normalize event targets in EventHandler.
https://bugs.webkit.org/show_bug.cgi?id=110037

Reviewed by Ryosuke Niwa.

Source/WebCore:

We need to teach EventHandler about Shadow DOM in a few places in order
to ensure that we properly target events dispatched upon text nodes.
Rather than naively grabbing the text node's direct parent via
parentNode(), we need to account for the case in which the text node is
distributed[1] to an insertion point inside a shadow host.
EventPathWalker::parent understands these relationships, and should
be used when dealing with mouse, drag, and touch events.

[1]: http://www.w3.org/TR/shadow-dom/#dfn-distribution

  • page/EventHandler.cpp:

(WebCore::EventHandler::handleMouseDraggedEvent):
(WebCore::EventHandler::handleTouchEvent):
(WebCore::EventHandler::passGestureEventToWidgetIfPossible):
(WebCore::EventHandler::updateDragAndDrop):

Refactor parentNode callsites to use EventPathWalker::parent().

LayoutTests:

  • fast/dom/shadow/resources/event-dispatching.js:

(scrollMouseWheel):
(addEventListeners):

Add MouseWheel, Drag, and Touch support to the event-dispatching
tests in Shadow DOM.

  • fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html:
  • fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root.html:

Scroll the mouse wheel, drag a bit, and touch before leaving the
text node, and record the generated events.

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r143436 r143439  
     12013-02-20  Mike West  <mkwst@chromium.org>
     2
     3        Use EventPathWalker rather than parentNode() to normalize event targets in EventHandler.
     4        https://bugs.webkit.org/show_bug.cgi?id=110037
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * fast/dom/shadow/resources/event-dispatching.js:
     9        (scrollMouseWheel):
     10        (addEventListeners):
     11            Add MouseWheel, Drag, and Touch support to the event-dispatching
     12            tests in Shadow DOM.
     13        * fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html:
     14        * fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root.html:
     15            Scroll the mouse wheel, drag a bit, and touch before leaving the
     16            text node, and record the generated events.
     17
    1182013-02-20  Zoltan Arvai  <zarvai@inf.u-szeged.hu>
    219
  • trunk/LayoutTests/fast/dom/shadow/resources/event-dispatching.js

    r143191 r143439  
    1515        y = element.offsetTop + element.offsetHeight / 2;
    1616    eventSender.mouseMoveTo(x, y);
     17}
     18
     19function touchLocation(node)
     20{
     21    var x = node.offsetLeft + 5;
     22    var y = node.offsetTop + defaultPaddingSize + 5;
     23    eventSender.addTouchPoint(x, y);
     24    eventSender.touchStart();
     25    eventSender.leapForward(100);
     26    eventSender.touchEnd();
     27    eventSender.cancelTouchPoint(0);
     28}
     29
     30function selectTextNode(node)
     31{
     32    getSelection().setBaseAndExtent(node, 0, node, node.length);
     33}
     34
     35function dragMouse(node) {
     36    var x = node.offsetLeft + 5;
     37    var y = node.offsetTop + defaultPaddingSize + 5;
     38
     39    eventSender.mouseMoveTo(x, y);
     40    eventSender.mouseDown();
     41    eventSender.leapForward(100);
     42    eventSender.mouseMoveTo(x + 100, y + 100);
     43    eventSender.mouseUp();
     44    eventSender.mouseMoveTo(x, y);
     45}
     46
     47function scrollMouseWheel(node) {
     48    var x = node.offsetLeft + 5;
     49    var y = node.offsetTop + defaultPaddingSize + 5;
     50    eventSender.mouseMoveTo(x, y);
     51    eventSender.mouseScrollBy(0, 120);
    1752}
    1853
     
    76111    for (var i = 0; i < nodes.length; ++i) {
    77112        var node = getNodeInShadowTreeStack(nodes[i]);
     113        node.addEventListener('click', recordEvent, false);
     114        node.addEventListener('dragstart', recordEvent, false);
     115        node.addEventListener('mouseout', recordEvent, false);
    78116        node.addEventListener('mouseover', recordEvent, false);
    79         node.addEventListener('mouseout', recordEvent, false);
    80         node.addEventListener('click', recordEvent, false);
     117        node.addEventListener('mousewheel', recordEvent, false);
     118        node.addEventListener('touchstart', recordEvent, false);
    81119        // <content> might be an inactive insertion point, so style it also.
    82120        if (node.tagName == 'DIV' || node.tagName == 'DETAILS' || node.tagName == 'SUMMARY' || node.tagName == 'CONTENT')
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node-expected.txt

    r143191 r143439  
    2121  mouseover
    2222     @top (target: top) (related: shadow-host)
     23
     24  touchstart
     25     @content (target: content)
     26     @shadow-root (target: content)
     27     @shadow-host (target: shadow-host)
     28     @top (target: shadow-host)
     29
     30  mousewheel
     31     @content (target: content)
     32     @shadow-root (target: content)
     33     @shadow-host (target: shadow-host)
     34     @top (target: shadow-host)
    2335PASS successfullyParsed is true
    2436
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html

    r143191 r143439  
    3131        eventSender.mouseMoveTo(x, y);
    3232        clearEventRecords();
     33
    3334        moveMouseOver(document.getElementById('top'));
    3435        debugDispatchedEvent('mouseout');
    3536        debugDispatchedEvent('mouseover');
     37
     38        touchLocation(host);
     39        debugDispatchedEvent('touchstart');
     40
     41        scrollMouseWheel(host);
     42        debugDispatchedEvent('mousewheel');
    3643    </script>
    3744    <script src="../../js/resources/js-test-post.js"></script>
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root-expected.txt

    r143191 r143439  
    2121  mouseover
    2222     @top (target: top) (related: shadow-host)
     23
     24  touchstart
     25     @shadow-root (target: shadow-root)
     26     @shadow-host (target: shadow-host)
     27     @top (target: shadow-host)
     28
     29  mousewheel
     30     @shadow-root (target: shadow-root)
     31     @shadow-host (target: shadow-host)
     32     @top (target: shadow-host)
    2333PASS successfullyParsed is true
    2434
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root.html

    r143191 r143439  
    3030        eventSender.mouseMoveTo(x, y);
    3131        clearEventRecords();
     32
    3233        moveMouseOver(document.getElementById('top'));
    3334        debugDispatchedEvent('mouseout');
    3435        debugDispatchedEvent('mouseover');
     36
     37        touchLocation(host);
     38        debugDispatchedEvent('touchstart');
     39
     40        scrollMouseWheel(host);
     41        debugDispatchedEvent('mousewheel');
    3542    </script>
    3643    <script src="../../js/resources/js-test-post.js"></script>
  • trunk/Source/WebCore/ChangeLog

    r143438 r143439  
     12013-02-20  Mike West  <mkwst@chromium.org>
     2
     3        Use EventPathWalker rather than parentNode() to normalize event targets in EventHandler.
     4        https://bugs.webkit.org/show_bug.cgi?id=110037
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        We need to teach EventHandler about Shadow DOM in a few places in order
     9        to ensure that we properly target events dispatched upon text nodes.
     10        Rather than naively grabbing the text node's direct parent via
     11        parentNode(), we need to account for the case in which the text node is
     12        distributed[1] to an insertion point inside a shadow host.
     13        EventPathWalker::parent understands these relationships, and should
     14        be used when dealing with mouse, drag, and touch events.
     15
     16        [1]: http://www.w3.org/TR/shadow-dom/#dfn-distribution
     17
     18        * page/EventHandler.cpp:
     19        (WebCore::EventHandler::handleMouseDraggedEvent):
     20        (WebCore::EventHandler::handleTouchEvent):
     21        (WebCore::EventHandler::passGestureEventToWidgetIfPossible):
     22        (WebCore::EventHandler::updateDragAndDrop):
     23            Refactor parentNode callsites to use EventPathWalker::parent().
     24
    1252013-02-20  Vsevolod Vlasov  <vsevik@chromium.org>
    226
  • trunk/Source/WebCore/page/EventHandler.cpp

    r143422 r143439  
    708708    RenderObject* renderer = targetNode->renderer();
    709709    if (!renderer) {
    710         renderer = targetNode->parentNode() ? targetNode->parentNode()->renderer() : 0;
     710        Node* parent = EventPathWalker::parent(targetNode);
     711        if (!parent)
     712            return false;
     713
     714        renderer = parent->renderer();
    711715        if (!renderer || !renderer->isListBox())
    712716            return false;
     
    19821986    RefPtr<Node> newTarget = mev.targetNode();
    19831987    if (newTarget && newTarget->isTextNode())
    1984         newTarget = newTarget->parentNode();
     1988        newTarget = EventPathWalker::parent(newTarget.get());
    19851989
    19861990    m_autoscrollController->updateDragAndDrop(newTarget.get(), event.position(), event.timestamp());
     
    26352639static const Node* closestScrollableNodeCandidate(const Node* node)
    26362640{
    2637     for (const Node* scrollableNode = node; scrollableNode; scrollableNode = scrollableNode->parentNode()) {
     2641    for (EventPathWalker walker(node); walker.node(); walker.moveToParent()) {
     2642        Node* scrollableNode = walker.node();
    26382643        if (scrollableNode->isDocumentNode())
    26392644            return scrollableNode;
     
    38703875            // Touch events should not go to text nodes
    38713876            if (node->isTextNode())
    3872                 node = node->parentNode();
     3877                node = EventPathWalker::parent(node);
    38733878
    38743879            if (InspectorInstrumentation::handleTouchEvent(m_frame->page(), node))
Note: See TracChangeset for help on using the changeset viewer.