Changeset 119069 in webkit


Ignore:
Timestamp:
May 31, 2012 12:55:29 AM (12 years ago)
Author:
hayato@chromium.org
Message:

ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
https://bugs.webkit.org/show_bug.cgi?id=87493

Reviewed by Dimitri Glazkov.

Source/WebCore:

ComposedShadowTreeWalker assumed that a visited shadow root is
always assigned to a shadow insertion point since it only
traverses nodes which are rendered. But there is an exceptional
use case such as an event dispatching. Some events, such as a
'click' event, may happen in an orphaned shadow subtree. In such
cases, traversal might start with a node in an orphaned shadow
subtree. So ComposedShadowTreeWalker can not assume that visited
shadow root is always assigned to a shadow insertion point.

This patch only fixes ComposedShadowTreeWalker.
ComposedShadowTreeParentWalker will be fixed in another patch with
an event dispatching test.

Test: fast/dom/shadow/composed-shadow-tree-walker.html

  • dom/ComposedShadowTreeWalker.cpp:

(WebCore::ComposedShadowTreeWalker::traverseParentBackToYoungerShadowRootOrHost):

LayoutTests:

  • fast/dom/shadow/composed-shadow-tree-walker.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r119065 r119069  
     12012-05-31  Hayato Ito  <hayato@chromium.org>
     2
     3        ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
     4        https://bugs.webkit.org/show_bug.cgi?id=87493
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        * fast/dom/shadow/composed-shadow-tree-walker.html:
     9
    1102012-05-31  Shane Stephens  <shanestephens@google.com>
    211
  • trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt

    r119022 r119069  
    175175DIV      id=a
    176176
     177Test for an orphaned shadow subtree.
     178Composed Shadow Tree:
     179DIV      id=a
     180        DIV      id=d
     181
     182Traverse in forward.
     183DIV      id=a
     184DIV      id=d
     185Traverse in backward.
     186DIV      id=d
     187DIV      id=a
     188
     189Test for traversal, starting with a node in an orphaned shadow subtree.
     190Composed Shadow Tree:
     191DIV      id=b
     192        DIV      id=c
     193
     194Traverse in forward.
     195DIV      id=b
     196DIV      id=c
     197Traverse in backward.
     198DIV      id=c
     199DIV      id=b
     200
    177201PASS successfullyParsed is true
    178202
  • trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html

    r119022 r119069  
    77<body>
    88<div id="console"></div>
     9<div id="sandbox"></div>
    910<script>
    1011description("Tests for Composed Shadow DOM Tree Traversal APIs. Can only run within DRT");
     
    6667function showComposedShadowTree(node)
    6768{
    68     document.body.appendChild(node);
    69     document.body.offsetLeft;
    70 
    7169    debug('Composed Shadow Tree:');
    7270    debug(dumpComposedShadowTree(node));
     
    8179}
    8280
     81function testComposedShadowTree(node)
     82{
     83    var sandbox = document.getElementById('sandbox');
     84    sandbox.innerHTML = '';
     85    sandbox.appendChild(node);
     86    document.body.offsetLeft;
     87    showComposedShadowTree(node);
     88}
     89
    8390debug('ShadowRoot should be used.');
    84 showComposedShadowTree(
     91testComposedShadowTree(
    8592    createDOM('div', {'id': 'a'},
    8693              createShadowRoot(createDOM('div', {'id': 'b'})),
     
    8895
    8996debug('A content element should select light children');
    90 showComposedShadowTree(
     97testComposedShadowTree(
    9198    createDOM('div', {'id': 'a'},
    9299              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    96103
    97104debug('Test for content element selector.');
    98 showComposedShadowTree(
     105testComposedShadowTree(
    99106    createDOM('div', {'id': 'a'},
    100107              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    105112
    106113debug('Light children should be selected only at once.');
    107 showComposedShadowTree(
     114testComposedShadowTree(
    108115    createDOM('div', {'id': 'a'},
    109116              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    115122
    116123debug('A content element can have fallback elements.');
    117 showComposedShadowTree(
     124testComposedShadowTree(
    118125    createDOM('div', {'id': 'a'},
    119126              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    124131
    125132debug('Fallback elements should not be used if <content> element selects any elements.');
    126 showComposedShadowTree(
     133testComposedShadowTree(
    127134    createDOM('div', {'id': 'a'},
    128135              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    133140
    134141debug('Test for Nested ShadowRoots.');
    135 showComposedShadowTree(
     142testComposedShadowTree(
    136143    createDOM('div', {'id': 'a'},
    137144              createShadowRoot(createDOM('div', {'id': 'b'},
     
    147154
    148155debug('Test for Multiple ShadowRoots.');
    149 showComposedShadowTree(
     156testComposedShadowTree(
    150157    createDOM('div', {'id': 'a'},
    151158              createShadowRoot(createDOM('div', {'id': 'b'}),
     
    158165
    159166debug('Test for inactive insertion points.');
    160 showComposedShadowTree(
     167testComposedShadowTree(
    161168    createDOM('div', {'id': 'a'},
    162169              createDOM('content', {'id': 'b'},
    163170                        createDOM('content', {'id': 'c'}))));
     171
     172debug('Test for an orphaned shadow subtree.');
     173testComposedShadowTree(
     174    createDOM('div', {'id': 'a'},
     175              createShadowRoot(
     176                  createDOM('div', {'id': 'b'},
     177                            createDOM('div', {'id': 'c'}))),
     178              createShadowRoot(
     179                  createDOM('div', {'id': 'd'}))));
     180
     181debug('Test for traversal, starting with a node in an orphaned shadow subtree.');
     182showComposedShadowTree(getNodeInShadowTreeStack('a/b'));
    164183
    165184</script>
  • trunk/Source/WebCore/ChangeLog

    r119068 r119069  
     12012-05-31  Hayato Ito  <hayato@chromium.org>
     2
     3        ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
     4        https://bugs.webkit.org/show_bug.cgi?id=87493
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        ComposedShadowTreeWalker assumed that a visited shadow root is
     9        always assigned to a shadow insertion point since it only
     10        traverses nodes which are rendered.  But there is an exceptional
     11        use case such as an event dispatching. Some events, such as a
     12        'click' event, may happen in an orphaned shadow subtree.  In such
     13        cases, traversal might start with a node in an orphaned shadow
     14        subtree.  So ComposedShadowTreeWalker can not assume that visited
     15        shadow root is always assigned to a shadow insertion point.
     16
     17        This patch only fixes ComposedShadowTreeWalker.
     18        ComposedShadowTreeParentWalker will be fixed in another patch with
     19        an event dispatching test.
     20
     21        Test: fast/dom/shadow/composed-shadow-tree-walker.html
     22
     23        * dom/ComposedShadowTreeWalker.cpp:
     24        (WebCore::ComposedShadowTreeWalker::traverseParentBackToYoungerShadowRootOrHost):
     25
     26
    1272012-05-30  Yury Semikhatsky  <yurys@chromium.org>
    228
  • trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp

    r118890 r119069  
    230230    }
    231231    InsertionPoint* assignedInsertionPoint = shadowRoot->assignedTo();
    232     ASSERT(assignedInsertionPoint);
    233     return traverseParent(assignedInsertionPoint);
     232    return assignedInsertionPoint ? traverseParent(assignedInsertionPoint) : 0;
    234233}
    235234
Note: See TracChangeset for help on using the changeset viewer.