Changeset 123064 in webkit


Ignore:
Timestamp:
Jul 18, 2012 7:39:57 PM (12 years ago)
Author:
hayato@chromium.org
Message:

[Shadow] A 'selectstart' event fired on distributed nodes should not be stopped at shadow boundary of the parent shadow host.
https://bugs.webkit.org/show_bug.cgi?id=90508

Reviewed by Dimitri Glazkov.

Source/WebCore:

We should not stop some kinds of events at the shadow boundary of a shadow host if the
event is fired on distributed nodes.

See the spec for such kinds of events.
http://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::ensureEventAncestors):
(WebCore::inTheSameScope):
(WebCore):
(WebCore::EventDispatcher::determineDispatchBehavior):

  • dom/EventDispatcher.h:

(EventDispatcher):

LayoutTests:

  • fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt:
  • fast/dom/shadow/events-stopped-at-shadow-boundary.html:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r123062 r123064  
     12012-07-18  Hayato Ito  <hayato@chromium.org>
     2
     3        [Shadow] A 'selectstart' event fired on distributed nodes should not be stopped at shadow boundary of the parent shadow host.
     4        https://bugs.webkit.org/show_bug.cgi?id=90508
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        * fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt:
     9        * fast/dom/shadow/events-stopped-at-shadow-boundary.html:
     10
    1112012-07-18  Julien Chaffraix  <jchaffraix@webkit.org>
    212
  • trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt

    r122801 r123064  
    3939     @host (target: host)
    4040     @top (target: host)
     41
     42An event fired on a distributed child should not be stopped at the shadow boundary of its host (host2), but should be stopped at the nearest shadow boundary (host1).
     43
     44  selectstart
     45     @distributed-child (target: distributed-child)
     46     @content (target: distributed-child)
     47     @parent-of-content (target: distributed-child)
     48     @host2 (target: distributed-child)
    4149PASS successfullyParsed is true
    4250
  • trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary.html

    r122801 r123064  
    6363}
    6464
     65function testEventsShoudBeStoppedAtShadowBoundary()
     66{
     67    var sandbox = document.getElementById('sandbox');
     68    sandbox.innerHTML = '';
     69    sandbox.appendChild(
     70        createDOM('div', {'id': 'top'},
     71                  createDOM('div', {'id': 'host'},
     72                            createShadowRoot(
     73                                createDOM('div', {'id': 'parent-of-target'},
     74                                          createDOM('div', {'id': 'target'})),
     75                                createDOM('div', {'id': 'parent-of-content'},
     76                                          createDOM('content', {'id': 'content'}))),
     77                            createDOM('div', {'id': 'distributed-child'}))));
     78    document.body.offsetLeft;
     79
     80    addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target', 'host/parent-of-content', 'host/content', 'distributed-child']);
     81
     82    for (var i = 0; i < events.length; ++i) {
     83        eventRecords = {};
     84        var event = document.createEvent('UIEvent');
     85        event.initEvent(events[i], true, false);
     86        getNodeInShadowTreeStack('host/target').dispatchEvent(event);
     87        dumpDispatchedEvent(events[i]);
     88    }
     89
     90}
     91
     92function testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary()
     93{
     94    var sandbox = document.getElementById('sandbox');
     95    sandbox.innerHTML = '';
     96    sandbox.appendChild(
     97        createDOM('div', {'id': 'host1'},
     98                  createShadowRoot(
     99                      createDOM('div', {'id': 'host2'},
     100                                createShadowRoot(
     101                                    createDOM('div', {'id': 'parent-of-content'},
     102                                              createDOM('content', {'id': 'content'}))),
     103                                createDOM('div', {'id': 'distributed-child'})))));
     104    document.body.offsetLeft;
     105
     106    addEventListeners(['host1', 'host1/host2', 'host1/host2/parent-of-content', 'host1/host2/content', 'host1/distributed-child']);
     107
     108    debug('\nAn event fired on a distributed child should not be stopped at the shadow boundary of its host (host2), but should be stopped at the nearest shadow boundary (host1).');
     109    eventRecords = {};
     110    var event = document.createEvent('UIEvent');
     111    event.initEvent('selectstart', true, false);
     112    getNodeInShadowTreeStack('host1/distributed-child').dispatchEvent(event);
     113    dumpDispatchedEvent('selectstart');
     114}
     115
    65116function test()
    66117{
     
    68119        testRunner.dumpAsText();
    69120
    70     var sandbox = document.getElementById('sandbox');
    71     sandbox.appendChild(
    72         createDOM('div', {'id': 'top'},
    73                   createDOM('div', {'id': 'host'},
    74                             createShadowRoot(
    75                                 createDOM('div', {'id': 'parent-of-target'},
    76                                           createDOM('div', {'id': 'target'}))))));
    77 
    78     addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target']);
    79 
    80     for (var i = 0; i < events.length; ++i) {
    81         var event = document.createEvent('UIEvent');
    82         event.initEvent(events[i], true, false);
    83         getNodeInShadowTreeStack('host/target').dispatchEvent(event);
    84         dumpDispatchedEvent(events[i]);
    85     }
     121    testEventsShoudBeStoppedAtShadowBoundary()
     122    testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary();
    86123}
    87 
    88124test();
    89125</script>
  • trunk/Source/WebCore/ChangeLog

    r123062 r123064  
     12012-07-18  Hayato Ito  <hayato@chromium.org>
     2
     3        [Shadow] A 'selectstart' event fired on distributed nodes should not be stopped at shadow boundary of the parent shadow host.
     4        https://bugs.webkit.org/show_bug.cgi?id=90508
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        We should not stop some kinds of events at the shadow boundary of a shadow host if the
     9        event is fired on distributed nodes.
     10
     11        See the spec for such kinds of events.
     12        http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#events-that-are-always-stopped
     13
     14        Test: fast/dom/shadow/events-stopped-at-shadow-boundary.html
     15
     16        * dom/EventDispatcher.cpp:
     17        (WebCore::EventDispatcher::ensureEventAncestors):
     18        (WebCore::inTheSameScope):
     19        (WebCore):
     20        (WebCore::EventDispatcher::determineDispatchBehavior):
     21        * dom/EventDispatcher.h:
     22        (EventDispatcher):
     23
    1242012-07-18  Julien Chaffraix  <jchaffraix@webkit.org>
    225
  • trunk/Source/WebCore/dom/EventDispatcher.cpp

    r122801 r123064  
    229229        if (!node->isShadowRoot())
    230230            continue;
    231         if (determineDispatchBehavior(event, toShadowRoot(node)) == StayInsideShadowDOM)
     231        if (determineDispatchBehavior(event, toShadowRoot(node), targetStack.last()) == StayInsideShadowDOM)
    232232            return;
    233233        if (!isSVGElement) {
     
    348348}
    349349
    350 EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event, ShadowRoot* shadowRoot)
     350static inline bool inTheSameScope(ShadowRoot* shadowRoot, EventTarget* target)
     351{
     352    return target->toNode() && target->toNode()->treeScope()->rootNode() == shadowRoot;
     353}
     354
     355EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event, ShadowRoot* shadowRoot, EventTarget* target)
    351356{
    352357#if ENABLE(FULLSCREEN_API) && ENABLE(VIDEO)
     
    367372    // See https://bugs.webkit.org/show_bug.cgi?id=52195 for details.
    368373    const AtomicString eventType = event->type();
    369     if (eventType == eventNames().abortEvent
     374    if (inTheSameScope(shadowRoot, target)
     375        && (eventType == eventNames().abortEvent
    370376            || eventType == eventNames().changeEvent
    371377            || eventType == eventNames().resetEvent
     
    373379            || eventType == eventNames().scrollEvent
    374380            || eventType == eventNames().selectEvent
    375             || eventType == eventNames().selectstartEvent)
     381            || eventType == eventNames().selectstartEvent))
    376382        return StayInsideShadowDOM;
    377383
  • trunk/Source/WebCore/dom/EventDispatcher.h

    r117723 r123064  
    7676    EventDispatcher(Node*);
    7777
    78     EventDispatchBehavior determineDispatchBehavior(Event*, ShadowRoot*);
     78    EventDispatchBehavior determineDispatchBehavior(Event*, ShadowRoot*, EventTarget*);
    7979
    8080    void ensureEventAncestors(Event*);
Note: See TracChangeset for help on using the changeset viewer.