<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[167930] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/167930">167930</a></dd>
<dt>Author</dt> <dd>abucur@adobe.com</dd>
<dt>Date</dt> <dd>2014-04-29 07:54:47 -0700 (Tue, 29 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Regions] Fix getClientRects() for content nodes
https://bugs.webkit.org/show_bug.cgi?id=117407

Reviewed by David Hyatt.

Source/WebCore:
This patch modifies getClientRects() to return a list of fragments
for a fragmented box instead of a single rectangle positioned inside
the region where the box center would appear.

The approach is to split the border box of the element in regions using
the layout positioning. Then each fragment is mapped to the view coordinates
and the result added to the list of rectangles. To preserve the originating
region when mapping the fragment through the ancestor tree I've introduced
the concept of a current region. The current region is stored inside a
CurrentRenderRegionMaintainer object, created whenever an algorithm needing
it needs to run. When the maintainer is destroyed, the cleanup is made
automatically. The RenderFlowThread holds a pointer to this structure for
easy access.

Tests: fast/regions/cssom/client-rects-fixed-content.html
       fast/regions/cssom/client-rects-forced-breaks.html
       fast/regions/cssom/client-rects-inline-complex.html
       fast/regions/cssom/client-rects-inline.html
       fast/regions/cssom/client-rects-nested-regions.html
       fast/regions/cssom/client-rects-positioned.html
       fast/regions/cssom/client-rects-relative-position.html
       fast/regions/cssom/client-rects-simple-block.html
       fast/regions/cssom/client-rects-transforms.html
       fast/regions/cssom/client-rects-unsplittable-float.html

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::absoluteQuads): Split the box in fragments.
* rendering/RenderBox.cpp:
(WebCore::RenderBox::absoluteQuads): Split the box in fragments.
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::RenderFlowThread):
(WebCore::RenderFlowThread::mapFromFlowToRegion):
(WebCore::RenderFlowThread::mapLocalToContainer):
(WebCore::RenderFlowThread::currentRegion):
* rendering/RenderFlowThread.h:
* rendering/RenderNamedFlowFragment.cpp:
(WebCore::RenderNamedFlowFragment::absoluteQuadsForBoxInRegion): Get
the fragments for this box in the region.
* rendering/RenderNamedFlowFragment.h:
* rendering/RenderNamedFlowThread.cpp:
(WebCore::RenderNamedFlowThread::absoluteQuadsForBox): Virtual function
that can be used to implement fragments to client rects mapping.
* rendering/RenderNamedFlowThread.h:
* rendering/RenderRegion.cpp:
(WebCore::RenderRegion::rectFlowPortionForBox): Small change to correctly
map empty rectangles to containers.
(WebCore::CurrentRenderRegionMaintainer::CurrentRenderRegionMaintainer):
(WebCore::CurrentRenderRegionMaintainer::~CurrentRenderRegionMaintainer):
* rendering/RenderRegion.h:
(WebCore::RenderRegion::absoluteQuadsForBoxInRegion):
(WebCore::CurrentRenderRegionMaintainer::region):

LayoutTests:
Tests verifying getClientRects works correctly in different situations.

* fast/regions/cssom/client-rects-fixed-content-expected.txt: Added.
* fast/regions/cssom/client-rects-fixed-content.html: Added.
* fast/regions/cssom/client-rects-forced-breaks-expected.txt: Added.
* fast/regions/cssom/client-rects-forced-breaks.html: Added.
* fast/regions/cssom/client-rects-inline-complex-expected.txt: Added.
* fast/regions/cssom/client-rects-inline-complex.html: Added.
* fast/regions/cssom/client-rects-inline-expected.txt: Added.
* fast/regions/cssom/client-rects-inline.html: Added.
* fast/regions/cssom/client-rects-nested-regions-expected.txt: Added.
* fast/regions/cssom/client-rects-nested-regions.html: Added.
* fast/regions/cssom/client-rects-positioned-expected.txt: Added.
* fast/regions/cssom/client-rects-positioned.html: Added.
* fast/regions/cssom/client-rects-relative-position-expected.txt: Added.
* fast/regions/cssom/client-rects-relative-position.html: Added.
* fast/regions/cssom/client-rects-simple-block-expected.txt: Added.
* fast/regions/cssom/client-rects-simple-block.html: Added.
* fast/regions/cssom/client-rects-transforms-expected.txt: Added.
* fast/regions/cssom/client-rects-transforms.html: Added.
* fast/regions/cssom/client-rects-unsplittable-float-expected.txt: Added.
* fast/regions/cssom/client-rects-unsplittable-float.html: Added.
* fast/regions/resources/helper.js:
(testClientRects): Function that compares the actual client rects for an
element to a list of expected client rects.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastregionsresourceshelperjs">trunk/LayoutTests/fast/regions/resources/helper.js</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockcpp">trunk/Source/WebCore/rendering/RenderBlock.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadcpp">trunk/Source/WebCore/rendering/RenderFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadh">trunk/Source/WebCore/rendering/RenderFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmenth">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadcpp">trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadh">trunk/Source/WebCore/rendering/RenderNamedFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderRegioncpp">trunk/Source/WebCore/rendering/RenderRegion.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderRegionh">trunk/Source/WebCore/rendering/RenderRegion.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsfixedcontentexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsfixedcontenthtml">trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsforcedbreaksexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsforcedbreakshtml">trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsinlinecomplexexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsinlinecomplexhtml">trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsinlineexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-inline-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsinlinehtml">trunk/LayoutTests/fast/regions/cssom/client-rects-inline.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsnestedregionsexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsnestedregionshtml">trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectspositionedexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-positioned-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectspositionedhtml">trunk/LayoutTests/fast/regions/cssom/client-rects-positioned.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsrelativepositionexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsrelativepositionhtml">trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectssimpleblockexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectssimpleblockhtml">trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectstransformsexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-transforms-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectstransformshtml">trunk/LayoutTests/fast/regions/cssom/client-rects-transforms.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsunsplittablefloatexpectedtxt">trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomclientrectsunsplittablefloathtml">trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/LayoutTests/ChangeLog        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -1,5 +1,38 @@
</span><span class="cx"> 2014-04-29  Andrei Bucur  &lt;abucur@adobe.com&gt;
</span><span class="cx"> 
</span><ins>+        [CSS Regions] Fix getClientRects() for content nodes
+        https://bugs.webkit.org/show_bug.cgi?id=117407
+
+        Reviewed by David Hyatt.
+
+        Tests verifying getClientRects works correctly in different situations.
+
+        * fast/regions/cssom/client-rects-fixed-content-expected.txt: Added.
+        * fast/regions/cssom/client-rects-fixed-content.html: Added.
+        * fast/regions/cssom/client-rects-forced-breaks-expected.txt: Added.
+        * fast/regions/cssom/client-rects-forced-breaks.html: Added.
+        * fast/regions/cssom/client-rects-inline-complex-expected.txt: Added.
+        * fast/regions/cssom/client-rects-inline-complex.html: Added.
+        * fast/regions/cssom/client-rects-inline-expected.txt: Added.
+        * fast/regions/cssom/client-rects-inline.html: Added.
+        * fast/regions/cssom/client-rects-nested-regions-expected.txt: Added.
+        * fast/regions/cssom/client-rects-nested-regions.html: Added.
+        * fast/regions/cssom/client-rects-positioned-expected.txt: Added.
+        * fast/regions/cssom/client-rects-positioned.html: Added.
+        * fast/regions/cssom/client-rects-relative-position-expected.txt: Added.
+        * fast/regions/cssom/client-rects-relative-position.html: Added.
+        * fast/regions/cssom/client-rects-simple-block-expected.txt: Added.
+        * fast/regions/cssom/client-rects-simple-block.html: Added.
+        * fast/regions/cssom/client-rects-transforms-expected.txt: Added.
+        * fast/regions/cssom/client-rects-transforms.html: Added.
+        * fast/regions/cssom/client-rects-unsplittable-float-expected.txt: Added.
+        * fast/regions/cssom/client-rects-unsplittable-float.html: Added.
+        * fast/regions/resources/helper.js: 
+        (testClientRects): Function that compares the actual client rects for an
+        element to a list of expected client rects.
+
+2014-04-29  Andrei Bucur  &lt;abucur@adobe.com&gt;
+
</ins><span class="cx">         Store the containing region map inside the flow thread
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131647
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsfixedcontentexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsfixedcontenthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-fixed-content.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+        position: fixed;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[0, 0, 20, 500, 500, 20]];
+
+        if (testClientRects(&quot;content&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsforcedbreaksexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+PASS
+
+PASS
+
+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsforcedbreakshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-forced-breaks.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: auto;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: auto;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: auto;
+    }
+
+    #float {
+        float: left;
+        width: 30px;
+        height: 150px;
+        overflow: auto;
+        background-color: blue;
+    }
+
+    #testMe {
+        -webkit-region-break-before: always;
+        -webkit-region-break-after: always;
+    }
+
+    #before {
+        -webkit-region-break-after: always;
+        width: 50px;
+        height: 50px;
+        background-color: green;
+    }
+
+    #after {
+        -webkit-region-break-after: always;
+        width: 70px;
+        height: 70px;
+        background-color: blue;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;div id=&quot;before&quot;&gt;&lt;/div&gt;&lt;div id=&quot;after&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var contentClientRects = [[11, 11, 61, 111, 100, 50], [31, 121, 101, 271, 150, 70]];
+        var beforeClientRects = [[11, 11, 61, 61, 50, 50]];
+        var afterClientRects = [[31, 121, 101, 191, 70, 70]];
+
+        var ok = testClientRects(&quot;content&quot;, contentClientRects);
+        ok = testClientRects(&quot;before&quot;, beforeClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;after&quot;, afterClientRects) &amp;&amp; ok;
+        if (ok)
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsinlinecomplexexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+PASS
+
+PASS
+
+PASS
+
+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsinlinecomplexhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-inline-complex.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 200px;
+        height: 210px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 220px;
+        width: 250px;
+        height: 100px;
+    }
+
+    #inlineBlock {
+        display: inline-block;
+        width: 80px;
+        height: 80px;
+        padding: 5px;
+        border: thin solid blue;
+    }
+
+    #insideInlineBlock {
+        display: block;
+        border: thin solid green;
+    }
+
+    #image {
+        width: 300px;
+        height: 400px;
+        border: thin solid purple;
+        margin: 10px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span&gt;X X X X X X X X X X X X &lt;div id=&quot;inlineBlock&quot;&gt;&lt;div id=&quot;insideInlineBlock&quot;&gt;&lt;img id=&quot;image&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;/div&gt; X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var contentClientRects = [[11, 11, 221, 211, 200, 210], [31, 221, 51, 471, 250, 20]];
+        var inlineBlockClientRects = [[51, 91, 143, 183, 92, 92]];
+        var insideInlineBlockClientRects = [[57, 97, 485, 177, 80, 428]];
+        var imageClientRects = [[68, 108, 470, 410, 302, 402]];
+
+        var ok = testClientRects(&quot;content&quot;, contentClientRects);
+        ok = testClientRects(&quot;inlineBlock&quot;, inlineBlockClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;insideInlineBlock&quot;, insideInlineBlockClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;image&quot;, imageClientRects) &amp;&amp; ok;
+        if (ok)
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsinlineexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-inline-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-inline-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-inline-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsinlinehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-inline.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-inline.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-inline.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished .content {
+        display: none;
+    }
+
+    .content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div class=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[11, 11, 31, 111, 100, 20], [31, 11, 51, 111, 100, 20], [31, 121, 51, 261, 140, 20],
+                                    [51, 121, 71, 261, 140, 20], [71, 121, 91, 261, 140, 20], [91, 121, 111, 141, 20, 20]];
+
+        if (testClientRects(&quot;testMe&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsnestedregionsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+PASS
+
+PASS
+
+PASS
+
+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsnestedregionshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-nested-regions.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,96 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content, .finished #innerContent {
+        display: none;
+    }
+
+    #innerContent {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    #content {
+        -webkit-flow-into: flow2;
+    }
+
+    .region {
+        -webkit-flow-from: flow2;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: auto;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: auto;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #before {
+        -webkit-region-break-after: always;
+        width: 50px;
+        height: 50px;
+        background-color: green;
+        -webkit-flow-from: flow;
+    }
+
+    #after {
+        -webkit-region-break-after: always;
+        width: 70px;
+        height: 70px;
+        background-color: blue;
+        -webkit-flow-from: flow;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;innerContent&quot;&gt;X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X&lt;/div&gt;
+    &lt;div id=&quot;content&quot;&gt;
+        &lt;div id=&quot;before&quot;&gt;&lt;/div&gt;&lt;div id=&quot;after&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var contentClientRects = [[11, 11, 61, 111, 100, 50], [31, 121, 101, 271, 150, 70]];
+        var beforeClientRects = [[11, 11, 61, 61, 50, 50]];
+        var afterClientRects = [[31, 121, 101, 191, 70, 70]];
+        var innerContentClientRects = [[11, 11, 61, 61, 50, 50], [31, 121, 411, 191, 70, 380]];
+
+        var ok = testClientRects(&quot;content&quot;, contentClientRects);
+        ok = testClientRects(&quot;before&quot;, beforeClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;after&quot;, afterClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;innerContent&quot;, innerContentClientRects) &amp;&amp; ok;
+        if (ok)
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectspositionedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-positioned-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-positioned-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-positioned-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectspositionedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-positioned.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-positioned.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-positioned.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+        position: absolute;
+        top: 60px;
+        left: 70px;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[41, 191, 131, 271, 80, 90], [41, 371, 561, 401, 30, 520]];
+
+        if (testClientRects(&quot;content&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsrelativepositionexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsrelativepositionhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-relative-position.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+        position: relative;
+        top: 200px;
+        left: 40px;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[211, 51, 261, 151, 100, 50], [231, 161, 311, 311, 150, 80]];
+
+        if (testClientRects(&quot;content&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectssimpleblockexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectssimpleblockhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-simple-block.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[11, 11, 61, 111, 100, 50], [31, 121, 111, 271, 150, 80]];
+
+        if (testClientRects(&quot;content&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectstransformsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-transforms-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-transforms-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-transforms-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectstransformshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-transforms.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-transforms.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-transforms.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+        -webkit-transform: translateX(50px) translateY(50px);
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: 100px;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X&lt;/span&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var expectedClientRects = [[61, 61, 111, 161, 100, 50], [81, 171, 181, 321, 150, 100], [91, 351, 151, 451, 100, 60]];
+
+        if (testClientRects(&quot;content&quot;, expectedClientRects))
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsunsplittablefloatexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float-expected.txt (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float-expected.txt        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+PASS
+
+PASS
+
+PASS
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomclientrectsunsplittablefloathtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float.html (0 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float.html                                (rev 0)
+++ trunk/LayoutTests/fast/regions/cssom/client-rects-unsplittable-float.html        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../resources/helper.js&quot;&gt;&lt;/script&gt;
+    &lt;title&gt;117407 - [CSS Regions] Fix getClientRects() for content nodes&lt;/title&gt;
+    &lt;style&gt;
+    body, html {
+        margin: 0px;
+    }
+
+    .finished .region, .finished #content {
+        display: none;
+    }
+
+    #content {
+        font-family: Ahem;
+        font-size: 20px;
+        -webkit-flow-into: flow;
+    }
+
+    .region {
+        -webkit-flow-from: flow;
+        position: absolute;
+        border: 1px solid black;
+    }
+
+    #region1 {
+        top: 10px;
+        left: 10px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #region2 {
+        top: 30px;
+        left: 120px;
+        width: 150px;
+        height: auto;
+    }
+
+    #region3 {
+        top: 40px;
+        left: 300px;
+        width: 100px;
+        height: 50px;
+    }
+
+    #float {
+        float: left;
+        width: 30px;
+        height: 150px;
+        overflow: auto;
+        background-color: blue;
+    }
+
+    #testMe {
+        -webkit-region-break-before: always;
+        -webkit-region-break-after: always;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;content&quot;&gt;
+    &lt;span&gt;X X X X X X X X X X X X X&lt;/span&gt;&lt;div id=&quot;float&quot;&gt;&lt;/div&gt;&lt;div id=&quot;testMe&quot;&gt;X X X X X X X X X X X X X&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div id=&quot;region1&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region2&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+    &lt;div id=&quot;region3&quot; class=&quot;region&quot;&gt;&lt;/div&gt;
+
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+        
+        var contentClientRects = [[11, 11, 61, 111, 100, 50], [31, 121, 71, 271, 150, 40], [41, 301, 181, 401, 100, 140]];
+        var floatClientRects = [[51, 121, 201, 151, 30, 150]];
+        var testMeClientRects = [[41, 301, 181, 401, 100, 140]];
+
+        var ok = testClientRects(&quot;content&quot;, contentClientRects);
+        ok = testClientRects(&quot;float&quot;, floatClientRects) &amp;&amp; ok;
+        ok = testClientRects(&quot;testMe&quot;, testMeClientRects) &amp;&amp; ok;
+        if (ok)
+            document.body.className = &quot;finished&quot;;
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastregionsresourceshelperjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/resources/helper.js (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/resources/helper.js        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/LayoutTests/fast/regions/resources/helper.js        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -76,6 +76,28 @@
</span><span class="cx">     return !results.length;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function testClientRects(id, expectedClientRects, tolerance)
+{
+    if (tolerance === undefined)
+        tolerance = 0;
+
+    var results = [];
+    var actualRects = document.getElementById(id).getClientRects();
+    if (actualRects.length != expectedClientRects.length)
+        results.push(&quot;FAIL: The element #&quot; + id + &quot; has a wrong count of client rects: &quot; + actualRects.length + &quot;(actual) vs. &quot; + expectedClientRects.length + &quot;(expected)&quot;);
+    else {
+        for (var i = 0; i &lt; expectedClientRects.length; ++i) {
+            var expectedRect = expectedClientRects[i];
+            var actualRect = actualRects[i];
+            assertEqualRects(results, id, rectToArray(actualRect), expectedRect, tolerance);
+        }
+    }
+
+    document.write(&quot;&lt;p&gt;&quot; + (results.length ? results.join(&quot;&lt;br /&gt;&quot;) : &quot;PASS&quot;) + &quot;&lt;/p&gt;&quot;);
+    
+    return !results.length;
+}
+
</ins><span class="cx"> function assertRectContains(results, name, containerRect, insideRect, tolerance)
</span><span class="cx"> {
</span><span class="cx">     // make the container rect bigger with tolerance
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/ChangeLog        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -1,5 +1,64 @@
</span><span class="cx"> 2014-04-29  Andrei Bucur  &lt;abucur@adobe.com&gt;
</span><span class="cx"> 
</span><ins>+        [CSS Regions] Fix getClientRects() for content nodes
+        https://bugs.webkit.org/show_bug.cgi?id=117407
+
+        Reviewed by David Hyatt.
+
+        This patch modifies getClientRects() to return a list of fragments
+        for a fragmented box instead of a single rectangle positioned inside
+        the region where the box center would appear.
+
+        The approach is to split the border box of the element in regions using
+        the layout positioning. Then each fragment is mapped to the view coordinates
+        and the result added to the list of rectangles. To preserve the originating
+        region when mapping the fragment through the ancestor tree I've introduced
+        the concept of a current region. The current region is stored inside a
+        CurrentRenderRegionMaintainer object, created whenever an algorithm needing
+        it needs to run. When the maintainer is destroyed, the cleanup is made
+        automatically. The RenderFlowThread holds a pointer to this structure for
+        easy access.
+
+        Tests: fast/regions/cssom/client-rects-fixed-content.html
+               fast/regions/cssom/client-rects-forced-breaks.html
+               fast/regions/cssom/client-rects-inline-complex.html
+               fast/regions/cssom/client-rects-inline.html
+               fast/regions/cssom/client-rects-nested-regions.html
+               fast/regions/cssom/client-rects-positioned.html
+               fast/regions/cssom/client-rects-relative-position.html
+               fast/regions/cssom/client-rects-simple-block.html
+               fast/regions/cssom/client-rects-transforms.html
+               fast/regions/cssom/client-rects-unsplittable-float.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::absoluteQuads): Split the box in fragments.
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::absoluteQuads): Split the box in fragments.
+        * rendering/RenderFlowThread.cpp:
+        (WebCore::RenderFlowThread::RenderFlowThread):
+        (WebCore::RenderFlowThread::mapFromFlowToRegion):
+        (WebCore::RenderFlowThread::mapLocalToContainer):
+        (WebCore::RenderFlowThread::currentRegion):
+        * rendering/RenderFlowThread.h:
+        * rendering/RenderNamedFlowFragment.cpp:
+        (WebCore::RenderNamedFlowFragment::absoluteQuadsForBoxInRegion): Get
+        the fragments for this box in the region.
+        * rendering/RenderNamedFlowFragment.h:
+        * rendering/RenderNamedFlowThread.cpp:
+        (WebCore::RenderNamedFlowThread::absoluteQuadsForBox): Virtual function
+        that can be used to implement fragments to client rects mapping.
+        * rendering/RenderNamedFlowThread.h:
+        * rendering/RenderRegion.cpp:
+        (WebCore::RenderRegion::rectFlowPortionForBox): Small change to correctly
+        map empty rectangles to containers.
+        (WebCore::CurrentRenderRegionMaintainer::CurrentRenderRegionMaintainer):
+        (WebCore::CurrentRenderRegionMaintainer::~CurrentRenderRegionMaintainer):
+        * rendering/RenderRegion.h:
+        (WebCore::RenderRegion::absoluteQuadsForBoxInRegion):
+        (WebCore::CurrentRenderRegionMaintainer::region):
+
+2014-04-29  Andrei Bucur  &lt;abucur@adobe.com&gt;
+
</ins><span class="cx">         Store the containing region map inside the flow thread
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131647
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -4698,15 +4698,18 @@
</span><span class="cx">     // For blocks inside inlines, we go ahead and include margins so that we run right up to the
</span><span class="cx">     // inline boxes above and below us (thus getting merged with them to form a single irregular
</span><span class="cx">     // shape).
</span><del>-    if (isAnonymousBlockContinuation()) {
-        // FIXME: This is wrong for block-flows that are horizontal.
-        // https://bugs.webkit.org/show_bug.cgi?id=46781
-        FloatRect localRect(0, -collapsedMarginBefore(),
-                            width(), height() + collapsedMarginBefore() + collapsedMarginAfter());
</del><ins>+    FloatRect localRect = isAnonymousBlockContinuation() 
+        ? FloatRect(0, -collapsedMarginBefore(), width(), height() + collapsedMarginBefore() + collapsedMarginAfter())
+        : FloatRect(0, 0, width(), height());
+    
+    // FIXME: This is wrong for block-flows that are horizontal.
+    // https://bugs.webkit.org/show_bug.cgi?id=46781
+    RenderFlowThread* flowThread = flowThreadContainingBlock();
+    if (!flowThread || !flowThread-&gt;absoluteQuadsForBox(quads, wasFixed, this, localRect.y(), localRect.maxY()))
</ins><span class="cx">         quads.append(localToAbsoluteQuad(localRect, 0 /* mode */, wasFixed));
</span><ins>+
+    if (isAnonymousBlockContinuation())
</ins><span class="cx">         continuation()-&gt;absoluteQuads(quads, wasFixed);
</span><del>-    } else
-        quads.append(RenderBox::localToAbsoluteQuad(FloatRect(0, 0, width(), height()), 0 /* mode */, wasFixed));
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LayoutRect RenderBlock::rectWithOutlineForRepaint(const RenderLayerModelObject* repaintContainer, LayoutUnit outlineWidth) const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -555,7 +555,13 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderBox::absoluteQuads(Vector&lt;FloatQuad&gt;&amp; quads, bool* wasFixed) const
</span><span class="cx"> {
</span><del>-    quads.append(localToAbsoluteQuad(FloatRect(0, 0, width(), height()), 0 /* mode */, wasFixed));
</del><ins>+    FloatRect localRect(0, 0, width(), height());
+
+    RenderFlowThread* flowThread = flowThreadContainingBlock();
+    if (flowThread &amp;&amp; flowThread-&gt;absoluteQuadsForBox(quads, wasFixed, this, localRect.y(), localRect.maxY()))
+        return;
+
+    quads.append(localToAbsoluteQuad(localRect, 0 /* mode */, wasFixed));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBox::updateLayerTransform()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">     : RenderBlockFlow(document, std::move(style))
</span><span class="cx">     , m_previousRegionCount(0)
</span><span class="cx">     , m_autoLogicalHeightRegionsCount(0)
</span><ins>+    , m_currentRegionMaintainer(nullptr)
</ins><span class="cx">     , m_regionsInvalidated(false)
</span><span class="cx">     , m_regionsHaveUniformLogicalWidth(true)
</span><span class="cx">     , m_regionsHaveUniformLogicalHeight(true)
</span><span class="lines">@@ -542,18 +543,17 @@
</span><span class="cx">     if (!hasValidRegionInfo())
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    LayoutRect boxRect = transformState.mappedQuad().enclosingBoundingBox();
-    flipForWritingMode(boxRect);
</del><ins>+    RenderRegion* renderRegion = currentRegion();
+    if (!renderRegion) {
+        LayoutRect boxRect = transformState.mappedQuad().enclosingBoundingBox();
+        flipForWritingMode(boxRect);
</ins><span class="cx"> 
</span><del>-    // FIXME: We need to refactor RenderObject::absoluteQuads to be able to split the quads across regions,
-    // for now we just take the center of the mapped enclosing box and map it to a region.
-    // Note: Using the center in order to avoid rounding errors.
</del><ins>+        LayoutPoint center = boxRect.center();
+        renderRegion = const_cast&lt;RenderFlowThread*&gt;(this)-&gt;regionAtBlockOffset(this, isHorizontalWritingMode() ? center.y() : center.x(), true, DisallowRegionAutoGeneration);
+        if (!renderRegion)
+            return 0;
+    }
</ins><span class="cx"> 
</span><del>-    LayoutPoint center = boxRect.center();
-    RenderRegion* renderRegion = const_cast&lt;RenderFlowThread*&gt;(this)-&gt;regionAtBlockOffset(this, isHorizontalWritingMode() ? center.y() : center.x(), true, DisallowRegionAutoGeneration);
-    if (!renderRegion)
-        return 0;
-
</del><span class="cx">     LayoutRect flippedRegionRect(renderRegion-&gt;flowThreadPortionRect());
</span><span class="cx">     flipForWritingMode(flippedRegionRect);
</span><span class="cx"> 
</span><span class="lines">@@ -1223,7 +1223,23 @@
</span><span class="cx"> 
</span><span class="cx">     if (RenderRegion* region = mapFromFlowToRegion(transformState)) {
</span><span class="cx">         // FIXME: The cast below is probably not the best solution, we may need to find a better way.
</span><del>-        static_cast&lt;const RenderObject*&gt;(region)-&gt;mapLocalToContainer(region-&gt;containerForRepaint(), transformState, mode, wasFixed);
</del><ins>+        const RenderObject* regionObject = static_cast&lt;const RenderObject*&gt;(region);
+
+        // If the repaint container is nullptr, we have to climb up to the RenderView, otherwise swap
+        // it with the region's repaint container.
+        repaintContainer = repaintContainer ? region-&gt;containerForRepaint() : nullptr;
+
+        if (RenderFlowThread* regionFlowThread = region-&gt;flowThreadContainingBlock()) {
+            RenderRegion* startRegion = nullptr;
+            RenderRegion* endRegion = nullptr;
+            if (regionFlowThread-&gt;getRegionRangeForBox(region, startRegion, endRegion)) {
+                CurrentRenderRegionMaintainer regionMaintainer(*startRegion);
+                regionObject-&gt;mapLocalToContainer(repaintContainer, transformState, mode, wasFixed);
+                return;
+            }
+        }
+
+        regionObject-&gt;mapLocalToContainer(repaintContainer, transformState, mode, wasFixed);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1443,6 +1459,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RenderRegion* RenderFlowThread::currentRegion() const
+{
+    return m_currentRegionMaintainer ? &amp;m_currentRegionMaintainer-&gt;region() : nullptr;
+}
+
</ins><span class="cx"> ContainingRegionMap&amp; RenderFlowThread::containingRegionMap()
</span><span class="cx"> {
</span><span class="cx">     if (!m_lineToRegionMap)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.h        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class CurrentRenderRegionMaintainer;
</ins><span class="cx"> struct LayerFragment;
</span><span class="cx"> typedef Vector&lt;LayerFragment, 1&gt; LayerFragments;
</span><span class="cx"> class RenderFlowThread;
</span><span class="lines">@@ -220,11 +221,16 @@
</span><span class="cx"> 
</span><span class="cx">     // Used to estimate the maximum height of the flow thread.
</span><span class="cx">     static LayoutUnit maxLogicalHeight() { return LayoutUnit::max() / 2; }
</span><del>-    
</del><ins>+
</ins><span class="cx">     bool regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const;
</span><span class="cx"> 
</span><ins>+    virtual bool absoluteQuadsForBox(Vector&lt;FloatQuad&gt;&amp;, bool*, const RenderBox*, float, float) const { return false; }
+
</ins><span class="cx">     virtual void layout() override;
</span><span class="cx"> 
</span><ins>+    void setCurrentRegionMaintainer(CurrentRenderRegionMaintainer* currentRegionMaintainer) { m_currentRegionMaintainer = currentRegionMaintainer; }
+    RenderRegion* currentRegion() const;
+
</ins><span class="cx">     ContainingRegionMap&amp; containingRegionMap();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -353,6 +359,8 @@
</span><span class="cx"> 
</span><span class="cx">     RegionIntervalTree m_regionIntervalTree;
</span><span class="cx"> 
</span><ins>+    CurrentRenderRegionMaintainer* m_currentRegionMaintainer;
+
</ins><span class="cx">     bool m_regionsInvalidated : 1;
</span><span class="cx">     bool m_regionsHaveUniformLogicalWidth : 1;
</span><span class="cx">     bool m_regionsHaveUniformLogicalHeight : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -524,4 +524,18 @@
</span><span class="cx">     RenderRegion::detachRegion();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderNamedFlowFragment::absoluteQuadsForBoxInRegion(Vector&lt;FloatQuad&gt;&amp; quads, bool* wasFixed, const RenderBox* renderer, float localTop, float localBottom)
+{
+    LayoutRect layoutLocalRect(0, localTop, renderer-&gt;borderBoxRectInRegion(this).width(), localBottom - localTop);
+    LayoutRect fragmentRect = rectFlowPortionForBox(renderer, layoutLocalRect);
+
+    // We want to skip the 0px height fragments for non-empty boxes that may appear in case the bottom of the box
+    // overlaps the bottom of a region.
+    if (localBottom != localTop &amp;&amp; !fragmentRect.height())
+        return;
+
+    CurrentRenderRegionMaintainer regionMaintainer(*this);
+    quads.append(renderer-&gt;localToAbsoluteQuad(FloatRect(fragmentRect), 0 /* mode */, wasFixed));
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -116,6 +116,8 @@
</span><span class="cx"> 
</span><span class="cx">     void updateRegionFlags();
</span><span class="cx"> 
</span><ins>+    virtual void absoluteQuadsForBoxInRegion(Vector&lt;FloatQuad&gt;&amp;, bool*, const RenderBox*, float, float) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     virtual const char* renderName() const override { return &quot;RenderNamedFlowFragment&quot;; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -839,4 +839,24 @@
</span><span class="cx">     clearRenderObjectCustomStyle(child);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool RenderNamedFlowThread::absoluteQuadsForBox(Vector&lt;FloatQuad&gt;&amp; quads, bool* wasFixed, const RenderBox* renderer, float localTop, float localBottom) const
+{
+    RenderRegion* startRegion = nullptr;
+    RenderRegion* endRegion = nullptr;
+    // If the box doesn't have a range, we don't know how it is fragmented so fallback to the default behaviour.
+    if (!getRegionRangeForBox(renderer, startRegion, endRegion))
+        return false;
+
+    for (auto iter = m_regionList.find(startRegion), end = m_regionList.end(); iter != end; ++iter) {
+        RenderRegion* region = *iter;
+
+        region-&gt;absoluteQuadsForBoxInRegion(quads, wasFixed, renderer, localTop, localBottom);
+
+        if (region == endRegion)
+            break;
+    }
+
+    return true;
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.h (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -99,6 +99,8 @@
</span><span class="cx">     void setDispatchRegionLayoutUpdateEvent(bool value) { m_dispatchRegionLayoutUpdateEvent = value; }
</span><span class="cx">     void setDispatchRegionOversetChangeEvent(bool value) { m_dispatchRegionOversetChangeEvent = value; }
</span><span class="cx"> 
</span><ins>+    virtual bool absoluteQuadsForBox(Vector&lt;FloatQuad&gt;&amp;, bool*, const RenderBox*, float, float) const override;
+
</ins><span class="cx"> protected:
</span><span class="cx">     void setMarkForDestruction();
</span><span class="cx">     void resetMarkForDestruction();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderRegioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderRegion.cpp (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -483,7 +483,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return mappedRect.isEmpty() ? mappedRect : m_flowThread-&gt;mapFromFlowThreadToLocal(box, mappedRect);
</del><ins>+    return m_flowThread-&gt;mapFromFlowThreadToLocal(box, mappedRect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderRegion::addLayoutOverflowForBox(const RenderBox* box, const LayoutRect&amp; rect)
</span><span class="lines">@@ -573,4 +573,19 @@
</span><span class="cx">     return rect;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+CurrentRenderRegionMaintainer::CurrentRenderRegionMaintainer(RenderRegion&amp; region)
+    : m_region(region)
+{
+    RenderFlowThread* flowThread = region.flowThread();
+    // A flow thread can have only one current region.
+    ASSERT(!flowThread-&gt;currentRegion());
+    flowThread-&gt;setCurrentRegionMaintainer(this);
+}
+
+CurrentRenderRegionMaintainer::~CurrentRenderRegionMaintainer()
+{
+    RenderFlowThread* flowThread = m_region.flowThread();
+    flowThread-&gt;setCurrentRegionMaintainer(nullptr);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderRegionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderRegion.h (167929 => 167930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderRegion.h        2014-04-29 14:06:05 UTC (rev 167929)
+++ trunk/Source/WebCore/rendering/RenderRegion.h        2014-04-29 14:54:47 UTC (rev 167930)
</span><span class="lines">@@ -128,6 +128,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool hasAutoLogicalHeight() const { return false; }
</span><span class="cx"> 
</span><ins>+    virtual void absoluteQuadsForBoxInRegion(Vector&lt;FloatQuad&gt;&amp;, bool*, const RenderBox*, float, float) { }
+
</ins><span class="cx"> protected:
</span><span class="cx">     RenderRegion(Element&amp;, PassRef&lt;RenderStyle&gt;, RenderFlowThread*);
</span><span class="cx">     RenderRegion(Document&amp;, PassRef&lt;RenderStyle&gt;, RenderFlowThread*);
</span><span class="lines">@@ -179,6 +181,17 @@
</span><span class="cx"> 
</span><span class="cx"> RENDER_OBJECT_TYPE_CASTS(RenderRegion, isRenderRegion())
</span><span class="cx"> 
</span><ins>+class CurrentRenderRegionMaintainer {
+    WTF_MAKE_NONCOPYABLE(CurrentRenderRegionMaintainer);
+public:
+    CurrentRenderRegionMaintainer(RenderRegion&amp;);
+    ~CurrentRenderRegionMaintainer();
+
+    RenderRegion&amp; region() const { return m_region; }
+private:
+    RenderRegion&amp; m_region;
+};
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // RenderRegion_h
</span></span></pre>
</div>
</div>

</body>
</html>