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

Unified 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)))
+
« 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