Changeset 241243 in webkit
- Timestamp:
- Feb 9, 2019 12:37:03 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r241231 r241243 1 2019-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 1 22 2019-02-08 Myles C. Maxfield <mmaxfield@apple.com> 2 23 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r241194 r241243 72 72 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")"); 73 73 auto& root = downcast<Container>(this->root()); 74 auto usedValues = UsedHorizontalValues { layoutState().displayBoxForLayoutBox(root).contentBoxWidth(), { }, { } }; 74 75 auto* layoutBox = root.firstInFlowOrFloatingChild(); 75 76 // Compute width/height for non-text content and margin/border/padding for inline containers. 76 77 while (layoutBox) { 77 78 if (layoutBox->establishesFormattingContext()) 78 layoutFormattingContextRoot(*layoutBox );79 layoutFormattingContextRoot(*layoutBox, usedValues); 79 80 else if (is<Container>(*layoutBox)) 80 computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox) );81 computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox), usedValues); 81 82 else if (layoutBox->isReplaced()) 82 computeWidthAndHeightForReplacedInlineBox(*layoutBox );83 computeWidthAndHeightForReplacedInlineBox(*layoutBox, usedValues); 83 84 layoutBox = nextInPreOrder(*layoutBox, root); 84 85 } … … 90 91 } 91 92 92 void InlineFormattingContext::computeMarginBorderAndPadding(const InlineContainer& inlineContainer) const 93 FormattingContext::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 133 void 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 140 void InlineFormattingContext::computeMarginBorderAndPadding(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const 93 141 { 94 142 // Non-replaced, non-formatting root containers (<span></span>) don't have width property -> non width computation. … … 96 144 ASSERT(!inlineContainer.establishesFormattingContext()); 97 145 98 computeBorderAndPadding(inlineContainer );146 computeBorderAndPadding(inlineContainer, usedValues); 99 147 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); 102 149 displayBox.setHorizontalComputedMargin(computedHorizontalMargin); 103 150 displayBox.setHorizontalMargin({ computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) }); 104 151 } 105 152 106 void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox ) const153 void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox, UsedHorizontalValues usedValues) const 107 154 { 108 155 auto& layoutState = this->layoutState(); 109 auto containingBlockWidth = layoutState.displayBoxForLayoutBox(*layoutBox.containingBlock()).contentBoxWidth();110 111 156 WidthAndMargin widthAndMargin; 112 auto usedValues = UsedHorizontalValues { containingBlockWidth, { }, { } };113 157 if (layoutBox.isFloatingPositioned()) 114 158 widthAndMargin = Geometry::floatingWidthAndMargin(layoutState, layoutBox, usedValues); … … 145 189 } 146 190 147 void InlineFormattingContext::layoutFormattingContextRoot(const Box& root ) const191 void InlineFormattingContext::layoutFormattingContextRoot(const Box& root, UsedHorizontalValues usedValues) const 148 192 { 149 193 ASSERT(root.isFloatingPositioned() || root.isInlineBlockBox()); 150 194 151 computeBorderAndPadding(root );152 computeWidthAndMargin(root );195 computeBorderAndPadding(root, usedValues); 196 computeWidthAndMargin(root, usedValues); 153 197 // Swich over to the new formatting context (the one that the root creates). 154 198 auto formattingContext = layoutState().createFormattingContext(root); … … 160 204 } 161 205 162 void InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox(const Box& layoutBox ) const206 void InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox(const Box& layoutBox, UsedHorizontalValues usedValues) const 163 207 { 164 208 ASSERT(!layoutBox.isContainer()); … … 166 210 ASSERT(layoutBox.replaced()); 167 211 168 computeBorderAndPadding(layoutBox );169 computeWidthAndMargin(layoutBox );212 computeBorderAndPadding(layoutBox, usedValues); 213 computeWidthAndMargin(layoutBox, usedValues); 170 214 computeHeightAndMargin(layoutBox); 171 215 } … … 293 337 } 294 338 295 FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsicWidthConstraints() const296 {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 330 339 } 331 340 } -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r241194 r241243 86 86 }; 87 87 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; 91 92 void computeHeightAndMargin(const Box&) const; 92 void computeWidthAndMargin(const Box& ) const;93 void computeWidthAndMargin(const Box&, UsedHorizontalValues) const; 93 94 94 95 void collectInlineContent(InlineRunProvider&) const; -
trunk/Tools/ChangeLog
r241238 r241243 1 2019-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 1 12 2019-02-09 Benjamin Poulain <benjamin@webkit.org> 2 13 -
trunk/Tools/LayoutReloaded/misc/LFC-passing-tests.txt
r241123 r241243 404 404 css2.1/20110323/absolute-non-replaced-max-height-001.htm 405 405 css2.1/20110323/absolute-non-replaced-max-height-002.htm 406 css2.1/t0402-c71-fwd-parsing-00-f.html407 406 css2.1/20110323/absolute-non-replaced-max-height-003.htm 408 407 css2.1/20110323/absolute-non-replaced-max-height-004.htm 408 css2.1/20110323/absolute-non-replaced-max-height-005.htm 409 css2.1/t0402-c71-fwd-parsing-00-f.html 410 css2.1/20110323/absolute-non-replaced-max-height-006.htm 409 411 css2.1/t0402-c71-fwd-parsing-01-f.html 410 css2.1/20110323/absolute-non-replaced-max-height-005.htm411 css2.1/20110323/absolute-non-replaced-max-height-006.htm412 412 css2.1/20110323/absolute-non-replaced-max-height-007.htm 413 413 css2.1/20110323/absolute-non-replaced-max-height-008.htm … … 422 422 css2.1/20110323/absolute-non-replaced-width-005.htm 423 423 css2.1/20110323/absolute-non-replaced-width-006.htm 424 css2.1/t0402-c71-fwd-parsing-03-f.html425 424 css2.1/20110323/absolute-non-replaced-width-007.htm 426 425 css2.1/20110323/absolute-non-replaced-width-008.htm … … 428 427 css2.1/20110323/absolute-non-replaced-width-010.htm 429 428 css2.1/20110323/absolute-non-replaced-width-011.htm 429 css2.1/t0402-c71-fwd-parsing-03-f.html 430 430 css2.1/20110323/absolute-non-replaced-width-012.htm 431 431 css2.1/20110323/absolute-non-replaced-width-013.htm … … 475 475 css2.1/20110323/absolute-replaced-height-028.htm 476 476 css2.1/20110323/absolute-replaced-height-029.htm 477 css2.1/t0803-c5502-imrgn-r-00-b-ag.html478 477 css2.1/20110323/absolute-replaced-height-030.htm 479 478 css2.1/20110323/absolute-replaced-height-031.htm … … 482 481 css2.1/20110323/absolute-replaced-height-035.htm 483 482 css2.1/20110323/absolute-replaced-height-036.htm 483 css2.1/t0803-c5502-imrgn-r-00-b-ag.html 484 484 css2.1/20110323/absolute-replaced-width-001.htm 485 485 css2.1/20110323/absolute-replaced-width-006.htm … … 497 497 css2.1/20110323/absolute-replaced-width-064.htm 498 498 css2.1/20110323/absolute-replaced-width-069.htm 499 css2.1/t0803-c5502-mrgn-r-02-c.html500 css2.1/t0803-c5502-mrgn-r-03-c.html501 499 css2.1/20110323/abspos-containing-block-initial-001.htm 502 500 css2.1/20110323/abspos-containing-block-initial-004a.htm 501 css2.1/t0803-c5502-mrgn-r-02-c.html 503 502 css2.1/20110323/abspos-containing-block-initial-004b.htm 503 css2.1/t0803-c5502-mrgn-r-03-c.html 504 504 css2.1/t0803-c5504-imrgn-l-00-b-ag.html 505 505 css2.1/20110323/abspos-containing-block-initial-005a.htm … … 511 511 css2.1/20110323/abspos-containing-block-initial-009f.htm 512 512 css2.1/t0803-c5504-mrgn-l-00-c-ag.html 513 css2.1/t0803-c5504-mrgn-l-02-c.html514 css2.1/t0803-c5504-mrgn-l-03-c.html515 css2.1/t0803-c5505-mrgn-00-b-ag.html516 513 css2.1/20110323/at-import-001.htm 517 514 css2.1/20110323/at-import-002.htm … … 523 520 css2.1/20110323/at-import-009.htm 524 521 css2.1/20110323/at-import-010.htm 522 css2.1/t0803-c5504-mrgn-l-02-c.html 525 523 css2.1/20110323/at-import-011.htm 524 css2.1/t0803-c5504-mrgn-l-03-c.html 525 css2.1/20110323/background-intrinsic-001.htm 526 css2.1/20110323/background-intrinsic-002.htm 527 css2.1/20110323/background-intrinsic-003.htm 528 css2.1/20110323/background-intrinsic-004.htm 529 css2.1/20110323/background-intrinsic-005.htm 530 css2.1/t0803-c5505-mrgn-00-b-ag.html 531 css2.1/20110323/background-intrinsic-007.htm 532 css2.1/20110323/background-intrinsic-008.htm 533 css2.1/20110323/background-intrinsic-009.htm 534 css2.1/20110323/block-non-replaced-height-001.htm 535 css2.1/20110323/block-non-replaced-height-003.htm 526 536 css2.1/t0803-c5505-mrgn-03-c-ag.html 527 537 css2.1/t0804-c5506-ipadn-t-00-b-a.html … … 529 539 css2.1/t0804-c5506-ipadn-t-02-b-a.html 530 540 css2.1/t0804-c5507-ipadn-r-00-b-ag.html 531 css2.1/20110323/background-intrinsic-003.htm 541 css2.1/20110323/block-non-replaced-height-007.htm 542 css2.1/20110323/block-non-replaced-height-009.htm 543 css2.1/20110323/block-non-replaced-height-011.htm 532 544 css2.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 545 css2.1/20110323/block-non-replaced-height-013.htm 536 546 css2.1/t0804-c5507-padn-r-02-f.html 537 547 css2.1/t0804-c5507-padn-r-03-f.html … … 539 549 css2.1/t0804-c5508-ipadn-b-01-f-a.html 540 550 css2.1/t0804-c5508-ipadn-b-02-b-a.html 541 css2.1/20110323/block-non-replaced-height-0 03.htm551 css2.1/20110323/block-non-replaced-height-015.htm 542 552 css2.1/t0804-c5509-ipadn-l-00-b-ag.html 543 css2.1/20110323/block-non-replaced-height-007.htm544 css2.1/20110323/block-non-replaced-height-009.htm545 css2.1/t0804-c5509-padn-l-00-b-ag.html546 css2.1/20110323/block-non-replaced-height-011.htm547 css2.1/t0804-c5509-padn-l-02-f.html548 css2.1/20110323/block-non-replaced-height-013.htm549 css2.1/20110323/block-non-replaced-height-015.htm550 css2.1/t0804-c5510-padn-00-b-ag.html551 css2.1/t0804-c5510-padn-02-f.html552 css2.1/t0805-c5511-brdr-tw-01-b-g.html553 css2.1/t0805-c5511-brdr-tw-02-b.html554 css2.1/t0805-c5511-brdr-tw-03-b.html555 553 css2.1/20110323/block-non-replaced-width-003.htm 556 554 css2.1/20110323/block-non-replaced-width-004.htm … … 560 558 css2.1/20110323/block-non-replaced-width-008.htm 561 559 css2.1/20110323/block-replaced-height-001.htm 562 css2.1/t0805-c5512-brdr-rw-00-b.html563 css2.1/t0805-c5512-brdr-rw-01-b-g.html564 css2.1/t0805-c5512-brdr-rw-02-b.html565 css2.1/t0805-c5512-brdr-rw-03-b.html566 560 css2.1/20110323/block-replaced-height-003.htm 567 561 css2.1/20110323/block-replaced-height-004.htm … … 570 564 css2.1/20110323/block-replaced-width-001.htm 571 565 css2.1/20110323/block-replaced-width-006.htm 566 css2.1/t0804-c5509-padn-l-00-b-ag.html 567 css2.1/t0804-c5509-padn-l-02-f.html 568 css2.1/t0804-c5510-padn-00-b-ag.html 569 css2.1/t0804-c5510-padn-02-f.html 570 css2.1/t0805-c5511-brdr-tw-01-b-g.html 571 css2.1/t0805-c5511-brdr-tw-02-b.html 572 css2.1/t0805-c5511-brdr-tw-03-b.html 573 css2.1/t0805-c5512-brdr-rw-00-b.html 574 css2.1/t0805-c5512-brdr-rw-01-b-g.html 575 css2.1/t0805-c5512-brdr-rw-02-b.html 576 css2.1/t0805-c5512-brdr-rw-03-b.html 572 577 css2.1/t0805-c5513-brdr-bw-01-b-g.html 573 578 css2.1/t0805-c5513-brdr-bw-02-b.html … … 598 603 css2.1/t1001-abs-pos-cb-03-b.html 599 604 css2.1/t1001-abs-pos-cb-04-b.html 605 css2.1/t1001-abs-pos-cb-05-b.html 606 css2.1/t1001-abs-pos-cb-06-b.html 600 607 css2.1/t1001-abs-pos-cb-07-b.html 601 608 css2.1/t1001-abs-pos-cb-08-b.html … … 644 651 css2.1/20110323/dynamic-top-change-004.htm 645 652 css2.1/t1604-c542-letter-sp-00-b-a.html 653 css2.1/20110323/empty-inline-001.htm 646 654 css2.1/t1605-c545-txttrans-00-b-ag.html 647 655 css2.1/t010403-shand-border-00-c.html … … 662 670 css2.1/t040103-escapes-06-b.html 663 671 css2.1/t040103-escapes-07-b.html 672 css2.1/20110323/eof-001.htm 664 673 css2.1/t040103-escapes-08-b.html 674 css2.1/20110323/eof-002.htm 665 675 css2.1/t040103-ident-00-c.html 676 css2.1/20110323/eof-003.htm 666 677 css2.1/t040103-ident-01-c.html 678 css2.1/20110323/eof-004.htm 667 679 css2.1/t040103-ident-02-c.html 680 css2.1/20110323/eof-005.htm 668 681 css2.1/t040103-ident-03-c.html 669 682 css2.1/t040103-ident-04-c.html 683 css2.1/20110323/eof-006.htm 670 684 css2.1/t040103-ident-05-c.html 685 css2.1/20110323/eof-007.htm 671 686 css2.1/t040103-ident-06-c.html 672 687 css2.1/t040103-ident-07-c.html … … 690 705 css2.1/t040109-c17-comments-00-b.html 691 706 css2.1/t040109-c17-comments-01-b.html 692 css2.1/20110323/empty-inline-001.htm693 707 css2.1/t040302-c61-phys-len-00-b.html 694 708 css2.1/t040302-c61-rel-len-00-b-ag.html 695 709 css2.1/t040303-c62-percent-00-b-ag.html 696 710 css2.1/t040304-c64-uri-00-a-g.html 697 css2.1/20110323/eof-001.htm698 711 css2.1/t040306-syntax-01-f.html 699 css2.1/20110323/eof-002.htm700 712 css2.1/t040307-syntax-01-b.html 701 css2.1/20110323/eof-003.htm702 713 css2.1/t050201-c12-grouping-00-b.html 703 css2.1/20110323/eof-004.htm704 css2.1/20110323/eof-005.htm705 css2.1/20110323/eof-006.htm706 css2.1/20110323/eof-007.htm707 714 css2.1/t051103-c21-activ-ln-00-e-i.html 708 715 css2.1/t051103-c21-focus-ln-00-e-i.html … … 710 717 css2.1/t051103-dom-hover-01-c-io.html 711 718 css2.1/t051103-dom-hover-02-c-io.html 712 css2.1/t060402-c31-important-00-b.html713 css2.1/t060403-c21-pseu-cls-00-e-i.html714 css2.1/t060403-c21-pseu-id-00-e-i.html715 719 css2.1/20110323/float-non-replaced-height-001.htm 716 720 css2.1/20110323/float-non-replaced-width-001.htm … … 720 724 css2.1/20110323/float-non-replaced-width-005.htm 721 725 css2.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 726 css2.1/t060402-c31-important-00-b.html 727 css2.1/t060403-c21-pseu-cls-00-e-i.html 728 css2.1/t060403-c21-pseu-id-00-e-i.html 724 729 css2.1/20110323/float-non-replaced-width-010.htm 725 730 css2.1/20110323/float-non-replaced-width-012.htm 726 731 css2.1/20110323/float-replaced-height-001.htm 732 css2.1/t090501-c414-flt-00-d.html 727 733 css2.1/20110323/float-replaced-height-004.htm 728 734 css2.1/20110323/float-replaced-height-005.htm … … 735 741 css2.1/20110323/float-replaced-width-006.htm 736 742 css2.1/20110323/float-replaced-width-011.htm 743 css2.1/t090501-c414-flt-02-d-g.html 737 744 css2.1/20110323/floats-001.html 738 745 css2.1/t100303-c412-blockw-00-d-ag.html
Note: See TracChangeset
for help on using the changeset viewer.