OLD | NEW |
---|---|
(Empty) | |
1 # Copyright (c) 2012 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 json | |
5 | |
6 from telemetry import tab | |
7 from telemetry import util | |
8 | |
9 class ExtensionPage(tab.Tab): | |
10 """Represents a an extension page in the browser | |
11 | |
12 Provides wrapper functions for running extension APIs as: | |
13 E.g.: | |
14 # Evaluates 1+1 in the extensions's javascript context. | |
15 tab.runtime.Evaluate('1+1') | |
16 """ | |
17 def __init__(self, browser, inspector_backend): | |
18 super(ExtensionPage, self).__init__(browser, inspector_backend) | |
19 | |
20 def _FormatParameters(self, *parameters): | |
21 json_params = '' | |
22 for param in parameters: | |
23 if len(json_params) > 0: | |
24 json_params += ',' | |
25 json_params += json.dumps(param[0]) | |
26 | |
27 return json_params | |
28 | |
29 def _RegisterEventListeners(self, event_names): | |
30 self.runtime.Execute('window.__lastCallEventHandler = {};') | |
31 for event_name in event_names: | |
32 self.runtime.Execute(""" | |
33 window.__lastCallEventHandler['%s'] = function() { | |
34 window.__lastCallEventArguments['%s'] = arguments; | |
35 }; | |
36 %s.addListener(window.__lastCallEventHandler['%s']); | |
37 """ % (event_name, event_name, event_name, event_name)) | |
38 | |
39 def _UnregisterEventListeners(self, event_names): | |
40 for event_name in event_names: | |
41 self.runtime.Execute(""" | |
42 %s.removeListener(window.__lastCallEventHandler['%s']); | |
43 """ % (event_name, event_name)) | |
44 | |
45 self.runtime.Execute('window.__lastCallEventHandler = {};') | |
46 | |
47 def RunMethodWithEvents(self, event_names, method_name, *parameters): | |
48 self._RegisterEventListeners(event_names) | |
49 self.runtime.Execute(""" | |
50 window.__lastCallEventArguments = {}; | |
51 window.__lastCallDone = false; | |
52 window.__lastCallArguments = false; | |
53 %s(%s, function() { | |
54 window.__lastCallArguments = arguments; | |
55 window.__lastCallDone = true; | |
56 }); | |
57 """ % (method_name, self._FormatParameters(parameters))) | |
58 def IsDone(): | |
59 expr = 'window.__lastCallDone' | |
60 for event_name in event_names: | |
61 expr += " && window.__lastCallEventArguments['%s']" % event_name | |
62 | |
63 return self.runtime.Evaluate(expr) | |
64 | |
65 util.WaitFor(IsDone, timeout=30) | |
66 results = (self.runtime.Evaluate('window.__lastCallArguments'), | |
67 self.runtime.Evaluate('window.__lastCallEventArguments')) | |
68 self._UnregisterEventListeners(event_names) | |
69 return results | |
70 | |
71 def RunMethod(self, method_name, *parameters): | |
nduca
2012/11/30 08:16:25
Might try callling this ChromeExtensionsAPI, makin
zel
2012/12/04 03:12:48
I've been thinking about this as the next step - w
| |
72 self.runtime.Execute(""" | |
73 window.__lastCallDone = false; | |
74 window.__lastCallArguments = false; | |
75 %s(%s, function() { | |
76 window.__lastCallArguments = arguments; | |
77 window.__lastCallDone = true; | |
78 }); | |
79 """ % (method_name, self._FormatParameters(parameters))) | |
80 def IsDone(): | |
81 return self.runtime.Evaluate("window.__lastCallDone") | |
82 | |
83 util.WaitFor(IsDone, timeout=30) | |
84 return self.runtime.Evaluate("window.__lastCallArguments") | |
85 | |
86 def RunSyncMethod(self, method_name, *parameters): | |
87 return self.runtime.Evaluate("%s(%s);" % | |
88 (method_name, self._FormatParameters(parameters))) | |
89 | |
OLD | NEW |