1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
8 from tvcm import dev_server
9 from tvcm import project as project_module
12 def _try_to_import_telemetry():
13 # Maybe telemetry is just hanging around in PYTHONPATH
20 # Try to find it in a likely location.
21 trace_viewer_path = os.path.join(os.path.dirname(__file__), '..', '..', '..')
22 parent_chrome_path = os.path.join(trace_viewer_path, '..', '..')
23 telemetry_path = os.path.abspath(
24 os.path.join(parent_chrome_path, 'tools', 'telemetry'))
25 if not os.path.exists(os.path.join(telemetry_path, 'telemetry', '__init__.py')):
27 if not telemetry_path in sys.path:
28 sys.path.append(telemetry_path)
32 if _try_to_import_telemetry():
34 from telemetry.core import browser_finder
35 from telemetry.core import browser_options
36 from telemetry.core import local_server
38 class _LocalDevServer(local_server.LocalServer):
39 def __init__(self, project):
40 super(_LocalDevServer, self).__init__(_LocalDevServerBackend)
41 self.project = project
43 def GetBackendStartupArgs(self):
44 return self.project.AsDict()
48 return self.forwarder.url
51 class _LocalDevServerBackend(local_server.LocalServerBackend):
53 super(_LocalDevServerBackend, self).__init__()
56 def StartAndGetNamedPorts(self, args):
57 self.server = dev_server.DevServer(port=0, quiet=True,
58 project=project_module.Project.FromDict(args))
59 return [local_server.NamedPort('http', self.server.port)]
61 def ServeForever(self):
62 return self.server.serve_forever()
69 return telemetry != None
72 class BrowserController(object):
73 def __init__(self, project):
75 raise Exception('Not supported: you trace-viewer to be inside a chrome checkout for this to work.')
76 self._project = project
78 finder_options = browser_options.BrowserFinderOptions()
79 parser = finder_options.CreateParser('telemetry_perf_test.py')
80 finder_options, _ = parser.parse_args(['--browser', 'any'])
81 finder_options.browser_options.warn_if_no_flash = False
82 browser_to_create = browser_finder.FindBrowser(finder_options)
85 raise Exception('Telemetry not found. Cannot run src/ tests')
89 assert browser_to_create
90 self._browser = browser_to_create.Create()
94 self._tab = self._browser.tabs[0]
96 self._server = _LocalDevServer(self._project)
97 self._browser.StartLocalServer(self._server)
100 self._browser.Close()
102 def NavigateToPath(self, path):
103 self._tab.Navigate(self._server.url + path)
104 self._tab.WaitForDocumentReadyStateToBeComplete()
106 def EvaluateJavaScript(self, js, timeout=120):
107 return self._tab.EvaluateJavaScript(js, timeout)
109 def WaitForJavaScriptExpression(self, js, timeout=120):
110 self._tab.WaitForJavaScriptExpression(js, timeout)
112 def EvaluateThennableAndWait(self, js, timeout=120):
114 raise Exception('Must not end with ;');
117 window.__thennableSucceeded = undefined;
118 window.__thennableResult = undefined;
121 window.__thennableSucceeded = true;
122 window.__thennableResult = res;
125 window.__thennableSucceeded = false;
126 if (typeof(err) === 'string') {
127 window.__thennableResult = err;
130 window.__thennableResult = e.message + '\\n' + e.stack;
133 self._tab.message_output_stream = sys.stderr
134 self._tab.ExecuteJavaScript(full_js)
135 self._tab.WaitForJavaScriptExpression('window.__thennableSucceeded !== undefined',
137 val = self._tab.EvaluateJavaScript('window.__thennableSucceeded')
139 raise Exception('Failed: %s' % self._tab.EvaluateJavaScript(
140 'window.__thennableResult'))
141 return self._tab.EvaluateJavaScript('window.__thennableResult')
146 def __exit__(self, *args):
158 self._browser.Close()