Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Unified Diff: Source/core/rendering/RenderListItem.cpp

Issue 368733002: Split list marker updating into two steps (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address reviewer comments Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderListItem.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderListItem.cpp
diff --git a/Source/core/rendering/RenderListItem.cpp b/Source/core/rendering/RenderListItem.cpp
index 840eb7ef002622ce29102e53fb4a95f87d00c4f3..4809c11781c947d34c03fb028c948dd564128a20 100644
--- a/Source/core/rendering/RenderListItem.cpp
+++ b/Source/core/rendering/RenderListItem.cpp
@@ -267,64 +267,70 @@ static RenderObject* firstNonMarkerChild(RenderObject* parent)
return result;
}
-void RenderListItem::updateMarkerLocation()
+void RenderListItem::updateMarkerLocationAndInvalidateWidth()
{
- // Sanity check the location of our marker.
- if (m_marker) {
- RenderObject* markerParent = m_marker->parent();
- RenderObject* lineBoxParent = getParentOfFirstLineBox(this, m_marker);
- if (!lineBoxParent) {
- // If the marker is currently contained inside an anonymous box,
- // then we are the only item in that anonymous box (since no line box
- // parent was found). It's ok to just leave the marker where it is
- // in this case.
- if (markerParent && markerParent->isAnonymousBlock())
- lineBoxParent = markerParent;
- else
- lineBoxParent = this;
- }
+ ASSERT(m_marker);
+
+ // FIXME: We should not modify the structure of the render tree
+ // during layout. crbug.com/370461
+ DeprecatedDisableModifyRenderTreeStructureAsserts disabler;
+ // Removing and adding the marker can trigger repainting in
+ // containers other than ourselves, so we need to disable LayoutState.
+ ForceHorriblySlowRectMapping slowRectMapping(*this);
+ if (updateMarkerLocation()) {
+ // If the marker is inside we need to redo the preferred width calculations
+ // as the size of the item now includes the size of the list marker.
+ if (m_marker->isInside())
+ containingBlock()->updateLogicalWidth();
+ }
+}
- if (markerParent != lineBoxParent || m_marker->preferredLogicalWidthsDirty()) {
- // FIXME: We should not modify the structure of the render tree
- // during layout. crbug.com/370461
- DeprecatedDisableModifyRenderTreeStructureAsserts disabler;
-
- // Removing and adding the marker can trigger repainting in
- // containers other than ourselves, so we need to disable LayoutState.
- ForceHorriblySlowRectMapping slowRectMapping(*this);
- updateFirstLetter();
- m_marker->remove();
- if (markerParent)
- markerParent->dirtyLinesFromChangedChild(m_marker);
- if (!lineBoxParent)
- lineBoxParent = this;
- lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent));
- m_marker->updateMarginsAndContent();
- // If markerParent is an anonymous block that has lost all its children, destroy it.
- if (markerParent && markerParent->isAnonymousBlock() && !toRenderBlock(markerParent)->firstChild() && !toRenderBlock(markerParent)->continuation())
- markerParent->destroy();
-
- // If the marker is inside we need to redo the preferred width calculations
- // as the size of the item now includes the size of the list marker.
- if (m_marker->isInside())
- containingBlock()->updateLogicalWidth();
- }
+bool RenderListItem::updateMarkerLocation()
+{
+ ASSERT(m_marker);
+ RenderObject* markerParent = m_marker->parent();
+ RenderObject* lineBoxParent = getParentOfFirstLineBox(this, m_marker);
+ if (!lineBoxParent) {
+ // If the marker is currently contained inside an anonymous box, then we
+ // are the only item in that anonymous box (since no line box parent was
+ // found). It's ok to just leave the marker where it is in this case.
+ if (markerParent && markerParent->isAnonymousBlock())
+ lineBoxParent = markerParent;
+ else
+ lineBoxParent = this;
+ }
+
+ if (markerParent != lineBoxParent) {
+ updateFirstLetter();
+ m_marker->remove();
+ // FIXME(crbug.com/391009): Investigate whether this call is needed.
+ if (markerParent)
+ markerParent->dirtyLinesFromChangedChild(m_marker);
+ lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent));
+ m_marker->updateMarginsAndContent();
+ // If markerParent is an anonymous block with no children, destroy it.
+ if (markerParent && markerParent->isAnonymousBlock() && !toRenderBlock(markerParent)->firstChild() && !toRenderBlock(markerParent)->continuation())
+ markerParent->destroy();
+ return true;
}
+
+ return false;
}
void RenderListItem::layout()
{
ASSERT(needsLayout());
- // The marker must be autosized before calling updateMarkerLocation.
- // It cannot be done in the parent's beginLayout because it is not yet in the render tree.
if (m_marker) {
- FastTextAutosizer* textAutosizer = document().fastTextAutosizer();
- if (textAutosizer)
+ // The marker must be autosized before calling
+ // updateMarkerLocationAndInvalidateWidth. It cannot be done in the
+ // parent's beginLayout because it is not yet in the render tree.
+ if (FastTextAutosizer* textAutosizer = document().fastTextAutosizer())
textAutosizer->inflateListItem(this, m_marker);
+
+ updateMarkerLocationAndInvalidateWidth();
}
- updateMarkerLocation();
RenderBlockFlow::layout();
}
@@ -475,6 +481,13 @@ void RenderListItem::clearExplicitValue()
explicitValueChanged();
}
+void RenderListItem::setNotInList(bool notInList)
+{
+ m_notInList = notInList;
+ if (m_marker)
+ updateMarkerLocation();
+}
+
static RenderListItem* previousOrNextItem(bool isListReversed, Node* list, RenderListItem* item)
{
return isListReversed ? previousListItem(list, item) : nextListItem(list, item);
« no previous file with comments | « Source/core/rendering/RenderListItem.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698