Index: tools/telemetry/telemetry/extension_page.py |
diff --git a/tools/telemetry/telemetry/extension_page.py b/tools/telemetry/telemetry/extension_page.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf86222e90c440ddbd3ae576da97fecd47f3a3db |
--- /dev/null |
+++ b/tools/telemetry/telemetry/extension_page.py |
@@ -0,0 +1,108 @@ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+import json |
+ |
+from telemetry import util |
+ |
+class ExtensionEvent(object): |
+ def __init__(self, name, condition = None): |
+ self._name = name |
+ self._condition = condition |
+ |
+ @property |
+ def name(self): |
+ return self._name |
+ |
+ @property |
+ def condition(self): |
+ return self._condition |
+ |
+ |
+class ExtensionPage(object): |
+ """Represents a an extension page in the browser |
+ |
+ Provides wrapper functions for running extension APIs as: |
+ E.g.: |
+ # Evaluates 1+1 in the extensions's javascript context. |
+ tab.runtime.Evaluate('1+1') |
+ """ |
+ def __init__(self, tab): |
+ self.tab = tab |
+ |
+ def __enter__(self): |
+ return self |
+ |
+ def __exit__(self, *args): |
+ self.tab.Close() |
+ |
+ def _FormatParameters(self, *parameters): |
+ return ','.join([json.dumps(param[0]) for param in parameters]) |
+ |
+ def _RegisterEventListeners(self, events): |
+ self.tab.runtime.Execute('window.__lastCallEventHandler = {};') |
+ for event in events: |
+ command = """ |
+ window.__lastCallEventHandler['%s'] = function() { |
+ window.__lastCallEventArguments['%s'] = arguments; |
+ window.__lastCallEventRaised['%s'] = %s; |
+ }; |
+ %s.addListener(window.__lastCallEventHandler['%s']); |
+ """ % (event.name, event.name, event.name, |
+ 'true' if event.condition is None else event.condition, |
+ event.name, |
+ event.name) |
+ self.tab.runtime.Execute(command) |
+ |
+ def _UnregisterEventListeners(self, events): |
+ for event in events: |
+ self.tab.runtime.Execute(""" |
+ %s.removeListener(window.__lastCallEventHandler['%s']); |
+ """ % (event.name, event.name)) |
+ |
+ self.tab.runtime.Execute('window.__lastCallEventHandler = {};') |
+ |
+ def RunMethodWithEvents(self, events, method_name, *parameters): |
+ self._RegisterEventListeners(events) |
+ command = """ |
+ window.__lastCallEventArguments = {}; |
+ window.__lastCallEventRaised = {}; |
+ window.__lastCallDone = false; |
+ window.__lastCallArguments = false; |
+ %s(%s, function() { |
+ window.__lastCallArguments = arguments; |
+ window.__lastCallDone = true; |
+ }); |
+ """ % (method_name, self._FormatParameters(parameters)) |
+ self.tab.runtime.Execute(command) |
+ def IsDone(): |
+ expr = 'window.__lastCallDone ' + ''.join( |
+ [('&& window.__lastCallEventRaised["%s"]' % event.name) |
+ for event in events]) |
+ return self.tab.runtime.Evaluate(expr) |
+ |
+ util.WaitFor(IsDone, timeout=30) |
+ results = (self.tab.runtime.Evaluate('window.__lastCallArguments'), |
+ self.tab.runtime.Evaluate('window.__lastCallEventArguments')) |
+ self._UnregisterEventListeners(events) |
+ return results |
+ |
+ def RunMethod(self, method_name, *parameters): |
+ self.tab.runtime.Execute(""" |
+ window.__lastCallDone = false; |
+ window.__lastCallArguments = false; |
+ %s(%s, function() { |
+ window.__lastCallArguments = arguments; |
+ window.__lastCallDone = true; |
+ }); |
+ """ % (method_name, self._FormatParameters(parameters))) |
+ def IsDone(): |
+ return self.tab.runtime.Evaluate("window.__lastCallDone") |
+ |
+ util.WaitFor(IsDone, timeout=30) |
+ return self.tab.runtime.Evaluate("window.__lastCallArguments") |
+ |
+ def RunSyncMethod(self, method_name, *parameters): |
+ return self.tab.runtime.Evaluate("%s(%s);" % |
+ (method_name, self._FormatParameters(parameters))) |
+ |