blob: 3b1e53b90775f178e693690e44c61a98101c80f9 [file] [log] [blame]
# Copyright (c) 2012 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.
import os
from telemetry.core import util
from telemetry.page import page as page_module
#from telemetry.page.actions import scroll
from telemetry.unittest import tab_test_case
class ScrollActionTest(tab_test_case.TabTestCase):
def setUp(self):
self._extra_browser_args.append('--enable-gpu-benchmarking')
super(ScrollActionTest, self).setUp()
def CreateAndNavigateToPageFromUnittestDataDir(
self, filename, page_attributes):
self._browser.SetHTTPServerDirectories(util.GetUnittestDataDir())
page = page_module.Page(
self._browser.http_server.UrlOf(filename),
None, # In this test, we don't need a page set.
attributes=page_attributes)
self._tab.Navigate(page.url)
self._tab.WaitForDocumentReadyStateToBeComplete()
return page
# crbug.com/308846, Blink roll 159695:159835.
#
# def testScrollAction(self):
# page = self.CreateAndNavigateToPageFromUnittestDataDir(
# "blank.html",
# page_attributes={"smoothness": {
# "action": "scroll"
# }})
# # Make page bigger than window so it's scrollable.
# self._tab.ExecuteJavaScript("""document.body.style.height =
# (2 * window.innerHeight + 1) + 'px';""")
#
# self.assertEquals(
# self._tab.EvaluateJavaScript("""document.documentElement.scrollTop
# || document.body.scrollTop"""), 0)
#
# i = scroll.ScrollAction()
# i.WillRunAction(page, self._tab)
#
# self._tab.ExecuteJavaScript("""
# window.__scrollAction.beginMeasuringHook = function() {
# window.__didBeginMeasuring = true;
# };
# window.__scrollAction.endMeasuringHook = function() {
# window.__didEndMeasuring = true;
# };""")
# i.RunAction(page, self._tab, None)
#
# self.assertTrue(self._tab.EvaluateJavaScript('window.__didBeginMeasuring'))
# self.assertTrue(self._tab.EvaluateJavaScript('window.__didEndMeasuring'))
#
# # Allow for roundoff error in scaled viewport.
# scroll_position = self._tab.EvaluateJavaScript(
# """(document.documentElement.scrollTop || document.body.scrollTop)
# + window.innerHeight""")
# scroll_height = self._tab.EvaluateJavaScript('document.body.scrollHeight')
# difference = scroll_position - scroll_height
# self.assertTrue(abs(difference) <= 1)
def testBoundingClientRect(self):
self.CreateAndNavigateToPageFromUnittestDataDir('blank.html', {})
with open(os.path.join(os.path.dirname(__file__), 'scroll.js')) as f:
js = f.read()
self._tab.ExecuteJavaScript(js)
# Verify that the rect returned by getBoundingVisibleRect() in scroll.js is
# completely contained within the viewport. Scroll events dispatched by the
# scrolling API use the center of this rect as their location, and this
# location needs to be within the viewport bounds to correctly decide
# between main-thread and impl-thread scroll. If the scrollable area were
# not clipped to the viewport bounds, then the instance used here (the
# scrollable area being more than twice as tall as the viewport) would
# result in a scroll location outside of the viewport bounds.
self._tab.ExecuteJavaScript("""document.body.style.height =
(2 * window.innerHeight + 1) + 'px';""")
rect_top = int(self._tab.EvaluateJavaScript(
'__ScrollAction_GetBoundingVisibleRect(document.body).top'))
rect_height = int(self._tab.EvaluateJavaScript(
'__ScrollAction_GetBoundingVisibleRect(document.body).height'))
rect_bottom = rect_top + rect_height
rect_left = int(self._tab.EvaluateJavaScript(
'__ScrollAction_GetBoundingVisibleRect(document.body).left'))
rect_width = int(self._tab.EvaluateJavaScript(
'__ScrollAction_GetBoundingVisibleRect(document.body).width'))
rect_right = rect_left + rect_width
viewport_height = int(self._tab.EvaluateJavaScript('window.innerHeight'))
viewport_width = int(self._tab.EvaluateJavaScript('window.innerWidth'))
self.assertTrue(rect_bottom <= viewport_height,
msg='%s + %s <= %s' % (rect_top, rect_height, viewport_height))
self.assertTrue(rect_right <= viewport_width,
msg='%s + %s <= %s' % (rect_left, rect_width, viewport_width))