WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
patch
patch (text/plain), 70.23 KB, created by
Raul Hudea
on 2012-08-30 09:36:45 PDT
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Raul Hudea
Created:
2012-08-30 09:36:45 PDT
Size:
70.23 KB
patch
obsolete
>diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 9194705..1dbe3af 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,41 @@ >+2012-08-30 Raul Hudea <rhudea@adobe.com> >+ >+ [CSSRegions][CSSOM] Implement Element.getRegionFlowRanges >+ https://bugs.webkit.org/show_bug.cgi?id=78493 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add tests for getRegionFlowRanges call. >+ >+ * fast/regions/get-region-flow-ranges-absolute-pos-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-absolute-pos.html: Added. >+ * fast/regions/get-region-flow-ranges-content-nodes-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-content-nodes.html: Added. >+ * fast/regions/get-region-flow-ranges-display-none-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-display-none.html: Added. >+ * fast/regions/get-region-flow-ranges-empty-regions-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-empty-regions.html: Added. >+ * fast/regions/get-region-flow-ranges-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-fixed-pos-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-fixed-pos.html: Added. >+ * fast/regions/get-region-flow-ranges-horiz-bt-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-horiz-bt.html: Added. >+ * fast/regions/get-region-flow-ranges-inline-only-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-inline-only.html: Added. >+ * fast/regions/get-region-flow-ranges-text-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-text-vert-lr-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-text-vert-lr.html: Added. >+ * fast/regions/get-region-flow-ranges-text.html: Added. >+ * fast/regions/get-region-flow-ranges-vert-lr-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-vert-lr.html: Added. >+ * fast/regions/get-region-flow-ranges-vert-rl-expected.txt: Added. >+ * fast/regions/get-region-flow-ranges-vert-rl.html: Added. >+ * fast/regions/get-region-flow-ranges.html: Added. >+ * fast/regions/resources/helper.js: >+ (getName): >+ (getRangeAt): >+ (compareArrays): >+ > 2012-08-30 Andrei Onea <onea@adobe.com> > > [CSSRegions]Add support for text-shadow in region styling >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos-expected.txt >new file mode 100644 >index 0000000..ce8caa4 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos-expected.txt >@@ -0,0 +1,7 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for absolute positioned elements >+PASS range1.length is 1 >+PASS Array [wrapper,0,wrapper,1] is equal to [wrapper,0,wrapper,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos.html b/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos.html >new file mode 100644 >index 0000000..e47415c >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-absolute-pos.html >@@ -0,0 +1,34 @@ >+<!doctype html> >+<html> >+<head> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ .border { border: 1px solid red; } >+ #box1 { -webkit-flow-into: flow; position: absolute; width: 50px; height: 50px; background-color: green; top: 25px; left: 25px; } >+ #region1 { -webkit-flow-from: flow; width: 100px; height: 100px; position: absolute; top: 100px; left: 50px; } >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="box1"></div></div> >+ <div id="region1" class="border"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ debug("[CSSRegions] Test for Region::getRegionFlowRanges for absolute positioned elements"); >+ var region1 = document.getElementById("region1"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "wrapper", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes-expected.txt >new file mode 100644 >index 0000000..f0a679e >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes-expected.txt >@@ -0,0 +1,15 @@ >+[CSSRegions] Implement Region::getRegionFlowRanges with multiple content nodes >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Flow test >+PASS range1.length is 1 >+PASS Array [wrapper,0,#text,4] is equal to [wrapper,0,#text,4] >+PASS range2.length is 2 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+PASS Array [wrapper2,0,wrapper2,1] is equal to [wrapper2,0,wrapper2,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes.html b/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes.html >new file mode 100644 >index 0000000..6415315 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-content-nodes.html >@@ -0,0 +1,52 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 50px; } >+ .border { border: 1px solid red; } >+ .flow { -webkit-flow-into: flow1;} >+ .blue {background-color: lightblue; width: 50px; height: 50px;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 120px; left: 20px; top: 300px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div class="flow">Text node.</div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="wrapper2"><div class="flow blue"></div></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Implement Region::getRegionFlowRanges with multiple content nodes"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 2); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "wrapper", 1]); >+ compareArrays(getRangeAt(range2, 1), ["wrapper2", 0, "wrapper2", 1]); >+ >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-display-none-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-display-none-expected.txt >new file mode 100644 >index 0000000..cf31bc4 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-display-none-expected.txt >@@ -0,0 +1,14 @@ >+[CSSRegions] Implement Region::getRegionFlowRanges for elements with display:none (Range should not break ranges at display:none) >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+1 >+3 >+5 >+Flow test >+PASS range1.length is 1 >+PASS Array [wrapper,0,wrapper,1] is equal to [wrapper,0,wrapper,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-display-none.html b/LayoutTests/fast/regions/get-region-flow-ranges-display-none.html >new file mode 100644 >index 0000000..1c2fc85 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-display-none.html >@@ -0,0 +1,42 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 20px; } >+ .border { border: 1px solid red; } >+ .flow { -webkit-flow-into: flow1;} >+ #wrapper p {margin: 0; padding: 0;} >+ .none {display: none;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div class="flow"><p>1</p><p class="none">2</p><p>3</p><p class="none">4</p><p>5</p></div></div> >+ <div id="region1" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Implement Region::getRegionFlowRanges for elements with display:none (Range should not break ranges at display:none)"); >+ var region1 = document.getElementById("region1"); >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "wrapper", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions-expected.txt >new file mode 100644 >index 0000000..24ac441 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions-expected.txt >@@ -0,0 +1,13 @@ >+[CSSRegions] Implement Region::getRegionFlowRanges for empty regions >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Flow test >+PASS range1.length is 0 >+PASS range2.length is 1 >+PASS Array [wrapper,0,wrapper,1] is equal to [wrapper,0,wrapper,1] >+PASS range3.length is 0 >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions.html b/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions.html >new file mode 100644 >index 0000000..f36959f >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-empty-regions.html >@@ -0,0 +1,52 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 50px; } >+ .border { border: 1px solid red; } >+ #box { -webkit-flow-into: flow1; height: 50px; margin-top: 40px; background-color: blue} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 30px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+ #region3 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="box"></div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="region3" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Implement Region::getRegionFlowRanges for empty regions"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ var region3 = document.getElementById("region3"); >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 0); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["wrapper", 0, "wrapper", 1]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 0); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+ document.getElementById("region3").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-expected.txt >new file mode 100644 >index 0000000..d402b05 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-expected.txt >@@ -0,0 +1,42 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges. >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Empty regions >+PASS range1.length is 0 >+PASS range2.length is 0 >+PASS range3.length is 0 >+Flow article >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,1] is equal to [box1,1,box1,1] >+PASS range3.length is 1 >+PASS Array [box1,1,wrapper,1] is equal to [box1,1,wrapper,1] >+Add text node to region2 (creates anonymous block) >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,2] is equal to [box1,1,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,2,wrapper,1] is equal to [box1,2,wrapper,1] >+Increase font size >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range3.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+Make child a content node, so it will move from region1 to region3 >+PASS range1.length is 2 >+PASS Array [wrapper,0,box1,0] is equal to [wrapper,0,box1,0] >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,box1,2] is equal to [#text,5,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,0,box1,1] is equal to [box1,0,box1,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos-expected.txt >new file mode 100644 >index 0000000..87eaecb >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos-expected.txt >@@ -0,0 +1,7 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for fixed positioned elements >+PASS range1.length is 1 >+PASS Array [wrapper,0,wrapper,1] is equal to [wrapper,0,wrapper,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos.html b/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos.html >new file mode 100644 >index 0000000..b37a853 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-fixed-pos.html >@@ -0,0 +1,33 @@ >+<!doctype html> >+<html> >+<head> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ .border { border: 1px solid red; } >+ #box1 { -webkit-flow-into: flow; position: fixed; width: 50px; height: 50px; background-color: green; top: 25px; left: 25px; } >+ #region1 { -webkit-flow-from: flow; width: 100px; height: 100px; position: absolute; top: 100px; left: 50px; } >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="box1"></div></div> >+ <div id="region1" class="border"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ debug("[CSSRegions] Test for Region::getRegionFlowRanges for fixed positioned elements"); >+ var region1 = document.getElementById("region1"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "wrapper", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+} >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt-expected.txt >new file mode 100644 >index 0000000..81da8ed >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt-expected.txt >@@ -0,0 +1,42 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for horizontal-bt mode >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Empty regions >+PASS range1.length is 0 >+PASS range2.length is 0 >+PASS range3.length is 0 >+Flow article >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,1] is equal to [box1,1,box1,1] >+PASS range3.length is 1 >+PASS Array [box1,1,wrapper,1] is equal to [box1,1,wrapper,1] >+Add text node to region2 (creates anonymous block) >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,2] is equal to [box1,1,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,2,wrapper,1] is equal to [box1,2,wrapper,1] >+Increase font size >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range3.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+Make child a content node, so it will move from region1 to region3 >+PASS range1.length is 2 >+PASS Array [wrapper,0,box1,0] is equal to [wrapper,0,box1,0] >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,box1,2] is equal to [#text,5,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,0,box1,1] is equal to [box1,0,box1,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt.html b/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt.html >new file mode 100644 >index 0000000..b798c1b >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-horiz-bt.html >@@ -0,0 +1,107 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ html { -webkit-writing-mode: horizontal-bt; } >+ body { font-family: monospace; } >+ #wrapper { font-size: 30px; } >+ .border { border: 1px solid red; } >+ #article { background-color: lightblue; height: 135px; padding: 10px;} >+ #box1 { background-color: lightgreen; height: 110px; padding: 10px;} >+ #box2 { background-color: orange; height: 10px; padding: 5px;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+ #region3 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 350px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="article"><div id="box1"><div id="box2"></div></div></div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="region3" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges for horizontal-bt mode"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ var region3 = document.getElementById("region3"); >+ >+ debug("Empty regions"); >+ var range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 0); >+ var range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 0); >+ var range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 0); >+ >+ debug("Flow article"); >+ var article = document.getElementById("article"); >+ article.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 1]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 1, "wrapper", 1]); >+ >+ debug("Add text node to region2 (creates anonymous block)"); >+ var textNode = document.createTextNode("Text node."); >+ document.getElementById("box1").appendChild(textNode); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 2, "wrapper", 1]); >+ >+ debug("Increase font size"); >+ var wrapper = document.getElementById("wrapper"); >+ wrapper.style.fontSize = "40px"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "#text", 4]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["#text", 5, "wrapper", 1]); >+ >+ debug("Make child a content node, so it will move from region1 to region3"); >+ var box2 = document.getElementById('box2'); >+ box2.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 2); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 0]); >+ compareArrays(getRangeAt(range1, 1), ["box1", 1, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 0, "box1", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+ document.getElementById("region3").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-inline-only-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-inline-only-expected.txt >new file mode 100644 >index 0000000..aca34c4 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-inline-only-expected.txt >@@ -0,0 +1,12 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for inline elements >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Flow test >+PASS range1.length is 1 >+PASS Array [wrapper,0,wrapper,1] is equal to [wrapper,0,wrapper,1] >+PASS range2.length is 0 >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-inline-only.html b/LayoutTests/fast/regions/get-region-flow-ranges-inline-only.html >new file mode 100644 >index 0000000..23a46c7 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-inline-only.html >@@ -0,0 +1,47 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 20px; } >+ .border { border: 1px solid red; } >+ #inlineOnly { -webkit-flow-into: flow1; background-color: lightblue; height: 135px; padding: 10px;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><span id="inlineOnly"></span></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges for inline elements"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "wrapper", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 0); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-text-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-text-expected.txt >new file mode 100644 >index 0000000..9c0593e >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-text-expected.txt >@@ -0,0 +1,14 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges. Text breaks in two regions >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Flow test >+PASS range1.length is 1 >+PASS Array [wrapper,0,#text,4] is equal to [wrapper,0,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr-expected.txt >new file mode 100644 >index 0000000..ef13b8c >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr-expected.txt >@@ -0,0 +1,14 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges in vertical-rl mode. Text breaks into two regions >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Flow test >+PASS range1.length is 1 >+PASS Array [wrapper,0,#text,4] is equal to [wrapper,0,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr.html b/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr.html >new file mode 100644 >index 0000000..5257ad4 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-text-vert-lr.html >@@ -0,0 +1,49 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ html { -webkit-writing-mode: vertical-rl; } >+ body { font-family: monospace; } >+ #wrapper { font-size: 50px; } >+ .border { border: 1px solid red; } >+ #box { -webkit-flow-into: flow1;} >+ #region1 { -webkit-flow-from: flow1; width: 70px; height: 250px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 60px; height: 250px; left: 20px; top: 300px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="box">Text node.</div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges in vertical-rl mode. Text breaks into two regions"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "wrapper", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-text.html b/LayoutTests/fast/regions/get-region-flow-ranges-text.html >new file mode 100644 >index 0000000..3ee729b >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-text.html >@@ -0,0 +1,47 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 50px; } >+ .border { border: 1px solid red; } >+ #box { -webkit-flow-into: flow1;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="box">Text node.</div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges. Text breaks in two regions"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ >+ debug("Flow test"); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "wrapper", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr-expected.txt >new file mode 100644 >index 0000000..153696b >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr-expected.txt >@@ -0,0 +1,42 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for vertical-lr mode >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Empty regions >+PASS range1.length is 0 >+PASS range2.length is 0 >+PASS range3.length is 0 >+Flow article >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,1] is equal to [box1,1,box1,1] >+PASS range3.length is 1 >+PASS Array [box1,1,wrapper,1] is equal to [box1,1,wrapper,1] >+Add text node to region2 (creates anonymous block) >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,2] is equal to [box1,1,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,2,wrapper,1] is equal to [box1,2,wrapper,1] >+Increase font size >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range3.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+Make child a content node, so it will move from region1 to region3 >+PASS range1.length is 2 >+PASS Array [wrapper,0,box1,0] is equal to [wrapper,0,box1,0] >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,box1,2] is equal to [#text,5,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,0,box1,1] is equal to [box1,0,box1,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr.html b/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr.html >new file mode 100644 >index 0000000..634ef2a >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-vert-lr.html >@@ -0,0 +1,107 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ html { -webkit-writing-mode: vertical-lr; } >+ body { font-family: monospace; } >+ #wrapper { font-size: 30px; } >+ .border { border: 1px solid red; } >+ #article { background-color: lightblue; width: 135px; padding: 10px;} >+ #box1 { background-color: lightgreen; width: 110px; padding: 10px;} >+ #box2 { background-color: orange; width: 10px; padding: 5px;} >+ #region1 { -webkit-flow-from: flow1; width: 70px; height: 250px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 60px; height: 250px; left: 20px; top: 300px;} >+ #region3 { -webkit-flow-from: flow1; width: 60px; height: 250px; left: 20px; top: 350px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="article"><div id="box1"><div id="box2"></div></div></div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="region3" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges for vertical-lr mode"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ var region3 = document.getElementById("region3"); >+ >+ debug("Empty regions"); >+ var range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 0); >+ var range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 0); >+ var range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 0); >+ >+ debug("Flow article"); >+ var article = document.getElementById("article"); >+ article.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 1]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 1, "wrapper", 1]); >+ >+ debug("Add text node to region2 (creates anonymous block)"); >+ var textNode = document.createTextNode("Text node."); >+ document.getElementById("box1").appendChild(textNode); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 2, "wrapper", 1]); >+ >+ debug("Increase font size"); >+ var wrapper = document.getElementById("wrapper"); >+ wrapper.style.fontSize = "40px"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "#text", 4]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["#text", 5, "wrapper", 1]); >+ >+ debug("Make child a content node, so it will move from region1 to region3"); >+ var box2 = document.getElementById('box2'); >+ box2.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 2); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 0]); >+ compareArrays(getRangeAt(range1, 1), ["box1", 1, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 0, "box1", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+ document.getElementById("region3").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl-expected.txt b/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl-expected.txt >new file mode 100644 >index 0000000..e52c8a2 >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl-expected.txt >@@ -0,0 +1,42 @@ >+[CSSRegions] Test for Region::getRegionFlowRanges for vertical-rl mode >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+Text node. >+Empty regions >+PASS range1.length is 0 >+PASS range2.length is 0 >+PASS range3.length is 0 >+Flow article >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,1] is equal to [box1,1,box1,1] >+PASS range3.length is 1 >+PASS Array [box1,1,wrapper,1] is equal to [box1,1,wrapper,1] >+Add text node to region2 (creates anonymous block) >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,box1,2] is equal to [box1,1,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,2,wrapper,1] is equal to [box1,2,wrapper,1] >+Increase font size >+PASS range1.length is 1 >+PASS Array [wrapper,0,box1,1] is equal to [wrapper,0,box1,1] >+PASS range2.length is 1 >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range3.length is 1 >+PASS Array [#text,5,wrapper,1] is equal to [#text,5,wrapper,1] >+Make child a content node, so it will move from region1 to region3 >+PASS range1.length is 2 >+PASS Array [wrapper,0,box1,0] is equal to [wrapper,0,box1,0] >+PASS Array [box1,1,#text,4] is equal to [box1,1,#text,4] >+PASS range2.length is 1 >+PASS Array [#text,5,box1,2] is equal to [#text,5,box1,2] >+PASS range3.length is 1 >+PASS Array [box1,0,box1,1] is equal to [box1,0,box1,1] >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl.html b/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl.html >new file mode 100644 >index 0000000..601154f >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges-vert-rl.html >@@ -0,0 +1,108 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ html { -webkit-writing-mode: vertical-rl; } >+ body { font-family: monospace; } >+ #wrapper { font-size: 30px; } >+ .border { border: 1px solid red; } >+ #article { background-color: lightblue; width: 135px; padding: 10px;} >+ #box1 { background-color: lightgreen; width: 110px; padding: 10px;} >+ #box2 { background-color: orange; width: 10px; padding: 5px;} >+ #region1 { -webkit-flow-from: flow1; width: 70px; height: 250px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 60px; height: 250px; left: 20px; top: 300px;} >+ #region3 { -webkit-flow-from: flow1; width: 60px; height: 250px; left: 20px; top: 350px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="article"><div id="box1"><div id="box2"></div></div></div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="region3" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges for vertical-rl mode"); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ var region3 = document.getElementById("region3"); >+ >+ debug("Empty regions"); >+ var range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 0); >+ var range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 0); >+ var range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 0); >+ >+ debug("Flow article"); >+ var article = document.getElementById("article"); >+ article.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 1]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 1, "wrapper", 1]); >+ >+ debug("Add text node to region2 (creates anonymous block)"); >+ var textNode = document.createTextNode("Text node."); >+ document.getElementById("box1").appendChild(textNode); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 2, "wrapper", 1]); >+ >+ debug("Increase font size"); >+ var wrapper = document.getElementById("wrapper"); >+ wrapper.style.fontSize = "40px"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "#text", 4]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["#text", 5, "wrapper", 1]); >+ >+ debug("Make child a content node, so it will move from region1 to region3"); >+ var box2 = document.getElementById('box2'); >+ box2.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 2); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 0]); >+ compareArrays(getRangeAt(range1, 1), ["box1", 1, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 0, "box1", 1]); >+ >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+ document.getElementById("region3").style.visibility = "hidden"; >+} >+ >+hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/get-region-flow-ranges.html b/LayoutTests/fast/regions/get-region-flow-ranges.html >new file mode 100644 >index 0000000..7f5285d >--- /dev/null >+++ b/LayoutTests/fast/regions/get-region-flow-ranges.html >@@ -0,0 +1,106 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../js/resources/js-test-pre.js"></script> >+<script src="resources/helper.js"></script> >+<style> >+ body { font-family: monospace; } >+ #wrapper { font-size: 30px; } >+ .border { border: 1px solid red; } >+ #article { background-color: lightblue; height: 135px; padding: 10px;} >+ #box1 { background-color: lightgreen; height: 110px; padding: 10px;} >+ #box2 { background-color: orange; height: 10px; padding: 5px;} >+ #region1 { -webkit-flow-from: flow1; width: 250px; height: 70px; left: 20px; top: 250px;} >+ #region2 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 300px;} >+ #region3 { -webkit-flow-from: flow1; width: 250px; height: 60px; left: 20px; top: 350px;} >+</style> >+</head> >+<body> >+ <div id="description"></div> >+ <div id="wrapper"><div id="article"><div id="box1"><div id="box2"></div></div></div></div> >+ <div id="region1" class="border"></div> >+ <div id="region2" class="border"></div> >+ <div id="region3" class="border"></div> >+ <div id="console"></div> >+<script> >+ if (window.layoutTestController) >+ layoutTestController.dumpAsText(); >+ >+ description("[CSSRegions] Test for Region::getRegionFlowRanges."); >+ var region1 = document.getElementById("region1"); >+ var region2 = document.getElementById("region2"); >+ var region3 = document.getElementById("region3"); >+ >+ debug("Empty regions"); >+ var range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 0); >+ var range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 0); >+ var range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 0); >+ >+ debug("Flow article"); >+ var article = document.getElementById("article"); >+ article.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 1]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 1, "wrapper", 1]); >+ >+ debug("Add text node to region2 (creates anonymous block)"); >+ var textNode = document.createTextNode("Text node."); >+ document.getElementById("box1").appendChild(textNode); >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 2, "wrapper", 1]); >+ >+ debug("Increase font size"); >+ var wrapper = document.getElementById("wrapper"); >+ wrapper.style.fontSize = "40px"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 1); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 1]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["box1", 1, "#text", 4]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["#text", 5, "wrapper", 1]); >+ >+ debug("Make child a content node, so it will move from region1 to region3"); >+ var box2 = document.getElementById('box2'); >+ box2.style.webkitFlowInto = "flow1"; >+ range1 = region1.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range1.length", 2); >+ compareArrays(getRangeAt(range1, 0), ["wrapper", 0, "box1", 0]); >+ compareArrays(getRangeAt(range1, 1), ["box1", 1, "#text", 4]); >+ range2 = region2.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range2.length", 1); >+ compareArrays(getRangeAt(range2, 0), ["#text", 5, "box1", 2]); >+ range3 = region3.webkitGetRegionFlowRanges(); >+ shouldEvaluateTo("range3.length", 1); >+ compareArrays(getRangeAt(range3, 0), ["box1", 0, "box1", 1]); >+ >+function hideRegionsAndFlows() { >+ document.getElementById("region1").style.visibility = "hidden"; >+ document.getElementById("region2").style.visibility = "hidden"; >+ document.getElementById("region3").style.visibility = "hidden"; >+} >+ >+ hideRegionsAndFlows(); >+</script> >+<script src="../js/resources/js-test-post.js"></script> >+</body> >+</html> >diff --git a/LayoutTests/fast/regions/resources/helper.js b/LayoutTests/fast/regions/resources/helper.js >index 9feb1a1..1f8e2c6 100644 >--- a/LayoutTests/fast/regions/resources/helper.js >+++ b/LayoutTests/fast/regions/resources/helper.js >@@ -160,3 +160,39 @@ function assert(expression, failMessage) > { > expression ? logPassMessage("") : logFailMessage(failMessage); > } >+ >+// used by getRegionFlowRanges tests >+function getName(node) { >+ if (!node) return "undefined"; >+ if (node.nodeType == 3) // Text node >+ return "#text"; >+ // all the others should have an id >+ return node.id; >+} >+ >+function getRangeAt(arrRange, index) { >+ if (index < arrRange.length) >+ return [getName(arrRange[index].startContainer), arrRange[index].startOffset, getName(arrRange[index].endContainer), arrRange[index].endOffset]; >+ return null; >+} >+ >+function compareArrays(current, expected) { >+ try { >+ if (current == null) { >+ testFailed("Null object. Expected [" + expected.toString() + "] was null"); >+ return; >+ } >+ if (current.length !== expected.length) { >+ testFailed("Array length differs. Expected [" + expected.toString() + "] was [" + current.toString() + "]"); >+ return; >+ } >+ for (var i = 0; i < current.length; i++) >+ if (current[i] !== expected[i]) { >+ testFailed("Expected [" + expected.toString() + "]. Was [" + current.toString() + "]"); >+ return; >+ } >+ } catch (ex) { >+ testFailed(current + " threw exception " + ex); >+ } >+ testPassed("Array [" + expected.toString() + "] is equal to [" + current.toString() + "]"); >+} >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c793714..03ed763 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,50 @@ >+2012-08-30 Raul Hudea <rhudea@adobe.com> >+ >+ [CSSRegions][CSSOM] Implement Element.getRegionFlowRanges >+ https://bugs.webkit.org/show_bug.cgi?id=78493 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Implement the getRegionFlowRanges function from the CSS Regions spec. It is implemented by iterating over >+ the content nodes and figuring out which nodes have boundingBox intersecting the region box and figuring out >+ the start and end positions. >+ >+ Tests: fast/regions/get-region-flow-ranges-absolute-pos.html >+ fast/regions/get-region-flow-ranges-content-nodes.html >+ fast/regions/get-region-flow-ranges-display-none.html >+ fast/regions/get-region-flow-ranges-empty-regions.html >+ fast/regions/get-region-flow-ranges-fixed-pos.html >+ fast/regions/get-region-flow-ranges-horiz-bt.html >+ fast/regions/get-region-flow-ranges-inline-only.html >+ fast/regions/get-region-flow-ranges-text-vert-lr.html >+ fast/regions/get-region-flow-ranges-text.html >+ fast/regions/get-region-flow-ranges-vert-lr.html >+ fast/regions/get-region-flow-ranges-vert-rl.html >+ fast/regions/get-region-flow-ranges.html >+ >+ * dom/Element.cpp: >+ (WebCore::Element::webkitGetRegionFlowRanges): >+ (WebCore): >+ * dom/Element.h: >+ * dom/Element.idl: added the webkitGetRegionFlowRanges method >+ * rendering/RenderBlock.cpp: >+ (WebCore::RenderBlock::offsetFromLogicalTopOfFirstPage): added a slow path to find the logicalTopOfFirstPage without LayoutState >+ * rendering/RenderFlowThread.cpp: >+ * rendering/RenderNamedFlowThread.cpp: >+ (WebCore::isContainedInNodes): >+ (WebCore): >+ (WebCore::logicalTopForBox): get logicalTop depending on the write mode >+ (WebCore::logicalBottomForBox): get logicalBottom depending on the write mode >+ (WebCore::boxIntersectsRegion): detects if a box intersects a region >+ (WebCore::RenderNamedFlowThread::getRanges): returns a vector of Ranges that contains Node that are part of a region >+ * rendering/RenderNamedFlowThread.h: >+ (RenderNamedFlowThread): >+ * rendering/RenderRegion.cpp: >+ (WebCore::RenderRegion::getRanges): proxy the getRanges call to its named flow thread >+ (WebCore): >+ * rendering/RenderRegion.h: >+ (RenderRegion): >+ > 2012-08-29 Dirk Schulze <krit@webkit.org> > > Refactor WrapShape to Shape/BasicShape >diff --git a/Source/WebCore/dom/Element.cpp b/Source/WebCore/dom/Element.cpp >index 67d41c8..98e025d 100644 >--- a/Source/WebCore/dom/Element.cpp >+++ b/Source/WebCore/dom/Element.cpp >@@ -2038,6 +2038,20 @@ const AtomicString& Element::webkitRegionOverset() const > return undefinedState; > } > >+Vector<RefPtr<Range> > Element::webkitGetRegionFlowRanges() const >+{ >+ document()->updateLayoutIgnorePendingStylesheets(); >+ >+ Vector<RefPtr<Range> > rangeObjects; >+ if (document()->cssRegionsEnabled() && renderer() && renderer()->isRenderRegion()) { >+ RenderRegion* region = toRenderRegion(renderer()); >+ if (region->isValid()) >+ region->getRanges(rangeObjects); >+ } >+ >+ return rangeObjects; >+} >+ > #ifndef NDEBUG > bool Element::fastAttributeLookupAllowed(const QualifiedName& name) const > { >diff --git a/Source/WebCore/dom/Element.h b/Source/WebCore/dom/Element.h >index 56964f3..7e1f4c6 100644 >--- a/Source/WebCore/dom/Element.h >+++ b/Source/WebCore/dom/Element.h >@@ -426,6 +426,7 @@ public: > > RenderRegion* renderRegion() const; > const AtomicString& webkitRegionOverset() const; >+ Vector<RefPtr<Range> > webkitGetRegionFlowRanges() const; > > bool hasID() const; > bool hasClass() const; >diff --git a/Source/WebCore/dom/Element.idl b/Source/WebCore/dom/Element.idl >index fb60c73..51c0f92 100644 >--- a/Source/WebCore/dom/Element.idl >+++ b/Source/WebCore/dom/Element.idl >@@ -144,6 +144,7 @@ module core { > > // CSS Regions API > readonly attribute DOMString webkitRegionOverset; >+ sequence<Range> webkitGetRegionFlowRanges(); > > #if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C > // Event handler DOM attributes >diff --git a/Source/WebCore/rendering/RenderBlock.cpp b/Source/WebCore/rendering/RenderBlock.cpp >index a6a9f2e..db77ad2 100755 >--- a/Source/WebCore/rendering/RenderBlock.cpp >+++ b/Source/WebCore/rendering/RenderBlock.cpp >@@ -7172,20 +7172,28 @@ bool RenderBlock::lineWidthForPaginatedLineChanged(RootInlineBox* rootBox, Layou > > LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const > { >- // FIXME: This function needs to work without layout state. It's fine to use the layout state as a cache >- // for speed, but we need a slow implementation that will walk up the containing block chain and figure >- // out our offset from the top of the page. > LayoutState* layoutState = view()->layoutState(); >- if (!layoutState || !layoutState->isPaginated()) >- return 0; >- >- // FIXME: Sanity check that the renderer in the layout state is ours, since otherwise the computation will be off. >- // Right now this assert gets hit inside computeLogicalHeight for percentage margins, since they're computed using >- // widths which can vary in each region. Until we patch that, we can't have this assert. >- // ASSERT(layoutState->m_renderer == this); >- >- LayoutSize offsetDelta = layoutState->m_layoutOffset - layoutState->m_pageOffset; >- return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.width(); >+ if (layoutState && !layoutState->isPaginated()) >+ return ZERO_LAYOUT_UNIT; >+ if (layoutState) { >+ // FIXME: Sanity check that the renderer in the layout state is ours, since otherwise the computation will be off. >+ // Right now this assert gets hit inside computeLogicalHeight for percentage margins, since they're computed using >+ // widths which can vary in each region. Until we patch that, we can't have this assert. >+ // ASSERT(layoutState->m_renderer == this); >+ >+ LayoutSize offsetDelta = layoutState->m_layoutOffset - layoutState->m_pageOffset; >+ return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.width(); >+ } >+ // slower path without layout state >+ LayoutUnit offsetTop; >+ const RenderBlock* currBlock = this; >+ bool isPaginated = false; >+ while (currBlock && !currBlock->isRenderFlowThread()) { >+ offsetTop += currBlock->logicalTop(); >+ currBlock = currBlock->containingBlock(); >+ isPaginated = currBlock && currBlock->isRenderFlowThread(); >+ }; >+ return isPaginated ? offsetTop : ZERO_LAYOUT_UNIT; > } > > RenderRegion* RenderBlock::regionAtBlockOffset(LayoutUnit blockOffset) const >diff --git a/Source/WebCore/rendering/RenderFlowThread.cpp b/Source/WebCore/rendering/RenderFlowThread.cpp >index fd31a0f..01db0c5 100644 >--- a/Source/WebCore/rendering/RenderFlowThread.cpp >+++ b/Source/WebCore/rendering/RenderFlowThread.cpp >@@ -789,5 +789,4 @@ CurrentRenderFlowThreadMaintainer::~CurrentRenderFlowThreadMaintainer() > view->flowThreadController()->setCurrentRenderFlowThread(0); > } > >- > } // namespace WebCore >diff --git a/Source/WebCore/rendering/RenderNamedFlowThread.cpp b/Source/WebCore/rendering/RenderNamedFlowThread.cpp >index 2a9102e..9857230 100644 >--- a/Source/WebCore/rendering/RenderNamedFlowThread.cpp >+++ b/Source/WebCore/rendering/RenderNamedFlowThread.cpp >@@ -27,8 +27,13 @@ > #include "RenderNamedFlowThread.h" > > #include "FlowThreadController.h" >+#include "InlineTextBox.h" >+#include "Position.h" >+#include "RenderInline.h" > #include "RenderRegion.h" >+#include "RenderText.h" > #include "RenderView.h" >+#include "Text.h" > #include "WebKitNamedFlow.h" > > namespace WebCore { >@@ -339,4 +344,183 @@ bool RenderNamedFlowThread::isMarkedForDestruction() const > return m_namedFlow->flowState() == WebKitNamedFlow::FlowStateNull; > } > >+static bool isContainedInNodes(Vector<Node*> others, Node* node) >+{ >+ for (size_t i = 0; i < others.size(); i++) { >+ Node* other = others.at(i); >+ if (other->contains(node)) >+ return true; >+ } >+ return false; >+} >+ >+static inline LayoutUnit logicalTopForBox(bool isHorizontalWritingMode, LayoutRect rect) >+{ >+ return isHorizontalWritingMode ? rect.y() : rect.x(); >+} >+ >+static inline LayoutUnit logicalBottomForBox(bool isHorizontalWritingMode, LayoutRect rect) >+{ >+ return isHorizontalWritingMode ? rect.maxY() : rect.maxX(); >+} >+ >+static bool boxIntersectsRegion(LayoutUnit logicalTopForBox, LayoutUnit logicalBottomForBox, LayoutUnit logicalTopForRegion, LayoutUnit logicalBottomForRegion) >+{ >+ bool regionIsEmpty = logicalBottomForRegion != MAX_LAYOUT_UNIT && logicalTopForRegion != MIN_LAYOUT_UNIT >+ && (logicalBottomForRegion - logicalTopForRegion) <= 0; >+ return (logicalBottomForBox - logicalTopForBox) > 0 >+ && !regionIsEmpty >+ && logicalTopForBox < logicalBottomForRegion && logicalTopForRegion < logicalBottomForBox; >+} >+ >+void RenderNamedFlowThread::getRanges(Vector<RefPtr<Range> >& rangeObjects, const RenderRegion* region) const >+{ >+ LayoutRect regionRect(region->flowThreadPortionRect()); >+ >+ LayoutUnit logicalTopForRegion; >+ LayoutUnit logicalBottomForRegion; >+ >+ // extend the first region top to contain everything up to its logical height >+ if (region->isFirstRegion()) >+ logicalTopForRegion = MIN_LAYOUT_UNIT; >+ else >+ logicalTopForRegion = logicalTopForBox(isHorizontalWritingMode(), regionRect); >+ >+ // extend the last region to contain everything above its y() >+ if (region->isLastRegion()) >+ logicalBottomForRegion = MAX_LAYOUT_UNIT; >+ else >+ logicalBottomForRegion = logicalBottomForBox(isHorizontalWritingMode(), regionRect); >+ >+ Vector<Node*> nodes; >+ // eliminate the contentNodes that are descendants of other contentNodes >+ for (NamedFlowContentNodes::const_iterator it = contentNodes().begin(); it != contentNodes().end(); ++it) { >+ Node* node = *it; >+ if (!isContainedInNodes(nodes, node)) >+ nodes.append(node); >+ } >+ >+ for (size_t i = 0; i < nodes.size(); i++) { >+ Node* contentNode = nodes.at(i); >+ if (!contentNode->renderer()) >+ continue; >+ >+ ExceptionCode ignoredException; >+ RefPtr<Range> range = Range::create(contentNode->document()); >+ bool foundStartPosition = false; >+ bool startsAboveRegion = true; >+ bool endsBelowRegion = true; >+ bool skipOverOutsideNodes = false; >+ Node* lastEndNode = 0; >+ >+ for (Node* node = contentNode; node; node = node->traverseNextNode(contentNode)) { >+ RenderObject* renderer = node->renderer(); >+ if (!renderer) >+ continue; >+ >+ LayoutRect boundingBox; >+ if (renderer->isRenderInline()) >+ boundingBox = toRenderInline(renderer)->linesBoundingBox(); >+ else if (renderer->isText()) >+ boundingBox = toRenderText(renderer)->linesBoundingBox(); >+ else { >+ boundingBox = toRenderBox(renderer)->frameRect(); >+ if (toRenderBox(renderer)->isRelPositioned()) >+ boundingBox.move(toRenderBox(renderer)->relativePositionLogicalOffset()); >+ } >+ >+ LayoutUnit offsetTop = renderer->containingBlock()->offsetFromLogicalTopOfFirstPage(); >+ const LayoutPoint logicalOffsetFromTop(isHorizontalWritingMode() ? ZERO_LAYOUT_UNIT : offsetTop, >+ isHorizontalWritingMode() ? offsetTop : ZERO_LAYOUT_UNIT); >+ >+ boundingBox.moveBy(logicalOffsetFromTop); >+ >+ LayoutUnit logicalTopForRenderer = logicalTopForBox(isHorizontalWritingMode(), boundingBox); >+ LayoutUnit logicalBottomForRenderer = logicalBottomForBox(isHorizontalWritingMode(), boundingBox); >+ >+ // if the bounding box of the current element doesn't intersect the region box >+ // close the current range only if the start element began inside the region, >+ // otherwise just move the start position after this node and keep skipping them until we found a proper start position. >+ if (!boxIntersectsRegion(logicalTopForRenderer, logicalBottomForRenderer, logicalTopForRegion, logicalBottomForRegion)) { >+ if (foundStartPosition) { >+ if (!startsAboveRegion) { >+ if (range->intersectsNode(node, ignoredException)) >+ range->setEndBefore(node, ignoredException); >+ rangeObjects.append(range->cloneRange(ignoredException)); >+ range = Range::create(contentNode->document()); >+ startsAboveRegion = true; >+ } else >+ skipOverOutsideNodes = true; >+ } >+ if (skipOverOutsideNodes) >+ range->setStartAfter(node, ignoredException); >+ foundStartPosition = false; >+ continue; >+ } >+ >+ // start position >+ if (logicalTopForRenderer < logicalTopForRegion && startsAboveRegion) { >+ if (renderer->isText()) { // Text crosses region top >+ // for Text elements, just find the last textbox that is contained inside the region and use its start() offset as start position >+ RenderText* textRenderer = toRenderText(renderer); >+ for (InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) { >+ if (offsetTop + box->logicalBottom() < logicalTopForRegion) >+ continue; >+ range->setStart(Position(toText(node), box->start())); >+ startsAboveRegion = false; >+ break; >+ } >+ } else { // node crosses region top >+ // for all elements, except Text, just set the start position to be before their children >+ startsAboveRegion = true; >+ range->setStart(Position(node, Position::PositionIsBeforeChildren)); >+ } >+ } else { // node starts inside region >+ // for elements that start inside the region, set the start position to be before them. If we found one, we will just skip the others until >+ // the range is closed. >+ if (startsAboveRegion) { >+ startsAboveRegion = false; >+ range->setStartBefore(node, ignoredException); >+ } >+ } >+ skipOverOutsideNodes = false; >+ foundStartPosition = true; >+ >+ // end position >+ if (logicalBottomForRegion < logicalBottomForRenderer && (endsBelowRegion || (!endsBelowRegion && !node->isDescendantOf(lastEndNode)))) { >+ // for Text elements, just find just find the last textbox that is contained inside the region and use its start()+len() offset as end position >+ if (renderer->isText()) { // Text crosses region bottom >+ RenderText* textRenderer = toRenderText(renderer); >+ InlineTextBox* lastBox; >+ for (InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) { >+ if ((offsetTop + box->logicalTop()) < logicalBottomForRegion) { >+ lastBox = box; >+ continue; >+ } >+ range->setEnd(Position(toText(node), lastBox->start() + lastBox->len())); >+ break; >+ } >+ endsBelowRegion = false; >+ lastEndNode = node; >+ } else { // node crosses region bottom >+ // for all elements, except Text, just set the start position to be after their children >+ range->setEnd(Position(node, Position::PositionIsAfterChildren)); >+ endsBelowRegion = true; >+ lastEndNode = node; >+ } >+ } else { // node ends inside region >+ // for elements that ends inside the region, set the end position to be after them >+ // allow this end position to be changed only by other elements that are not descendants of the current end node >+ if (endsBelowRegion || (!endsBelowRegion && !node->isDescendantOf(lastEndNode))) { >+ range->setEndAfter(node, ignoredException); >+ endsBelowRegion = false; >+ lastEndNode = node; >+ } >+ } >+ } >+ if (foundStartPosition || skipOverOutsideNodes) >+ rangeObjects.append(range); >+ } >+} >+ > } >diff --git a/Source/WebCore/rendering/RenderNamedFlowThread.h b/Source/WebCore/rendering/RenderNamedFlowThread.h >index 85c523b..4516296 100644 >--- a/Source/WebCore/rendering/RenderNamedFlowThread.h >+++ b/Source/WebCore/rendering/RenderNamedFlowThread.h >@@ -70,6 +70,7 @@ public: > const NamedFlowContentNodes& contentNodes() const { return m_contentNodes; } > bool hasContentNode(Node* contentNode) const { ASSERT(contentNode); return m_contentNodes.contains(contentNode); } > bool isMarkedForDestruction() const; >+ void getRanges(Vector<RefPtr<Range> >&, const RenderRegion*) const; > > protected: > void setMarkForDestruction(); >diff --git a/Source/WebCore/rendering/RenderRegion.cpp b/Source/WebCore/rendering/RenderRegion.cpp >index e22f199..8296369 100644 >--- a/Source/WebCore/rendering/RenderRegion.cpp >+++ b/Source/WebCore/rendering/RenderRegion.cpp >@@ -35,6 +35,7 @@ > #include "HitTestResult.h" > #include "IntRect.h" > #include "PaintInfo.h" >+#include "Range.h" > #include "RenderBoxRegionInfo.h" > #include "RenderNamedFlowThread.h" > #include "RenderView.h" >@@ -460,4 +461,10 @@ void RenderRegion::clearObjectStyleInRegion(const RenderObject* object) > clearObjectStyleInRegion(child); > } > >+void RenderRegion::getRanges(Vector<RefPtr<Range> >& rangeObjects) const >+{ >+ RenderNamedFlowThread* namedFlow = view()->flowThreadController()->ensureRenderFlowThreadWithName(style()->regionThread()); >+ namedFlow->getRanges(rangeObjects, this); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/rendering/RenderRegion.h b/Source/WebCore/rendering/RenderRegion.h >index a9edfce..f9d18be 100644 >--- a/Source/WebCore/rendering/RenderRegion.h >+++ b/Source/WebCore/rendering/RenderRegion.h >@@ -100,7 +100,9 @@ public: > // height of a single column or page in the set. > virtual LayoutUnit pageLogicalWidth() const; > virtual LayoutUnit pageLogicalHeight() const; >- >+ >+ void getRanges(Vector<RefPtr<Range> >&) const; >+ > // This method represents the logical height of the entire flow thread portion used by the region or set. > // For RenderRegions it matches logicalPaginationHeight(), but for sets it is the height of all the pages > // or columns added together.
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
hyatt
:
review-
hyatt
:
commit-queue-
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 78493
:
156424
|
161495
|
162493
|
162499
|
162511
|
163176
|
163179
|
163777
|
163785
|
163794