blob: 3cc3cd08164d31d510804129e72ae8998eca8811 [file] [log] [blame]
# Copyright 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 logging
from telemetry import test
from telemetry.core import bitmap
from telemetry.core import video
from telemetry.core import util
from telemetry.core import exceptions
from telemetry.core.backends.chrome import tracing_backend
from telemetry.timeline import model
from telemetry.unittest import tab_test_case
def _IsDocumentVisible(tab):
return not tab.EvaluateJavaScript('document.hidden || document.webkitHidden')
class FakePlatform(object):
def __init__(self):
self._is_video_capture_running = False
#pylint: disable=W0613
def StartVideoCapture(self, min_bitrate_mbps):
self._is_video_capture_running = True
def StopVideoCapture(self):
self._is_video_capture_running = False
return video.Video(self, None)
def SetFullPerformanceModeEnabled(self, enabled):
pass
@property
def is_video_capture_running(self):
return self._is_video_capture_running
class TabTest(tab_test_case.TabTestCase):
def testNavigateAndWaitToForCompleteState(self):
self._browser.SetHTTPServerDirectories(util.GetUnittestDataDir())
self._tab.Navigate(self._browser.http_server.UrlOf('blank.html'))
self._tab.WaitForDocumentReadyStateToBeComplete()
def testNavigateAndWaitToForInteractiveState(self):
self._browser.SetHTTPServerDirectories(util.GetUnittestDataDir())
self._tab.Navigate(self._browser.http_server.UrlOf('blank.html'))
self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()
def testTabBrowserIsRightBrowser(self):
self.assertEquals(self._tab.browser, self._browser)
def testRendererCrash(self):
self.assertRaises(exceptions.TabCrashException,
lambda: self._tab.Navigate('chrome://crash',
timeout=5))
def testActivateTab(self):
if not self._browser.supports_tab_control:
logging.warning('Browser does not support tab control, skipping test.')
return
util.WaitFor(lambda: _IsDocumentVisible(self._tab), timeout=5)
new_tab = self._browser.tabs.New()
new_tab.Navigate('about:blank')
util.WaitFor(lambda: _IsDocumentVisible(new_tab), timeout=5)
self.assertFalse(_IsDocumentVisible(self._tab))
self._tab.Activate()
util.WaitFor(lambda: _IsDocumentVisible(self._tab), timeout=5)
self.assertFalse(_IsDocumentVisible(new_tab))
def testTabUrl(self):
self.assertEquals(self._tab.url, 'about:blank')
self.Navigate('blank.html')
self.assertEquals(self._tab.url, self.test_url)
def testIsTimelineRecordingRunningTab(self):
self.assertFalse(self._tab.is_timeline_recording_running)
self._tab.StartTimelineRecording()
self.assertTrue(self._tab.is_timeline_recording_running)
self._tab.StopTimelineRecording()
self.assertFalse(self._tab.is_timeline_recording_running)
#pylint: disable=W0212
def testIsVideoCaptureRunning(self):
original_platform = self._tab.browser._platform
self._tab.browser._platform = FakePlatform()
self.assertFalse(self._tab.is_video_capture_running)
self._tab.StartVideoCapture(min_bitrate_mbps=2)
self.assertTrue(self._tab.is_video_capture_running)
self.assertIsNotNone(self._tab.StopVideoCapture())
self.assertFalse(self._tab.is_video_capture_running)
self._tab.browser._platform = original_platform
def testHighlight(self):
self.assertEquals(self._tab.url, 'about:blank')
self._browser.StartTracing(tracing_backend.DEFAULT_TRACE_CATEGORIES)
self._tab.Highlight(bitmap.WEB_PAGE_TEST_ORANGE)
self._tab.ClearHighlight(bitmap.WEB_PAGE_TEST_ORANGE)
trace_data = self._browser.StopTracing()
timeline_model = model.TimelineModel(trace_data)
renderer_thread = timeline_model.GetRendererThreadFromTabId(
self._tab.id)
found_video_start_event = False
for event in renderer_thread.async_slices:
if event.name == '__ClearHighlight.video_capture_start':
found_video_start_event = True
break
self.assertTrue(found_video_start_event)
def testGetRendererThreadFromTabId(self):
self.assertEquals(self._tab.url, 'about:blank')
# Create 3 tabs. The third tab is closed before we call StartTracing.
first_tab = self._tab
second_tab = self._browser.tabs.New()
second_tab.Navigate('about:blank')
second_tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()
third_tab = self._browser.tabs.New()
third_tab.Navigate('about:blank')
third_tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()
third_tab.Close()
self._browser.StartTracing(tracing_backend.MINIMAL_TRACE_CATEGORIES)
first_tab.ExecuteJavaScript('console.time("first-tab-marker");')
first_tab.ExecuteJavaScript('console.timeEnd("first-tab-marker");')
second_tab.ExecuteJavaScript('console.time("second-tab-marker");')
second_tab.ExecuteJavaScript('console.timeEnd("second-tab-marker");')
trace_data = self._browser.StopTracing()
timeline_model = model.TimelineModel(trace_data)
# Assert that the renderer_thread of the first tab contains
# 'first-tab-marker'.
renderer_thread = timeline_model.GetRendererThreadFromTabId(
first_tab.id)
first_tab_markers = [
renderer_thread.IterAllSlicesOfName('first-tab-marker')]
self.assertEquals(1, len(first_tab_markers))
# Close second tab and assert that the renderer_thread of the second tab
# contains 'second-tab-marker'.
second_tab.Close()
renderer_thread = timeline_model.GetRendererThreadFromTabId(
second_tab.id)
second_tab_markers = [
renderer_thread.IterAllSlicesOfName('second-tab-marker')]
self.assertEquals(1, len(second_tab_markers))
# Third tab wasn't available when we start tracing, so there is no
# renderer_thread corresponding to it in the the trace.
self.assertIs(None, timeline_model.GetRendererThreadFromTabId(third_tab.id))
class GpuTabTest(tab_test_case.TabTestCase):
def setUp(self):
self._extra_browser_args = ['--enable-gpu-benchmarking']
super(GpuTabTest, self).setUp()
# Test flaky on mac: http://crbug.com/358664
@test.Disabled('android', 'mac')
def testScreenshot(self):
if not self._tab.screenshot_supported:
logging.warning('Browser does not support screenshots, skipping test.')
return
self.Navigate('green_rect.html')
pixel_ratio = self._tab.EvaluateJavaScript('window.devicePixelRatio || 1')
screenshot = self._tab.Screenshot(5)
assert screenshot
screenshot.GetPixelColor(0 * pixel_ratio, 0 * pixel_ratio).AssertIsRGB(
0, 255, 0, tolerance=2)
screenshot.GetPixelColor(31 * pixel_ratio, 31 * pixel_ratio).AssertIsRGB(
0, 255, 0, tolerance=2)
screenshot.GetPixelColor(32 * pixel_ratio, 32 * pixel_ratio).AssertIsRGB(
255, 255, 255, tolerance=2)