Index: Source/core/rendering/RenderText.cpp |
diff --git a/Source/core/rendering/RenderText.cpp b/Source/core/rendering/RenderText.cpp |
index d9b8a4533a8bb9741f84db3e02af3036a8ec54b1..7348910e716911307068569050e3eec346d767ac 100644 |
--- a/Source/core/rendering/RenderText.cpp |
+++ b/Source/core/rendering/RenderText.cpp |
@@ -936,28 +936,37 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si |
TextRun textRun(text()); |
BidiResolver<TextRunIterator, BidiCharacterRun> bidiResolver; |
- BidiStatus status(LTR, false); |
- status.last = status.lastStrong = WTF::Unicode::OtherNeutral; |
- bidiResolver.setStatus(status); |
- bidiResolver.setPositionIgnoringNestedIsolates(TextRunIterator(&textRun, 0)); |
- bool hardLineBreak = false; |
- bool reorderRuns = false; |
- bidiResolver.createBidiRunsForLine(TextRunIterator(&textRun, textRun.length()), NoVisualOverride, hardLineBreak, reorderRuns); |
- |
- BidiRunList<BidiCharacterRun>& bidiRuns = bidiResolver.runs(); |
- BidiCharacterRun* run = bidiRuns.firstRun(); |
+ |
+ BidiCharacterRun* run; |
+ TextDirection textDirection = styleToUse->direction(); |
+ if (isOverride(styleToUse->unicodeBidi())) { |
+ run = 0; |
+ } else { |
+ BidiStatus status(LTR, false); |
+ status.last = status.lastStrong = WTF::Unicode::OtherNeutral; |
+ bidiResolver.setStatus(status); |
+ bidiResolver.setPositionIgnoringNestedIsolates(TextRunIterator(&textRun, 0)); |
+ bool hardLineBreak = false; |
+ bool reorderRuns = false; |
+ bidiResolver.createBidiRunsForLine(TextRunIterator(&textRun, textRun.length()), NoVisualOverride, hardLineBreak, reorderRuns); |
+ BidiRunList<BidiCharacterRun>& bidiRuns = bidiResolver.runs(); |
+ run = bidiRuns.firstRun(); |
+ } |
+ |
for (int i = 0; i < len; i++) { |
UChar c = uncheckedCharacterAt(i); |
- // Treat adjacent runs with the same resolved directionality |
- // (TextDirection as opposed to WTF::Unicode::Direction) as belonging |
- // to the same run to avoid breaking unnecessarily. |
- while (i > run->stop() || (run->next() && run->next()->direction() == run->direction())) |
- run = run->next(); |
+ if (run) { |
+ // Treat adjacent runs with the same resolved directionality |
+ // (TextDirection as opposed to WTF::Unicode::Direction) as belonging |
+ // to the same run to avoid breaking unnecessarily. |
+ while (i > run->stop() || (run->next() && run->next()->direction() == run->direction())) |
+ run = run->next(); |
- ASSERT(run); |
- ASSERT(i <= run->stop()); |
- TextDirection textDirection = run->direction(); |
+ ASSERT(run); |
+ ASSERT(i <= run->stop()); |
+ textDirection = run->direction(); |
+ } |
bool previousCharacterIsSpace = isSpace; |
bool isNewline = false; |
@@ -1021,7 +1030,8 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si |
} |
// Terminate word boundary at bidi run boundary. |
- j = min(j, run->stop() + 1); |
+ if (run) |
+ j = min(j, run->stop() + 1); |
int wordLen = j - i; |
if (wordLen) { |
bool isSpace = (j < len) && c == ' '; |
@@ -1117,7 +1127,8 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si |
lastWordBoundary++; |
} |
} |
- bidiRuns.deleteRuns(); |
+ if (run) |
+ bidiResolver.runs().deleteRuns(); |
if (firstGlyphLeftOverflow > 0) |
glyphOverflow.left = firstGlyphLeftOverflow; |