⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 118645 in webkit


Ignore:
Timestamp:
May 27, 2012, 9:39:30 PM (14 years ago)
Author:
hayato@chromium.org
Message:

Support multiple shadow roots in event dispatching.
https://bugs.webkit.org/show_bug.cgi?id=87470

Reviewed by Dimitri Glazkov.

Source/WebCore:

The current implementation does not set event's target correctly
if an event happens on DOM tree with multiple shadow roots. So
this patch updates an event re-targeting algorithm so that it
works even if it is applied to multiple shadow roots.

Tests: fast/dom/shadow/shadow-dom-event-dispatching.html

  • dom/ComposedShadowTreeWalker.cpp:

(WebCore::ComposedShadowTreeWalker::traverseParentIncludingInsertionPointAndShadowRoot):

  • dom/EventDispatcher.cpp:

(WebCore::EventDispatcher::ensureEventAncestors):

LayoutTests:

  • fast/dom/shadow/shadow-dom-event-dispatching-expected.txt:
  • fast/dom/shadow/shadow-dom-event-dispatching.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r118633 r118645  
     12012-05-27  Hayato Ito  <hayato@chromium.org>
     2
     3        Support multiple shadow roots in event dispatching.
     4        https://bugs.webkit.org/show_bug.cgi?id=87470
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        * fast/dom/shadow/shadow-dom-event-dispatching-expected.txt:
     9        * fast/dom/shadow/shadow-dom-event-dispatching.html:
     10
    1112012-05-27  Takashi Sakamoto  <tasak@google.com>
    212
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-expected.txt

    r118320 r118645  
    322322     @B (target: child-of-inactive-content) (related: A)
    323323     @top (target: child-of-inactive-content) (related: A)
     324
     325
     326Composed Shadow Tree will be:
     327DIV      id=sandbox
     328        DIV      id=top
     329                DIV      id=A
     330                        DIV      id=B
     331                        DIV      id=D
     332                        DIV      id=F
     333
     334
     335Moving mouse from B to A
     336
     337  mouseout
     338     @B (target: B) (related: A)
     339     @C (target: C) (related: A)
     340     @older-shadow-root (target: C) (related: A)
     341     @E (target: E) (related: A)
     342     @younger-shadow-root (target: E) (related: A)
     343     @A (target: B) (related: A)
     344     @top (target: B) (related: A)
     345
     346  mouseover
     347     @A (target: A) (related: B)
     348     @top (target: A) (related: B)
     349
     350Moving mouse from A/D to A//F
     351
     352  mouseout
     353     @D (target: D) (related: A)
     354     @older-shadow-root (target: D) (related: A)
     355     @E (target: E) (related: F)
     356     @younger-shadow-root (target: E) (related: F)
     357
     358  mouseover
     359     @F (target: F) (related: E)
     360     @younger-shadow-root (target: F) (related: E)
     361
     362Moving mouse from B to A//F
     363
     364  mouseout
     365     @B (target: B) (related: A)
     366     @C (target: C) (related: A)
     367     @older-shadow-root (target: C) (related: A)
     368     @E (target: E) (related: F)
     369     @younger-shadow-root (target: E) (related: F)
     370     @A (target: B) (related: A)
     371     @top (target: B) (related: A)
     372
     373  mouseover
     374     @F (target: F) (related: E)
     375     @younger-shadow-root (target: F) (related: E)
     376     @A (target: A) (related: B)
     377     @top (target: A) (related: B)
    324378PASS successfullyParsed is true
    325379
  • trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching.html

    r118320 r118645  
    226226}
    227227
     228// Hosting multiple shadow roots
     229function prepareDOMTree8(parent)
     230{
     231    parent.appendChild(
     232        createDOM('div', {'id': 'top'},
     233                  createDOM('div', {'id': 'A'},
     234                            createShadowRoot(
     235                                createDOM('content', {'id': 'C'}),
     236                                createDOM('div', {'id': 'D'})),
     237                            createShadowRoot(
     238                                createDOM('shadow', {'id': 'E'}),
     239                                createDOM('div', {'id': 'F'})),
     240                            createDOM('div', {'id': 'B'}))));
     241
     242    addEventListeners(['top', 'A', 'B', 'A/', 'A/C', 'A/D', 'A//', 'A//E', 'A//F']);
     243    getNodeInShadowTreeStack('A/').id = 'older-shadow-root';
     244    getNodeInShadowTreeStack('A//').id = 'younger-shadow-root';
     245    parent.offsetLeft;
     246    debug('\n\nComposed Shadow Tree will be:\n' + dumpComposedShadowTree(parent));
     247}
     248
    228249function debugDispatchedEvent(eventType)
    229250{
     
    318339
    319340    sandbox.innerHTML = '';
     341    prepareDOMTree8(sandbox);
     342
     343    moveMouse('B', 'A');
     344    moveMouse('A/D', 'A//F');
     345    moveMouse('B', 'A//F');
    320346}
    321347
  • trunk/Source/WebCore/ChangeLog

    r118644 r118645  
     12012-05-27  Hayato Ito  <hayato@chromium.org>
     2
     3        Support multiple shadow roots in event dispatching.
     4        https://bugs.webkit.org/show_bug.cgi?id=87470
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        The current implementation does not set event's target correctly
     9        if an event happens on DOM tree with multiple shadow roots.  So
     10        this patch updates an event re-targeting algorithm so that it
     11        works even if it is applied to multiple shadow roots.
     12
     13        Tests: fast/dom/shadow/shadow-dom-event-dispatching.html
     14
     15        * dom/ComposedShadowTreeWalker.cpp:
     16        (WebCore::ComposedShadowTreeWalker::traverseParentIncludingInsertionPointAndShadowRoot):
     17        * dom/EventDispatcher.cpp:
     18        (WebCore::EventDispatcher::ensureEventAncestors):
     19
    1202012-05-27  Benjamin Poulain  <benjamin@webkit.org>
    221
  • trunk/Source/WebCore/dom/EventDispatcher.cpp

    r117957 r118645  
    200200    if (m_ancestorsInitialized)
    201201        return;
    202 
    203     ComposedShadowTreeWalker ancestorWalker(m_node.get());
    204     EventTarget* originalTarget = eventTargetRespectingSVGTargetRules(ancestorWalker.get());
    205     m_ancestors.append(EventContext(m_node.get(), originalTarget, originalTarget));
    206202    m_ancestorsInitialized = true;
    207 
    208     if (!m_node->inDocument())
    209         return;
    210 
     203    bool inDocument = m_node->inDocument();
     204    bool isSVGElement = m_node->isSVGElement();
    211205    Vector<EventTarget*> targetStack;
    212     targetStack.append(originalTarget);
    213     while (true) {
    214         if (ancestorWalker.get()->isShadowRoot()) {
    215             if (determineDispatchBehavior(event, toShadowRoot(ancestorWalker.get())) == StayInsideShadowDOM)
    216                 return;
    217             ancestorWalker.parentIncludingInsertionPointAndShadowRoot();
    218             if (!ancestorWalker.get())
    219                 return;
    220             if (!m_node->isSVGElement()) {
    221                 targetStack.removeLast();
    222                 if (targetStack.isEmpty())
    223                     targetStack.append(ancestorWalker.get());
    224             }
    225         } else {
    226             ancestorWalker.parentIncludingInsertionPointAndShadowRoot();
    227             if (!ancestorWalker.get())
    228                 return;
    229             if (isInsertionPoint(ancestorWalker.get()) && toInsertionPoint(ancestorWalker.get())->isActive())
    230                 targetStack.append(ancestorWalker.get());
    231         }
    232         m_ancestors.append(EventContext(ancestorWalker.get(), eventTargetRespectingSVGTargetRules(ancestorWalker.get()), targetStack.last()));
     206    for (ComposedShadowTreeWalker walker(m_node.get()); walker.get(); walker.parentIncludingInsertionPointAndShadowRoot()) {
     207        Node* node = walker.get();
     208        if (isActiveInsertionPoint(node) || targetStack.isEmpty())
     209            targetStack.append(eventTargetRespectingSVGTargetRules(node));
     210        m_ancestors.append(EventContext(node, eventTargetRespectingSVGTargetRules(node), targetStack.last()));
     211        if (!inDocument)
     212            return;
     213        if (!node->isShadowRoot())
     214            continue;
     215        if (determineDispatchBehavior(event, toShadowRoot(node)) == StayInsideShadowDOM)
     216            return;
     217        if (!isSVGElement && !targetStack.isEmpty())
     218            targetStack.removeLast();
    233219    }
    234220}
Note: See TracChangeset for help on using the changeset viewer.