Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: tools/telemetry/telemetry/extension_page.py

Issue 11412238: Proof of concept for running extension API stack through dev tools. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 ExtensionEvent(object):
9 def __init__(self, name, condition = None):
10 self._name = name
11 self._condition = condition
12
13 @property
14 def name(self):
15 return self._name
16
17 @property
18 def condition(self):
19 return self._condition
20
21
22 class ExtensionPage(object):
23 """Represents a an extension page in the browser
24
25 Provides wrapper functions for running extension APIs as:
26 E.g.:
27 # Evaluates 1+1 in the extensions's javascript context.
28 tab.runtime.Evaluate('1+1')
29 """
30 def __init__(self, tab):
31 self.tab = tab
32
33 def __enter__(self):
34 return self
35
36 def __exit__(self, *args):
37 self.tab.Close()
38
39 def _FormatParameters(self, *parameters):
40 return ','.join([json.dumps(param[0]) for param in parameters])
41
42 def _RegisterEventListeners(self, events):
43 self.tab.runtime.Execute('window.__lastCallEventHandler = {};')
44 for event in events:
45 command = """
46 window.__lastCallEventHandler['%s'] = function() {
47 window.__lastCallEventArguments['%s'] = arguments;
48 window.__lastCallEventRaised['%s'] = %s;
49 };
50 %s.addListener(window.__lastCallEventHandler['%s']);
51 """ % (event.name, event.name, event.name,
52 'true' if event.condition is None else event.condition,
53 event.name,
54 event.name)
55 self.tab.runtime.Execute(command)
56
57 def _UnregisterEventListeners(self, events):
58 for event in events:
59 self.tab.runtime.Execute("""
60 %s.removeListener(window.__lastCallEventHandler['%s']);
61 """ % (event.name, event.name))
62
63 self.tab.runtime.Execute('window.__lastCallEventHandler = {};')
64
65 def RunMethodWithEvents(self, events, method_name, *parameters):
66 self._RegisterEventListeners(events)
67 command = """
68 window.__lastCallEventArguments = {};
69 window.__lastCallEventRaised = {};
70 window.__lastCallDone = false;
71 window.__lastCallArguments = false;
72 %s(%s, function() {
73 window.__lastCallArguments = arguments;
74 window.__lastCallDone = true;
75 });
76 """ % (method_name, self._FormatParameters(parameters))
77 self.tab.runtime.Execute(command)
78 def IsDone():
79 expr = 'window.__lastCallDone ' + ''.join(
80 [('&& window.__lastCallEventRaised["%s"]' % event.name)
81 for event in events])
82 return self.tab.runtime.Evaluate(expr)
83
84 util.WaitFor(IsDone, timeout=30)
85 results = (self.tab.runtime.Evaluate('window.__lastCallArguments'),
86 self.tab.runtime.Evaluate('window.__lastCallEventArguments'))
87 self._UnregisterEventListeners(events)
88 return results
89
90 def RunMethod(self, method_name, *parameters):
91 self.tab.runtime.Execute("""
92 window.__lastCallDone = false;
93 window.__lastCallArguments = false;
94 %s(%s, function() {
95 window.__lastCallArguments = arguments;
96 window.__lastCallDone = true;
97 });
98 """ % (method_name, self._FormatParameters(parameters)))
99 def IsDone():
100 return self.tab.runtime.Evaluate("window.__lastCallDone")
101
102 util.WaitFor(IsDone, timeout=30)
103 return self.tab.runtime.Evaluate("window.__lastCallArguments")
104
105 def RunSyncMethod(self, method_name, *parameters):
106 return self.tab.runtime.Evaluate("%s(%s);" %
107 (method_name, self._FormatParameters(parameters)))
108
OLDNEW
« no previous file with comments | « tools/telemetry/telemetry/desktop_browser_finder.py ('k') | tools/telemetry/telemetry/possible_browser.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698