Index: LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html |
diff --git a/LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html b/LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5d5a9e50a10ef6ca9fb9f45643a4510dc041d5b2 |
--- /dev/null |
+++ b/LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html |
@@ -0,0 +1,175 @@ |
+<!DOCTYPE html> |
+ |
+<html><head> |
+ <style> |
+ .filler { |
+ background-color: #CC9900; |
+ margin: 20px; |
+ border-style: solid; |
+ border-width: 1px; |
+ width: 400px; |
+ height: 100px; |
+ } |
+ |
+ .negativechild { |
+ z-index: -1; |
+ position: relative; |
+ } |
+ |
+ #parentscrollinglayer { |
+ background-color: #CC9999; |
+ height: 200px; |
+ width: 500px; |
+ overflow-y: scroll; |
+ } |
+ |
+ #childscrollinglayer { |
+ margin: 30px; |
+ position: relative; |
+ left: 20px; |
+ top: 20px; |
+ background-color: #990066; |
+ height: 200px; |
+ width: 300px; |
+ overflow-x: scroll; |
+ } |
+ </style> |
+ |
+ <script src="resources/build-paint-order-lists.js"></script> |
+ <script> |
+ var debugMode = false; |
+ |
+ if (window.testRunner) |
+ testRunner.dumpAsText(); |
+ |
+ function write(str) |
+ { |
+ var pre = document.getElementById('console'); |
+ var text = document.createTextNode(str + '\n'); |
+ pre.appendChild(text); |
+ } |
+ |
+ function getStackingOrder() |
+ { |
+ var divElements = []; |
+ // Force a style recalc. |
+ document.body.offsetTop; |
+ |
+ var stackingOrder = window.internals.nodesFromRect(document, 100, 75, 200, 200, 200, 200, false, false, false); |
+ |
+ for (var i = 0; i < stackingOrder.length; ++i) |
+ if (stackingOrder[i].nodeName === "DIV") |
+ divElements.push(stackingOrder[i]); |
+ |
+ return divElements; |
+ } |
+ |
+ function compareStackingOrderWithPaintOrder(stackingOrder, paintOrder) |
+ { |
+ if (debugMode) { |
+ write("paint:") |
+ for (var i = 0; i < paintOrder.length; i++) |
+ write(paintOrder[i].id + " " + paintOrder[i].className + " " + paintOrder[i].tagName); |
+ |
+ write("stacking:") |
+ for (var i = 0; i < stackingOrder.length; i++) |
+ write(stackingOrder[i].id + " " + stackingOrder[i].className + " " + stackingOrder[i].tagName); |
+ } |
+ |
+ for (var i = 0, j = 0; i < stackingOrder.length && j < paintOrder.length; i++) { |
+ // Ignore elements with class "filler negativechild". These elements are |
+ // irrelevant to stacking order, since they do not overlap with the |
+ // elements we care about. They exist in the paint order lists because |
+ // they are still descendants of the same stacking context, but they |
+ // will not affect visual layout. |
+ while (j < paintOrder.length && paintOrder[paintOrder.length - j - 1].className === "filler negativechild") |
+ j++; |
+ |
+ if (j >= paintOrder.length) |
+ break; |
+ |
+ if (stackingOrder[i] === paintOrder[paintOrder.length - j - 1]) |
+ j++; |
+ } |
+ |
+ if (debugMode) |
+ write(stackingOrder.length + " " + i + " " + paintOrder.length + " " + j); |
+ |
+ return j === paintOrder.length; |
+ } |
+ |
+ function doTest() |
+ { |
+ var parentscrollinglayer = document.getElementById('parentscrollinglayer'); |
+ var childscrollinglayer = document.getElementById('childscrollinglayer'); |
+ |
+ if (window.internals) { |
+ // Here we want to compare paint order lists before and after promotion |
+ // to the actual stacking order as determined by hit-testing. So we |
+ // first force the element not to promote, then compute its paint and |
+ // stacking order lists. We then force the element to opt in, and |
+ // generate the paint and stacking order lists after opt-in. |
+ // |
+ // The paint order lists should exactly match the stacking order lists |
+ // (modulo children that fall outside of the hit-testing area |
+ // on-screen), both before and after promotion. |
+ parentscrollinglayer.style.webkitTransform = 'translateZ(0px)'; |
+ document.body.offsetTop; |
+ |
+ window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(false); |
+ parentscrollinglayer.style.webkitTransform = ''; |
+ |
+ var oldStackingOrder = getStackingOrder(); |
+ var oldPaintOrder = getPaintOrder(childscrollinglayer); |
+ |
+ window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(true); |
+ parentscrollinglayer.style.webkitTransform = 'translateZ(0px)'; |
+ |
+ var newStackingOrder = getStackingOrder(); |
+ var newPaintOrder = getPaintOrder(childscrollinglayer); |
+ |
+ // The getPaintOrder() function should return a pair of paint orders. |
+ // One before promotion and one after. This pair of lists should remain |
+ // identical whether the element is actually currently promoted or not, |
+ // its purpose is to generate hypothetical pre- and post-lists to |
+ // determine if the element is promotable. |
+ if (!comparePaintOrderLists(oldPaintOrder, newPaintOrder)) |
+ write("FAIL - paint order lists not identical before/after promotion"); |
+ |
+ if (!compareStackingOrderWithPaintOrder(oldStackingOrder, oldPaintOrder.beforePromote)) |
+ write("FAIL - paint order list before promote doesn't match stacking order"); |
Julien - ping for review
2013/04/24 15:44:01
Does it make sense for these failure to not return
hartmanng
2013/04/24 17:02:41
No, you're right, it probably doesn't make sense t
|
+ |
+ if (!compareStackingOrderWithPaintOrder(newStackingOrder, oldPaintOrder.afterPromote)) |
+ write("FAIL - paint order list after promote doesn't match stacking order"); |
+ |
+ var childScrollingLayerOccurrences = countOccurrencesOfElementInPaintOrderList(oldPaintOrder.beforePromote, childscrollinglayer); |
+ if (childScrollingLayerOccurrences !== 1) |
+ write("FAIL - paint order list before promote contains " + childScrollingLayerOccurrences + " occurrences of child scrolling layer. Should be exactly 1."); |
+ |
+ childScrollingLayerOccurrences = countOccurrencesOfElementInPaintOrderList(oldPaintOrder.afterPromote, childscrollinglayer); |
+ if (childScrollingLayerOccurrences !== 1) |
+ write("FAIL - paint order list after promote contains " + childScrollingLayerOccurrences + " occurrences of child scrolling layer. Should be exactly 1."); |
+ |
+ write("PASS - did not crash."); |
+ } |
+ } |
+ |
+ window.addEventListener('load', doTest, false); |
+ </script> |
+</head> |
+<body> |
+<div class="filler"></div> |
+<div id="parentscrollinglayer"> |
+ <div id="childscrollinglayer"> |
+ <div class="filler"></div> |
+ </div> |
+ <div class="filler"></div> |
+ <div class="filler"></div> |
+</div> |
+<div id="fillerchild1" class="filler negativechild"></div> |
+<div id="fillerchild2" class="filler negativechild"></div> |
+<div id="fillerchild3" class="filler negativechild"></div> |
+<div id="fillerchild4" class="filler negativechild"></div> |
+<pre id="console"></pre> |
+</body> |
+</html> |