Source/WebCore/ChangeLog

 12011-03-29 Levi Weintraub <leviw@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 RTL: Directionality always reset on hard line break
 6 https://bugs.webkit.org/show_bug.cgi?id=23124
 7
 8 No longer clearing all BidiContexts when we hit a hard line break.
 9 Instead, directionality applied by DOM elements is preserved by
 10 reconstructing the context stack ignoring those that didn't come
 11 from the DOM.
 12
 13 Test: fast/text/international/bidi-br-as-paragraph-separator.html
 14
 15 * platform/text/BidiContext.cpp:
 16 (WebCore::BidiContext::createUncached):
 17 (WebCore::BidiContext::create):
 18 (WebCore::copyContextAndRebaselineLevel): Helper to make a copy of a context
 19 and recalculate its bidi level.
 20 (WebCore::BidiContext::copyStackRemovingUnicodeEmbeddingContexts): Returns the top of
 21 a BidiContext stack that's equivalent but without contexts from Unicode directional
 22 characters.
 23 (WebCore::operator==): Now takes into account embedding source.
 24 * platform/text/BidiContext.h:
 25 (WebCore::BidiContext::source): Enum to specify whether an embedded
 26 bidirectional control came from the DOM/Style or Unicode characters
 27 (WebCore::BidiContext::BidiContext):
 28 * platform/text/BidiResolver.h:
 29 (WebCore::BidiEmbedding::BidiEmbedding): An embedding is now a direction
 30 and a hint about where it came from so we can differentiate DOM directions
 31 from unicode direction control characters.
 32 (WebCore::BidiEmbedding::direction):
 33 (WebCore::BidiEmbedding::source):
 34 (WebCore::::embed): Now takes a source as well as a direction.
 35 (WebCore::::commitExplicitEmbedding):
 36 (WebCore::::createBidiRunsForLine):
 37 * rendering/InlineIterator.h:
 38 (WebCore::bidiNext):
 39 (WebCore::bidiFirst):
 40 * rendering/RenderBlockLineLayout.cpp:
 41 (WebCore::RenderBlock::determineStartPosition):
 42
1432011-03-29 Emil A Eklund <eae@chromium.org>
244
345 Reviewed by Dimitri Glazkov.
82226

Source/WebCore/platform/text/BidiContext.cpp

2121
2222#include "config.h"
2323#include "BidiContext.h"
 24#include <wtf/Vector.h>
2425
2526namespace WebCore {
2627
2728using namespace WTF::Unicode;
2829
29 inline PassRefPtr<BidiContext> BidiContext::createUncached(unsigned char level, Direction direction, bool override, BidiContext* parent)
 30inline PassRefPtr<BidiContext> BidiContext::createUncached(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent)
3031{
31  return adoptRef(new BidiContext(level, direction, override, parent));
 32 return adoptRef(new BidiContext(level, direction, override, source, parent));
3233}
3334
34 PassRefPtr<BidiContext> BidiContext::create(unsigned char level, Direction direction, bool override, BidiContext* parent)
 35PassRefPtr<BidiContext> BidiContext::create(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent)
3536{
3637 ASSERT(direction == (level % 2 ? RightToLeft : LeftToRight));
3738
3839 if (parent)
39  return createUncached(level, direction, override, parent);
 40 return createUncached(level, direction, override, source, parent);
4041
4142 ASSERT(level <= 1);
4243 if (!level) {
4344 if (!override) {
44  static BidiContext* ltrContext = createUncached(0, LeftToRight, false, 0).releaseRef();
 45 static BidiContext* ltrContext = createUncached(0, LeftToRight, false, FromStyleOrDOM, 0).releaseRef();
4546 return ltrContext;
4647 }
4748
48  static BidiContext* ltrOverrideContext = createUncached(0, LeftToRight, true, 0).releaseRef();
 49 static BidiContext* ltrOverrideContext = createUncached(0, LeftToRight, true, FromStyleOrDOM, 0).releaseRef();
4950 return ltrOverrideContext;
5051 }
5152
5253 if (!override) {
53  static BidiContext* rtlContext = createUncached(1, RightToLeft, false, 0).releaseRef();
 54 static BidiContext* rtlContext = createUncached(1, RightToLeft, false, FromStyleOrDOM, 0).releaseRef();
5455 return rtlContext;
5556 }
5657
57  static BidiContext* rtlOverrideContext = createUncached(1, RightToLeft, true, 0).releaseRef();
 58 static BidiContext* rtlOverrideContext = createUncached(1, RightToLeft, true, FromStyleOrDOM, 0).releaseRef();
5859 return rtlOverrideContext;
5960}
6061
 62static inline PassRefPtr<BidiContext> copyContextAndRebaselineLevel(BidiContext* context, BidiContext* parent)
 63{
 64 ASSERT(context);
 65 unsigned char newLevel = parent ? parent->level() : 0;
 66 if (context->dir() == RightToLeft)
 67 newLevel = nextGreaterOddLevel(newLevel);
 68 else if (parent)
 69 newLevel = nextGreaterEvenLevel(newLevel);
 70
 71 return BidiContext::create(newLevel, context->dir(), context->override(), context->source(), parent);
 72}
 73
 74// The BidiContext stack must be immutable -- they're re-used for re-layout after
 75// DOM modification/editing -- so we copy all the non-unicode contexts, and
 76// recalculate their levels.
 77PassRefPtr<BidiContext> BidiContext::copyStackRemovingUnicodeEmbeddingContexts()
 78{
 79 Vector<BidiContext*, 64> contexts;
 80 for (BidiContext* iter = this; iter; iter = iter->parent()) {
 81 if (iter->source() != FromUnicode)
 82 contexts.append(iter);
 83 }
 84 ASSERT(contexts.size());
 85
 86 RefPtr<BidiContext> topContext = copyContextAndRebaselineLevel(contexts.last(), 0);
 87 for (int i = contexts.size() - 1; i > 0; --i)
 88 topContext = copyContextAndRebaselineLevel(contexts[i - 1], topContext.get());
 89
 90 return topContext.release();
 91}
 92
6193bool operator==(const BidiContext& c1, const BidiContext& c2)
6294{
6395 if (&c1 == &c2)
6496 return true;
65  if (c1.level() != c2.level() || c1.override() != c2.override() || c1.dir() != c2.dir())
 97 if (c1.level() != c2.level() || c1.override() != c2.override() || c1.dir() != c2.dir() || c1.source() != c2.source())
6698 return false;
6799 if (!c1.parent())
68100 return !c2.parent();
82066

Source/WebCore/platform/text/BidiContext.h

3030
3131namespace WebCore {
3232
 33enum BidiEmbeddingSource {
 34 FromStyleOrDOM,
 35 FromUnicode
 36};
 37
3338// Used to keep track of explicit embeddings.
3439class BidiContext : public RefCounted<BidiContext> {
3540public:
36  static PassRefPtr<BidiContext> create(unsigned char level, WTF::Unicode::Direction direction, bool override = false, BidiContext* parent = 0);
 41 static PassRefPtr<BidiContext> create(unsigned char level, WTF::Unicode::Direction, bool override = false, BidiEmbeddingSource = FromStyleOrDOM, BidiContext* parent = 0);
3742
3843 BidiContext* parent() const { return m_parent.get(); }
3944 unsigned char level() const { return m_level; }
4045 WTF::Unicode::Direction dir() const { return static_cast<WTF::Unicode::Direction>(m_direction); }
4146 bool override() const { return m_override; }
 47 BidiEmbeddingSource source() const { return static_cast<BidiEmbeddingSource>(m_source); }
4248
 49 PassRefPtr<BidiContext> copyStackRemovingUnicodeEmbeddingContexts();
4350private:
44  BidiContext(unsigned char level, WTF::Unicode::Direction direction, bool override, BidiContext* parent)
 51 BidiContext(unsigned char level, WTF::Unicode::Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent)
4552 : m_level(level)
4653 , m_direction(direction)
4754 , m_override(override)
 55 , m_source(source)
4856 , m_parent(parent)
4957 {
5058 }
5159
52  static PassRefPtr<BidiContext> createUncached(unsigned char level, WTF::Unicode::Direction, bool override, BidiContext* parent);
 60 static PassRefPtr<BidiContext> createUncached(unsigned char level, WTF::Unicode::Direction, bool override, BidiEmbeddingSource, BidiContext* parent);
5361
5462 unsigned char m_level;
5563 unsigned m_direction : 5; // Direction
5664 bool m_override : 1;
 65 unsigned m_source : 1; // BidiEmbeddingSource
5766 RefPtr<BidiContext> m_parent;
5867};
5968
 69inline unsigned char nextGreaterOddLevel(unsigned char level)
 70{
 71 return (level + 1) | 1;
 72}
 73
 74inline unsigned char nextGreaterEvenLevel(unsigned char level)
 75{
 76 return (level + 2) & ~1;
 77}
 78
6079bool operator==(const BidiContext&, const BidiContext&);
6180
6281} // namespace WebCore
82066

Source/WebCore/platform/text/BidiResolver.h

@@struct BidiStatus {
7575 RefPtr<BidiContext> context;
7676};
7777
 78class BidiEmbedding {
 79public:
 80 BidiEmbedding(WTF::Unicode::Direction direction, BidiEmbeddingSource source)
 81 : m_direction(direction)
 82 , m_source(source)
 83 {
 84 }
 85
 86 WTF::Unicode::Direction direction() const { return m_direction; }
 87 BidiEmbeddingSource source() const { return m_source; }
 88private:
 89 WTF::Unicode::Direction m_direction;
 90 BidiEmbeddingSource m_source;
 91};
 92
7893inline bool operator==(const BidiStatus& status1, const BidiStatus& status2)
7994{
8095 return status1.eor == status2.eor && status1.last == status2.last && status1.lastStrong == status2.lastStrong && *(status1.context) == *(status2.context);

@@enum VisualDirectionOverride {
134149
135150template <class Iterator, class Run> class BidiResolver {
136151 WTF_MAKE_NONCOPYABLE(BidiResolver);
137 public :
 152public:
138153 BidiResolver()
139154 : m_direction(WTF::Unicode::OtherNeutral)
140155 , reachedEndOfLine(false)

@@public :
166181
167182 MidpointState<Iterator>& midpointState() { return m_midpointState; }
168183
169  void embed(WTF::Unicode::Direction);
 184 void embed(WTF::Unicode::Direction, BidiEmbeddingSource);
170185 bool commitExplicitEmbedding();
171186
172187 void createBidiRunsForLine(const Iterator& end, VisualDirectionOverride = NoVisualOverride, bool hardLineBreak = false);

@@private:
210225 void lowerExplicitEmbeddingLevel(WTF::Unicode::Direction from);
211226 void checkDirectionInLowerRaiseEmbeddingLevel();
212227
213  Vector<WTF::Unicode::Direction, 8> m_currentExplicitEmbeddingSequence;
 228 Vector<BidiEmbedding, 8> m_currentExplicitEmbeddingSequence;
214229};
215230
216231template <class Iterator, class Run>

@@void BidiResolver<Iterator, Run>::append
307322}
308323
309324template <class Iterator, class Run>
310 void BidiResolver<Iterator, Run>::embed(WTF::Unicode::Direction d)
 325void BidiResolver<Iterator, Run>::embed(WTF::Unicode::Direction dir, BidiEmbeddingSource source)
311326{
312327 using namespace WTF::Unicode;
313328
314  ASSERT(d == PopDirectionalFormat || d == LeftToRightEmbedding || d == LeftToRightOverride || d == RightToLeftEmbedding || d == RightToLeftOverride);
315  m_currentExplicitEmbeddingSequence.append(d);
 329 ASSERT(dir == PopDirectionalFormat || dir == LeftToRightEmbedding || dir == LeftToRightOverride || dir == RightToLeftEmbedding || dir == RightToLeftOverride);
 330 m_currentExplicitEmbeddingSequence.append(BidiEmbedding(dir, source));
316331}
317332
318333template <class Iterator, class Run>

@@bool BidiResolver<Iterator, Run>::commit
414429 RefPtr<BidiContext> toContext = context();
415430
416431 for (size_t i = 0; i < m_currentExplicitEmbeddingSequence.size(); ++i) {
417  Direction embedding = m_currentExplicitEmbeddingSequence[i];
418  if (embedding == PopDirectionalFormat) {
 432 BidiEmbedding embedding = m_currentExplicitEmbeddingSequence[i];
 433 if (embedding.direction() == PopDirectionalFormat) {
419434 if (BidiContext* parentContext = toContext->parent())
420435 toContext = parentContext;
421436 } else {
422  Direction direction = (embedding == RightToLeftEmbedding || embedding == RightToLeftOverride) ? RightToLeft : LeftToRight;
423  bool override = embedding == LeftToRightOverride || embedding == RightToLeftOverride;
 437 Direction direction = (embedding.direction() == RightToLeftEmbedding || embedding.direction() == RightToLeftOverride) ? RightToLeft : LeftToRight;
 438 bool override = embedding.direction() == LeftToRightOverride || embedding.direction() == RightToLeftOverride;
424439 unsigned char level = toContext->level();
425  if (direction == RightToLeft) {
426  // Go to the least greater odd integer
427  level += 1;
428  level |= 1;
429  } else {
430  // Go to the least greater even integer
431  level += 2;
432  level &= ~1;
433  }
 440 if (direction == RightToLeft)
 441 level = nextGreaterOddLevel(level);
 442 else
 443 level = nextGreaterEvenLevel(level);
434444 if (level < 61)
435  toContext = BidiContext::create(level, direction, override, toContext.get());
 445 toContext = BidiContext::create(level, direction, override, embedding.source(), toContext.get());
436446 }
437447 }
438448

@@void BidiResolver<Iterator, Run>::create
554564 Direction dirCurrent;
555565 if (pastEnd && (hardLineBreak || current.atEnd())) {
556566 BidiContext* c = context();
557  while (c->parent())
558  c = c->parent();
559  dirCurrent = c->dir();
560567 if (hardLineBreak) {
561568 // A deviation from the Unicode Bidi Algorithm in order to match
562  // Mac OS X text and WinIE: a hard line break resets bidi state.
563  stateAtEnd.setContext(c);
 569 // WinIE and user expectations: hard line breaks reset bidi state
 570 // coming from unicode bidi control characters, but not those from
 571 // DOM nodes with specified directionality
 572 stateAtEnd.setContext(c->copyStackRemovingUnicodeEmbeddingContexts());
 573
 574 dirCurrent = stateAtEnd.context()->dir();
564575 stateAtEnd.setEorDir(dirCurrent);
565576 stateAtEnd.setLastDir(dirCurrent);
566577 stateAtEnd.setLastStrongDir(dirCurrent);
 578 } else {
 579 while (c->parent())
 580 c = c->parent();
 581 dirCurrent = c->dir();
567582 }
568583 } else {
569584 dirCurrent = current.direction();

@@void BidiResolver<Iterator, Run>::create
587602 case RightToLeftOverride:
588603 case LeftToRightOverride:
589604 case PopDirectionalFormat:
590  embed(dirCurrent);
 605 embed(dirCurrent, FromUnicode);
591606 commitExplicitEmbedding();
592607 break;
593608
82066

Source/WebCore/rendering/InlineIterator.h

@@static inline RenderObject* bidiNext(Ren
8888 WTF::Unicode::Direction d = (ub == Embed
8989 ? (dir == RTL ? WTF::Unicode::RightToLeftEmbedding : WTF::Unicode::LeftToRightEmbedding)
9090 : (dir == RTL ? WTF::Unicode::RightToLeftOverride : WTF::Unicode::LeftToRightOverride));
91  resolver->embed(d);
 91 resolver->embed(d, FromStyleOrDOM);
9292 }
9393 }
9494 }

@@static inline RenderObject* bidiNext(Ren
102102
103103 while (current && current != block) {
104104 if (resolver && current->isRenderInline() && current->style()->unicodeBidi() != UBNormal)
105  resolver->embed(WTF::Unicode::PopDirectionalFormat);
 105 resolver->embed(WTF::Unicode::PopDirectionalFormat, FromStyleOrDOM);
106106
107107 next = current->nextSibling();
108108 if (next) {

@@static inline RenderObject* bidiNext(Ren
113113 WTF::Unicode::Direction d = (ub == Embed
114114 ? (dir == RTL ? WTF::Unicode::RightToLeftEmbedding: WTF::Unicode::LeftToRightEmbedding)
115115 : (dir == RTL ? WTF::Unicode::RightToLeftOverride : WTF::Unicode::LeftToRightOverride));
116  resolver->embed(d);
 116 resolver->embed(d, FromStyleOrDOM);
117117 }
118118 }
119119 break;

@@static inline RenderObject* bidiFirst(Re
158158 WTF::Unicode::Direction d = (ub == Embed
159159 ? (dir == RTL ? WTF::Unicode::RightToLeftEmbedding : WTF::Unicode::LeftToRightEmbedding)
160160 : (dir == RTL ? WTF::Unicode::RightToLeftOverride : WTF::Unicode::LeftToRightOverride));
161  resolver->embed(d);
 161 resolver->embed(d, FromStyleOrDOM);
162162 }
163163 }
164164 if (skipInlines && o->firstChild())
82066

Source/WebCore/rendering/RenderBlockLineLayout.cpp

@@RootInlineBox* RenderBlock::determineSta
11581158 resolver.setLastStrongDir(direction);
11591159 resolver.setLastDir(direction);
11601160 resolver.setEorDir(direction);
1161  resolver.setContext(BidiContext::create(ltr ? 0 : 1, direction, style()->unicodeBidi() == Override));
 1161 resolver.setContext(BidiContext::create(ltr ? 0 : 1, direction, style()->unicodeBidi() == Override, FromStyleOrDOM));
11621162
11631163 startObj = bidiFirst(this, &resolver);
11641164 }
82066

LayoutTests/ChangeLog

 12011-03-29 Levi Weintraub <leviw@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 RTL: Directionality always reset on hard line break
 6 https://bugs.webkit.org/show_bug.cgi?id=23124
 7
 8 Testing that hard line breaks are being treated as paragraph separators but only
 9 clearing directional state from Unicode control characters, not DOM nodes.
 10 Also adding expected pixel results for bidi-override-in-anonymous-block as we're
 11 passing more of the test with this patch.
 12
 13 * fast/text/international/bidi-br-as-paragraph-separator.html: Added.
 14 * platform/mac/fast/css/bidi-override-in-anonymous-block-expected.checksum: Added.
 15 * platform/mac/fast/css/bidi-override-in-anonymous-block-expected.png: Added.
 16 * platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.checksum: Added.
 17 * platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.png: Added.
 18 * platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.txt: Added.
 19
1202011-03-29 Yuta Kitamura <yutak@chromium.org>
221
322 Unreviewed, updating Chromium test expectations.
82226

LayoutTests/fast/text/international/bidi-br-as-paragraph-separator.html

 1<!DOCTYPE html>
 2
 3<html>
 4<head>
 5<style>
 6.resultsDiv {
 7 position: absolute;
 8 top: 0px;
 9 left: 0px;
 10 -moz-column-width: 13em;
 11 -webkit-column-width: 13em;
 12 -moz-column-gap: 5em;
 13 -webkit-column-gap: 5em;
 14 height: 400px;
 15}
 16</style>
 17</head>
 18<body>
 19<div>This test validates we treat BR as a paragraph separator, but preserve the affects of all directionality from DOM nodes. You should not see any red.</div>
 20
 21<div style="position: relative">
 22<div style="color:red" class="resultsDiv">
 23<div dir=ltr>
 24ab.
 25<bdo dir=rtl>
 26cd!
 27<span dir=ltr>
 28ab.
 29<span dir=rtl>
 30ab!
 31<br>
 32ab!
 33</span>
 34ab.
 35</span>
 36cd!
 37</bdo>
 38ab.
 39</div>
 40
 41<div style="color: green" class="resultsDiv">
 42<div>ab. ab. &nbsp;!ab !dc</div>
 43<div>&nbsp;!dc !abab. ab.</div>
 44</div>
 45</div>
 46
 47<div style="position:relative; top:50px">
 48<div style="color: red" class="resultsDiv">
 49<div dir=ltr>
 50==>
 51&#x202B;
 52=>>
 53<span dir=ltr>
 54==>
 55&#x202B;
 56=>>
 57&#x202A;
 58==>
 59<br>
 60==>
 61&#x202C;
 62==>
 63&#x202C;
 64==>
 65</span>
 66==>
 67&#x202C;
 68==>
 69</div>
 70<div style="color: green" class="resultsDiv">
 71<div>==> ==> &nbsp;==> &nbsp;<<= &nbsp;<<=</div>
 72<div>==> &nbsp;==> &nbsp;==> ==> &nbsp;==></div>
 73</div>
 74
 75
 76</div>
0

LayoutTests/platform/mac/fast/css/bidi-override-in-anonymous-block-expected.checksum

 1c0b2a04b591771f33d6f717b30c67dac
02\ No newline at end of file
0

LayoutTests/platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.checksum

 1d658c91b6f76958904b27a8196648bfd
02\ No newline at end of file
0

LayoutTests/platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.txt

 1layer at (0,0) size 800x600
 2 RenderView at (0,0) size 800x600
 3layer at (0,0) size 800x52
 4 RenderBlock {HTML} at (0,0) size 800x52
 5 RenderBody {BODY} at (8,8) size 784x36
 6 RenderBlock {DIV} at (0,0) size 784x36
 7 RenderText {#text} at (0,0) size 776x36
 8 text run at (0,0) width 776: "This test validates we treat BR as a paragraph separator, but preserve the affects of all directionality from DOM nodes. You"
 9 text run at (0,18) width 145: "should not see any red."
 10layer at (8,44) size 94x400
 11 RenderBlock (positioned) {DIV} at (0,0) size 94x400 [color=#FF0000]
 12 RenderBlock {DIV} at (0,0) size 94x36
 13 RenderText {#text} at (0,0) size 23x18
 14 text run at (0,0) width 23: "ab. "
 15 RenderInline {BDO} at (0,0) size 94x36
 16 RenderText {#text} at (70,0) size 24x18
 17 text run at (70,0) width 24 RTL override: "cd! "
 18 RenderInline {SPAN} at (0,0) size 48x36
 19 RenderText {#text} at (23,0) size 23x18
 20 text run at (23,0) width 23: "ab. "
 21 RenderInline {SPAN} at (0,0) size 46x36
 22 RenderText {#text} at (46,0) size 24x18
 23 text run at (46,0) width 9 RTL: "! "
 24 text run at (55,0) width 15: "ab"
 25 RenderBR {BR} at (46,0) size 0x18
 26 RenderText {#text} at (24,18) size 24x18
 27 text run at (24,18) width 9 RTL: "! "
 28 text run at (33,18) width 15: "ab"
 29 RenderText {#text} at (48,18) size 23x18
 30 text run at (48,18) width 23: "ab. "
 31 RenderText {#text} at (0,18) size 24x18
 32 text run at (0,18) width 24 RTL override: "cd! "
 33 RenderText {#text} at (71,18) size 19x18
 34 text run at (71,18) width 19: "ab."
 35layer at (8,44) size 94x400
 36 RenderBlock (positioned) {DIV} at (0,0) size 94x400 [color=#008000]
 37 RenderBlock {DIV} at (0,0) size 94x18
 38 RenderText {#text} at (0,0) size 94x18
 39 text run at (0,0) width 94: "ab. ab. !ab !dc"
 40 RenderBlock {DIV} at (0,18) size 94x18
 41 RenderText {#text} at (0,0) size 90x18
 42 text run at (0,0) width 90: " !dc !abab. ab."
 43layer at (8,94) size 167x400
 44 RenderBlock (positioned) {DIV} at (0,0) size 167x400 [color=#FF0000]
 45 RenderBlock {DIV} at (0,0) size 167x36
 46 RenderText {#text} at (0,0) size 167x18
 47 text run at (0,0) width 31: "==> "
 48 text run at (132,0) width 35 RTL: "\x{202B} =>> "
 49 RenderInline {SPAN} at (0,0) size 132x36
 50 RenderText {#text} at (31,0) size 101x18
 51 text run at (31,0) width 31: "==> "
 52 text run at (62,0) width 35: "\x{202A} ==> "
 53 text run at (97,0) width 35 RTL: "\x{202B} =>> "
 54 RenderBR {BR} at (97,0) size 0x18
 55 RenderText {#text} at (0,18) size 101x18
 56 text run at (0,18) width 31: "==> "
 57 text run at (31,18) width 70: "\x{202C} ==> \x{202C} ==> "
 58 RenderText {#text} at (101,18) size 62x18
 59 text run at (101,18) width 62: "==> \x{202C} ==>"
 60layer at (8,94) size 163x400
 61 RenderBlock (positioned) {DIV} at (0,0) size 163x400 [color=#008000]
 62 RenderBlock {DIV} at (0,0) size 163x18
 63 RenderText {#text} at (0,0) size 163x18
 64 text run at (0,0) width 163: "==> ==> ==> <<= <<="
 65 RenderBlock {DIV} at (0,18) size 163x18
 66 RenderText {#text} at (0,0) size 163x18
 67 text run at (0,0) width 163: "==> ==> ==> ==> ==>"
0

LayoutTests/platform/mac/fast/css/bidi-override-in-anonymous-block-expected.png

INVALID: Image lacks a checksum. This will fail with a MISSING error in run-webkit-tests. Always generate new png files using run-webkit-tests.

LayoutTests/platform/mac/fast/text/international/bidi-br-as-paragraph-separator-expected.png

INVALID: Image lacks a checksum. This will fail with a MISSING error in run-webkit-tests. Always generate new png files using run-webkit-tests.