blob: 17453d49093de671c18cd827f554254b8dbaa258 [file] [log] [blame]
const kScaleEpsilon = 0.1;
const kOffsetEpsilon = 2;
const centerX = window.innerWidth / 2;
const centerY = window.innerHeight / 2;
// TODO(bokan): Add more variations (speed, anchor location, etc.) but it's
// difficult right now as pinchBy is badly broken on desktops:
// https://crbug.com/787615.
// TODO(bokan): |ignore_offset| is added temporarily to allow testing the
// pinch-zoom on desktop in a less strict way. Currently, touchscreen pinch-zoom
// on desktop doesn't zoom to the expected location. Until that's fixed we'll
// run tests without checking the location so we guard regressing the scale but
// once it's fixed we can remove this and run the strict tests.
// https://crbug.com/787615
function runTest(t, testCase, ignore_offset) {
return new Promise(t.step_func((resolve, reject) => {
internals.setPageScaleFactor(testCase.startingScale);
internals.setVisualViewportOffset(
window.innerWidth * (1 - (1 / testCase.startingScale)) / 2,
window.innerHeight * (1 - (1 / testCase.startingScale)) / 2);
// Ensure the compositor knows the starting scale and offset.
waitForCompositorCommit().then(t.step_func(() => {
chrome.gpuBenchmarking.pinchBy(
testCase.scale, centerX, centerY, t.step_func(() => {
waitForCompositorCommit().then(t.step_func(() => {
const expectedScale = testCase.startingScale * testCase.scale;
assert_approx_equals(
window.visualViewport.scale, expectedScale, kScaleEpsilon,
testCase.msg + ' has correct page scale factor.');
if (!ignore_offset) {
assert_approx_equals(
window.visualViewport.offsetLeft,
window.innerWidth * (1 - (1 / expectedScale)) / 2,
kOffsetEpsilon,
testCase.msg + ' has correct visual viewport offsetLeft.');
assert_approx_equals(
window.visualViewport.offsetTop,
window.innerHeight * (1 - (1 / expectedScale)) / 2,
kOffsetEpsilon,
testCase.msg + ' has correct visual viewport offsetTop.');
}
resolve();
}));
}),
testCase.speed, testCase.gestureSource);
}));
}));
}
async function runAllTestCases(t, testCases) {
for (const testCase of testCases) {
await runTest(t, testCase, false);
}
}
async function runAllTestCasesDesktop(t, testCases) {
for (const testCase of testCases) {
await runTest(t, testCase, true);
}
}