| <!DOCTYPE html> |
| <html> |
| <head> |
| <style> |
| body { |
| height: 2000px; |
| } |
| |
| .positionFixed { |
| position: fixed; |
| } |
| |
| .positionAbsolute { |
| position: absolute; |
| } |
| |
| .overflow { |
| width: 100px; |
| height: 100px; |
| border: 2px solid black; |
| overflow: scroll; |
| } |
| |
| .scrolled { |
| background-color: blue; |
| width: 75px; |
| height: 24px; |
| margin: 4px; |
| position: relative; |
| } |
| |
| .onTop { |
| z-index: 2; |
| } |
| |
| pre { |
| position: absolute; |
| top: 400px; |
| z-index: -1; |
| } |
| |
| .positioned { |
| background-color: purple; |
| width: 80px; |
| height: 40px; |
| top: 65px; |
| left: 25px; |
| } |
| |
| .sibling { |
| background-color: green; |
| width: 50px; |
| height: 100px; |
| top: 10px; |
| left: 5px; |
| z-index: 1; |
| } |
| </style> |
| <script> |
| if (window.internals) |
| window.internals.settings.setPreferCompositingToLCDTextEnabled(true); |
| |
| function addDomElement(elementType, className, id, parent, description, indent) |
| { |
| var element = document.createElement(elementType); |
| element.setAttribute("class", className); |
| element.setAttribute("id", id); |
| if (parent === "body") |
| document.body.appendChild(element); |
| else |
| document.getElementById(parent).appendChild(element); |
| |
| if (elementType === "div") { |
| for (var i = 0; i < indent; ++i) |
| description.push(" "); |
| description.push("+ "); |
| description.push(id); |
| if (className) { |
| description.push(", class: "); |
| description.push(className); |
| } |
| description.push("\n"); |
| } |
| |
| return element; |
| } |
| |
| function positionElement(id, left, top) { |
| var element = document.getElementById(id); |
| element.style.left = left + "px"; |
| element.style.top = top + "px"; |
| } |
| |
| function buildDom(description, indent, parameters) |
| { |
| var configurationElement = parameters.title; |
| var containerElement = "container-" + parameters.title; |
| var ancestorElement = "ancestor-" + parameters.title; |
| var parentElement = configurationElement; |
| |
| addDomElement("div", "positionAbsolute", configurationElement, "body", description, indent); |
| positionElement(configurationElement, parameters.left, parameters.top); |
| if (parameters.hasSibling) { |
| addDomElement("div", "", ancestorElement, parentElement, description, indent); |
| indent++; |
| var siblingElement = "sibling-" + parameters.title; |
| addDomElement("div", "positionFixed sibling", siblingElement, ancestorElement, description, indent); |
| positionElement(siblingElement, parameters.left + 5, parameters.top + 10); |
| parentElement = ancestorElement; |
| } |
| |
| var overflowClass = parameters.isContainingBlock |
| ? "positionAbsolute overflow" |
| : "overflow"; |
| |
| addDomElement("div", overflowClass, containerElement, parentElement, description, indent); |
| indent++; |
| |
| parentElement = containerElement; |
| if (parameters.hasGrandchildren) { |
| var scrollingContainerElement = "scrollingContainer-" + parameters.title; |
| addDomElement("div", "", scrollingContainerElement, parentElement, description, indent); |
| indent++; |
| parentElement = scrollingContainerElement; |
| } |
| |
| var positionedClass = parameters.isFixedPositioned |
| ? "positionFixed" |
| : "positionAbsolute"; |
| |
| var positionedElement = "positioned-" + parameters.title; |
| addDomElement("div", positionedClass + " positioned", positionedElement, parentElement, description, indent); |
| if (parameters.isFixedPositioned) |
| positionElement(positionedElement, parameters.left + 25, parameters.top + 65); |
| |
| for (var i = 0; i < 5; ++i) { |
| var scrolledClass = "scrolled"; |
| if ((i % 2) == 0) |
| scrolledClass += " onTop"; |
| addDomElement("div", scrolledClass, "scrolled-" + parameters.title, parentElement, description, indent); |
| } |
| } |
| |
| function testConfiguration(configuration, index, description) { |
| description.push("\n" + (index + 1) + ". '" + configuration.title + "'\n"); |
| var configurationsPerRow = 4; |
| configuration.top = 10 + 120 * (Math.floor(index / configurationsPerRow)); |
| configuration.left = 10 + 120 * (index % configurationsPerRow); |
| buildDom(description, 0, configuration); |
| } |
| |
| function doTest() { |
| if (window.internals) |
| testRunner.dumpAsTextWithPixelResults(); |
| |
| // Some configurations are as not meaningful for fixed-pos. For example, we |
| // alternate between having the scroll container be a containing block for |
| // the positioned descendant. For the fixed-pos case, the containing block |
| // will be the viewport. |
| var configurations = [ |
| { |
| 'title': 'absolute-grandchildren-not-contained', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': false, |
| 'hasSibling': false, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'absolute-grandchildren', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': true, |
| 'hasSibling': false, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'absolute-not-contained', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': false, |
| 'hasSibling': false, |
| 'hasGrandchildren': false, |
| }, |
| { |
| 'title': 'absolute-sibling-grandchildren-not-contained', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': false, |
| 'hasSibling': true, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'absolute-sibling-grandchildren', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': true, |
| 'hasSibling': true, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'absolute-sibling-not-contained', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': false, |
| 'hasSibling': true, |
| 'hasGrandchildren': false, |
| }, |
| { |
| 'title': 'absolute-sibling', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': true, |
| 'hasSibling': true, |
| 'hasGrandchildren': false, |
| }, |
| { |
| 'title': 'absolute', |
| 'isFixedPositioned': false, |
| 'isContainingBlock': true, |
| 'hasSibling': false, |
| 'hasGrandchildren': false, |
| }, |
| { |
| 'title': 'fixed-sibling-grandchildren', |
| 'isFixedPositioned': true, |
| 'isContainingBlock': true, |
| 'hasSibling': true, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'fixed-sibling', |
| 'isFixedPositioned': true, |
| 'isContainingBlock': true, |
| 'hasSibling': true, |
| 'hasGrandchildren': false, |
| }, |
| { |
| 'title': 'fixed-grandchildren', |
| 'isFixedPositioned': true, |
| 'isContainingBlock': true, |
| 'hasSibling': false, |
| 'hasGrandchildren': true, |
| }, |
| { |
| 'title': 'fixed', |
| 'isFixedPositioned': true, |
| 'isContainingBlock': true, |
| 'hasSibling': false, |
| 'hasGrandchildren': false, |
| }, |
| ]; |
| |
| var description = [ "We check that scrolling is accelerated in the following configurations:\n" ]; |
| for (var i = 0; i < configurations.length; ++i) |
| testConfiguration(configurations[i], i, description); |
| |
| var containers = document.getElementsByClassName("overflow"); |
| for (var i = 0; i < containers.length; ++i) { |
| var container = containers[i]; |
| container.scrollTop = container.scrollHeight - container.clientHeight; |
| } |
| |
| addDomElement("pre", "", "console", "body", [], 0); |
| var pre = document.getElementById("console"); |
| |
| if (window.internals) { |
| var layerTreeAsText = internals.layerTreeAsText(document); |
| pre.style.left = "-80000px"; |
| pre.innerHTML = layerTreeAsText; |
| } else { |
| pre.innerHTML = description.join(""); |
| } |
| } |
| |
| window.onload = doTest; |
| |
| </script> |
| </head> |
| <body> |
| </body> |
| </html> |