Bug 1253683 - Add a test. r=tnikkel

MozReview-Commit-ID: Cn3paFTFo1O

--HG--
extra : rebase_source : 58868e2aef582b4fb12d5dd8af72996863d3fc13
This commit is contained in:
Kartikaya Gupta 2016-06-29 14:29:42 -04:00
Родитель 63a50e8725
Коммит 20ce0084db
4 изменённых файлов: 80 добавлений и 23 удалений

Просмотреть файл

@ -81,6 +81,25 @@ function findRcdNode(apzcTree) {
return null;
}
// Return whether an element whose id includes |elementId| has been layerized.
// Assumes |elementId| will be present in the content description for the
// element, and not in the content descriptions of other elements.
function isLayerized(elementId) {
var contentTestData = SpecialPowers.getDOMWindowUtils(window).getContentAPZTestData();
ok(contentTestData.paints.length > 0, "expected at least one paint");
var seqno = contentTestData.paints[contentTestData.paints.length - 1].sequenceNumber;
contentTestData = convertTestData(contentTestData);
var paint = contentTestData.paints[seqno];
for (var scrollId in paint) {
if ("contentDescription" in paint[scrollId]) {
if (paint[scrollId]["contentDescription"].includes(elementId)) {
return true;
}
}
}
return false;
}
function flushApzRepaints(aCallback, aWindow = window) {
if (!aCallback) {
throw "A callback must be provided!";

Просмотреть файл

@ -52,3 +52,5 @@ skip-if = (toolkit == 'android') # wheel events not supported on mobile
[test_group_mouseevents.html]
[test_touch_listeners_impacting_wheel.html]
skip-if = (toolkit == 'android') || (toolkit == 'cocoa') # wheel events not supported on mobile, and synthesized wheel smooth-scrolling not supported on OS X
[test_bug1253683.html]
skip-if = (os == 'android') || (os == 'b2g') # uses wheel events which are not supported on mobile

Просмотреть файл

@ -0,0 +1,59 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1253683
-->
<head>
<title>Test to ensure non-scrollable frames don't get layerized</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
<script type="application/javascript" src="apz_test_native_event_utils.js"></script>
<script type="application/javascript" src="apz_test_utils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<p id="display"></p>
<div id="container" style="height: 500px; overflow:scroll">
<pre id="no_layer" style="background-color: #f5f5f5; margin: 15px; padding: 15px; margin-top: 100px; border: 1px solid #eee; overflow:scroll">sample code here</pre>
<div style="height: 5000px">spacer to make the 'container' div the root scrollable element</div>
</div>
<pre id="test">
<script type="application/javascript;version=1.7">
function* test(testDriver) {
var container = document.getElementById('container');
var no_layer = document.getElementById('no_layer');
// Check initial state
is(container.scrollTop, 0, "Initial scrollY should be 0");
ok(!isLayerized('no_layer'), "initially 'no_layer' should not be layerized");
// Scrolling over outer1 should layerize outer1, but not inner1.
yield moveMouseAndScrollWheelOver(no_layer, 10, 10, testDriver, true);
yield waitForAllPaints(function() {
flushApzRepaints(testDriver);
});
ok(container.scrollTop > 0, "We should have scrolled the body");
ok(!isLayerized('no_layer'), "no_layer should still not be layerized");
}
if (isApzEnabled()) {
SimpleTest.waitForExplicitFinish();
// Turn off displayport expiry so that we don't miss failures where the
// displayport is set and expired before we check for layerization.
// Also enable APZ test logging, since we use that data to determine whether
// a scroll frame was layerized.
pushPrefs([["apz.displayport_expiry_ms", 0],
["apz.test.logging_enabled", true]])
.then(waitUntilApzStable)
.then(runContinuation(test))
.then(SimpleTest.finish);
}
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -58,29 +58,8 @@ function scrollWheelOver(element, waitForScroll, testDriver) {
moveMouseAndScrollWheelOver(element, 10, 10, testDriver, waitForScroll);
}
var utils;
const DISPLAYPORT_EXPIRY = 100;
// Return whether the element with id |elementId| has been layerized.
// Assumes |elementId| will be present in the content description for the
// element, and not in the content descriptions of other elements.
function isLayerized(elementId) {
var contentTestData = utils.getContentAPZTestData();
ok(contentTestData.paints.length > 0, "expected at least one paint");
var seqno = contentTestData.paints[contentTestData.paints.length - 1].sequenceNumber;
contentTestData = convertTestData(contentTestData);
var paint = contentTestData.paints[seqno];
for (var scrollId in paint) {
if ("contentDescription" in paint[scrollId]) {
if (paint[scrollId]["contentDescription"].includes(elementId)) {
return true;
}
}
}
return false;
}
// This helper function produces another helper function, which, when invoked,
// invokes the provided testDriver argument in a setTimeout 0. This is really
// just useful in cases when there are no paints pending, because then
@ -94,8 +73,6 @@ function asyncWrapper(testDriver) {
}
function* test(testDriver) {
utils = SpecialPowers.getDOMWindowUtils(window);
// Initially, nothing should be layerized.
ok(!isLayerized('outer1'), "initially 'outer1' should not be layerized");
ok(!isLayerized('inner1'), "initially 'inner1' should not be layerized");