| Index: Source/core/dom/NodeRenderingContext.cpp
|
| diff --git a/Source/core/dom/NodeRenderingContext.cpp b/Source/core/dom/NodeRenderingContext.cpp
|
| index acdfbbd5536ba54271d8695db02808c4fee9d996..1d39ef454f3e4854d4d027f07c14d8c2a990c2b1 100644
|
| --- a/Source/core/dom/NodeRenderingContext.cpp
|
| +++ b/Source/core/dom/NodeRenderingContext.cpp
|
| @@ -79,7 +79,7 @@ static bool isRendererReparented(const RenderObject* renderer)
|
| return false;
|
| if (renderer->style() && !renderer->style()->flowThread().isEmpty())
|
| return true;
|
| - if (toElement(renderer->node())->isInTopLayer())
|
| + if (toElement(renderer->node())->shouldBeReparentedUnderRenderView(renderer->style()))
|
| return true;
|
| return false;
|
| }
|
| @@ -90,7 +90,16 @@ RenderObject* NodeRenderingContext::nextRenderer() const
|
| return renderer->nextSibling();
|
|
|
| Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
|
| - if (element && element->isInTopLayer()) {
|
| + if (element && element->shouldBeReparentedUnderRenderView(m_style.get())) {
|
| + // FIXME: Reparented renderers not in the top layer should probably be
|
| + // ordered in DOM tree order. We don't have a good way to do that yet,
|
| + // since NodeRenderingTraversal isn't aware of reparenting. It's safe to
|
| + // just append for now; it doesn't disrupt the top layer rendering as
|
| + // the layer collection in RenderLayer only requires that top layer
|
| + // renderers are orderered correctly relative to each other.
|
| + if (!element->isInTopLayer())
|
| + return 0;
|
| +
|
| const Vector<RefPtr<Element> >& topLayerElements = element->document()->topLayerElements();
|
| size_t position = topLayerElements.find(element);
|
| ASSERT(position != notFound);
|
| @@ -123,10 +132,10 @@ RenderObject* NodeRenderingContext::previousRenderer() const
|
| if (RenderObject* renderer = m_node->renderer())
|
| return renderer->previousSibling();
|
|
|
| - // FIXME: This doesn't work correctly for things in the top layer that are
|
| + // FIXME: This doesn't work correctly for reparented elements that are
|
| // display: none. We'd need to duplicate the logic in nextRenderer, but since
|
| // nothing needs that yet just assert.
|
| - ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer());
|
| + ASSERT(!m_node->isElementNode() || !toElement(m_node)->shouldBeReparentedUnderRenderView(m_style.get()));
|
|
|
| if (m_parentFlowRenderer)
|
| return m_parentFlowRenderer->previousRendererForNode(m_node);
|
| @@ -147,8 +156,8 @@ RenderObject* NodeRenderingContext::parentRenderer() const
|
| if (RenderObject* renderer = m_node->renderer())
|
| return renderer->parent();
|
|
|
| - if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) {
|
| - // The parent renderer of top layer elements is the RenderView, but only
|
| + if (m_node->isElementNode() && toElement(m_node)->shouldBeReparentedUnderRenderView(m_style.get())) {
|
| + // The parent renderer of reparented elements is the RenderView, but only
|
| // if the normal parent would have had a renderer.
|
| // FIXME: This behavior isn't quite right as the spec for top layer
|
| // only talks about display: none ancestors so putting a <dialog> inside
|
|
|