Changeset 107000 in webkit


Ignore:
Timestamp:
Feb 7, 2012 3:46:40 PM (12 years ago)
Author:
leviw@chromium.org
Message:

unicode-bidi:plaintext is supposed to be effective on display:inline elements too
https://bugs.webkit.org/show_bug.cgi?id=73310

Reviewed by Eric Seidel.

Source/WebCore:

Adding support for unicode-bidi: plaintext as a property on inlines. These are treated
like unicode-bidi: isolate with the addition of their directionality being determined
by the UBA.

Tests: fast/text/international/inline-plaintext-is-isolated-expected.html

fast/text/international/inline-plaintext-is-isolated.html
fast/text/international/inline-plaintext-relayout-with-leading-neutrals-expected.html
fast/text/international/inline-plaintext-relayout-with-leading-neutrals.html
fast/text/international/inline-plaintext-with-generated-content-expected.html
fast/text/international/inline-plaintext-with-generated-content.html

  • platform/text/UnicodeBidi.h:

(WebCore::isIsolated): Added this convenience function as Plaintext and Isolate Unicode-Bidi values
are both treated as isolated content.

  • rendering/InlineIterator.h:

(WebCore::notifyObserverEnteredObject): Inline now supports Unicode-Bidi Plaintext.
(WebCore::notifyObserverWillExitObject): Ditto.
(WebCore::bidiFirstSkippingEmptyInlines): Changed to support being called without a resolver.
(WebCore::isIsolatedInline): Inline now supports Unicode-Bidi: Plaintext.

  • rendering/RenderBlockLineLayout.cpp:

(WebCore::determineDirectionality): Generalized for inlines.
(WebCore::constructBidiRuns): Added support for Unicode-Bidi: Plaintext as an isolated inline.
(WebCore::RenderBlock::layoutRunsAndFloatsInRange): Fixed comment.
(WebCore::RenderBlock::determineStartPosition): Fixed comment and switched to updated
bidiFirstSkippingEmptyInlines.

LayoutTests:

Ref tests for unicode-bidi: plaintext on inlines.

  • fast/text/international/inline-plaintext-is-isolated-expected.html: Added.
  • fast/text/international/inline-plaintext-is-isolated.html: Added.
  • fast/text/international/inline-plaintext-relayout-with-leading-neutrals-expected.html: Added.
  • fast/text/international/inline-plaintext-relayout-with-leading-neutrals.html: Added.
  • fast/text/international/inline-plaintext-with-generated-content-expected.html: Added.
  • fast/text/international/inline-plaintext-with-generated-content.html: Added.
Location:
trunk
Files:
6 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r106995 r107000  
     12012-02-07  Levi Weintraub  <leviw@chromium.org>
     2
     3        unicode-bidi:plaintext is supposed to be effective on display:inline elements too
     4        https://bugs.webkit.org/show_bug.cgi?id=73310
     5
     6        Reviewed by Eric Seidel.
     7
     8        Ref tests for unicode-bidi: plaintext on inlines.
     9
     10        * fast/text/international/inline-plaintext-is-isolated-expected.html: Added.
     11        * fast/text/international/inline-plaintext-is-isolated.html: Added.
     12        * fast/text/international/inline-plaintext-relayout-with-leading-neutrals-expected.html: Added.
     13        * fast/text/international/inline-plaintext-relayout-with-leading-neutrals.html: Added.
     14        * fast/text/international/inline-plaintext-with-generated-content-expected.html: Added.
     15        * fast/text/international/inline-plaintext-with-generated-content.html: Added.
     16
    1172012-02-07  Julien Chaffraix  <jchaffraix@webkit.org>
    218
  • trunk/Source/WebCore/ChangeLog

    r106998 r107000  
     12012-02-07  Levi Weintraub  <leviw@chromium.org>
     2
     3        unicode-bidi:plaintext is supposed to be effective on display:inline elements too
     4        https://bugs.webkit.org/show_bug.cgi?id=73310
     5
     6        Reviewed by Eric Seidel.
     7
     8        Adding support for unicode-bidi: plaintext as a property on inlines. These are treated
     9        like unicode-bidi: isolate with the addition of their directionality being determined
     10        by the UBA.
     11
     12        Tests: fast/text/international/inline-plaintext-is-isolated-expected.html
     13               fast/text/international/inline-plaintext-is-isolated.html
     14               fast/text/international/inline-plaintext-relayout-with-leading-neutrals-expected.html
     15               fast/text/international/inline-plaintext-relayout-with-leading-neutrals.html
     16               fast/text/international/inline-plaintext-with-generated-content-expected.html
     17               fast/text/international/inline-plaintext-with-generated-content.html
     18
     19        * platform/text/UnicodeBidi.h:
     20        (WebCore::isIsolated): Added this convenience function as Plaintext and Isolate Unicode-Bidi values
     21        are both treated as isolated content.
     22        * rendering/InlineIterator.h:
     23        (WebCore::notifyObserverEnteredObject): Inline now supports Unicode-Bidi Plaintext.
     24        (WebCore::notifyObserverWillExitObject): Ditto.
     25        (WebCore::bidiFirstSkippingEmptyInlines): Changed to support being called without a resolver.
     26        (WebCore::isIsolatedInline): Inline now supports Unicode-Bidi: Plaintext.
     27        * rendering/RenderBlockLineLayout.cpp:
     28        (WebCore::determineDirectionality): Generalized for inlines.
     29        (WebCore::constructBidiRuns): Added support for Unicode-Bidi: Plaintext as an isolated inline.
     30        (WebCore::RenderBlock::layoutRunsAndFloatsInRange): Fixed comment.
     31        (WebCore::RenderBlock::determineStartPosition): Fixed comment and switched to updated
     32        bidiFirstSkippingEmptyInlines.
     33
    1342012-02-07  Kentaro Hara  <haraken@chromium.org>
    235
  • trunk/Source/WebCore/platform/text/UnicodeBidi.h

    r95901 r107000  
    3535    Isolate,
    3636    Plaintext
    37 };
     37};
     38
     39inline bool isIsolated(const EUnicodeBidi& unicodeBidi)
     40{
     41    return unicodeBidi == Isolate || unicodeBidi == Plaintext;
     42}
    3843
    3944}
  • trunk/Source/WebCore/rendering/InlineIterator.h

    r102875 r107000  
    132132        return;
    133133    }
    134     if (unicodeBidi == Isolate) {
     134    if (isIsolated(unicodeBidi)) {
    135135        observer->enterIsolate();
    136136        // Embedding/Override characters implied by dir= are handled when
     
    139139    }
    140140
    141     // FIXME: Should unicode-bidi: plaintext really be embedding override/embed characters here?
    142141    if (!observer->inIsolate())
    143142        observer->embed(embedCharFromDirection(style->direction(), unicodeBidi), FromStyleOrDOM);
     
    153152    if (unicodeBidi == UBNormal)
    154153        return; // Nothing to do for unicode-bidi: normal
    155     if (unicodeBidi == Isolate) {
     154    if (isIsolated(unicodeBidi)) {
    156155        observer->exitIsolate();
    157156        return;
     
    256255}
    257256
    258 static inline RenderObject* bidiFirstSkippingEmptyInlines(RenderObject* root, InlineBidiResolver* resolver)
    259 {
    260     ASSERT(resolver);
     257static inline RenderObject* bidiFirstSkippingEmptyInlines(RenderObject* root, InlineBidiResolver* resolver = 0)
     258{
    261259    RenderObject* o = root->firstChild();
    262260    if (!o)
     
    279277        o = bidiNextSkippingEmptyInlines(root, o, resolver);
    280278
    281     resolver->commitExplicitEmbedding();
     279    if (resolver)
     280        resolver->commitExplicitEmbedding();
    282281    return o;
    283282}
     
    393392{
    394393    ASSERT(object);
    395     return object->isRenderInline() && object->style()->unicodeBidi() == Isolate;
     394    return object->isRenderInline() && isIsolated(object->style()->unicodeBidi());
    396395}
    397396
  • trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp

    r105423 r107000  
    259259}
    260260
    261 static void determineParagraphDirection(TextDirection& dir, InlineIterator iter)
     261static void determineDirectionality(TextDirection& dir, InlineIterator iter)
    262262{
    263263    while (!iter.atEnd()) {
     
    971971        // to take a RenderObject and do this logic there, but that would be a layering
    972972        // violation for BidiResolver (which knows nothing about RenderObject).
    973         RenderInline* isolatedSpan = toRenderInline(containingIsolate(startObj, currentRoot));
     973        RenderInline* isolatedInline = toRenderInline(containingIsolate(startObj, currentRoot));
    974974        InlineBidiResolver isolatedResolver;
    975         isolatedResolver.setStatus(statusWithDirection(isolatedSpan->style()->direction()));
     975        EUnicodeBidi unicodeBidi = isolatedInline->style()->unicodeBidi();
     976        TextDirection direction;
     977        if (unicodeBidi == Plaintext)
     978            determineDirectionality(direction, InlineIterator(isolatedInline, isolatedRun->object(), 0));
     979        else {
     980            ASSERT(unicodeBidi == Isolate);
     981            direction = isolatedInline->style()->direction();
     982        }
     983        isolatedResolver.setStatus(statusWithDirection(direction));
    976984
    977985        // FIXME: The fact that we have to construct an Iterator here
    978986        // currently prevents this code from moving into BidiResolver.
    979         if (!bidiFirstSkippingEmptyInlines(isolatedSpan, &isolatedResolver))
     987        if (!bidiFirstSkippingEmptyInlines(isolatedInline, &isolatedResolver))
    980988            continue;
     989
    981990        // The starting position is the beginning of the first run within the isolate that was identified
    982991        // during the earlier call to createBidiRunsForLine. This can be but is not necessarily the
    983992        // first run within the isolate.
    984         InlineIterator iter = InlineIterator(isolatedSpan, startObj, isolatedRun->m_start);
     993        InlineIterator iter = InlineIterator(isolatedInline, startObj, isolatedRun->m_start);
    985994        isolatedResolver.setPositionIgnoringNestedIsolates(iter);
    986995
     
    12411250        end = lineBreaker.nextLineBreak(resolver, layoutState.lineInfo(), lineBreakIteratorInfo, lastFloatFromPreviousLine, consecutiveHyphenatedLines);
    12421251        if (resolver.position().atEnd()) {
    1243             // FIXME: We shouldn't be creating any runs in findNextLineBreak to begin with!
     1252            // FIXME: We shouldn't be creating any runs in nextLineBreak to begin with!
    12441253            // Once BidiRunList is separated from BidiResolver this will not be needed.
    12451254            resolver.runs().deleteRuns();
     
    12601269            if (isNewUBAParagraph && styleToUse->unicodeBidi() == Plaintext && !resolver.context()->parent()) {
    12611270                TextDirection direction = styleToUse->direction();
    1262                 determineParagraphDirection(direction, resolver.position());
     1271                determineDirectionality(direction, resolver.position());
    12631272                resolver.setStatus(BidiStatus(direction, styleToUse->unicodeBidi() == Override));
    12641273            }
     
    16691678    } else {
    16701679        TextDirection direction = style()->direction();
    1671         if (style()->unicodeBidi() == Plaintext) {
    1672             // FIXME: Why does "unicode-bidi: plaintext" bidiFirstIncludingEmptyInlines when all other line layout code uses bidiFirstSkippingEmptyInlines?
    1673             determineParagraphDirection(direction, InlineIterator(this, bidiFirstIncludingEmptyInlines(this), 0));
    1674         }
     1680        if (style()->unicodeBidi() == Plaintext)
     1681            determineDirectionality(direction, InlineIterator(this, bidiFirstSkippingEmptyInlines(this), 0));
    16751682        resolver.setStatus(BidiStatus(direction, style()->unicodeBidi() == Override));
    16761683        InlineIterator iter = InlineIterator(this, bidiFirstSkippingEmptyInlines(this, &resolver), 0);
Note: See TracChangeset for help on using the changeset viewer.