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 07108abaf65100eddf81d77fcd2ecdd46d54b50a..bb4549de590e1ee6a690c6cc5adf6d7a2eff7892 100644 |
--- a/third_party/WebKit/Source/core/layout/line/InlineIterator.h |
+++ b/third_party/WebKit/Source/core/layout/line/InlineIterator.h |
@@ -33,6 +33,22 @@ |
namespace blink { |
+struct BidiIsolatedRun { |
+ BidiIsolatedRun(LayoutObject& object, unsigned position, LayoutObject& root, BidiRun& runToReplace) |
+ : object(object) |
+ , root(root) |
+ , runToReplace(runToReplace) |
+ , position(position) |
+ { |
+ } |
+ |
+ LayoutObject& object; |
+ LayoutObject& root; |
+ BidiRun& runToReplace; |
+ unsigned position; |
+}; |
+ |
+ |
// This class is used to LayoutInline subtrees, stepping by character within the |
// text children. InlineIterator will use bidiNext to find the next LayoutText |
// optionally notifying a BidiResolver every time it steps into/out of a LayoutInline. |
@@ -565,14 +581,14 @@ static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter) |
// FIXME: This belongs on InlineBidiResolver, except it's a template specialization |
// of BidiResolver which knows nothing about LayoutObjects. |
-static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos) |
+static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos, LineLayoutItem root) |
{ |
ASSERT(obj); |
BidiRun* isolatedRun = new BidiRun(pos, pos, obj, resolver.context(), resolver.dir()); |
resolver.runs().addRun(isolatedRun); |
// FIXME: isolatedRuns() could be a hash of object->run and then we could cheaply |
// ASSERT here that we didn't create multiple objects for the same inline. |
- resolver.isolatedRuns().append(isolatedRun); |
+ resolver.isolatedRuns().append(BidiIsolatedRun(*obj, pos, *root, *isolatedRun)); |
return isolatedRun; |
} |
@@ -616,7 +632,7 @@ public: |
void commitExplicitEmbedding(BidiRunList<BidiRun>&) { } |
BidiRunList<BidiRun>& runs() { return m_runs; } |
- void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, InlineBidiResolver& resolver) |
+ void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver) |
{ |
// We only need to add a fake run for a given isolated span once during each call to createBidiRunsForLine. |
// We'll be called for every span inside the isolated span so we just ignore subsequent calls. |
@@ -624,8 +640,8 @@ public: |
if (LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj)) |
return; |
if (!m_haveAddedFakeRunForRootIsolate) { |
- BidiRun* run = addPlaceholderRunForIsolatedInline(resolver, obj, pos); |
- resolver.setMidpointStateForIsolatedRun(run, m_midpointStateForRootIsolate); |
+ BidiRun* run = addPlaceholderRunForIsolatedInline(resolver, obj, pos, root); |
+ resolver.setMidpointStateForIsolatedRun(*run, m_midpointStateForRootIsolate); |
m_haveAddedFakeRunForRootIsolate = true; |
} |
// obj and pos together denote a single position in the inline, from which the parsing of the isolate will start. |
@@ -640,7 +656,7 @@ private: |
BidiRunList<BidiRun>& m_runs; |
}; |
-static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker) |
+static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker) |
{ |
// Trailing space code creates empty BidiRun objects, start == end, so |
// that case needs to be handled specifically. |
@@ -655,14 +671,14 @@ static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start |
if (end - start > limit) |
limitedEnd = start + limit; |
if (behavior == AppendingFakeRun) |
- tracker.addFakeRunIfNecessary(obj, start, limitedEnd, resolver); |
+ tracker.addFakeRunIfNecessary(obj, start, limitedEnd, root, resolver); |
else |
resolver.runs().addRun(createRun(start, limitedEnd, obj, resolver)); |
start = limitedEnd; |
} |
} |
-static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker) |
+static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker) |
{ |
if (start > end || LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj)) |
return; |
@@ -681,10 +697,10 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, un |
start = nextMidpoint.offset(); |
lineMidpointState.incrementCurrentMidpoint(); |
if (start < end) |
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, resolver, behavior, tracker); |
+ return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, root, resolver, behavior, tracker); |
} else { |
if (!haveNextMidpoint || (obj != nextMidpoint.object())) { |
- appendRunObjectIfNecessary(obj, start, end, resolver, behavior, tracker); |
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
return; |
} |
@@ -695,19 +711,19 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, un |
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, resolver, behavior, tracker); |
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, nextMidpoint.offset() + 1, end, resolver, behavior, tracker); |
+ appendRunObjectIfNecessary(obj, start, nextMidpoint.offset() + 1, root, resolver, behavior, tracker); |
+ return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, nextMidpoint.offset() + 1, end, root, resolver, behavior, tracker); |
} |
} else { |
- appendRunObjectIfNecessary(obj, start, end, resolver, behavior, tracker); |
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); |
} |
} |
} |
-static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker) |
+static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, IsolateTracker& tracker) |
{ |
tracker.setMidpointStateForRootIsolate(resolver.midpointState()); |
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), resolver, AppendingFakeRun, tracker); |
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), root, resolver, AppendingFakeRun, tracker); |
} |
template <> |
@@ -722,9 +738,9 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs) |
LineLayoutItem obj = m_sor.object(); |
while (obj && obj != m_eor.object() && obj != m_endOfRunAtEndOfLine.object()) { |
if (isolateTracker.inIsolate()) |
- addFakeRunIfNecessary(obj, start, obj.length(), *this, isolateTracker); |
+ addFakeRunIfNecessary(obj, start, obj.length(), m_sor.root(), *this, isolateTracker); |
else |
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), *this, AppendingRunsForObject, isolateTracker); |
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), m_sor.root(), *this, AppendingRunsForObject, isolateTracker); |
// FIXME: start/obj should be an InlineIterator instead of two separate variables. |
start = 0; |
obj = bidiNextSkippingEmptyInlines(m_sor.root(), obj, &isolateTracker); |
@@ -739,9 +755,9 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs) |
// It's OK to add runs for zero-length LayoutObjects, just don't make the run larger than it should be |
int end = obj.length() ? pos + 1 : 0; |
if (isolateTracker.inIsolate()) |
- addFakeRunIfNecessary(obj, start, end, *this, isolateTracker); |
+ addFakeRunIfNecessary(obj, start, end, m_sor.root(), *this, isolateTracker); |
else |
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, *this, AppendingRunsForObject, isolateTracker); |
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, m_sor.root(), *this, AppendingRunsForObject, isolateTracker); |
} |
if (isEndOfLine) |