Commit 83d2e872 authored by mitz@apple.com's avatar mitz@apple.com

WebCore:

        Reviewed by Sam Weinig with no hesitation.

        - fix the HTML/CSS case of https://bugs.webkit.org/show_bug.cgi?id=19839
          <rdar://problem/6304805> A PDF,RLE sequence that should be a no-op affects bidi reordering

        Test: fast/text/bidi-embedding-pop-and-push-same.html

        * platform/text/BidiResolver.h:
        (WebCore::BidiResolver::embed): Changed to only add the embedding
        operation to a vector of pending operations.

        (WebCore::BidiResolver::lowerExplicitEmbeddingLevel): Added. Moved the
        code that used to be in the PDF case of embed() here, except the part
        that sets the context.

        (WebCore::BidiResolver::raiseExplicitEmbeddingLevel): Added. Moved the
        code that used to be in the non-PDF case of embed() here, except the
        part the sets the context.

        (WebCore::BidiResolver::commitExplicitEmbedding): Added. Processes the
        explicit embedding operations in the vector by creating an updated
        context and determining the old and new embedding levels. If the levels
        are not the same, calls {lower,raise}ExplicitEmbeddingLevel(). Always
        sets the context to the new one.

        (WebCore::BidiResolver::createBidiRunsForLine): Added calls to
        commitExplicitEmbedding() after calling embed() and after calling
        increment().

        * rendering/bidi.cpp:
        (WebCore::bidiFirst): Added calls to commitExplicitEmbedding() because
        this function increments the resolver.

        (WebCore::RenderBlock::skipLeadingWhitespace): Ditto.

LayoutTests:

        Reviewed by Sam Weinig with no hesitation.

        - test for the HTML/CSS case of https://bugs.webkit.org/show_bug.cgi?id=19839
          <rdar://problem/6304805> A PDF,RLE sequence that should be a no-op affects bidi reordering

        * fast/text/bidi-embedding-pop-and-push-same.html: Added.
        * platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.checksum: Added.
        * platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.png: Added.
        * platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.txt: Added.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@37828 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent d4dce5b8
2008-10-23 Dan Bernstein <mitz@apple.com>
Reviewed by Sam Weinig with no hesitation.
- test for the HTML/CSS case of https://bugs.webkit.org/show_bug.cgi?id=19839
<rdar://problem/6304805> A PDF,RLE sequence that should be a no-op affects bidi reordering
* fast/text/bidi-embedding-pop-and-push-same.html: Added.
* platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.checksum: Added.
* platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.png: Added.
* platform/mac/fast/text/bidi-embedding-pop-and-push-same-expected.txt: Added.
2008-10-23 Kevin McCullough <kmccullough@apple.com>
Reviewed by Tim Hatcher.
......
1f24a83e6a2f8b683dd110509586b25f
\ No newline at end of file
layer at (0,0) size 800x600
RenderView at (0,0) size 800x600
layer at (0,0) size 800x600
RenderBlock {HTML} at (0,0) size 800x600
RenderBody {BODY} at (8,8) size 784x584
RenderBlock {P} at (0,0) size 784x18
RenderText {#text} at (0,0) size 512x18
text run at (0,0) width 512: "In each box below, the words or letters should be in the same order on every line."
RenderBlock {DIV} at (8,34) size 768x64 [border: (1px solid #ADD8E6)]
RenderBlock {DIV} at (5,5) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 75x18
RenderText {#text} at (46,0) size 75x18
text run at (46,0) width 75: "ipsum dolor"
RenderText {#text} at (121,0) size 56x18
text run at (121,0) width 56: " sit amet."
RenderBlock {DIV} at (5,23) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 38x18
RenderText {#text} at (46,0) size 38x18
text run at (46,0) width 38: "ipsum"
RenderInline {SPAN} at (0,0) size 37x18
RenderText {#text} at (84,0) size 37x18
text run at (84,0) width 37: " dolor"
RenderText {#text} at (121,0) size 56x18
text run at (121,0) width 56: " sit amet."
RenderBlock {DIV} at (5,41) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 42x18
RenderText {#text} at (46,0) size 42x18
text run at (46,0) width 42: "ipsum "
RenderInline {B} at (0,0) size 91x18
RenderInline {SPAN} at (0,0) size 36x18
RenderText {#text} at (88,0) size 36x18
text run at (88,0) width 36: "dolor"
RenderText {#text} at (124,0) size 4x18
text run at (124,0) width 4: " "
RenderInline {I} at (0,0) size 14x18
RenderText {#text} at (128,0) size 14x18
text run at (128,0) width 14: "sit"
RenderText {#text} at (142,0) size 37x18
text run at (142,0) width 37: " amet"
RenderText {#text} at (179,0) size 4x18
text run at (179,0) width 4: "."
RenderBlock {DIV} at (8,106) size 768x64 [border: (1px solid #ADD8E6)]
RenderBlock {DIV} at (5,5) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 65x18
RenderText {#text} at (46,0) size 65x18
text run at (46,0) width 22 RTL: " \x{5DB}\x{5DC}"
text run at (68,0) width 9: "if"
text run at (77,0) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} "
RenderText {#text} at (111,0) size 56x18
text run at (111,0) width 56: " sit amet."
RenderBlock {DIV} at (5,23) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 34x18
RenderText {#text} at (77,0) size 34x18
text run at (77,0) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} "
RenderInline {SPAN} at (0,0) size 31x18
RenderText {#text} at (46,0) size 31x18
text run at (46,0) width 22 RTL: " \x{5DB}\x{5DC}"
text run at (68,0) width 9: "if"
RenderText {#text} at (111,0) size 56x18
text run at (111,0) width 56: " sit amet."
RenderBlock {DIV} at (5,41) size 758x18
RenderText {#text} at (0,0) size 46x18
text run at (0,0) width 46: "Lorem "
RenderInline {SPAN} at (0,0) size 34x18
RenderText {#text} at (77,0) size 34x18
text run at (77,0) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} "
RenderInline {B} at (0,0) size 120x18
RenderInline {SPAN} at (0,0) size 31x18
RenderText {#text} at (46,0) size 31x18
text run at (46,0) width 22 RTL: " \x{5DB}\x{5DC}"
text run at (68,0) width 9: "if"
RenderText {#text} at (111,0) size 4x18
text run at (111,0) width 4: " "
RenderInline {I} at (0,0) size 14x18
RenderText {#text} at (115,0) size 14x18
text run at (115,0) width 14: "sit"
RenderText {#text} at (129,0) size 37x18
text run at (129,0) width 37: " amet"
RenderText {#text} at (166,0) size 4x18
text run at (166,0) width 4: "."
RenderBlock {DIV} at (8,178) size 768x46 [border: (1px solid #ADD8E6)]
RenderBlock {DIV} at (5,5) size 758x18
RenderInline {SPAN} at (0,0) size 19x18
RenderText {#text} at (0,0) size 19x18
text run at (0,0) width 19: "a b"
RenderText {#text} at (0,0) size 0x0
RenderBlock {DIV} at (5,23) size 758x18
RenderInline {SPAN} at (0,0) size 7x18
RenderText {#text} at (0,0) size 7x18
text run at (0,0) width 7: "a"
RenderInline {SPAN} at (0,0) size 12x18
RenderText {#text} at (7,0) size 12x18
text run at (7,0) width 12: " b"
RenderText {#text} at (0,0) size 0x0
RenderBlock {DIV} at (8,232) size 768x64 [border: (1px solid #ADD8E6)]
RenderBlock {DIV} at (5,5) size 758x18
RenderText {#text} at (721,0) size 37x18
text run at (721,0) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} "
RenderInline {SPAN} at (0,0) size 85x18
RenderText {#text} at (636,0) size 85x18
text run at (636,0) width 85 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD} \x{5E9}\x{5DC}\x{5D5}\x{5E9}"
RenderText {#text} at (552,0) size 84x18
text run at (552,0) width 84 RTL: " \x{5D0}\x{5E8}\x{5D1}\x{5E2} \x{5D7}\x{5DE}\x{5E9}."
RenderBlock {DIV} at (5,23) size 758x18
RenderText {#text} at (721,0) size 37x18
text run at (721,0) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} "
RenderInline {SPAN} at (0,0) size 44x18
RenderText {#text} at (677,0) size 44x18
text run at (677,0) width 44 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD}"
RenderInline {SPAN} at (0,0) size 41x18
RenderText {#text} at (636,0) size 41x18
text run at (636,0) width 41 RTL: " \x{5E9}\x{5DC}\x{5D5}\x{5E9}"
RenderText {#text} at (552,0) size 84x18
text run at (552,0) width 84 RTL: " \x{5D0}\x{5E8}\x{5D1}\x{5E2} \x{5D7}\x{5DE}\x{5E9}."
RenderBlock {DIV} at (5,41) size 758x18
RenderText {#text} at (721,0) size 37x18
text run at (721,0) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} "
RenderInline {SPAN} at (0,0) size 48x18
RenderText {#text} at (673,0) size 48x18
text run at (673,0) width 48 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD} "
RenderInline {B} at (0,0) size 119x18
RenderInline {SPAN} at (0,0) size 38x18
RenderText {#text} at (635,0) size 38x18
text run at (635,0) width 38 RTL: "\x{5E9}\x{5DC}\x{5D5}\x{5E9}"
RenderText {#text} at (631,0) size 4x18
text run at (631,0) width 4 RTL: " "
RenderInline {I} at (0,0) size 39x18
RenderText {#text} at (592,0) size 39x18
text run at (592,0) width 39 RTL: "\x{5D0}\x{5E8}\x{5D1}\x{5E2}"
RenderText {#text} at (554,0) size 38x18
text run at (554,0) width 38 RTL: " \x{5D7}\x{5DE}\x{5E9}"
RenderText {#text} at (550,0) size 4x18
text run at (550,0) width 4 RTL: "."
2008-10-23 Dan Bernstein <mitz@apple.com>
Reviewed by Sam Weinig with no hesitation.
- fix the HTML/CSS case of https://bugs.webkit.org/show_bug.cgi?id=19839
<rdar://problem/6304805> A PDF,RLE sequence that should be a no-op affects bidi reordering
Test: fast/text/bidi-embedding-pop-and-push-same.html
* platform/text/BidiResolver.h:
(WebCore::BidiResolver::embed): Changed to only add the embedding
operation to a vector of pending operations.
(WebCore::BidiResolver::lowerExplicitEmbeddingLevel): Added. Moved the
code that used to be in the PDF case of embed() here, except the part
that sets the context.
(WebCore::BidiResolver::raiseExplicitEmbeddingLevel): Added. Moved the
code that used to be in the non-PDF case of embed() here, except the
part the sets the context.
(WebCore::BidiResolver::commitExplicitEmbedding): Added. Processes the
explicit embedding operations in the vector by creating an updated
context and determining the old and new embedding levels. If the levels
are not the same, calls {lower,raise}ExplicitEmbeddingLevel(). Always
sets the context to the new one.
(WebCore::BidiResolver::createBidiRunsForLine): Added calls to
commitExplicitEmbedding() after calling embed() and after calling
increment().
* rendering/bidi.cpp:
(WebCore::bidiFirst): Added calls to commitExplicitEmbedding() because
this function increments the resolver.
(WebCore::RenderBlock::skipLeadingWhitespace): Ditto.
2008-10-23 Jan Michael Alonzo <jmalonzo@webkit.org>
Gtk build fix. Not reviewed.
......
......@@ -25,6 +25,7 @@
#include "BidiContext.h"
#include <wtf/Noncopyable.h>
#include <wtf/PassRefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
......@@ -135,6 +136,8 @@ public :
void setStatus(const BidiStatus s) { m_status = s; }
void embed(WTF::Unicode::Direction);
void commitExplicitEmbedding();
void createBidiRunsForLine(const Iterator& end, bool visualOrder = false, bool hardLineBreak = false);
Run* firstRun() const { return m_firstRun; }
......@@ -169,6 +172,12 @@ protected:
Run* m_lastRun;
Run* m_logicallyLastRun;
unsigned m_runCount;
private:
void raiseExplicitEmbeddingLevel(WTF::Unicode::Direction from, WTF::Unicode::Direction to);
void lowerExplicitEmbeddingLevel(WTF::Unicode::Direction from);
Vector<WTF::Unicode::Direction, 8> m_currentExplicitEmbeddingSequence;
};
template <class Iterator, class Run>
......@@ -260,115 +269,144 @@ void BidiResolver<Iterator, Run>::embed(WTF::Unicode::Direction d)
{
using namespace WTF::Unicode;
if (d == PopDirectionalFormat) {
BidiContext* c = context()->parent();
if (c) {
if (!emptyRun && eor != last) {
ASSERT(m_status.eor != OtherNeutral || eor.atEnd());
// bidi.sor ... bidi.eor ... bidi.last eor; need to append the bidi.sor-bidi.eor run or extend it through bidi.last
ASSERT(m_status.last == EuropeanNumberSeparator
|| m_status.last == EuropeanNumberTerminator
|| m_status.last == CommonNumberSeparator
|| m_status.last == BoundaryNeutral
|| m_status.last == BlockSeparator
|| m_status.last == SegmentSeparator
|| m_status.last == WhiteSpaceNeutral
|| m_status.last == OtherNeutral);
if (m_direction == OtherNeutral)
m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;
if (context()->dir() == LeftToRight) {
// bidi.sor ... bidi.eor ... bidi.last L
if (m_status.eor == EuropeanNumber) {
if (m_status.lastStrong != LeftToRight) {
m_direction = EuropeanNumber;
appendRun();
}
} else if (m_status.eor == ArabicNumber) {
m_direction = ArabicNumber;
appendRun();
} else if (m_status.lastStrong != LeftToRight) {
appendRun();
m_direction = LeftToRight;
}
} else if (m_status.eor == EuropeanNumber || m_status.eor == ArabicNumber || m_status.lastStrong == LeftToRight) {
ASSERT(d == PopDirectionalFormat || d == LeftToRightEmbedding || d == LeftToRightOverride || d == RightToLeftEmbedding || d == RightToLeftOverride);
m_currentExplicitEmbeddingSequence.append(d);
}
template <class Iterator, class Run>
void BidiResolver<Iterator, Run>::lowerExplicitEmbeddingLevel(WTF::Unicode::Direction from)
{
using namespace WTF::Unicode;
if (!emptyRun && eor != last) {
ASSERT(m_status.eor != OtherNeutral || eor.atEnd());
// bidi.sor ... bidi.eor ... bidi.last eor; need to append the bidi.sor-bidi.eor run or extend it through bidi.last
ASSERT(m_status.last == EuropeanNumberSeparator
|| m_status.last == EuropeanNumberTerminator
|| m_status.last == CommonNumberSeparator
|| m_status.last == BoundaryNeutral
|| m_status.last == BlockSeparator
|| m_status.last == SegmentSeparator
|| m_status.last == WhiteSpaceNeutral
|| m_status.last == OtherNeutral);
if (m_direction == OtherNeutral)
m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;
if (from == LeftToRight) {
// bidi.sor ... bidi.eor ... bidi.last L
if (m_status.eor == EuropeanNumber) {
if (m_status.lastStrong != LeftToRight) {
m_direction = EuropeanNumber;
appendRun();
m_direction = RightToLeft;
}
eor = last;
} else if (m_status.eor == ArabicNumber) {
m_direction = ArabicNumber;
appendRun();
} else if (m_status.lastStrong != LeftToRight) {
appendRun();
m_direction = LeftToRight;
}
} else if (m_status.eor == EuropeanNumber || m_status.eor == ArabicNumber || m_status.lastStrong == LeftToRight) {
appendRun();
emptyRun = true;
// sor for the new run is determined by the higher level (rule X10)
setLastDir(context()->dir());
setLastStrongDir(context()->dir());
setContext(c);
eor = Iterator();
}
} else {
Direction runDir;
if (d == RightToLeftEmbedding || d == RightToLeftOverride)
runDir = RightToLeft;
else
runDir = LeftToRight;
bool override = d == LeftToRightOverride || d == RightToLeftOverride;
unsigned char level = context()->level();
if (runDir == RightToLeft) {
if (level % 2) // we have an odd level
level += 2;
else
level++;
} else {
if (level % 2) // we have an odd level
level++;
else
level += 2;
m_direction = RightToLeft;
}
eor = last;
}
appendRun();
emptyRun = true;
// sor for the new run is determined by the higher level (rule X10)
setLastDir(from);
setLastStrongDir(from);
eor = Iterator();
}
if (level < 61) {
if (!emptyRun && eor != last) {
ASSERT(m_status.eor != OtherNeutral || eor.atEnd());
// bidi.sor ... bidi.eor ... bidi.last eor; need to append the bidi.sor-bidi.eor run or extend it through bidi.last
ASSERT(m_status.last == EuropeanNumberSeparator
|| m_status.last == EuropeanNumberTerminator
|| m_status.last == CommonNumberSeparator
|| m_status.last == BoundaryNeutral
|| m_status.last == BlockSeparator
|| m_status.last == SegmentSeparator
|| m_status.last == WhiteSpaceNeutral
|| m_status.last == OtherNeutral);
if (m_direction == OtherNeutral)
m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;
if (runDir == LeftToRight) {
// bidi.sor ... bidi.eor ... bidi.last L
if (m_status.eor == EuropeanNumber) {
if (m_status.lastStrong != LeftToRight) {
m_direction = EuropeanNumber;
appendRun();
}
} else if (m_status.eor == ArabicNumber) {
m_direction = ArabicNumber;
appendRun();
} else if (m_status.lastStrong != LeftToRight && context()->dir() == LeftToRight) {
appendRun();
m_direction = LeftToRight;
}
} else if (m_status.eor == ArabicNumber
|| m_status.eor == EuropeanNumber && (m_status.lastStrong != LeftToRight || context()->dir() == RightToLeft)
|| m_status.eor != EuropeanNumber && m_status.lastStrong == LeftToRight && context()->dir() == RightToLeft) {
template <class Iterator, class Run>
void BidiResolver<Iterator, Run>::raiseExplicitEmbeddingLevel(WTF::Unicode::Direction from, WTF::Unicode::Direction to)
{
using namespace WTF::Unicode;
if (!emptyRun && eor != last) {
ASSERT(m_status.eor != OtherNeutral || eor.atEnd());
// bidi.sor ... bidi.eor ... bidi.last eor; need to append the bidi.sor-bidi.eor run or extend it through bidi.last
ASSERT(m_status.last == EuropeanNumberSeparator
|| m_status.last == EuropeanNumberTerminator
|| m_status.last == CommonNumberSeparator
|| m_status.last == BoundaryNeutral
|| m_status.last == BlockSeparator
|| m_status.last == SegmentSeparator
|| m_status.last == WhiteSpaceNeutral
|| m_status.last == OtherNeutral);
if (m_direction == OtherNeutral)
m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;
if (to == LeftToRight) {
// bidi.sor ... bidi.eor ... bidi.last L
if (m_status.eor == EuropeanNumber) {
if (m_status.lastStrong != LeftToRight) {
m_direction = EuropeanNumber;
appendRun();
m_direction = RightToLeft;
}
eor = last;
} else if (m_status.eor == ArabicNumber) {
m_direction = ArabicNumber;
appendRun();
} else if (m_status.lastStrong != LeftToRight && from == LeftToRight) {
appendRun();
m_direction = LeftToRight;
}
} else if (m_status.eor == ArabicNumber
|| m_status.eor == EuropeanNumber && (m_status.lastStrong != LeftToRight || from == RightToLeft)
|| m_status.eor != EuropeanNumber && m_status.lastStrong == LeftToRight && from == RightToLeft) {
appendRun();
emptyRun = true;
setContext(new BidiContext(level, runDir, override, context()));
setLastDir(runDir);
setLastStrongDir(runDir);
eor = Iterator();
m_direction = RightToLeft;
}
eor = last;
}
appendRun();
emptyRun = true;
setLastDir(to);
setLastStrongDir(to);
eor = Iterator();
}
template <class Iterator, class Run>
void BidiResolver<Iterator, Run>::commitExplicitEmbedding()
{
using namespace WTF::Unicode;
unsigned char fromLevel = context()->level();
RefPtr<BidiContext> toContext = context();
for (size_t i = 0; i < m_currentExplicitEmbeddingSequence.size(); ++i) {
Direction embedding = m_currentExplicitEmbeddingSequence[i];
if (embedding == PopDirectionalFormat) {
if (BidiContext* parentContext = toContext->parent())
toContext = parentContext;
} else {
Direction direction = (embedding == RightToLeftEmbedding || embedding == RightToLeftOverride) ? RightToLeft : LeftToRight;
bool override = embedding == LeftToRightOverride || embedding == RightToLeftOverride;
unsigned char level = toContext->level();
if (direction == RightToLeft) {
// Go to the least greater odd integer
level += 1;
level |= 1;
} else {
// Go to the least greater even integer
level += 2;
level &= ~1;
}
if (level < 61)
toContext = new BidiContext(level, direction, override, toContext.get());
}
}
unsigned char toLevel = toContext->level();
if (toLevel > fromLevel)
raiseExplicitEmbeddingLevel(fromLevel % 2 ? RightToLeft : LeftToRight, toLevel % 2 ? RightToLeft : LeftToRight);
else if (toLevel < fromLevel)
lowerExplicitEmbeddingLevel(fromLevel % 2 ? RightToLeft : LeftToRight);
setContext(toContext);
m_currentExplicitEmbeddingSequence.clear();
}
template <class Iterator, class Run>
......@@ -493,6 +531,7 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, boo
case LeftToRightOverride:
case PopDirectionalFormat:
embed(dirCurrent);
commitExplicitEmbedding();
break;
// strong types
......@@ -814,6 +853,9 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, boo
}
increment();
if (!m_currentExplicitEmbeddingSequence.isEmpty())
commitExplicitEmbedding();
if (emptyRun && (dirCurrent == RightToLeftEmbedding
|| dirCurrent == LeftToRightEmbedding
|| dirCurrent == RightToLeftOverride
......
......@@ -255,12 +255,19 @@ static RenderObject* bidiFirst(RenderBlock* block, InlineBidiResolver* resolver,
}
if (skipInlines && o->firstChild())
o = bidiNext(block, o, resolver, skipInlines);
else
return o; // Never skip empty inlines.
else {
// Never skip empty inlines.
if (resolver)
resolver->commitExplicitEmbedding();
return o;
}
}
if (o && !o->isText() && !o->isReplaced() && !o->isFloating() && !o->isPositioned())
o = bidiNext(block, o, resolver, skipInlines);
if (resolver)
resolver->commitExplicitEmbedding();
return o;
}
......@@ -1512,6 +1519,7 @@ int RenderBlock::skipLeadingWhitespace(InlineBidiResolver& resolver)
}
resolver.increment();
}
resolver.commitExplicitEmbedding();
return availableWidth;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment