Index: Source/core/platform/text/BidiResolver.h |
diff --git a/Source/core/platform/text/BidiResolver.h b/Source/core/platform/text/BidiResolver.h |
index 71802f9f2e34e67a9c125249a0f502ad78fa214f..dc5ee34fa25db4ab1b85bc6bc4e7e990f7e2f59f 100644 |
--- a/Source/core/platform/text/BidiResolver.h |
+++ b/Source/core/platform/text/BidiResolver.h |
@@ -178,6 +178,7 @@ public: |
#endif |
const Iterator& position() const { return m_current; } |
+ Iterator& position() { return m_current; } |
void setPositionIgnoringNestedIsolates(const Iterator& position) { m_current = position; } |
void setPosition(const Iterator& position, unsigned nestedIsolatedCount) |
{ |
@@ -185,8 +186,6 @@ public: |
m_nestedIsolateCount = nestedIsolatedCount; |
} |
- void increment() { m_current.increment(); } |
- |
BidiContext* context() const { return m_status.context.get(); } |
void setContext(PassRefPtr<BidiContext> c) { m_status.context = c; } |
@@ -222,7 +221,10 @@ public: |
Vector<Run*>& isolatedRuns() { return m_isolatedRuns; } |
+ bool isEndOfParagraph(const Iterator& end) { return m_current == end || m_current.atEnd(); } |
+ |
protected: |
+ void increment() { m_current.increment(); } |
// FIXME: Instead of InlineBidiResolvers subclassing this method, we should |
// pass in some sort of Traits object which knows how to create runs for appending. |
void appendRun(); |
@@ -550,12 +552,31 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis |
m_eor = Iterator(); |
m_last = m_current; |
- bool pastEnd = false; |
+ bool lastParagraphEnded = false; |
BidiResolver<Iterator, Run> stateAtEnd; |
while (true) { |
+ if (inIsolate() && m_emptyRun) { |
+ m_sor = m_current; |
+ m_emptyRun = false; |
+ } |
+ |
+ if (!lastParagraphEnded && isEndOfParagraph(end)) { |
+ if (m_emptyRun) |
+ break; |
+ |
+ stateAtEnd.m_status = m_status; |
+ stateAtEnd.m_sor = m_sor; |
+ stateAtEnd.m_eor = m_eor; |
+ stateAtEnd.m_last = m_last; |
+ stateAtEnd.m_reachedEndOfLine = m_reachedEndOfLine; |
+ stateAtEnd.m_lastBeforeET = m_lastBeforeET; |
+ stateAtEnd.m_emptyRun = m_emptyRun; |
+ endOfLine = m_last; |
+ lastParagraphEnded = true; |
+ } |
Direction dirCurrent; |
- if (pastEnd && (hardLineBreak || m_current.atEnd())) { |
+ if (lastParagraphEnded && (hardLineBreak || m_current.atEnd())) { |
BidiContext* c = context(); |
if (hardLineBreak) { |
// A deviation from the Unicode Bidi Algorithm in order to match |
@@ -842,7 +863,7 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis |
break; |
} |
- if (pastEnd && m_eor == m_current) { |
+ if (lastParagraphEnded && m_eor == m_current) { |
if (!m_reachedEndOfLine) { |
m_eor = endOfLine; |
switch (m_status.eor) { |
@@ -882,7 +903,7 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis |
increment(); |
if (!m_currentExplicitEmbeddingSequence.isEmpty()) { |
bool committed = commitExplicitEmbedding(); |
- if (committed && pastEnd) { |
+ if (committed && lastParagraphEnded) { |
m_current = end; |
m_status = stateAtEnd.m_status; |
m_sor = stateAtEnd.m_sor; |
@@ -895,20 +916,6 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis |
break; |
} |
} |
- |
- if (!pastEnd && (m_current == end || m_current.atEnd())) { |
- if (m_emptyRun) |
- break; |
- stateAtEnd.m_status = m_status; |
- stateAtEnd.m_sor = m_sor; |
- stateAtEnd.m_eor = m_eor; |
- stateAtEnd.m_last = m_last; |
- stateAtEnd.m_reachedEndOfLine = m_reachedEndOfLine; |
- stateAtEnd.m_lastBeforeET = m_lastBeforeET; |
- stateAtEnd.m_emptyRun = m_emptyRun; |
- endOfLine = m_last; |
- pastEnd = true; |
- } |
} |
m_runs.setLogicallyLastRun(m_runs.lastRun()); |