summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorbajones@chromium.org <bajones@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-19 13:40:10 +0000
committerbajones@chromium.org <bajones@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-19 13:40:10 +0000
commit5388c32361d1b66670866bcc9199d7c2abcfb9f2 (patch)
tree9c060fb2ae7365d2839e41c7ddee148dd6ba0802 /tools
parentb981bb43a2824e50af81a4dd44a5132f598d9dad (diff)
downloadchromium_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.py3
-rw-r--r--tools/telemetry/telemetry/inspector_page.py59
-rw-r--r--tools/telemetry/telemetry/inspector_page_unittest.py21
-rw-r--r--tools/telemetry/telemetry/inspector_runtime.py3
-rw-r--r--tools/telemetry/telemetry/inspector_timeline.py3
-rw-r--r--tools/telemetry/telemetry/png_bitmap.py69
-rw-r--r--tools/telemetry/telemetry/png_bitmap_unittest.py27
-rw-r--r--tools/telemetry/telemetry/tab.py10
-rw-r--r--tools/telemetry/telemetry/tab_test_case.py9
-rw-r--r--tools/telemetry/unittest_data/green_rect.html19
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