Changeset 92969 in webkit


Ignore:
Timestamp:
Aug 12, 2011 10:22:25 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Original patch by Mihnea Ovidenie <mihnea@adobe.com>.
Also contains some improvements done by Dave Hyatt <hyatt@apple.com>.

[CSSRegions]RenderFlowThread should display its content using RenderRegion
https://bugs.webkit.org/show_bug.cgi?id=65627

Source/WebCore:

RenderFlowThread collects RenderObjects from a flow. These objects are displayed by means
of RenderRegion objects that get the content from the same flow.

Patch by Alexandru Chiculita <Alexandru Chiculita> on 2011-08-12
Reviewed by David Hyatt.

Tests: fast/regions/content-flowed-into-regions-dynamically-added.html

fast/regions/content-flowed-into-regions-dynamically-removed.html
fast/regions/content-flowed-into-regions-with-dyn-index.html
fast/regions/content-flowed-into-regions-with-index-dom.html
fast/regions/content-flowed-into-regions-with-index.html
fast/regions/content-flowed-into-regions.html
fast/regions/flow-content-basic-vertical-rl.html
fast/regions/flow-content-basic-vertical.html

  • dom/Node.cpp:

(WebCore::Node::diff):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::RenderFlowThread):
(WebCore::RenderFlowThread::createFlowThreadStyle):
(WebCore::RenderFlowThread::styleDidChange):
(WebCore::compareRenderRegions):
(WebCore::RenderFlowThread::addRegionToThread):
(WebCore::RenderFlowThread::removeRegionFromThread):
(WebCore::RenderFlowThread::layout):
(WebCore::RenderFlowThread::computeLogicalWidth):
(WebCore::RenderFlowThread::computeLogicalHeight):
(WebCore::RenderFlowThread::paintIntoRegion):

  • rendering/RenderFlowThread.h:
  • rendering/RenderObject.cpp:

(WebCore::RenderObject::createObject):

  • rendering/RenderRegion.cpp:

(WebCore::RenderRegion::RenderRegion):
(WebCore::RenderRegion::~RenderRegion):
(WebCore::RenderRegion::paint):
(WebCore::RenderRegion::styleDidChange):

  • rendering/RenderRegion.h:

(WebCore::RenderRegion::setRegionRect):
(WebCore::RenderRegion::regionRect):

  • rendering/RenderTreeAsText.cpp:

(WebCore::writeLayers):

  • rendering/RenderView.cpp:

(WebCore::RenderView::styleDidChange):
(WebCore::RenderView::renderFlowThreadWithName):

  • rendering/RenderView.h:

LayoutTests:

Also updated the old tests that expected an 100% by 100% RenderFlowThread. Those tests
require at least a region attached, otherwise the RenderFlowThread would have been 0/0 in size,
and no output would be generated for them in the render tree.

The attached regions are now printed in the render tree, so some tests required updated results.

Patch by Alexandru Chiculita <Alexandru Chiculita> on 2011-08-12
Reviewed by David Hyatt.

  • fast/regions/content-flowed-into-regions-dynamically-added-expected.png: Added.
  • fast/regions/content-flowed-into-regions-dynamically-added-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-dynamically-added.html: Added.
  • fast/regions/content-flowed-into-regions-dynamically-removed-expected.png: Added.
  • fast/regions/content-flowed-into-regions-dynamically-removed-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-dynamically-removed.html: Added.
  • fast/regions/content-flowed-into-regions-expected.png: Added.
  • fast/regions/content-flowed-into-regions-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-with-dyn-index-expected.png: Added.
  • fast/regions/content-flowed-into-regions-with-dyn-index-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-with-dyn-index.html: Added.
  • fast/regions/content-flowed-into-regions-with-index-dom-expected.png: Added.
  • fast/regions/content-flowed-into-regions-with-index-dom-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-with-index-dom.html: Added.
  • fast/regions/content-flowed-into-regions-with-index-expected.png: Added.
  • fast/regions/content-flowed-into-regions-with-index-expected.txt: Added.
  • fast/regions/content-flowed-into-regions-with-index.html: Added.
  • fast/regions/content-flowed-into-regions.html: Added.
  • fast/regions/flow-content-basic-vertical-rl.html: Copied from LayoutTests/fast/regions/flow-content-basic.html.
  • fast/regions/flow-content-basic-vertical.html: Copied from LayoutTests/fast/regions/flow-content-basic.html.
  • fast/regions/flow-content-basic.html:
  • fast/regions/render-region-renderer-expected.txt:
  • fast/regions/resources/region-style.css: Added.

(.greenBox):
(.blueBox):
(.orangeBox):
(.flowArticle):
(.regionArticle):
(.borderBox):

  • fast/regions/webkit-flow-renderer-expected.txt:
  • fast/regions/webkit-flow-renderer-layer-expected.txt:
  • fast/regions/webkit-flow-renderer-layer.html:
  • fast/regions/webkit-flow-renderer-nested-expected.txt:
  • fast/regions/webkit-flow-renderer-nested.html:
  • fast/regions/webkit-flow-renderer.html:
  • platform/mac/fast/regions/flow-content-basic-expected.png: Added.
  • platform/mac/fast/regions/flow-content-basic-expected.txt: Added.
  • platform/mac/fast/regions/flow-content-basic-vertical-expected.png: Added.
  • platform/mac/fast/regions/flow-content-basic-vertical-expected.txt: Added.
  • platform/mac/fast/regions/flow-content-basic-vertical-rl-expected.png: Added.
  • platform/mac/fast/regions/flow-content-basic-vertical-rl-expected.txt: Added.
Location:
trunk
Files:
27 added
19 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r92966 r92969  
     12011-08-12  Alexandru Chiculita  <achicu@adobe.com>
     2
     3        Original patch by Mihnea Ovidenie <mihnea@adobe.com>.
     4        Also contains some improvements done by Dave Hyatt <hyatt@apple.com>.
     5
     6        [CSSRegions]RenderFlowThread should display its content using RenderRegion
     7        https://bugs.webkit.org/show_bug.cgi?id=65627
     8
     9        Also updated the old tests that expected an 100% by 100% RenderFlowThread. Those tests
     10        require at least a region attached, otherwise the RenderFlowThread would have been 0/0 in size,
     11        and no output would be generated for them in the render tree.
     12
     13        The attached regions are now printed in the render tree, so some tests required updated results.
     14
     15        Reviewed by David Hyatt.
     16
     17        * fast/regions/content-flowed-into-regions-dynamically-added-expected.png: Added.
     18        * fast/regions/content-flowed-into-regions-dynamically-added-expected.txt: Added.
     19        * fast/regions/content-flowed-into-regions-dynamically-added.html: Added.
     20        * fast/regions/content-flowed-into-regions-dynamically-removed-expected.png: Added.
     21        * fast/regions/content-flowed-into-regions-dynamically-removed-expected.txt: Added.
     22        * fast/regions/content-flowed-into-regions-dynamically-removed.html: Added.
     23        * fast/regions/content-flowed-into-regions-expected.png: Added.
     24        * fast/regions/content-flowed-into-regions-expected.txt: Added.
     25        * fast/regions/content-flowed-into-regions-with-dyn-index-expected.png: Added.
     26        * fast/regions/content-flowed-into-regions-with-dyn-index-expected.txt: Added.
     27        * fast/regions/content-flowed-into-regions-with-dyn-index.html: Added.
     28        * fast/regions/content-flowed-into-regions-with-index-dom-expected.png: Added.
     29        * fast/regions/content-flowed-into-regions-with-index-dom-expected.txt: Added.
     30        * fast/regions/content-flowed-into-regions-with-index-dom.html: Added.
     31        * fast/regions/content-flowed-into-regions-with-index-expected.png: Added.
     32        * fast/regions/content-flowed-into-regions-with-index-expected.txt: Added.
     33        * fast/regions/content-flowed-into-regions-with-index.html: Added.
     34        * fast/regions/content-flowed-into-regions.html: Added.
     35        * fast/regions/flow-content-basic-vertical-rl.html: Copied from LayoutTests/fast/regions/flow-content-basic.html.
     36        * fast/regions/flow-content-basic-vertical.html: Copied from LayoutTests/fast/regions/flow-content-basic.html.
     37        * fast/regions/flow-content-basic.html:
     38        * fast/regions/render-region-renderer-expected.txt:
     39        * fast/regions/resources/region-style.css: Added.
     40        (.greenBox):
     41        (.blueBox):
     42        (.orangeBox):
     43        (.flowArticle):
     44        (.regionArticle):
     45        (.borderBox):
     46        * fast/regions/webkit-flow-renderer-expected.txt:
     47        * fast/regions/webkit-flow-renderer-layer-expected.txt:
     48        * fast/regions/webkit-flow-renderer-layer.html:
     49        * fast/regions/webkit-flow-renderer-nested-expected.txt:
     50        * fast/regions/webkit-flow-renderer-nested.html:
     51        * fast/regions/webkit-flow-renderer.html:
     52        * platform/mac/fast/regions/flow-content-basic-expected.png: Added.
     53        * platform/mac/fast/regions/flow-content-basic-expected.txt: Added.
     54        * platform/mac/fast/regions/flow-content-basic-vertical-expected.png: Added.
     55        * platform/mac/fast/regions/flow-content-basic-vertical-expected.txt: Added.
     56        * platform/mac/fast/regions/flow-content-basic-vertical-rl-expected.png: Added.
     57        * platform/mac/fast/regions/flow-content-basic-vertical-rl-expected.txt: Added.
     58
    1592011-08-12  Abhishek Arya  <inferno@chromium.org>
    260
  • trunk/LayoutTests/fast/regions/flow-content-basic-vertical-rl.html

    r92966 r92969  
    1010
    1111    <style type="text/css">
     12        html { -webkit-writing-mode: vertical-rl }
     13
    1214        #source{
    1315            -webkit-flow: "main-thread";
    1416        }
    15        
    16         .region{
    17             content:from(main-thread);
    18         }
    19        
     17
     18        .region { width: 100px; height:300px; content: -webkit-from-flow("main-thread"); border:1px solid black; padding:5px }
     19
    2020        .pass{
    2121            color: green;
     
    2929<body>
    3030    <div id="source" class="pass">
    31         <p>flow content</p>
     31        <div style="width:100px;">first flow content</div>
     32        <div style="width:100px;">second flow content</div>
    3233    </div>
    3334    <div>
    34         The words "flow content" in green should display after this div,
     35        The words "flow content" in green should display twice after this div,
    3536        and there should be two copies of this content that match.
    3637    </div>
    3738    <div id="region1" class="region">
     39        <div class="error">FAIL if this text is displayed.</div>
     40    </div>
     41   <div id="region2" class="region">
    3842        <div class="error">FAIL if this text is displayed.</div>
    3943    </div>
  • trunk/LayoutTests/fast/regions/flow-content-basic-vertical.html

    r92966 r92969  
    1010
    1111    <style type="text/css">
     12        html { -webkit-writing-mode: vertical-lr }
     13
    1214        #source{
    1315            -webkit-flow: "main-thread";
     
    1517       
    1618        .region{
    17             content:from(main-thread);
     19            content: -webkit-from-flow("main-thread");
     20            width:100px;
    1821        }
    1922       
  • trunk/LayoutTests/fast/regions/flow-content-basic.html

    r90067 r92969  
    1515       
    1616        .region{
    17             content:from(main-thread);
     17            content: -webkit-from-flow("main-thread");
     18            height:100px;
     19            width:300px;
    1820        }
    1921       
  • trunk/LayoutTests/fast/regions/render-region-renderer-expected.txt

    r91955 r92969  
    44  RenderBlock {HTML} at (0,0) size 800x170
    55    RenderBody {BODY} at (8,8) size 784x154
    6       RenderRegion {DIV} at (0,0) size 784x2 [border: (1px solid #FF0000)]
     6      RenderRegion {DIV} at (0,0) size 2x2 [border: (1px solid #FF0000)]
    77      RenderRegion {DIV} at (0,2) size 52x52 [border: (1px solid #FF0000)]
    88      RenderBlock {DIV} at (0,54) size 100x100
     
    1212layer at (8,200) size 52x52
    1313  RenderRegion {DIV} at (8,200) size 52x52 [border: (1px solid #FF0000)]
     14Flow Threads
     15  Thread with flow-name 'no-flow'
     16    layer at (0,0) size 50x250
     17      RenderFlowThread at (0,0) size 50x250
     18  Regions for flow 'no-flow'
     19    RenderRegion {DIV} with index 0
     20    RenderRegion {DIV} with index 0
     21    RenderRegion {DIV} with index 0
     22    RenderRegion {DIV} with index 0
     23    RenderRegion {DIV} with index 0
     24    RenderRegion {DIV} with index 0
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer-expected.txt

    r91760 r92969  
    11layer at (0,0) size 800x600
    22  RenderView at (0,0) size 800x600
    3 layer at (0,0) size 800x8
    4   RenderBlock {HTML} at (0,0) size 800x8
    5     RenderBody {BODY} at (8,8) size 784x0
     3layer at (0,0) size 800x316
     4  RenderBlock {HTML} at (0,0) size 800x316
     5    RenderBody {BODY} at (8,8) size 784x300
     6      RenderRegion {DIV} at (0,0) size 784x100
     7      RenderRegion {DIV} at (0,100) size 784x100
     8      RenderRegion {DIV} at (0,200) size 784x100
    69Flow Threads
    710  Thread with flow-name 'flowA'
    8     layer at (0,0) size 800x600
    9       RenderFlowThread at (0,0) size 800x600
    10         RenderBlock {DIV} at (0,0) size 800x18
     11    layer at (0,0) size 784x100
     12      RenderFlowThread at (0,0) size 784x100
     13        RenderBlock {DIV} at (0,0) size 784x18
    1114          RenderText {#text} at (0,0) size 91x18
    1215            text run at (0,0) width 91: "DIV4 - flowA"
    13         RenderBlock {DIV} at (0,18) size 800x18
     16        RenderBlock {DIV} at (0,18) size 784x18
    1417          RenderText {#text} at (0,0) size 91x18
    1518            text run at (0,0) width 91: "DIV1 - flowA"
     19  Regions for flow 'flowA'
     20    RenderRegion {DIV} #REGION1 with index 0
    1621  Thread with flow-name 'flowB'
    17     layer at (0,0) size 800x600
    18       RenderFlowThread at (0,0) size 800x600
    19         RenderBlock {DIV} at (0,0) size 800x18
     22    layer at (0,0) size 784x100
     23      RenderFlowThread at (0,0) size 784x100
     24        RenderBlock {DIV} at (0,0) size 784x18
    2025          RenderText {#text} at (0,0) size 90x18
    2126            text run at (0,0) width 90: "DIV5 - flowB"
    22         RenderBlock {DIV} at (0,18) size 800x18
     27        RenderBlock {DIV} at (0,18) size 784x18
    2328          RenderText {#text} at (0,0) size 90x18
    2429            text run at (0,0) width 90: "DIV7 - flowB"
    25         RenderBlock (anonymous) at (0,36) size 800x18
     30        RenderBlock (anonymous) at (0,36) size 784x18
    2631          RenderInline {SPAN} at (0,0) size 103x18
    2732            RenderText {#text} at (0,0) size 103x18
    2833              text run at (0,0) width 103: "SPAN2 - flowB"
    29         RenderBlock {DIV} at (0,54) size 800x18
     34        RenderBlock {DIV} at (0,54) size 784x18
    3035          RenderText {#text} at (0,0) size 90x18
    3136            text run at (0,0) width 90: "DIV6 - flowB"
     37  Regions for flow 'flowB'
     38    RenderRegion {DIV} #REGION2 with index 0
    3239  Thread with flow-name 'flowC'
    33     layer at (0,0) size 800x600
    34       RenderFlowThread at (0,0) size 800x600
    35         RenderBlock {DIV} at (0,0) size 800x18
     40    layer at (0,0) size 784x100
     41      RenderFlowThread at (0,0) size 784x100
     42        RenderBlock {DIV} at (0,0) size 784x18
    3643          RenderText {#text} at (0,0) size 90x18
    3744            text run at (0,0) width 90: "DIV3 - flowC"
    38         RenderBlock {DIV} at (0,18) size 800x18
     45        RenderBlock {DIV} at (0,18) size 784x18
    3946          RenderText {#text} at (0,0) size 90x18
    4047            text run at (0,0) width 90: "DIV8 - flowC"
     48  Regions for flow 'flowC'
     49    RenderRegion {DIV} #REGION3 with index 0
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer-layer-expected.txt

    r92870 r92969  
    11layer at (0,0) size 800x600
    22  RenderView at (0,0) size 800x600
    3 layer at (0,0) size 800x8
    4   RenderBlock {HTML} at (0,0) size 800x8
    5     RenderBody {BODY} at (8,8) size 784x0
     3layer at (0,0) size 800x316
     4  RenderBlock {HTML} at (0,0) size 800x316
     5    RenderBody {BODY} at (8,8) size 784x300
     6      RenderRegion {DIV} at (0,0) size 784x100
     7      RenderRegion {DIV} at (0,100) size 784x100
     8      RenderRegion {DIV} at (0,200) size 784x100
    69Flow Threads
    710  Thread with flow-name 'flowA'
    8     layer at (0,0) size 800x600
    9       RenderFlowThread at (0,0) size 800x600
     11    layer at (0,0) size 784x100
     12      RenderFlowThread at (0,0) size 784x100
     13  Regions for flow 'flowA'
     14    RenderRegion {DIV} #REGION1 with index 0
    1015  Thread with flow-name 'flowB'
    11     layer at (0,0) size 800x600
    12       RenderFlowThread at (0,0) size 800x600
     16    layer at (0,0) size 784x100
     17      RenderFlowThread at (0,0) size 784x100
     18  Regions for flow 'flowB'
     19    RenderRegion {DIV} #REGION2 with index 0
    1320  Thread with flow-name 'flowC'
    14     layer at (0,0) size 800x600
    15       RenderFlowThread at (0,0) size 800x600
    16         RenderBlock {DIV} at (0,0) size 800x36
    17           RenderBlock (anonymous) at (0,0) size 800x18
     21    layer at (0,0) size 784x100
     22      RenderFlowThread at (0,0) size 784x100
     23        RenderBlock {DIV} at (0,0) size 784x36
     24          RenderBlock (anonymous) at (0,0) size 784x18
    1825            RenderText {#text} at (0,0) size 90x18
    1926              text run at (0,0) width 90: "DIV3 - flowC"
    20           RenderBlock {DIV} at (0,18) size 800x18
     27          RenderBlock {DIV} at (0,18) size 784x18
    2128            RenderText {#text} at (0,0) size 90x18
    2229              text run at (0,0) width 90: "DIV5 - flowC"
     30  Regions for flow 'flowC'
     31    RenderRegion {DIV} #REGION3 with index 0
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer-layer.html

    r91760 r92969  
    1919        z-index: -1;
    2020    }
     21   
     22    #REGION1, #REGION2, #REGION3 {
     23        width: 100%;
     24        height: 100px;
     25    }
     26    #REGION1 { content: -webkit-from-flow('flowA'); }
     27    #REGION2 { content: -webkit-from-flow('flowB'); }
     28    #REGION3 { content: -webkit-from-flow('flowC'); }
    2129</style>
    2230
     
    3038</div>
    3139
     40<!-- Make some regions, so that the flow has a size and it's visible in the render tree. -->
     41<div id="REGION1"></div>
     42<div id="REGION2"></div>
     43<div id="REGION3"></div>
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer-nested-expected.txt

    r91760 r92969  
    11layer at (0,0) size 800x600
    22  RenderView at (0,0) size 800x600
    3 layer at (0,0) size 800x8
    4   RenderBlock {HTML} at (0,0) size 800x8
    5     RenderBody {BODY} at (8,8) size 784x0
     3layer at (0,0) size 800x216
     4  RenderBlock {HTML} at (0,0) size 800x216
     5    RenderBody {BODY} at (8,8) size 784x200
     6      RenderRegion {DIV} at (0,0) size 784x100
     7      RenderRegion {DIV} at (0,100) size 784x100
    68Flow Threads
    79  Thread with flow-name 'flowA'
    8     layer at (0,0) size 800x600
    9       RenderFlowThread at (0,0) size 800x600
    10         RenderBlock {DIV} at (0,0) size 800x18
    11           RenderBlock (anonymous) at (0,0) size 800x18
     10    layer at (0,0) size 784x100
     11      RenderFlowThread at (0,0) size 784x100
     12        RenderBlock {DIV} at (0,0) size 784x18
     13          RenderBlock (anonymous) at (0,0) size 784x18
    1214            RenderText {#text} at (0,0) size 91x18
    1315              text run at (0,0) width 91: "DIV1 - flowA"
    1416            RenderText {#text} at (0,0) size 0x0
    15           RenderBlock {P} at (0,34) size 800x0
    16           RenderBlock {P} at (0,34) size 800x0
    17         RenderBlock {DIV} at (0,34) size 800x18
     17          RenderBlock {P} at (0,34) size 784x0
     18          RenderBlock {P} at (0,34) size 784x0
     19        RenderBlock {DIV} at (0,34) size 784x18
    1820          RenderText {#text} at (0,0) size 91x18
    1921            text run at (0,0) width 91: "DIV3 - flowA"
     22  Regions for flow 'flowA'
     23    RenderRegion {DIV} #REGION1 with index 0
    2024  Thread with flow-name 'flowB'
    21     layer at (0,0) size 800x600
    22       RenderFlowThread at (0,0) size 800x600
    23         RenderBlock {DIV} at (0,0) size 800x18
     25    layer at (0,0) size 784x100
     26      RenderFlowThread at (0,0) size 784x100
     27        RenderBlock {DIV} at (0,0) size 784x18
    2428          RenderText {#text} at (0,0) size 90x18
    2529            text run at (0,0) width 90: "DIV2 - flowB"
     30  Regions for flow 'flowB'
     31    RenderRegion {DIV} #REGION2 with index 0
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer-nested.html

    r91760 r92969  
    44#DIV1, #DIV3 { -webkit-flow:'flowA'; }
    55#DIV2 { -webkit-flow:'flowB'; }
     6
     7#REGION1, #REGION2 {
     8    width: 100%;
     9    height: 100px;
     10}
     11#REGION1 { content: -webkit-from-flow('flowA'); }
     12#REGION2 { content: -webkit-from-flow('flowB'); }
    613</style>
    714
     
    1320    </p>
    1421</div>
     22
     23<!-- Make some regions, so that the flow has a size and it's visible in the render tree. -->
     24<div id="REGION1"></div>
     25<div id="REGION2"></div>
  • trunk/LayoutTests/fast/regions/webkit-flow-renderer.html

    r91760 r92969  
    55#SPAN2 { -webkit-flow: 'flowB'; }
    66#DIV3 { -webkit-flow: 'flowC'; }
     7
     8#REGION1, #REGION2, #REGION3 {
     9    width: 100%;
     10    height: 100px;
     11}
     12#REGION1 { content: -webkit-from-flow('flowA'); }
     13#REGION2 { content: -webkit-from-flow('flowB'); }
     14#REGION3 { content: -webkit-from-flow('flowC'); }
    715</style>
    816
     
    1018<span id="SPAN2">SPAN2 - flowB</span>
    1119<div id="DIV3">DIV3 - flowC</div>
     20
     21<!-- Make some regions, so that the flow has a size and it's visible in the render tree. -->
     22<div id="REGION1"></div>
     23<div id="REGION2"></div>
     24<div id="REGION3"></div>
    1225
    1326<script>
  • trunk/Source/WebCore/ChangeLog

    r92966 r92969  
     12011-08-12  Alexandru Chiculita  <achicu@adobe.com>
     2
     3        Original patch by Mihnea Ovidenie <mihnea@adobe.com>.
     4        Also contains some improvements done by Dave Hyatt <hyatt@apple.com>.
     5
     6        [CSSRegions]RenderFlowThread should display its content using RenderRegion
     7        https://bugs.webkit.org/show_bug.cgi?id=65627
     8
     9        RenderFlowThread collects RenderObjects from a flow. These objects are displayed by means
     10        of RenderRegion objects that get the content from the same flow.
     11
     12        Reviewed by David Hyatt.
     13
     14        Tests: fast/regions/content-flowed-into-regions-dynamically-added.html
     15               fast/regions/content-flowed-into-regions-dynamically-removed.html
     16               fast/regions/content-flowed-into-regions-with-dyn-index.html
     17               fast/regions/content-flowed-into-regions-with-index-dom.html
     18               fast/regions/content-flowed-into-regions-with-index.html
     19               fast/regions/content-flowed-into-regions.html
     20               fast/regions/flow-content-basic-vertical-rl.html
     21               fast/regions/flow-content-basic-vertical.html
     22
     23        * dom/Node.cpp:
     24        (WebCore::Node::diff):
     25        * rendering/RenderFlowThread.cpp:
     26        (WebCore::RenderFlowThread::RenderFlowThread):
     27        (WebCore::RenderFlowThread::createFlowThreadStyle):
     28        (WebCore::RenderFlowThread::styleDidChange):
     29        (WebCore::compareRenderRegions):
     30        (WebCore::RenderFlowThread::addRegionToThread):
     31        (WebCore::RenderFlowThread::removeRegionFromThread):
     32        (WebCore::RenderFlowThread::layout):
     33        (WebCore::RenderFlowThread::computeLogicalWidth):
     34        (WebCore::RenderFlowThread::computeLogicalHeight):
     35        (WebCore::RenderFlowThread::paintIntoRegion):
     36        * rendering/RenderFlowThread.h:
     37        * rendering/RenderObject.cpp:
     38        (WebCore::RenderObject::createObject):
     39        * rendering/RenderRegion.cpp:
     40        (WebCore::RenderRegion::RenderRegion):
     41        (WebCore::RenderRegion::~RenderRegion):
     42        (WebCore::RenderRegion::paint):
     43        (WebCore::RenderRegion::styleDidChange):
     44        * rendering/RenderRegion.h:
     45        (WebCore::RenderRegion::setRegionRect):
     46        (WebCore::RenderRegion::regionRect):
     47        * rendering/RenderTreeAsText.cpp:
     48        (WebCore::writeLayers):
     49        * rendering/RenderView.cpp:
     50        (WebCore::RenderView::styleDidChange):
     51        (WebCore::RenderView::renderFlowThreadWithName):
     52        * rendering/RenderView.h:
     53
    1542011-08-12  Abhishek Arya  <inferno@chromium.org>
    255
  • trunk/Source/WebCore/dom/Node.cpp

    r92792 r92969  
    365365    // we need to prepare a separate render region object.
    366366    if ((s1 && s2) && ((s1->regionThread() != s2->regionThread() || (s1->regionIndex() != s2->regionIndex()))))
    367             ch = Detach;
     367        ch = Detach;
    368368
    369369    return ch;
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r92792 r92969  
    3232#include "RenderFlowThread.h"
    3333#include "Node.h"
     34#include "PaintInfo.h"
     35#include "RenderRegion.h"
    3436
    3537namespace WebCore {
    3638
    3739RenderFlowThread::RenderFlowThread(Node* node, const AtomicString& flowThread)
    38       : RenderBlock(node)
    39       , m_flowThread(flowThread)
     40    : RenderBlock(node)
     41    , m_flowThread(flowThread)
     42    , m_regionsInvalidated(false)
    4043{
    4144    setIsAnonymous(false);
    42     setStyle(createFlowThreadStyle());
    43 }
    44 
    45 PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle()
     45}
     46
     47PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle(RenderStyle* parentStyle)
    4648{
    4749    RefPtr<RenderStyle> newStyle(RenderStyle::create());
     50    newStyle->inheritFrom(parentStyle);
    4851    newStyle->setDisplay(BLOCK);
    4952    newStyle->setPosition(AbsolutePosition);
     
    5962}
    6063
     64void RenderFlowThread::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
     65{
     66    RenderBlock::styleDidChange(diff, oldStyle);
     67
     68    if (oldStyle && oldStyle->writingMode() != style()->writingMode())
     69        m_regionsInvalidated = true;
     70}
     71
    6172RenderObject* RenderFlowThread::nextRendererForNode(Node* node) const
    6273{
     
    111122}
    112123
     124// Compare two regions to determine in which one the content should flow first.
     125// The function returns true if the first passed region is "less" than the second passed region.
     126// If the first region index < second region index, then the first region is "less" than the second region.
     127// If the first region index == second region index and first region appears before second region in DOM,
     128// the first region is "less" than the second region.
     129// If the first region is "less" than the second region, the first region receives content before second region.
     130static bool compareRenderRegions(const RenderRegion* firstRegion, const RenderRegion* secondRegion)
     131{
     132    ASSERT(firstRegion);
     133    ASSERT(secondRegion);
     134
     135    // First, compare only region-index properties.
     136    if (firstRegion->style()->regionIndex() != secondRegion->style()->regionIndex())
     137        return (firstRegion->style()->regionIndex() < secondRegion->style()->regionIndex());
     138
     139    // If the regions have the same region-index, compare their position in dom.
     140    ASSERT(firstRegion->node());
     141    ASSERT(secondRegion->node());
     142
     143    unsigned short position = firstRegion->node()->compareDocumentPosition(secondRegion->node());
     144    return (position & Node::DOCUMENT_POSITION_FOLLOWING);
     145}
     146
     147void RenderFlowThread::addRegionToThread(RenderRegion* renderRegion)
     148{
     149    ASSERT(renderRegion);
     150    if (m_regionList.isEmpty())
     151        m_regionList.add(renderRegion);
     152    else {
     153        // Find the first region "greater" than renderRegion.
     154        RenderRegionList::iterator it = m_regionList.begin();
     155        while (it != m_regionList.end() && !compareRenderRegions(renderRegion, *it))
     156            ++it;
     157        m_regionList.insertBefore(it, renderRegion);
     158    }
     159
     160    invalidateRegions();
     161}
     162
     163void RenderFlowThread::removeRegionFromThread(RenderRegion* renderRegion)
     164{
     165    ASSERT(renderRegion);
     166    m_regionList.remove(renderRegion);
     167
     168    invalidateRegions();
     169}
     170
     171void RenderFlowThread::layout()
     172{
     173    if (m_regionsInvalidated) {
     174        m_regionsInvalidated = false;
     175        if (hasRegions()) {
     176            int logicalHeight = 0;
     177            for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     178                RenderRegion* region = *iter;
     179
     180                ASSERT(!region->needsLayout());
     181
     182                IntRect regionRect;
     183                if (isHorizontalWritingMode()) {
     184                    regionRect = IntRect(0, logicalHeight, region->contentWidth(), region->contentHeight());
     185                    logicalHeight += regionRect.height();
     186                } else {
     187                    regionRect = IntRect(logicalHeight, 0, region->contentWidth(), region->contentHeight());
     188                    logicalHeight += regionRect.width();
     189                }
     190
     191                region->setRegionRect(regionRect);               
     192            }
     193        }
     194    }
     195
     196    RenderBlock::layout();
     197}
     198
     199void RenderFlowThread::computeLogicalWidth()
     200{
     201    int logicalWidth = 0;
     202
     203    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     204        RenderRegion* region = *iter;
     205        ASSERT(!region->needsLayout());
     206        logicalWidth = max(isHorizontalWritingMode() ? region->contentWidth() : region->contentHeight(), logicalWidth);
     207    }
     208
     209    setLogicalWidth(logicalWidth);
     210}
     211
     212void RenderFlowThread::computeLogicalHeight()
     213{
     214    int logicalHeight = 0;
     215
     216    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     217        RenderRegion* region = *iter;
     218        ASSERT(!region->needsLayout());
     219        logicalHeight += isHorizontalWritingMode() ? region->contentHeight() : region->contentWidth();
     220    }
     221
     222    setLogicalHeight(logicalHeight);
     223}
     224
     225void RenderFlowThread::paintIntoRegion(PaintInfo& paintInfo, const LayoutRect& regionRect, const LayoutPoint& paintOffset)
     226{
     227    GraphicsContext* context = paintInfo.context;
     228    if (!context)
     229        return;
     230
     231    // Adjust the clipping rect for the region.
     232    // paintOffset contains the offset where the painting should occur
     233    // adjusted with the region padding and border.
     234    LayoutRect regionClippingRect(paintOffset, regionRect.size());
     235
     236    PaintInfo info(paintInfo);
     237    info.rect.intersect(regionClippingRect);
     238
     239    if (!info.rect.isEmpty()) {
     240        context->save();
     241
     242        context->clip(regionClippingRect);
     243
     244        // RenderFlowThread should start painting its content in a position that is offset
     245        // from the region rect's current position. The amount of offset is equal to the location of
     246        // region in flow coordinates.
     247        LayoutPoint renderFlowThreadOffset;
     248        if (style()->isFlippedBlocksWritingMode()) {
     249            LayoutRect flippedRegionRect(regionRect);
     250            flipForWritingMode(flippedRegionRect);
     251            renderFlowThreadOffset = LayoutPoint(regionClippingRect.location() - flippedRegionRect.location());
     252        } else
     253            renderFlowThreadOffset = LayoutPoint(regionClippingRect.location() - regionRect.location());
     254
     255        RenderBlock::paint(paintInfo, renderFlowThreadOffset);
     256
     257        context->restore();
     258    }
     259}
     260
    113261} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r92792 r92969  
    4141
    4242class RenderStyle;
     43class RenderRegion;
     44
     45typedef ListHashSet<RenderRegion*> RenderRegionList;
    4346
    4447// RenderFlowThread is used to collect all the render objects that participate in a
     
    5457    virtual bool isRenderFlowThread() const { return true; }
    5558
     59    virtual void layout();
     60
    5661    AtomicString flowThread() const { return m_flowThread; }
    5762
     
    6671    virtual void removeChild(RenderObject*);
    6772
     73    void addRegionToThread(RenderRegion*);
     74    void removeRegionFromThread(RenderRegion*);
     75    const RenderRegionList& renderRegionList() const { return m_regionList; }
     76
     77    void computeLogicalWidth();
     78    void computeLogicalHeight();
     79
     80    void paintIntoRegion(PaintInfo&, const LayoutRect&, const LayoutPoint&);
     81
     82    bool hasRegions() const { return m_regionList.size(); }
     83
     84    void invalidateRegions() { m_regionsInvalidated = true; setNeedsLayout(true); }
     85
     86    static PassRefPtr<RenderStyle> createFlowThreadStyle(RenderStyle* parentStyle);
     87
     88    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     89
    6890private:
    69     static PassRefPtr<RenderStyle> createFlowThreadStyle();
    70    
    7191    virtual const char* renderName() const { return "RenderFlowThread"; }
    72    
     92
    7393    typedef ListHashSet<RenderObject*> FlowThreadChildList;
    7494    FlowThreadChildList m_flowThreadChildList;
    75    
     95
    7696    AtomicString m_flowThread;
     97    RenderRegionList m_regionList;
     98    bool m_regionsInvalidated;
    7799};
    78100
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r92888 r92969  
    139139        case COMPACT:
    140140            // Only non-replaced block elements can become a region.
    141             if (!style->regionThread().isEmpty())
    142                 return new (arena) RenderRegion(node);
     141            if (!style->regionThread().isEmpty() && doc->renderView())
     142                return new (arena) RenderRegion(node, doc->renderView()->renderFlowThreadWithName(style->regionThread()));
    143143            return new (arena) RenderBlock(node);
    144144        case LIST_ITEM:
  • trunk/Source/WebCore/rendering/RenderRegion.cpp

    r92792 r92969  
    3434#include "IntRect.h"
    3535#include "PaintInfo.h"
     36#include "RenderFlowThread.h"
    3637#include "RenderView.h"
    3738
    3839namespace WebCore {
    3940
    40 RenderRegion::RenderRegion(Node* node)
    41 : RenderBox(node)
     41RenderRegion::RenderRegion(Node* node, RenderFlowThread* flowThread)
     42    : RenderBox(node)
     43    , m_flowThread(flowThread)
    4244{
     45    setReplaced(true);
    4346}
    4447
    4548RenderRegion::~RenderRegion()
    4649{
     50    if (m_flowThread && view())
     51        m_flowThread->removeRegionFromThread(this);
     52    m_flowThread = 0;
    4753}
    4854
     
    5965void RenderRegion::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
    6066{
    61     if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseMask && paintInfo.phase != PaintPhaseOutline
    62         && paintInfo.phase != PaintPhaseSelfOutline)
    63         return;
    64 
    6567    if (!paintInfo.shouldPaintWithinRoot(this))
    6668        return;
     
    8284    if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth())
    8385        paintOutline(paintInfo.context, paintRect);
     86
     87    // Delegate painting of content in region to RenderFlowThread.
     88    adjustedPaintOffset.move(borderLeft() + paddingLeft(), borderTop() + paddingTop());
     89    m_flowThread->paintIntoRegion(paintInfo, regionRect(), adjustedPaintOffset);
    8490}
    8591
    86 } // namespace WebCore
     92void RenderRegion::styleDidChange(StyleDifference difference, const RenderStyle* oldStyle)
     93{
     94    RenderBox::styleDidChange(difference, oldStyle);
     95    // This needs to be done here and not in the constructor, because RenderFlowThread
     96    // uses the style() property which is not yet initialized in the constructor.
     97    if (!oldStyle && m_flowThread)
     98        m_flowThread->addRegionToThread(this);
     99}
     100
     101} // namespace WebCre
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r92792 r92969  
    3535namespace WebCore {
    3636
     37class RenderFlowThread;
     38
    3739class RenderRegion : public RenderBox {
    3840public:
    39     explicit RenderRegion(Node*);
     41    explicit RenderRegion(Node*, RenderFlowThread*);
    4042    virtual ~RenderRegion();
    4143
     
    4547    virtual void paint(PaintInfo&, const LayoutPoint&);
    4648
     49    void setRegionRect(const IntRect& rect) { m_regionRect = rect; }
     50    IntRect regionRect() const { return m_regionRect; }
     51
    4752private:
    4853    virtual const char* renderName() const { return "RenderRegion"; }
     54
     55    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     56
     57    RenderFlowThread* m_flowThread;
     58    IntRect m_regionRect;
    4959};
    5060
  • trunk/Source/WebCore/rendering/RenderTreeAsText.cpp

    r92792 r92969  
    4545#include "RenderListMarker.h"
    4646#include "RenderPart.h"
     47#include "RenderRegion.h"
    4748#include "RenderTableCell.h"
    4849#include "RenderView.h"
     
    723724            RenderLayer* layer = renderFlowThread->layer();
    724725            writeLayers(ts, rootLayer, layer, paintDirtyRect, indent + 2, behavior);
     726
     727            // Display the render regions attached to this flow thread
     728            const RenderRegionList& flowThreadRegionList = renderFlowThread->renderRegionList();
     729            if (!flowThreadRegionList.isEmpty()) {
     730                writeIndent(ts, indent + 1);
     731                ts << "Regions for flow '"<< renderFlowThread->flowThread() << "'\n";
     732                for (RenderRegionList::const_iterator itRR = flowThreadRegionList.begin(); itRR != flowThreadRegionList.end(); ++itRR) {
     733                    RenderRegion* renderRegion = *itRR;
     734                    writeIndent(ts, indent + 2);
     735                    ts << "RenderRegion";
     736                    if (renderRegion->node()) {
     737                        String tagName = getTagName(renderRegion->node());
     738                        if (!tagName.isEmpty())
     739                            ts << " {" << tagName << "}";
     740                        if (renderRegion->node()->isElementNode() && renderRegion->node()->hasID()) {
     741                            Element* element = static_cast<Element*>(renderRegion->node());
     742                            ts << " #" << element->idForStyleResolution();
     743                        }
     744                    }
     745                    ts << " with index " << renderRegion->style()->regionIndex() << "\n";
     746                }
     747            }
    725748        }
    726749    }
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r92874 r92969  
    794794}
    795795
     796void RenderView::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
     797{
     798    RenderBlock::styleDidChange(diff, oldStyle);
     799   
     800    for (RenderObject* renderer = firstChild(); renderer; renderer = renderer->nextSibling()) {
     801        if (renderer->isRenderFlowThread()) {
     802            RenderFlowThread* flowRenderer = toRenderFlowThread(renderer);
     803            flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style()));
     804        }
     805    }
     806}
     807
    796808RenderFlowThread* RenderView::renderFlowThreadWithName(const AtomicString& flowThread)
    797809{
     
    805817
    806818    RenderFlowThread* flowRenderer = new (renderArena()) RenderFlowThread(document(), flowThread);
     819    flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style()));
    807820    addChild(flowRenderer);
    808821   
  • trunk/Source/WebCore/rendering/RenderView.h

    r92792 r92969  
    169169    RenderFlowThread* renderFlowThreadWithName(const AtomicString& flowThread);
    170170
     171    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     172   
    171173protected:
    172174    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, bool* wasFixed = 0) const;
Note: See TracChangeset for help on using the changeset viewer.