diff options
author | bajones@chromium.org <bajones@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-19 13:40:10 +0000 |
---|---|---|
committer | bajones@chromium.org <bajones@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-19 13:40:10 +0000 |
commit | 5388c32361d1b66670866bcc9199d7c2abcfb9f2 (patch) | |
tree | 9c060fb2ae7365d2839e41c7ddee148dd6ba0802 /tools | |
parent | b981bb43a2824e50af81a4dd44a5132f598d9dad (diff) | |
download | chromium_src-5388c32361d1b66670866bcc9199d7c2abcfb9f2.zip chromium_src-5388c32361d1b66670866bcc9199d7c2abcfb9f2.tar.gz chromium_src-5388c32361d1b66670866bcc9199d7c2abcfb9f2.tar.bz2 |
Added Tab.SnapshotContent and MapsGL example to telemetry
This CL is dependent on an upcoming feature in the gpuBenchmarking extension,
and will not work correctly until that is implemented.
This is a subset of the prior CL 11362023, which has been broken apart to facilitate easier reviews
BUG=157479
TBR=nduca@chromium.org
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=167549
Review URL: https://chromiumcodereview.appspot.com/11360172
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168518 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools')
-rw-r--r-- | tools/telemetry/telemetry/inspector_console.py | 3 | ||||
-rw-r--r-- | tools/telemetry/telemetry/inspector_page.py | 59 | ||||
-rw-r--r-- | tools/telemetry/telemetry/inspector_page_unittest.py | 21 | ||||
-rw-r--r-- | tools/telemetry/telemetry/inspector_runtime.py | 3 | ||||
-rw-r--r-- | tools/telemetry/telemetry/inspector_timeline.py | 3 | ||||
-rw-r--r-- | tools/telemetry/telemetry/png_bitmap.py | 69 | ||||
-rw-r--r-- | tools/telemetry/telemetry/png_bitmap_unittest.py | 27 | ||||
-rw-r--r-- | tools/telemetry/telemetry/tab.py | 10 | ||||
-rw-r--r-- | tools/telemetry/telemetry/tab_test_case.py | 9 | ||||
-rw-r--r-- | tools/telemetry/unittest_data/green_rect.html | 19 |
10 files changed, 215 insertions, 8 deletions
diff --git a/tools/telemetry/telemetry/inspector_console.py b/tools/telemetry/telemetry/inspector_console.py index b9ea024..89811ff 100644 --- a/tools/telemetry/telemetry/inspector_console.py +++ b/tools/telemetry/telemetry/inspector_console.py @@ -5,7 +5,8 @@ import json import logging class InspectorConsole(object): - def __init__(self, inspector_backend): + def __init__(self, inspector_backend, tab): + self._tab = tab self._inspector_backend = inspector_backend self._inspector_backend.RegisterDomain( 'Console', diff --git a/tools/telemetry/telemetry/inspector_page.py b/tools/telemetry/telemetry/inspector_page.py index b37d330..58afb4e 100644 --- a/tools/telemetry/telemetry/inspector_page.py +++ b/tools/telemetry/telemetry/inspector_page.py @@ -5,9 +5,13 @@ import json import logging from telemetry import util +from telemetry import png_bitmap + +DEFAULT_SCREENSHOT_TIMEOUT = 60 class InspectorPage(object): - def __init__(self, inspector_backend): + def __init__(self, inspector_backend, tab): + self._tab = tab self._inspector_backend = inspector_backend self._inspector_backend.RegisterDomain( 'Page', @@ -81,3 +85,56 @@ class InspectorPage(object): self._inspector_backend.SendAndIgnoreResponse(request) self.PerformActionAndWaitForNavigate(DoNavigate, timeout) + + @property + def screenshot_supported(self): + """True if the browser instance is capable of capturing screenshots""" + if self._tab.runtime.Evaluate( + 'window.chrome.gpuBenchmarking === undefined'): + return False + + if self._tab.runtime.Evaluate( + 'window.chrome.gpuBenchmarking.windowSnapshot === undefined'): + return False + + return True + + def Screenshot(self, timeout=DEFAULT_SCREENSHOT_TIMEOUT): + """Capture a screenshot of the window for rendering validation""" + + if self._tab.runtime.Evaluate( + 'window.chrome.gpuBenchmarking === undefined'): + raise Exception("Browser was not started with --enable-gpu-benchmarking") + + if self._tab.runtime.Evaluate( + 'window.chrome.gpuBenchmarking.windowSnapshot === undefined'): + raise Exception("Browser does not support window snapshot API.") + + self._tab.runtime.Evaluate(""" + if(!window.__telemetry) { + window.__telemetry = {} + } + window.__telemetry.snapshotComplete = false; + window.__telemetry.snapshotData = null; + window.chrome.gpuBenchmarking.windowSnapshot(function(snapshot) { + window.__telemetry.snapshotData = snapshot; + window.__telemetry.snapshotComplete = true; + }); + """) + + def IsSnapshotComplete(): + return self._tab.runtime.Evaluate('window.__telemetry.snapshotComplete') + + util.WaitFor(IsSnapshotComplete, timeout) + + snap = self._tab.runtime.Evaluate(""" + (function() { + var data = window.__telemetry.snapshotData; + delete window.__telemetry.snapshotComplete; + delete window.__telemetry.snapshotData; + return data; + })() + """) + if snap: + return png_bitmap.PngBitmap(snap['data']) + return None diff --git a/tools/telemetry/telemetry/inspector_page_unittest.py b/tools/telemetry/telemetry/inspector_page_unittest.py index 8bb9b99..1d214ab 100644 --- a/tools/telemetry/telemetry/inspector_page_unittest.py +++ b/tools/telemetry/telemetry/inspector_page_unittest.py @@ -43,3 +43,24 @@ class InspectorPageTest(tab_test_case.TabTestCase): self.assertTrue(custom_action_called[0]) self.assertEquals(self._tab.runtime.Evaluate('document.location.pathname;'), '/blank.html') + +class GpuInspectorPageTest(tab_test_case.TabTestCase): + def setUp(self): + self._extra_browser_args = ['--enable-gpu-benchmarking'] + super(GpuInspectorPageTest, self).setUp() + + def testScreenshot(self): + unittest_data_dir = os.path.join(os.path.dirname(__file__), + '..', 'unittest_data') + self._browser.SetHTTPServerDirectory(unittest_data_dir) + self._tab.page.Navigate( + self._browser.http_server.UrlOf('green_rect.html')) + self._tab.WaitForDocumentReadyStateToBeComplete() + + # Skip this test if running against a browser without screenshot support + if self._tab.page.screenshot_supported: + screenshot = self._tab.page.Screenshot(5) + assert screenshot + screenshot.GetPixelColor(0, 0).AssertIsRGB(0, 255, 0) + screenshot.GetPixelColor(31, 31).AssertIsRGB(0, 255, 0) + screenshot.GetPixelColor(32, 32).AssertIsRGB(255, 255, 255) diff --git a/tools/telemetry/telemetry/inspector_runtime.py b/tools/telemetry/telemetry/inspector_runtime.py index 4479b66..e6a90bc 100644 --- a/tools/telemetry/telemetry/inspector_runtime.py +++ b/tools/telemetry/telemetry/inspector_runtime.py @@ -5,7 +5,8 @@ class EvaluateException(Exception): pass class InspectorRuntime(object): - def __init__(self, inspector_backend): + def __init__(self, inspector_backend, tab): + self._tab = tab self._inspector_backend = inspector_backend self._inspector_backend.RegisterDomain( 'Runtime', diff --git a/tools/telemetry/telemetry/inspector_timeline.py b/tools/telemetry/telemetry/inspector_timeline.py index 0aadb3a..6b502fa4 100644 --- a/tools/telemetry/telemetry/inspector_timeline.py +++ b/tools/telemetry/telemetry/inspector_timeline.py @@ -59,8 +59,9 @@ class InspectorTimeline(object): def __exit__(self, *args): self._timeline.Stop() - def __init__(self, inspector_backend): + def __init__(self, inspector_backend, tab): self._inspector_backend = inspector_backend + self._tab = tab self._is_recording = False self._timeline_events = TimelineEvents() diff --git a/tools/telemetry/telemetry/png_bitmap.py b/tools/telemetry/telemetry/png_bitmap.py new file mode 100644 index 0000000..6914dfb --- /dev/null +++ b/tools/telemetry/telemetry/png_bitmap.py @@ -0,0 +1,69 @@ +# 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 sys +import os +import base64 + +PNG_PATH = os.path.join(os.path.dirname(__file__), '../third_party/png') +if PNG_PATH not in sys.path: + sys.path.append(PNG_PATH) + +import png # pylint: disable=F0401 + +class PngColor(object): + """Encapsulates an RGB color retreived from a PngBitmap""" + + def __init__(self, r, g, b, a=255): + self.r = r + self.g = g + self.b = b + self.a = a + + def IsEqual(self, expected_color, tolerance=0): + """Verifies that the color is within a given tolerance of + the expected color""" + r_diff = abs(self.r - expected_color.r) + g_diff = abs(self.g - expected_color.g) + b_diff = abs(self.b - expected_color.b) + a_diff = abs(self.a - expected_color.a) + return (r_diff <= tolerance and g_diff <= tolerance + and b_diff <= tolerance and a_diff <= tolerance) + + def AssertIsRGB(self, r, g, b, tolerance=0): + assert self.IsEqual(PngColor(r, g, b), tolerance) + + def AssertIsRGBA(self, r, g, b, a, tolerance=0): + assert self.IsEqual(PngColor(r, g, b, a), tolerance) + +class PngBitmap(object): + """Utilities for parsing and inspecting inspecting a PNG""" + + def __init__(self, base64_png): + self._png_data = base64.b64decode(base64_png) + self._png = png.Reader(bytes=self._png_data) + rgba8_data = self._png.asRGBA8() + self._width = rgba8_data[0] + self._height = rgba8_data[1] + self._pixels = list(rgba8_data[2]) + self._metadata = rgba8_data[3] + + @property + def width(self): + """Width of the snapshot""" + return self._width + + @property + def height(self): + """Height of the snapshot""" + return self._height + + def GetPixelColor(self, x, y): + """Returns a PngColor for the pixel at (x, y)""" + row = self._pixels[y] + offset = x * 4 + return PngColor(row[offset], row[offset+1], row[offset+2], row[offset+3]) + + def WriteFile(self, path): + with open(path, "wb") as f: + f.write(self._png_data) diff --git a/tools/telemetry/telemetry/png_bitmap_unittest.py b/tools/telemetry/telemetry/png_bitmap_unittest.py new file mode 100644 index 0000000..7881ff0 --- /dev/null +++ b/tools/telemetry/telemetry/png_bitmap_unittest.py @@ -0,0 +1,27 @@ +# 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 unittest + +from telemetry import png_bitmap + +# This is a simple base64 encoded 2x2 PNG which contains, in order, a single +# Red, Yellow, Blue, and Green pixel. +test_png = """ +iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91 +JpzAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACx +MBAJqcGAAAABZJREFUCNdj/M/AwPCfgYGB4T/DfwY +AHAAD/iOWZXsAAAAASUVORK5CYII= +""" + +class PngBitmapTest(unittest.TestCase): + def testRead(self): + png = png_bitmap.PngBitmap(test_png) + + self.assertEquals(2, png.width) + self.assertEquals(2, png.height) + + png.GetPixelColor(0, 0).AssertIsRGB(255, 0, 0) + png.GetPixelColor(1, 1).AssertIsRGB(0, 255, 0) + png.GetPixelColor(0, 1).AssertIsRGB(0, 0, 255) + png.GetPixelColor(1, 0).AssertIsRGB(255, 255, 0) diff --git a/tools/telemetry/telemetry/tab.py b/tools/telemetry/telemetry/tab.py index d6ac82a..9d6530f 100644 --- a/tools/telemetry/telemetry/tab.py +++ b/tools/telemetry/telemetry/tab.py @@ -23,11 +23,13 @@ class Tab(object): def __init__(self, browser, inspector_backend): self._browser = browser self._inspector_backend = inspector_backend - self._page = inspector_page.InspectorPage(self._inspector_backend) - self._runtime = inspector_runtime.InspectorRuntime(self._inspector_backend) - self._console = inspector_console.InspectorConsole(self._inspector_backend) + self._page = inspector_page.InspectorPage(self._inspector_backend, self) + self._runtime = inspector_runtime.InspectorRuntime( + self._inspector_backend, self) + self._console = inspector_console.InspectorConsole( + self._inspector_backend, self) self._timeline = inspector_timeline.InspectorTimeline( - self._inspector_backend) + self._inspector_backend, self) def __del__(self): self.Close() diff --git a/tools/telemetry/telemetry/tab_test_case.py b/tools/telemetry/telemetry/tab_test_case.py index cbd52d1..cd1837f 100644 --- a/tools/telemetry/telemetry/tab_test_case.py +++ b/tools/telemetry/telemetry/tab_test_case.py @@ -7,10 +7,19 @@ from telemetry import browser_finder from telemetry import options_for_unittests class TabTestCase(unittest.TestCase): + def __init__(self, *args): + self._extra_browser_args = [] + super(TabTestCase, self).__init__(*args) + def setUp(self): self._browser = None self._tab = None options = options_for_unittests.Get() + + if self._extra_browser_args: + for arg in self._extra_browser_args: + options.extra_browser_args.append(arg) + browser_to_create = browser_finder.FindBrowser(options) if not browser_to_create: raise Exception('No browser found, cannot continue test.') diff --git a/tools/telemetry/unittest_data/green_rect.html b/tools/telemetry/unittest_data/green_rect.html new file mode 100644 index 0000000..478c755 --- /dev/null +++ b/tools/telemetry/unittest_data/green_rect.html @@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<html> +<head> + <style> + html, body { + margin: 0; + padding: 0; + } + #green { + width: 32px; + height: 32px; + background-color: rgb(0, 255, 0); + } + </style> +</head> +<body> + <div id="green"></div> +</body> +</html>
\ No newline at end of file |