Index: Source/core/dom/LayoutTreeBuilder.cpp |
diff --git a/Source/core/dom/LayoutTreeBuilder.cpp b/Source/core/dom/LayoutTreeBuilder.cpp |
index f0ae0816d1b12be8a30ff49f074572ccca31b696..e0e2eb23aabd67ff2eca9174e8356ed16015ab65 100644 |
--- a/Source/core/dom/LayoutTreeBuilder.cpp |
+++ b/Source/core/dom/LayoutTreeBuilder.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" |
@@ -57,7 +58,7 @@ LayoutTreeBuilderForElement::LayoutTreeBuilderForElement(Element& element, Compu |
} |
} |
-LayoutObject* LayoutTreeBuilderForElement::nextLayoutObject() const |
+LayoutObject* LayoutTreeBuilderForElement::nextLayoutObject(LayoutObject* parentLayoutObject) const |
{ |
ASSERT(m_layoutObjectParent); |
@@ -67,6 +68,11 @@ LayoutObject* LayoutTreeBuilderForElement::nextLayoutObject() const |
if (m_node->isFirstLetterPseudoElement()) |
return FirstLetterPseudoElement::firstLetterTextRenderer(*m_node); |
+ if (m_node->isMarkerPseudoElement()) { |
+ ASSERT(parentLayoutObject); |
+ return MarkerPseudoElement::firstNonMarkerChild(parentLayoutObject); |
+ } |
+ |
return LayoutTreeBuilder::nextLayoutObject(); |
} |
@@ -74,8 +80,14 @@ LayoutObject* LayoutTreeBuilderForElement::parentLayoutObject() const |
{ |
LayoutObject* parentLayoutObject = LayoutTreeBuilder::parentLayoutObject(); |
+ if (m_node->isMarkerPseudoElement()) { |
+ ASSERT(m_layoutObjectParent->isLayoutBlockFlow()); |
+ if (LayoutObject* markerLayoutObject = MarkerPseudoElement::parentOfFirstLineBox(toLayoutBlockFlow(m_layoutObjectParent), nullptr)) |
esprehn
2015/04/22 07:45:45
This needs to be encapsulated, this code shouldn't
dsinclair
2015/04/22 20:00:38
Done.
|
+ return markerLayoutObject; |
+ } |
+ |
if (parentLayoutObject) { |
- // FIXME: Guarding this by parentLayoutObject isn't quite right as the spec for |
+ // 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 |
// <optgroup> seems like it should still work even though this check will prevent it. |
if (m_node->isInTopLayer()) |
@@ -105,6 +117,9 @@ bool LayoutTreeBuilderForElement::shouldCreateLayoutObject() const |
if (!parentLayoutObject->canHaveChildren()) |
return false; |
+ if (m_node->isMarkerPseudoElement() && m_layoutObjectParent->style()->display() == LIST_ITEM) |
esprehn
2015/04/22 07:45:45
We should never even get here if the parent is the
dsinclair
2015/04/22 20:00:38
Done.
|
+ return true; |
+ |
return m_node->layoutObjectIsNeeded(style()); |
} |
@@ -134,7 +149,7 @@ void LayoutTreeBuilderForElement::createLayoutObject() |
// for the first time. Otherwise code using inLayoutFlowThread() in the styleWillChange and styleDidChange will fail. |
newLayoutObject->setFlowThreadState(parentLayoutObject->flowThreadState()); |
- LayoutObject* nextLayoutObject = this->nextLayoutObject(); |
+ LayoutObject* nextLayoutObject = this->nextLayoutObject(parentLayoutObject); |
esprehn
2015/04/22 07:45:45
remove the argument, just call parentLayoutObject
dsinclair
2015/04/22 20:00:38
Done.
|
m_node->setLayoutObject(newLayoutObject); |
newLayoutObject->setStyle(&style); // setStyle() can depend on layoutObject() already being set. |