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 util | |
7 | |
8 class ExtensionPage(object): | |
9 """Represents a an extension page in the browser | |
10 | |
11 Provides wrapper functions for running extension APIs as: | |
12 E.g.: | |
13 # Evaluates 1+1 in the extensions's javascript context. | |
14 tab.runtime.Evaluate('1+1') | |
15 """ | |
16 def __init__(self, tab): | |
nduca
2012/12/07 19:23:47
When we get close to landing this, this shouldn't
| |
17 self.tab = tab | |
18 | |
19 def __enter__(self): | |
20 return self | |
21 | |
22 def __exit__(self, *args): | |
23 self.tab.Close() | |
24 | |
25 def _FormatParameters(self, *parameters): | |
26 json_params = '' | |
27 for param in parameters: | |
nduca
2012/12/07 19:23:47
doesn't our code do this for us?
zel
2012/12/12 21:03:42
not sure. what do you think I should be calling in
| |
28 if len(json_params) > 0: | |
29 json_params += ',' | |
30 json_params += json.dumps(param[0]) | |
31 | |
32 return json_params | |
33 | |
34 def _RegisterEventListeners(self, event_names): | |
35 self.tab.runtime.Execute('window.__lastCallEventHandler = {};') | |
36 for event_name in event_names: | |
37 self.tab.runtime.Execute(""" | |
38 window.__lastCallEventHandler['%s'] = function() { | |
39 window.__lastCallEventArguments['%s'] = arguments; | |
40 }; | |
41 %s.addListener(window.__lastCallEventHandler['%s']); | |
42 """ % (event_name, event_name, event_name, event_name)) | |
43 | |
44 def _UnregisterEventListeners(self, event_names): | |
45 for event_name in event_names: | |
46 self.tab.runtime.Execute(""" | |
47 %s.removeListener(window.__lastCallEventHandler['%s']); | |
48 """ % (event_name, event_name)) | |
49 | |
50 self.tab.runtime.Execute('window.__lastCallEventHandler = {};') | |
51 | |
52 def RunMethodWithEvents(self, event_names, method_name, *parameters): | |
nduca
2012/12/07 19:23:47
This stuff makes me uneasy that the last argument
zel
2012/12/12 21:03:42
we need to chat in person about this one too
| |
53 self._RegisterEventListeners(event_names) | |
54 self.tab.runtime.Execute(""" | |
55 window.__lastCallEventArguments = {}; | |
56 window.__lastCallDone = false; | |
57 window.__lastCallArguments = false; | |
58 %s(%s, function() { | |
59 window.__lastCallArguments = arguments; | |
60 window.__lastCallDone = true; | |
61 }); | |
62 """ % (method_name, self._FormatParameters(parameters))) | |
63 def IsDone(): | |
64 expr = 'window.__lastCallDone' | |
65 for event_name in event_names: | |
66 expr += " && window.__lastCallEventArguments['%s']" % event_name | |
67 | |
68 return self.tab.runtime.Evaluate(expr) | |
69 | |
70 util.WaitFor(IsDone, timeout=30) | |
71 results = (self.tab.runtime.Evaluate('window.__lastCallArguments'), | |
72 self.tab.runtime.Evaluate('window.__lastCallEventArguments')) | |
73 self._UnregisterEventListeners(event_names) | |
74 return results | |
75 | |
76 def RunMethod(self, method_name, *parameters): | |
77 self.tab.runtime.Execute(""" | |
78 window.__lastCallDone = false; | |
79 window.__lastCallArguments = false; | |
80 %s(%s, function() { | |
81 window.__lastCallArguments = arguments; | |
82 window.__lastCallDone = true; | |
83 }); | |
84 """ % (method_name, self._FormatParameters(parameters))) | |
85 def IsDone(): | |
86 return self.tab.runtime.Evaluate("window.__lastCallDone") | |
87 | |
88 util.WaitFor(IsDone, timeout=30) | |
89 return self.tab.runtime.Evaluate("window.__lastCallArguments") | |
90 | |
91 def RunSyncMethod(self, method_name, *parameters): | |
nduca
2012/12/07 19:23:47
I think I'm fine with this on runtime object
| |
92 return self.tab.runtime.Evaluate("%s(%s);" % | |
93 (method_name, self._FormatParameters(parameters))) | |
94 | |
OLD | NEW |