| 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)))
|
| +
|
|
|