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 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 |
OLD | NEW |