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

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

Issue 23264018: unicode-bidi: plaintext is treating embedded unicode-bidi: isolate incorrectly. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Patch for landing Created 7 years, 4 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 | « LayoutTests/fast/text/international/unicode-bidi-plaintext-nested-isolate-neutral-expected.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderBlockLineLayout.cpp
diff --git a/Source/core/rendering/RenderBlockLineLayout.cpp b/Source/core/rendering/RenderBlockLineLayout.cpp
index b7484d68e91b45e2ddf2eb0484dcab30d05289b9..b418021bff001915ccee9a02b888ac948d4fee27 100644
--- a/Source/core/rendering/RenderBlockLineLayout.cpp
+++ b/Source/core/rendering/RenderBlockLineLayout.cpp
@@ -344,9 +344,61 @@ static LayoutUnit inlineLogicalWidth(RenderObject* child, bool start = true, boo
return extraWidth;
}
-static void determineDirectionality(TextDirection& dir, InlineIterator iter)
+static RenderObject* firstRenderObjectForDirectionalityDetermination(RenderObject* root, RenderObject* current = 0)
+{
+ RenderObject* next = current;
+ while (current) {
+ if (isIsolated(current->style()->unicodeBidi())
+ && (current->isRenderInline() || current->isRenderBlock())) {
+ if (current != root)
+ current = 0;
+ else
+ current = next;
+ break;
+ }
+ current = current->parent();
+ }
+
+ if (!current)
+ current = root->firstChild();
+
+ while (current) {
+ next = 0;
+ if (isIteratorTarget(current) && !(current->isText() && toRenderText(current)->isAllCollapsibleWhitespace()))
+ break;
+
+ if (!isIteratorTarget(current) && !isIsolated(current->style()->unicodeBidi()))
+ next = current->firstChild();
+
+ if (!next) {
+ while (current && current != root) {
+ next = current->nextSibling();
+ if (next)
+ break;
+ current = current->parent();
+ }
+ }
+
+ if (!next)
+ break;
+
+ current = next;
+ }
+
+ return current;
+}
+
+static void determinePlaintextDirectionality(TextDirection& dir, RenderObject* root, RenderObject* current = 0, unsigned pos = 0)
{
+ InlineIterator iter(root, firstRenderObjectForDirectionalityDetermination(root, current), pos);
+ InlineBidiResolver observer;
+ observer.setPositionIgnoringNestedIsolates(iter);
+ observer.setStatus(BidiStatus(root->style()->direction(), isOverride(root->style()->unicodeBidi())));
while (!iter.atEnd()) {
+ if (observer.inIsolate()) {
+ iter.increment(&observer);
+ continue;
+ }
if (iter.atParagraphSeparator())
return;
if (UChar current = iter.current()) {
@@ -360,7 +412,7 @@ static void determineDirectionality(TextDirection& dir, InlineIterator iter)
return;
}
}
- iter.increment();
+ iter.increment(&observer);
}
}
@@ -1276,9 +1328,9 @@ static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver,
InlineBidiResolver isolatedResolver;
EUnicodeBidi unicodeBidi = isolatedInline->style()->unicodeBidi();
- TextDirection direction;
+ TextDirection direction = isolatedInline->style()->direction();
if (unicodeBidi == Plaintext)
- determineDirectionality(direction, InlineIterator(isolatedInline, isolatedRun->object(), 0));
+ determinePlaintextDirectionality(direction, isolatedInline, startObj);
else {
ASSERT(unicodeBidi == Isolate || unicodeBidi == IsolateOverride);
direction = isolatedInline->style()->direction();
@@ -1805,7 +1857,7 @@ void RenderBlock::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, Inlin
if (isNewUBAParagraph && styleToUse->unicodeBidi() == Plaintext && !resolver.context()->parent()) {
TextDirection direction = styleToUse->direction();
- determineDirectionality(direction, resolver.position());
+ determinePlaintextDirectionality(direction, resolver.position().root(), resolver.position().object(), resolver.position().offset());
resolver.setStatus(BidiStatus(direction, isOverride(styleToUse->unicodeBidi())));
}
// FIXME: This ownership is reversed. We should own the BidiRunList and pass it to createBidiRunsForLine.
@@ -2292,7 +2344,7 @@ RootInlineBox* RenderBlock::determineStartPosition(LineLayoutState& layoutState,
} else {
TextDirection direction = style()->direction();
if (style()->unicodeBidi() == Plaintext)
- determineDirectionality(direction, InlineIterator(this, bidiFirstSkippingEmptyInlines(this), 0));
+ determinePlaintextDirectionality(direction, this);
resolver.setStatus(BidiStatus(direction, isOverride(style()->unicodeBidi())));
InlineIterator iter = InlineIterator(this, bidiFirstSkippingEmptyInlines(this, &resolver), 0);
resolver.setPosition(iter, numberOfIsolateAncestors(iter));
« no previous file with comments | « LayoutTests/fast/text/international/unicode-bidi-plaintext-nested-isolate-neutral-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698