Changeset 241243 in webkit


Ignore:
Timestamp:
Feb 9, 2019 12:37:03 PM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Add intrinsic width support for basic inline containers
https://bugs.webkit.org/show_bug.cgi?id=194473

Reviewed by Antti Koivisto.

Source/WebCore:

Preferred width computation logic is very similar to normal layout.
One of the main difference is that the preferred width codepath does not provide valid containing block width.
This patch implement basic inline container support by passing nullopt containing block width in UsedHorizontalValues.

  • layout/inlineformatting/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::layout const):
(WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const):
(WebCore::Layout::InlineFormattingContext::computeBorderAndPadding const):
(WebCore::Layout::InlineFormattingContext::computeMarginBorderAndPadding const):
(WebCore::Layout::InlineFormattingContext::computeWidthAndMargin const):
(WebCore::Layout::InlineFormattingContext::layoutFormattingContextRoot const):
(WebCore::Layout::InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox const):

  • layout/inlineformatting/InlineFormattingContext.h:

Tools:

Expand tests coverage (11 new tests -> 798)

  • LayoutReloaded/misc/LFC-passing-tests.txt: not sure why run-singly keeps producing different ordering.
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r241231 r241243  
     12019-02-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Add intrinsic width support for basic inline containers
     4        https://bugs.webkit.org/show_bug.cgi?id=194473
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Preferred width computation logic is very similar to normal layout.
     9        One of the main difference is that the preferred width codepath does not provide valid containing block width.
     10        This patch implement basic inline container support by passing nullopt containing block width in UsedHorizontalValues.
     11
     12        * layout/inlineformatting/InlineFormattingContext.cpp:
     13        (WebCore::Layout::InlineFormattingContext::layout const):
     14        (WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const):
     15        (WebCore::Layout::InlineFormattingContext::computeBorderAndPadding const):
     16        (WebCore::Layout::InlineFormattingContext::computeMarginBorderAndPadding const):
     17        (WebCore::Layout::InlineFormattingContext::computeWidthAndMargin const):
     18        (WebCore::Layout::InlineFormattingContext::layoutFormattingContextRoot const):
     19        (WebCore::Layout::InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox const):
     20        * layout/inlineformatting/InlineFormattingContext.h:
     21
    1222019-02-08  Myles C. Maxfield  <mmaxfield@apple.com>
    223
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp

    r241194 r241243  
    7272    LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")");
    7373    auto& root = downcast<Container>(this->root());
     74    auto usedValues = UsedHorizontalValues { layoutState().displayBoxForLayoutBox(root).contentBoxWidth(), { }, { } };
    7475    auto* layoutBox = root.firstInFlowOrFloatingChild();
    7576    // Compute width/height for non-text content and margin/border/padding for inline containers.
    7677    while (layoutBox) {
    7778        if (layoutBox->establishesFormattingContext())
    78             layoutFormattingContextRoot(*layoutBox);
     79            layoutFormattingContextRoot(*layoutBox, usedValues);
    7980        else if (is<Container>(*layoutBox))
    80             computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox));
     81            computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox), usedValues);
    8182        else if (layoutBox->isReplaced())
    82             computeWidthAndHeightForReplacedInlineBox(*layoutBox);
     83            computeWidthAndHeightForReplacedInlineBox(*layoutBox, usedValues);
    8384        layoutBox = nextInPreOrder(*layoutBox, root);
    8485    }
     
    9091}
    9192
    92 void InlineFormattingContext::computeMarginBorderAndPadding(const InlineContainer& inlineContainer) const
     93FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsicWidthConstraints() const
     94{
     95    ASSERT(!layoutState().formattingStateForBox(root()).instrinsicWidthConstraints(root()));
     96    ASSERT(is<Container>(root()));
     97
     98    auto& layoutState = this->layoutState();
     99    auto& root = downcast<Container>(this->root());
     100
     101    auto usedValues = UsedHorizontalValues { { }, { }, { } };
     102    auto* layoutBox = root.firstInFlowOrFloatingChild();
     103    while (layoutBox) {
     104        if (layoutBox->establishesFormattingContext() || layoutBox->isReplaced())
     105            ASSERT_NOT_IMPLEMENTED_YET();
     106        else if (is<Container>(*layoutBox))
     107            computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox), usedValues);
     108        layoutBox = nextInPreOrder(*layoutBox, root);
     109    }
     110
     111    InlineRunProvider inlineRunProvider;
     112    collectInlineContent(inlineRunProvider);
     113
     114    auto maximumLineWidth = [&](auto availableWidth) {
     115        LayoutUnit maxContentLogicalRight;
     116        auto lineBreaker = InlineLineBreaker { layoutState, formattingState().inlineContent(), inlineRunProvider.runs() };
     117        LayoutUnit lineLogicalRight;
     118        while (auto run = lineBreaker.nextRun(lineLogicalRight, availableWidth, !lineLogicalRight)) {
     119            if (run->position == InlineLineBreaker::Run::Position::LineBegin)
     120                lineLogicalRight = 0;
     121            lineLogicalRight += run->width;
     122
     123            maxContentLogicalRight = std::max(maxContentLogicalRight, lineLogicalRight);
     124        }
     125        return maxContentLogicalRight;
     126    };
     127
     128    auto instrinsicWidthConstraints = FormattingContext::InstrinsicWidthConstraints { maximumLineWidth(0), maximumLineWidth(LayoutUnit::max()) };
     129    layoutState.formattingStateForBox(root).setInstrinsicWidthConstraints(root, instrinsicWidthConstraints);
     130    return instrinsicWidthConstraints;
     131}
     132
     133void InlineFormattingContext::computeBorderAndPadding(const Box& layoutBox, UsedHorizontalValues usedValues) const
     134{
     135    auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);
     136    displayBox.setBorder(Geometry::computedBorder(layoutBox));
     137    displayBox.setPadding(Geometry::computedPadding(layoutBox, usedValues));
     138}
     139
     140void InlineFormattingContext::computeMarginBorderAndPadding(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const
    93141{
    94142    // Non-replaced, non-formatting root containers (<span></span>) don't have width property -> non width computation.
     
    96144    ASSERT(!inlineContainer.establishesFormattingContext());
    97145
    98     computeBorderAndPadding(inlineContainer);
     146    computeBorderAndPadding(inlineContainer, usedValues);
    99147    auto& displayBox = layoutState().displayBoxForLayoutBox(inlineContainer);
    100     auto containingBlockWidth = layoutState().displayBoxForLayoutBox(*inlineContainer.containingBlock()).contentBoxWidth();
    101     auto computedHorizontalMargin = Geometry::computedHorizontalMargin(inlineContainer, UsedHorizontalValues { containingBlockWidth, { }, { } });
     148    auto computedHorizontalMargin = Geometry::computedHorizontalMargin(inlineContainer, usedValues);
    102149    displayBox.setHorizontalComputedMargin(computedHorizontalMargin);
    103150    displayBox.setHorizontalMargin({ computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) });
    104151}
    105152
    106 void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox) const
     153void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox, UsedHorizontalValues usedValues) const
    107154{
    108155    auto& layoutState = this->layoutState();
    109     auto containingBlockWidth = layoutState.displayBoxForLayoutBox(*layoutBox.containingBlock()).contentBoxWidth();
    110 
    111156    WidthAndMargin widthAndMargin;
    112     auto usedValues = UsedHorizontalValues { containingBlockWidth, { }, { } };
    113157    if (layoutBox.isFloatingPositioned())
    114158        widthAndMargin = Geometry::floatingWidthAndMargin(layoutState, layoutBox, usedValues);
     
    145189}
    146190
    147 void InlineFormattingContext::layoutFormattingContextRoot(const Box& root) const
     191void InlineFormattingContext::layoutFormattingContextRoot(const Box& root, UsedHorizontalValues usedValues) const
    148192{
    149193    ASSERT(root.isFloatingPositioned() || root.isInlineBlockBox());
    150194
    151     computeBorderAndPadding(root);
    152     computeWidthAndMargin(root);
     195    computeBorderAndPadding(root, usedValues);
     196    computeWidthAndMargin(root, usedValues);
    153197    // Swich over to the new formatting context (the one that the root creates).
    154198    auto formattingContext = layoutState().createFormattingContext(root);
     
    160204}
    161205
    162 void InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox(const Box& layoutBox) const
     206void InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox(const Box& layoutBox, UsedHorizontalValues usedValues) const
    163207{
    164208    ASSERT(!layoutBox.isContainer());
     
    166210    ASSERT(layoutBox.replaced());
    167211
    168     computeBorderAndPadding(layoutBox);
    169     computeWidthAndMargin(layoutBox);
     212    computeBorderAndPadding(layoutBox, usedValues);
     213    computeWidthAndMargin(layoutBox, usedValues);
    170214    computeHeightAndMargin(layoutBox);
    171215}
     
    293337}
    294338
    295 FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsicWidthConstraints() const
    296 {
    297     auto& formattingStateForRoot = layoutState().formattingStateForBox(root());
    298     if (auto instrinsicWidthConstraints = formattingStateForRoot.instrinsicWidthConstraints(root()))
    299         return *instrinsicWidthConstraints;
    300 
    301     auto& inlineFormattingState = formattingState();
    302     InlineRunProvider inlineRunProvider;
    303     collectInlineContent(inlineRunProvider);
    304 
    305     // Compute width for non-text content.
    306     for (auto& inlineRun : inlineRunProvider.runs()) {
    307         if (inlineRun.isText())
    308             continue;
    309 
    310         computeWidthAndMargin(inlineRun.inlineItem().layoutBox());
    311     }
    312 
    313     auto maximumLineWidth = [&](auto availableWidth) {
    314         LayoutUnit maxContentLogicalRight;
    315         InlineLineBreaker lineBreaker(layoutState(), inlineFormattingState.inlineContent(), inlineRunProvider.runs());
    316         LayoutUnit lineLogicalRight;
    317         while (auto run = lineBreaker.nextRun(lineLogicalRight, availableWidth, !lineLogicalRight)) {
    318             if (run->position == InlineLineBreaker::Run::Position::LineBegin)
    319                 lineLogicalRight = 0;
    320             lineLogicalRight += run->width;
    321 
    322             maxContentLogicalRight = std::max(maxContentLogicalRight, lineLogicalRight);
    323         }
    324         return maxContentLogicalRight;
    325     };
    326 
    327     return FormattingContext::InstrinsicWidthConstraints { maximumLineWidth(0), maximumLineWidth(LayoutUnit::max()) };
    328 }
    329 
    330339}
    331340}
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r241194 r241243  
    8686    };
    8787
    88     void layoutFormattingContextRoot(const Box&) const;
    89     void computeWidthAndHeightForReplacedInlineBox(const Box&) const;
    90     void computeMarginBorderAndPadding(const InlineContainer&) const;
     88    void layoutFormattingContextRoot(const Box&, UsedHorizontalValues) const;
     89    void computeWidthAndHeightForReplacedInlineBox(const Box&, UsedHorizontalValues) const;
     90    void computeBorderAndPadding(const Box&, UsedHorizontalValues) const;
     91    void computeMarginBorderAndPadding(const InlineContainer&, UsedHorizontalValues) const;
    9192    void computeHeightAndMargin(const Box&) const;
    92     void computeWidthAndMargin(const Box&) const;
     93    void computeWidthAndMargin(const Box&, UsedHorizontalValues) const;
    9394
    9495    void collectInlineContent(InlineRunProvider&) const;
  • trunk/Tools/ChangeLog

    r241238 r241243  
     12019-02-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Add intrinsic width support for basic inline containers
     4        https://bugs.webkit.org/show_bug.cgi?id=194473
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Expand tests coverage (11 new tests -> 798)
     9
     10        * LayoutReloaded/misc/LFC-passing-tests.txt: not sure why run-singly keeps producing different ordering.
     11
    1122019-02-09  Benjamin Poulain  <benjamin@webkit.org>
    213
  • trunk/Tools/LayoutReloaded/misc/LFC-passing-tests.txt

    r241123 r241243  
    404404css2.1/20110323/absolute-non-replaced-max-height-001.htm
    405405css2.1/20110323/absolute-non-replaced-max-height-002.htm
    406 css2.1/t0402-c71-fwd-parsing-00-f.html
    407406css2.1/20110323/absolute-non-replaced-max-height-003.htm
    408407css2.1/20110323/absolute-non-replaced-max-height-004.htm
     408css2.1/20110323/absolute-non-replaced-max-height-005.htm
     409css2.1/t0402-c71-fwd-parsing-00-f.html
     410css2.1/20110323/absolute-non-replaced-max-height-006.htm
    409411css2.1/t0402-c71-fwd-parsing-01-f.html
    410 css2.1/20110323/absolute-non-replaced-max-height-005.htm
    411 css2.1/20110323/absolute-non-replaced-max-height-006.htm
    412412css2.1/20110323/absolute-non-replaced-max-height-007.htm
    413413css2.1/20110323/absolute-non-replaced-max-height-008.htm
     
    422422css2.1/20110323/absolute-non-replaced-width-005.htm
    423423css2.1/20110323/absolute-non-replaced-width-006.htm
    424 css2.1/t0402-c71-fwd-parsing-03-f.html
    425424css2.1/20110323/absolute-non-replaced-width-007.htm
    426425css2.1/20110323/absolute-non-replaced-width-008.htm
     
    428427css2.1/20110323/absolute-non-replaced-width-010.htm
    429428css2.1/20110323/absolute-non-replaced-width-011.htm
     429css2.1/t0402-c71-fwd-parsing-03-f.html
    430430css2.1/20110323/absolute-non-replaced-width-012.htm
    431431css2.1/20110323/absolute-non-replaced-width-013.htm
     
    475475css2.1/20110323/absolute-replaced-height-028.htm
    476476css2.1/20110323/absolute-replaced-height-029.htm
    477 css2.1/t0803-c5502-imrgn-r-00-b-ag.html
    478477css2.1/20110323/absolute-replaced-height-030.htm
    479478css2.1/20110323/absolute-replaced-height-031.htm
     
    482481css2.1/20110323/absolute-replaced-height-035.htm
    483482css2.1/20110323/absolute-replaced-height-036.htm
     483css2.1/t0803-c5502-imrgn-r-00-b-ag.html
    484484css2.1/20110323/absolute-replaced-width-001.htm
    485485css2.1/20110323/absolute-replaced-width-006.htm
     
    497497css2.1/20110323/absolute-replaced-width-064.htm
    498498css2.1/20110323/absolute-replaced-width-069.htm
    499 css2.1/t0803-c5502-mrgn-r-02-c.html
    500 css2.1/t0803-c5502-mrgn-r-03-c.html
    501499css2.1/20110323/abspos-containing-block-initial-001.htm
    502500css2.1/20110323/abspos-containing-block-initial-004a.htm
     501css2.1/t0803-c5502-mrgn-r-02-c.html
    503502css2.1/20110323/abspos-containing-block-initial-004b.htm
     503css2.1/t0803-c5502-mrgn-r-03-c.html
    504504css2.1/t0803-c5504-imrgn-l-00-b-ag.html
    505505css2.1/20110323/abspos-containing-block-initial-005a.htm
     
    511511css2.1/20110323/abspos-containing-block-initial-009f.htm
    512512css2.1/t0803-c5504-mrgn-l-00-c-ag.html
    513 css2.1/t0803-c5504-mrgn-l-02-c.html
    514 css2.1/t0803-c5504-mrgn-l-03-c.html
    515 css2.1/t0803-c5505-mrgn-00-b-ag.html
    516513css2.1/20110323/at-import-001.htm
    517514css2.1/20110323/at-import-002.htm
     
    523520css2.1/20110323/at-import-009.htm
    524521css2.1/20110323/at-import-010.htm
     522css2.1/t0803-c5504-mrgn-l-02-c.html
    525523css2.1/20110323/at-import-011.htm
     524css2.1/t0803-c5504-mrgn-l-03-c.html
     525css2.1/20110323/background-intrinsic-001.htm
     526css2.1/20110323/background-intrinsic-002.htm
     527css2.1/20110323/background-intrinsic-003.htm
     528css2.1/20110323/background-intrinsic-004.htm
     529css2.1/20110323/background-intrinsic-005.htm
     530css2.1/t0803-c5505-mrgn-00-b-ag.html
     531css2.1/20110323/background-intrinsic-007.htm
     532css2.1/20110323/background-intrinsic-008.htm
     533css2.1/20110323/background-intrinsic-009.htm
     534css2.1/20110323/block-non-replaced-height-001.htm
     535css2.1/20110323/block-non-replaced-height-003.htm
    526536css2.1/t0803-c5505-mrgn-03-c-ag.html
    527537css2.1/t0804-c5506-ipadn-t-00-b-a.html
     
    529539css2.1/t0804-c5506-ipadn-t-02-b-a.html
    530540css2.1/t0804-c5507-ipadn-r-00-b-ag.html
    531 css2.1/20110323/background-intrinsic-003.htm
     541css2.1/20110323/block-non-replaced-height-007.htm
     542css2.1/20110323/block-non-replaced-height-009.htm
     543css2.1/20110323/block-non-replaced-height-011.htm
    532544css2.1/t0804-c5507-padn-r-00-c-ag.html
    533 css2.1/20110323/background-intrinsic-008.htm
    534 css2.1/20110323/background-intrinsic-009.htm
    535 css2.1/20110323/block-non-replaced-height-001.htm
     545css2.1/20110323/block-non-replaced-height-013.htm
    536546css2.1/t0804-c5507-padn-r-02-f.html
    537547css2.1/t0804-c5507-padn-r-03-f.html
     
    539549css2.1/t0804-c5508-ipadn-b-01-f-a.html
    540550css2.1/t0804-c5508-ipadn-b-02-b-a.html
    541 css2.1/20110323/block-non-replaced-height-003.htm
     551css2.1/20110323/block-non-replaced-height-015.htm
    542552css2.1/t0804-c5509-ipadn-l-00-b-ag.html
    543 css2.1/20110323/block-non-replaced-height-007.htm
    544 css2.1/20110323/block-non-replaced-height-009.htm
    545 css2.1/t0804-c5509-padn-l-00-b-ag.html
    546 css2.1/20110323/block-non-replaced-height-011.htm
    547 css2.1/t0804-c5509-padn-l-02-f.html
    548 css2.1/20110323/block-non-replaced-height-013.htm
    549 css2.1/20110323/block-non-replaced-height-015.htm
    550 css2.1/t0804-c5510-padn-00-b-ag.html
    551 css2.1/t0804-c5510-padn-02-f.html
    552 css2.1/t0805-c5511-brdr-tw-01-b-g.html
    553 css2.1/t0805-c5511-brdr-tw-02-b.html
    554 css2.1/t0805-c5511-brdr-tw-03-b.html
    555553css2.1/20110323/block-non-replaced-width-003.htm
    556554css2.1/20110323/block-non-replaced-width-004.htm
     
    560558css2.1/20110323/block-non-replaced-width-008.htm
    561559css2.1/20110323/block-replaced-height-001.htm
    562 css2.1/t0805-c5512-brdr-rw-00-b.html
    563 css2.1/t0805-c5512-brdr-rw-01-b-g.html
    564 css2.1/t0805-c5512-brdr-rw-02-b.html
    565 css2.1/t0805-c5512-brdr-rw-03-b.html
    566560css2.1/20110323/block-replaced-height-003.htm
    567561css2.1/20110323/block-replaced-height-004.htm
     
    570564css2.1/20110323/block-replaced-width-001.htm
    571565css2.1/20110323/block-replaced-width-006.htm
     566css2.1/t0804-c5509-padn-l-00-b-ag.html
     567css2.1/t0804-c5509-padn-l-02-f.html
     568css2.1/t0804-c5510-padn-00-b-ag.html
     569css2.1/t0804-c5510-padn-02-f.html
     570css2.1/t0805-c5511-brdr-tw-01-b-g.html
     571css2.1/t0805-c5511-brdr-tw-02-b.html
     572css2.1/t0805-c5511-brdr-tw-03-b.html
     573css2.1/t0805-c5512-brdr-rw-00-b.html
     574css2.1/t0805-c5512-brdr-rw-01-b-g.html
     575css2.1/t0805-c5512-brdr-rw-02-b.html
     576css2.1/t0805-c5512-brdr-rw-03-b.html
    572577css2.1/t0805-c5513-brdr-bw-01-b-g.html
    573578css2.1/t0805-c5513-brdr-bw-02-b.html
     
    598603css2.1/t1001-abs-pos-cb-03-b.html
    599604css2.1/t1001-abs-pos-cb-04-b.html
     605css2.1/t1001-abs-pos-cb-05-b.html
     606css2.1/t1001-abs-pos-cb-06-b.html
    600607css2.1/t1001-abs-pos-cb-07-b.html
    601608css2.1/t1001-abs-pos-cb-08-b.html
     
    644651css2.1/20110323/dynamic-top-change-004.htm
    645652css2.1/t1604-c542-letter-sp-00-b-a.html
     653css2.1/20110323/empty-inline-001.htm
    646654css2.1/t1605-c545-txttrans-00-b-ag.html
    647655css2.1/t010403-shand-border-00-c.html
     
    662670css2.1/t040103-escapes-06-b.html
    663671css2.1/t040103-escapes-07-b.html
     672css2.1/20110323/eof-001.htm
    664673css2.1/t040103-escapes-08-b.html
     674css2.1/20110323/eof-002.htm
    665675css2.1/t040103-ident-00-c.html
     676css2.1/20110323/eof-003.htm
    666677css2.1/t040103-ident-01-c.html
     678css2.1/20110323/eof-004.htm
    667679css2.1/t040103-ident-02-c.html
     680css2.1/20110323/eof-005.htm
    668681css2.1/t040103-ident-03-c.html
    669682css2.1/t040103-ident-04-c.html
     683css2.1/20110323/eof-006.htm
    670684css2.1/t040103-ident-05-c.html
     685css2.1/20110323/eof-007.htm
    671686css2.1/t040103-ident-06-c.html
    672687css2.1/t040103-ident-07-c.html
     
    690705css2.1/t040109-c17-comments-00-b.html
    691706css2.1/t040109-c17-comments-01-b.html
    692 css2.1/20110323/empty-inline-001.htm
    693707css2.1/t040302-c61-phys-len-00-b.html
    694708css2.1/t040302-c61-rel-len-00-b-ag.html
    695709css2.1/t040303-c62-percent-00-b-ag.html
    696710css2.1/t040304-c64-uri-00-a-g.html
    697 css2.1/20110323/eof-001.htm
    698711css2.1/t040306-syntax-01-f.html
    699 css2.1/20110323/eof-002.htm
    700712css2.1/t040307-syntax-01-b.html
    701 css2.1/20110323/eof-003.htm
    702713css2.1/t050201-c12-grouping-00-b.html
    703 css2.1/20110323/eof-004.htm
    704 css2.1/20110323/eof-005.htm
    705 css2.1/20110323/eof-006.htm
    706 css2.1/20110323/eof-007.htm
    707714css2.1/t051103-c21-activ-ln-00-e-i.html
    708715css2.1/t051103-c21-focus-ln-00-e-i.html
     
    710717css2.1/t051103-dom-hover-01-c-io.html
    711718css2.1/t051103-dom-hover-02-c-io.html
    712 css2.1/t060402-c31-important-00-b.html
    713 css2.1/t060403-c21-pseu-cls-00-e-i.html
    714 css2.1/t060403-c21-pseu-id-00-e-i.html
    715719css2.1/20110323/float-non-replaced-height-001.htm
    716720css2.1/20110323/float-non-replaced-width-001.htm
     
    720724css2.1/20110323/float-non-replaced-width-005.htm
    721725css2.1/20110323/float-non-replaced-width-006.htm
    722 css2.1/t090501-c414-flt-00-d.html
    723 css2.1/t090501-c414-flt-02-d-g.html
     726css2.1/t060402-c31-important-00-b.html
     727css2.1/t060403-c21-pseu-cls-00-e-i.html
     728css2.1/t060403-c21-pseu-id-00-e-i.html
    724729css2.1/20110323/float-non-replaced-width-010.htm
    725730css2.1/20110323/float-non-replaced-width-012.htm
    726731css2.1/20110323/float-replaced-height-001.htm
     732css2.1/t090501-c414-flt-00-d.html
    727733css2.1/20110323/float-replaced-height-004.htm
    728734css2.1/20110323/float-replaced-height-005.htm
     
    735741css2.1/20110323/float-replaced-width-006.htm
    736742css2.1/20110323/float-replaced-width-011.htm
     743css2.1/t090501-c414-flt-02-d-g.html
    737744css2.1/20110323/floats-001.html
    738745css2.1/t100303-c412-blockw-00-d-ag.html
Note: See TracChangeset for help on using the changeset viewer.