Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / third_party / tvcm / tvcm / browser_controller.py
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.
4 import unittest
5 import sys
6 import os
7
8 from tvcm import dev_server
9 from tvcm import project as project_module
10
11
12 def _try_to_import_telemetry():
13   # Maybe telemetry is just hanging around in PYTHONPATH
14   try:
15     import telemetry
16     return True
17   except:
18     pass
19
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')):
26     return False
27   if not telemetry_path in sys.path:
28     sys.path.append(telemetry_path)
29   return True
30
31
32 if _try_to_import_telemetry():
33   import telemetry
34   from telemetry.core import browser_finder
35   from telemetry.core import browser_options
36   from telemetry.core import local_server
37
38   class _LocalDevServer(local_server.LocalServer):
39     def __init__(self, project):
40       super(_LocalDevServer, self).__init__(_LocalDevServerBackend)
41       self.project = project
42
43     def GetBackendStartupArgs(self):
44       return self.project.AsDict()
45
46     @property
47     def url(self):
48       return self.forwarder.url
49
50
51   class _LocalDevServerBackend(local_server.LocalServerBackend):
52     def __init__(self):
53       super(_LocalDevServerBackend, self).__init__()
54       self.server = None
55
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)]
60
61     def ServeForever(self):
62       return self.server.serve_forever()
63
64 else:
65   telemetry = None
66
67
68 def IsSupported():
69   return telemetry != None
70
71
72 class BrowserController(object):
73   def __init__(self, project):
74     if telemetry == None:
75       raise Exception('Not supported: you trace-viewer to be inside a chrome checkout for this to work.')
76     self._project = project
77
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)
83
84     if telemetry == None:
85       raise Exception('Telemetry not found. Cannot run src/ tests')
86     self._browser = None
87     self._tab = None
88
89     assert browser_to_create
90     self._browser = browser_to_create.Create()
91     self._tab = None
92     try:
93       self._browser.Start()
94       self._tab = self._browser.tabs[0]
95
96       self._server = _LocalDevServer(self._project)
97       self._browser.StartLocalServer(self._server)
98
99     except:
100       self._browser.Close()
101
102   def NavigateToPath(self, path):
103     self._tab.Navigate(self._server.url + path)
104     self._tab.WaitForDocumentReadyStateToBeComplete()
105
106   def EvaluateJavaScript(self, js, timeout=120):
107     return self._tab.EvaluateJavaScript(js, timeout)
108
109   def WaitForJavaScriptExpression(self, js, timeout=120):
110     self._tab.WaitForJavaScriptExpression(js, timeout)
111
112   def EvaluateThennableAndWait(self, js, timeout=120):
113     if js.endswith(';'):
114       raise Exception('Must not end with ;');
115
116     full_js = """
117     window.__thennableSucceeded = undefined;
118     window.__thennableResult = undefined;
119 (%s).then(
120     function(res) {
121       window.__thennableSucceeded = true;
122       window.__thennableResult = res;
123     },
124     function(err) {
125       window.__thennableSucceeded = false;
126       if (typeof(err) === 'string') {
127         window.__thennableResult = err;
128         return;
129       }
130       window.__thennableResult = e.message + '\\n' + e.stack;
131     });
132 """ % js
133     self._tab.message_output_stream = sys.stderr
134     self._tab.ExecuteJavaScript(full_js)
135     self._tab.WaitForJavaScriptExpression('window.__thennableSucceeded !== undefined',
136                                           timeout=timeout)
137     val = self._tab.EvaluateJavaScript('window.__thennableSucceeded')
138     if val == False:
139       raise Exception('Failed: %s' % self._tab.EvaluateJavaScript(
140           'window.__thennableResult'))
141     return self._tab.EvaluateJavaScript('window.__thennableResult')
142
143   def __enter__(self):
144     return self
145
146   def __exit__(self, *args):
147     self.Close()
148
149   def Close(self):
150     if self._server:
151       self._server.Close()
152       self._server = None
153
154     if self._tab:
155       self._tab = None
156
157     if self._browser:
158       self._browser.Close()
159       self._browser = None