Index: Source/core/dom/RenderTreeBuilder.cpp |
diff --git a/Source/core/dom/RenderTreeBuilder.cpp b/Source/core/dom/RenderTreeBuilder.cpp |
index 3db451dfcef58fad505cf3df9b58e76feac2a19d..9db6099b3b433390573b70381bc05dad9b4ba0aa 100644 |
--- a/Source/core/dom/RenderTreeBuilder.cpp |
+++ b/Source/core/dom/RenderTreeBuilder.cpp |
@@ -31,6 +31,7 @@ |
#include "core/css/resolver/StyleResolver.h" |
#include "core/dom/FirstLetterPseudoElement.h" |
#include "core/dom/Fullscreen.h" |
+#include "core/dom/MarkerPseudoElement.h" |
#include "core/dom/Node.h" |
#include "core/dom/PseudoElement.h" |
#include "core/dom/Text.h" |
@@ -55,7 +56,7 @@ RenderTreeBuilderForElement::RenderTreeBuilderForElement(Element& element, Rende |
} |
} |
-RenderObject* RenderTreeBuilderForElement::nextRenderer() const |
+RenderObject* RenderTreeBuilderForElement::nextRenderer(RenderObject* parentRenderer) const |
{ |
ASSERT(m_renderingParent); |
@@ -65,6 +66,11 @@ RenderObject* RenderTreeBuilderForElement::nextRenderer() const |
if (m_node->isFirstLetterPseudoElement()) |
return FirstLetterPseudoElement::firstLetterTextRenderer(*m_node); |
+ if (m_node->isMarkerPseudoElement()) { |
+ ASSERT(parentRenderer); |
+ return MarkerPseudoElement::firstNonMarkerChild(parentRenderer); |
+ } |
+ |
return RenderTreeBuilder::nextRenderer(); |
} |
@@ -72,6 +78,12 @@ RenderObject* RenderTreeBuilderForElement::parentRenderer() const |
{ |
RenderObject* parentRenderer = RenderTreeBuilder::parentRenderer(); |
+ if (m_node->isMarkerPseudoElement()) { |
+ ASSERT(m_renderingParent->isRenderBlockFlow()); |
+ if (RenderObject* markerRenderer = MarkerPseudoElement::getParentOfFirstLineBox(toRenderBlockFlow(m_renderingParent), nullptr)) |
+ return markerRenderer; |
+ } |
+ |
if (parentRenderer) { |
// FIXME: Guarding this by parentRenderer isn't quite right as the spec for |
// top layer only talks about display: none ancestors so putting a <dialog> inside an |
@@ -103,6 +115,9 @@ bool RenderTreeBuilderForElement::shouldCreateRenderer() const |
if (!parentRenderer->canHaveChildren()) |
return false; |
+ if (m_node->isMarkerPseudoElement() && m_renderingParent->style()->display() == LIST_ITEM) |
+ return true; |
+ |
return m_node->rendererIsNeeded(style()); |
} |
@@ -132,7 +147,7 @@ void RenderTreeBuilderForElement::createRenderer() |
// for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. |
newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); |
- RenderObject* nextRenderer = this->nextRenderer(); |
+ RenderObject* nextRenderer = this->nextRenderer(parentRenderer); |
m_node->setRenderer(newRenderer); |
newRenderer->setStyle(&style); // setStyle() can depend on renderer() already being set. |