Index: third_party/WebKit/Source/core/layout/line/InlineIterator.h |
diff --git a/third_party/WebKit/Source/core/layout/line/InlineIterator.h b/third_party/WebKit/Source/core/layout/line/InlineIterator.h |
index d35c070a081ff207a273b4b9949212cc75237be2..ace68b2111611df5542fb9c817a8207bd9567118 100644 |
--- a/third_party/WebKit/Source/core/layout/line/InlineIterator.h |
+++ b/third_party/WebKit/Source/core/layout/line/InlineIterator.h |
@@ -690,40 +690,44 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, un |
if (start > end || LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj)) |
return; |
- LineMidpointState& lineMidpointState = resolver.midpointState(); |
- bool haveNextMidpoint = (lineMidpointState.currentMidpoint() < lineMidpointState.numMidpoints()); |
- InlineIterator nextMidpoint; |
- if (haveNextMidpoint) |
- nextMidpoint = lineMidpointState.midpoints()[lineMidpointState.currentMidpoint()]; |
- if (lineMidpointState.betweenMidpoints()) { |
- if (!(haveNextMidpoint && nextMidpoint.getLineLayoutItem() == obj)) |
- return; |
- // This is a new start point. Stop ignoring objects and |
- // adjust our start. |
- lineMidpointState.setBetweenMidpoints(false); |
- start = nextMidpoint.offset(); |
- lineMidpointState.incrementCurrentMidpoint(); |
- if (start < end) |
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, root, resolver, behavior, tracker); |
- } else { |
- if (!haveNextMidpoint || (obj != nextMidpoint.getLineLayoutItem())) { |
- appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
- return; |
- } |
- |
- // An end midpoint has been encountered within our object. We |
- // need to go ahead and append a run with our endpoint. |
- if (nextMidpoint.offset() + 1 <= end) { |
- lineMidpointState.setBetweenMidpoints(true); |
+ for (;;) { |
+ LineMidpointState& lineMidpointState = resolver.midpointState(); |
+ bool haveNextMidpoint = (lineMidpointState.currentMidpoint() < lineMidpointState.numMidpoints()); |
+ InlineIterator nextMidpoint; |
+ if (haveNextMidpoint) |
+ nextMidpoint = lineMidpointState.midpoints()[lineMidpointState.currentMidpoint()]; |
+ if (lineMidpointState.betweenMidpoints()) { |
+ if (!(haveNextMidpoint && nextMidpoint.getLineLayoutItem() == obj)) |
+ return; |
+ // This is a new start point. Stop ignoring objects and |
+ // adjust our start. |
+ lineMidpointState.setBetweenMidpoints(false); |
+ start = nextMidpoint.offset(); |
lineMidpointState.incrementCurrentMidpoint(); |
- if (nextMidpoint.offset() != UINT_MAX) { // UINT_MAX means stop at the object and don't nclude any of it. |
- if (nextMidpoint.offset() + 1 > start) |
- appendRunObjectIfNecessary(obj, start, nextMidpoint.offset() + 1, root, resolver, behavior, tracker); |
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, nextMidpoint.offset() + 1, end, root, resolver, behavior, tracker); |
- } |
+ if (start < end) |
+ continue; |
} else { |
- appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
+ if (!haveNextMidpoint || (obj != nextMidpoint.getLineLayoutItem())) { |
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
+ return; |
+ } |
+ |
+ // An end midpoint has been encountered within our object. We |
+ // need to go ahead and append a run with our endpoint. |
+ if (nextMidpoint.offset() + 1 <= end) { |
+ lineMidpointState.setBetweenMidpoints(true); |
+ lineMidpointState.incrementCurrentMidpoint(); |
+ if (nextMidpoint.offset() != UINT_MAX) { // UINT_MAX means stop at the object and don't nclude any of it. |
+ if (nextMidpoint.offset() + 1 > start) |
+ appendRunObjectIfNecessary(obj, start, nextMidpoint.offset() + 1, root, resolver, behavior, tracker); |
+ start = nextMidpoint.offset() + 1; |
+ continue; |
+ } |
+ } else { |
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
+ } |
} |
+ return; |
} |
} |