blob: eb2876770857116f8bc390697f75e5d009497bfb [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import division
from telemetry import decorators
from telemetry.internal.actions import page_action
from telemetry.internal.actions import pinch
from telemetry.internal.actions import utils
from telemetry.testing import tab_test_case
class PinchActionTest(tab_test_case.TabTestCase):
def setUp(self):
super(PinchActionTest, self).setUp()
self.Navigate('zoom.html')
utils.InjectJavaScript(self._tab, 'gesture_common.js')
@decorators.Disabled('android') # crbug.com/796615
def testPinchByApiCalledWithCorrectArguments(self):
if not page_action.IsGestureSourceTypeSupported(self._tab, 'touch'):
return
action_runner = self._tab.action_runner
action_runner.ExecuteJavaScript('''
chrome.gpuBenchmarking.pinchBy = function(
scaleFactor, anchorLeft, anchorTop, callback, speed) {
window.__test_scaleFactor = scaleFactor;
window.__test_anchorLeft = anchorLeft;
window.__test_anchorTop = anchorTop;
window.__test_callback = callback;
window.__test_speed = speed;
window.__pinchActionDone = true;
};''')
action_runner.PinchPage(scale_factor=2)
self.assertEqual(
2, action_runner.EvaluateJavaScript('window.__test_scaleFactor'))
self.assertTrue(
action_runner.EvaluateJavaScript('!isNaN(window.__test_anchorLeft)'))
self.assertTrue(
action_runner.EvaluateJavaScript('!isNaN(window.__test_anchorTop)'))
self.assertTrue(
action_runner.EvaluateJavaScript('!!window.__test_callback'))
self.assertEqual(
800, action_runner.EvaluateJavaScript('window.__test_speed'))
# TODO(bokan): It looks like pinch gestures don't quite work correctly on
# desktop and ChromeOS. Disable for now and investigate later.
# https://crbug.com/787615 and https://crbug.com/797834.
@decorators.Disabled('chromeos', 'linux', 'mac', 'win')
def testPinchScale(self):
starting_scale = self._tab.EvaluateJavaScript('window.visualViewport.scale')
i = pinch.PinchAction(
scale_factor=4,
speed_in_pixels_per_second=500)
i.WillRunAction(self._tab)
i.RunAction(self._tab)
scale = self._tab.EvaluateJavaScript('window.visualViewport.scale')
self.assertAlmostEqual(scale, starting_scale * 4, delta=0.2 * scale)
starting_scale = scale
i = pinch.PinchAction(
scale_factor=0.5,
speed_in_pixels_per_second=500)
i.WillRunAction(self._tab)
i.RunAction(self._tab)
scale = self._tab.EvaluateJavaScript('window.visualViewport.scale')
# Note: we have to use an approximate equality here. The pinch gestures
# aren't exact. Some investigation long ago showed that the touch slop
# distance in Android's gesture recognizer violated some assumptions made
# by the synthetic gestures. There's (a bit of) context in
# https://crbug.com/686390.
# TODO(bokan): I landed changes in M65 (https://crrev.com/c/784213) that
# should make this significantly better. We can tighten up the bounds once
# that's in ref builds.
#2To3-division: this line is unchanged as result is expected floats.
self.assertAlmostEqual(scale, starting_scale / 2, delta=0.2 * scale)
# Test that the anchor ratio correctly centers the pinch gesture at the
# requested part of the viewport.
# TODO(bokan): It looks like pinch gestures don't quite work correctly on
# desktop and ChromeOS. Disable for now and investigate later.
# https://crbug.com/787615 and https://crbug.com/797834.
@decorators.Disabled('chromeos', 'linux', 'mac', 'win')
def testPinchAnchor(self):
starting_scale = self._tab.EvaluateJavaScript('window.visualViewport.scale')
self.assertEquals(1, starting_scale)
width = self._tab.EvaluateJavaScript('window.innerWidth')
height = self._tab.EvaluateJavaScript('window.innerHeight')
# Pinch zoom into the bottom right corner. Note, we can't go exactly to the
# corner since the starting touch point would be outside the screen.
i = pinch.PinchAction(
left_anchor_ratio=0.9,
top_anchor_ratio=0.9,
scale_factor=2.5,
speed_in_pixels_per_second=500)
i.WillRunAction(self._tab)
i.RunAction(self._tab)
offset_x = self._tab.EvaluateJavaScript('window.visualViewport.offsetLeft')
offset_y = self._tab.EvaluateJavaScript('window.visualViewport.offsetTop')
self.assertGreater(offset_x, width // 2)
self.assertGreater(offset_y, height // 2)
# TODO(bokan): This early-out can be removed once setPageScaleFactor (M64)
# rolls into the ref builds.
if not self._tab.EvaluateJavaScript(
"'setPageScaleFactor' in chrome.gpuBenchmarking"):
return
self._tab.EvaluateJavaScript(
'chrome.gpuBenchmarking.setPageScaleFactor(1)')
# Try again in the top left.
i = pinch.PinchAction(
left_anchor_ratio=0.1,
top_anchor_ratio=0.1,
scale_factor=2.5,
speed_in_pixels_per_second=500)
i.WillRunAction(self._tab)
i.RunAction(self._tab)
offset_x = self._tab.EvaluateJavaScript('window.visualViewport.offsetLeft')
offset_y = self._tab.EvaluateJavaScript('window.visualViewport.offsetTop')
self.assertLess(offset_x + width // 2.5, width // 2)
self.assertLess(offset_y + height // 2.5, height // 2)