| Index: Source/core/dom/NodeRenderingContext.cpp
|
| diff --git a/Source/core/dom/NodeRenderingContext.cpp b/Source/core/dom/NodeRenderingContext.cpp
|
| index 984dfb8de32a0fb39c3c389d53bd3afd829a6a97..8ea7f81fa8661c2292171d2cefdb14acd771c1cd 100644
|
| --- a/Source/core/dom/NodeRenderingContext.cpp
|
| +++ b/Source/core/dom/NodeRenderingContext.cpp
|
| @@ -174,6 +174,7 @@ bool NodeRenderingContext::shouldCreateRenderer() const
|
| {
|
| if (!m_renderingParent)
|
| return false;
|
| +
|
| RenderObject* parentRenderer = this->parentRenderer();
|
| if (!parentRenderer)
|
| return false;
|
| @@ -184,37 +185,41 @@ bool NodeRenderingContext::shouldCreateRenderer() const
|
| return true;
|
| }
|
|
|
| -void NodeRenderingContext::moveToFlowThreadIfNeeded()
|
| +// Check the specific case of elements that are children of regions but are flowed into a flow thread themselves.
|
| +bool NodeRenderingContext::elementInsideRegionNeedsRenderer()
|
| {
|
| - ASSERT(m_node->isElementNode());
|
| - ASSERT(m_style);
|
| - if (!RuntimeEnabledFeatures::cssRegionsEnabled())
|
| - return;
|
| + Element* element = toElement(m_node);
|
| + bool elementInsideRegionNeedsRenderer = false;
|
| + RenderObject* parentRenderer = this->parentRenderer();
|
| + if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer->isRenderRegion())
|
| + || (!parentRenderer && element->parentElement() && element->parentElement()->isInsideRegion())) {
|
|
|
| - if (m_style->flowThread().isEmpty())
|
| - return;
|
| + if (!m_style)
|
| + m_style = element->styleForRenderer();
|
|
|
| - // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements such as ::first-line, ::first-letter, ::before or ::after
|
| - // cannot be directly collected into a named flow.
|
| - if (m_node->isPseudoElement())
|
| - return;
|
| + elementInsideRegionNeedsRenderer = element->shouldMoveToFlowThread(m_style.get());
|
|
|
| - // FIXME: Do not collect elements if they are in shadow tree.
|
| - if (m_node->isInShadowTree())
|
| - return;
|
| + // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
|
| + if (element->rendererIsNeeded(*this))
|
| + element->setIsInsideRegion(true);
|
| + }
|
|
|
| - if (m_node->isElementNode() && FullscreenController::isActiveFullScreenElement(toElement(m_node)))
|
| + return elementInsideRegionNeedsRenderer;
|
| +}
|
| +
|
| +void NodeRenderingContext::moveToFlowThreadIfNeeded()
|
| +{
|
| + if (!RuntimeEnabledFeatures::cssRegionsEnabled())
|
| return;
|
|
|
| - // Allow only svg root elements to be directly collected by a render flow thread.
|
| - if (m_node->isSVGElement()
|
| - && (!(m_node->hasTagName(SVGNames::svgTag) && m_node->parentNode() && !m_node->parentNode()->isSVGElement())))
|
| + Element* element = toElement(m_node);
|
| +
|
| + if (!element->shouldMoveToFlowThread(m_style.get()))
|
| return;
|
|
|
| - m_flowThread = m_style->flowThread();
|
| ASSERT(m_node->document()->renderView());
|
| FlowThreadController* flowThreadController = m_node->document()->renderView()->flowThreadController();
|
| - m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName(m_flowThread);
|
| + m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName(m_style->flowThread());
|
| flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRenderer);
|
| }
|
|
|
| @@ -234,8 +239,11 @@ void NodeRenderingContext::createRendererForElementIfNeeded()
|
|
|
| Element* element = toElement(m_node);
|
|
|
| - if (!shouldCreateRenderer())
|
| + element->setIsInsideRegion(false);
|
| +
|
| + if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer())
|
| return;
|
| +
|
| if (!m_style)
|
| m_style = element->styleForRenderer();
|
| ASSERT(m_style);
|
|
|