Index: tools/telemetry/telemetry/core/backends/chrome/inspector_page.py |
diff --git a/tools/telemetry/telemetry/core/backends/chrome/inspector_page.py b/tools/telemetry/telemetry/core/backends/chrome/inspector_page.py |
index 8c4c6fe899bde6d376c99eab406b652c35a1de4f..dc3bf4cfa5ee48ab0edd08acdc7c32da276bf6b9 100644 |
--- a/tools/telemetry/telemetry/core/backends/chrome/inspector_page.py |
+++ b/tools/telemetry/telemetry/core/backends/chrome/inspector_page.py |
@@ -15,8 +15,12 @@ class InspectorPage(object): |
'Page', |
self._OnNotification, |
self._OnClose) |
+ |
self._navigation_pending = False |
self._navigation_url = "" |
+ self._script_to_evaluate_on_commit = None |
+ # Turn on notifications. We need them to get the Page.frameNavigated event. |
+ self._EnablePageNotifications() |
qsr
2014/01/07 16:22:15
Enabling notification only after setting up the va
|
def _OnNotification(self, msg): |
logging.debug('Notification: %s', json.dumps(msg, indent=2)) |
@@ -32,16 +36,36 @@ class InspectorPage(object): |
def _OnClose(self): |
pass |
- def _EnablePageNotifications(self, timeout): |
- request = { |
- 'method': 'Page.enable' |
- } |
- res = self._inspector_backend.SyncRequest(request, timeout) |
- assert len(res['result'].keys()) == 0 |
+ def _SetScriptToEvaluateOnCommit(self, source): |
+ existing_source = (self._script_to_evaluate_on_commit and |
+ self._script_to_evaluate_on_commit['source']) |
+ if source == existing_source: |
+ return |
+ if existing_source: |
+ request = { |
+ 'method': 'Page.removeScriptToEvaluateOnLoad', |
+ 'params': { |
+ 'identifier': self._script_to_evaluate_on_commit['id'], |
+ } |
+ } |
+ self._inspector_backend.SyncRequest(request) |
+ self._script_to_evaluate_on_commit = None |
+ if source: |
+ request = { |
+ 'method': 'Page.addScriptToEvaluateOnLoad', |
+ 'params': { |
+ 'scriptSource': source, |
+ } |
+ } |
+ res = self._inspector_backend.SyncRequest(request) |
+ self._script_to_evaluate_on_commit = { |
+ 'id': res['result']['identifier'], |
+ 'source': source |
+ } |
- def _DisablePageNotifications(self, timeout): |
+ def _EnablePageNotifications(self, timeout=60): |
request = { |
- 'method': 'Page.disable' |
+ 'method': 'Page.enable' |
} |
res = self._inspector_backend.SyncRequest(request, timeout) |
assert len(res['result'].keys()) == 0 |
@@ -55,19 +79,15 @@ class InspectorPage(object): |
start_time = time.time() |
remaining_time = timeout |
+ action_function() |
+ self._navigation_pending = True |
try: |
- self._EnablePageNotifications(remaining_time) |
- try: |
- action_function() |
- self._navigation_pending = True |
- while self._navigation_pending and remaining_time > 0: |
- remaining_time = max(timeout - (time.time() - start_time), 0.0) |
- self._inspector_backend.DispatchNotifications(remaining_time) |
- finally: |
- self._DisablePageNotifications(remaining_time) |
+ while self._navigation_pending and remaining_time > 0: |
+ remaining_time = max(timeout - (time.time() - start_time), 0.0) |
+ self._inspector_backend.DispatchNotifications(remaining_time) |
except util.TimeoutException: |
- # Since we pass remaining_time as timeout to all of the calls in this, |
- # method, we need to list the full timeout time in this message. |
+ # Since we pass remaining_time to DispatchNotifications, we need to |
+ # list the full timeout time in this message. |
raise util.TimeoutException('Timed out while waiting %ds for navigation. ' |
'Error=%s' % (timeout, sys.exc_info()[1])) |
@@ -80,14 +100,7 @@ class InspectorPage(object): |
""" |
def DoNavigate(): |
- if script_to_evaluate_on_commit: |
- request = { |
- 'method': 'Page.addScriptToEvaluateOnLoad', |
- 'params': { |
- 'scriptSource': script_to_evaluate_on_commit, |
- } |
- } |
- self._inspector_backend.SyncRequest(request) |
+ self._SetScriptToEvaluateOnCommit(script_to_evaluate_on_commit) |
# Navigate the page. However, there seems to be a bug in chrome devtools |
# protocol where the request id for this event gets held on the browser |
# side pretty much indefinitely. |