Changeset 90536 in webkit


Ignore:
Timestamp:
Jul 6, 2011 9:22:17 PM (13 years ago)
Author:
morrita@google.com
Message:

2011-07-06 MORITA Hajime <morrita@google.com>

[ShadowContentElement] Redundant RenderText objects are created on the content boundaries.
https://bugs.webkit.org/show_bug.cgi?id=63977

Reviewed by Dimitri Glazkov.

This test have two set of fixture DOM tree:
One is for shadow tree which has one content element,
another is for light DOM tree, whose root is to have a shadow DOM.

Then the test makes 2 complete DOM trees (DOM tree with shadow and
flattened dom) for each combination of the fixture items. And
compare their layout result.

  • fast/dom/shadow/content-element-renderers-expected.txt: Added.
  • fast/dom/shadow/content-element-renderers.html: Added.

2011-07-06 MORITA Hajime <morrita@google.com>

[ShadowContentElement] Redundant RenderText objects are created on the content boundaries.
https://bugs.webkit.org/show_bug.cgi?id=63977

Reviewed by Dimitri Glazkov.

NodeRenderingContext::nextRenderer() and previousRenderer() didn't work well
when it crosses content elements:

  • It doesn't step into forwarded children of ShadowContentElement.
  • It doesn't step out from traversing forwarded children to neighbors of the content element of that forwarded chidren.

This change makes it to step into and out from content element.

Test: fast/dom/shadow/content-element-renderers.html

  • dom/NodeRenderingContext.cpp: (WebCore::firstRendererOf): Added (WebCore::lastRendererOf): Added (WebCore::NodeRenderingContext::nextRenderer): (WebCore::NodeRenderingContext::previousRenderer):
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r90535 r90536  
     12011-07-06  MORITA Hajime  <morrita@google.com>
     2
     3        [ShadowContentElement] Redundant RenderText objects are created on the content boundaries.
     4        https://bugs.webkit.org/show_bug.cgi?id=63977
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        This test have two set of fixture DOM tree:
     9        One is for shadow tree which has one content element,
     10        another is for light DOM tree, whose root is to have a shadow DOM.
     11       
     12        Then the test makes 2 complete DOM trees (DOM tree with shadow and
     13        flattened dom) for each combination of the fixture items. And
     14        compare their layout result.
     15       
     16        * fast/dom/shadow/content-element-renderers-expected.txt: Added.
     17        * fast/dom/shadow/content-element-renderers.html: Added.
     18
    1192011-07-06  Juan C. Montemayor  <jmont@apple.com>
    220
  • trunk/Source/WebCore/ChangeLog

    r90531 r90536  
     12011-07-06  MORITA Hajime  <morrita@google.com>
     2
     3        [ShadowContentElement] Redundant RenderText objects are created on the content boundaries.
     4        https://bugs.webkit.org/show_bug.cgi?id=63977
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        NodeRenderingContext::nextRenderer() and previousRenderer() didn't work well
     9        when it crosses content elements:
     10        - It doesn't step into forwarded children of ShadowContentElement.
     11        - It doesn't step out from traversing forwarded children to
     12          neighbors of the content element of that forwarded chidren.
     13       
     14        This change makes it to step into and out from content element.
     15       
     16        Test: fast/dom/shadow/content-element-renderers.html
     17
     18        * dom/NodeRenderingContext.cpp:
     19        (WebCore::firstRendererOf): Added
     20        (WebCore::lastRendererOf): Added
     21        (WebCore::NodeRenderingContext::nextRenderer):
     22        (WebCore::NodeRenderingContext::previousRenderer):
     23
    1242011-07-06  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
    225
  • trunk/Source/WebCore/dom/NodeRenderingContext.cpp

    r90094 r90536  
    131131}
    132132
     133static RenderObject* firstRendererOf(ShadowContentElement* parent)
     134{
     135    size_t inclusionCount = parent->inclusionCount();
     136    for (size_t i = 0; i < inclusionCount; ++i) {
     137        Node* candidate = parent->inclusionAt(i);
     138        if (RenderObject* renderer = candidate->renderer())
     139            return renderer;
     140    }
     141
     142    return 0;
     143}
     144
     145static RenderObject* lastRendererOf(ShadowContentElement* parent)
     146{
     147    size_t inclusionCount = parent->inclusionCount();
     148    for (size_t i = 0; i < inclusionCount; ++i) {
     149        Node* candidate = parent->inclusionAt(inclusionCount - i - 1);
     150        if (RenderObject* renderer = candidate->renderer())
     151            return renderer;
     152    }
     153
     154    return 0;
     155}
     156
    133157RenderObject* NodeRenderingContext::nextRenderer() const
    134158{
     
    137161        return renderer->nextSibling();
    138162
    139     if (m_phase == AttachContentForwarded)
    140         return nextRendererOf(m_contentElement, m_node);
     163    if (m_phase == AttachContentForwarded) {
     164        if (RenderObject* found = nextRendererOf(m_contentElement, m_node))
     165            return found;
     166        return NodeRenderingContext(m_contentElement).nextRenderer();
     167    }
    141168
    142169    // Avoid an O(n^2) problem with this function by not checking for
     
    148175        if (node->renderer())
    149176            return node->renderer();
     177        if (node->isContentElement()) {
     178            if (RenderObject* first = firstRendererOf(toShadowContentElement(node)))
     179                return first;
     180        }
    150181    }
    151182
     
    159190        return renderer->previousSibling();
    160191
    161     if (m_phase == AttachContentForwarded)
    162         return previousRendererOf(m_contentElement, m_node);
     192    if (m_phase == AttachContentForwarded) {
     193        if (RenderObject* found = previousRendererOf(m_contentElement, m_node))
     194            return found;
     195        return NodeRenderingContext(m_contentElement).previousRenderer();
     196    }
    163197
    164198    // FIXME: We should have the same O(N^2) avoidance as nextRenderer does
     
    167201        if (node->renderer())
    168202            return node->renderer();
     203        if (node->isContentElement()) {
     204            if (RenderObject* last = lastRendererOf(toShadowContentElement(node)))
     205                return last;
     206        }
    169207    }
    170208
Note: See TracChangeset for help on using the changeset viewer.