Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html

Issue 13467028: Add an intermediate function to generate 2 paint-order lists. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: addressing review comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other-expected.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..0742db2f4f1fd1e48e59eb335edaac71bff10aad
--- /dev/null
+++ b/LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html>
+
+<html><head>
+ <style>
+ .filler {
+ background-color: #CC9900;
+ 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 {
+ position: relative;
+ 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) {
+ var failure = false;
+
+ // 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)) {
+ failure = true;
+ write("FAIL - paint order lists not identical before/after promotion");
+ }
+
+ if (!compareStackingOrderWithPaintOrder(oldStackingOrder, oldPaintOrder.beforePromote)) {
+ failure = true;
+ write("FAIL - paint order list before promote doesn't match stacking order");
+ }
+
+ if (!compareStackingOrderWithPaintOrder(newStackingOrder, oldPaintOrder.afterPromote)) {
+ failure = true;
+ write("FAIL - paint order list after promote doesn't match stacking order");
+ }
+
+ var childScrollingLayerOccurrences = countOccurrencesOfElementInPaintOrderList(oldPaintOrder.beforePromote, childscrollinglayer);
+ if (childScrollingLayerOccurrences !== 1) {
+ failure = true;
+ 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) {
+ failure = true;
+ write("FAIL - paint order list after promote contains " + childScrollingLayerOccurrences + " occurrences of child scrolling layer. Should be exactly 1.");
+ }
+
+ if(!failure)
+ 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>
« no previous file with comments | « no previous file | LayoutTests/compositing/overflow/build-paint-order-list-where-opt-in-decisions-can-affect-each-other-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698