Index: tools/telemetry/telemetry/inspector_page.py |
diff --git a/tools/telemetry/telemetry/inspector_page.py b/tools/telemetry/telemetry/inspector_page.py |
index a879dcffd435e06974dc557ec8b1676a2a75b929..b37d33049e1a876e0834201b8260df3c1cbaa2be 100644 |
--- a/tools/telemetry/telemetry/inspector_page.py |
+++ b/tools/telemetry/telemetry/inspector_page.py |
@@ -13,53 +13,71 @@ class InspectorPage(object): |
'Page', |
self._OnNotification, |
self._OnClose) |
- self._pending_navigate_url = None |
+ self._navigation_pending = False |
def _OnNotification(self, msg): |
logging.debug('Notification: %s', json.dumps(msg, indent=2)) |
- if msg['method'] == 'Page.frameNavigated' and self._pending_navigate_url: |
+ if msg['method'] == 'Page.frameNavigated' and self._navigation_pending: |
url = msg['params']['frame']['url'] |
if not url == 'chrome://newtab/': |
- # Marks the navigation as complete and unblocks the navigate call. |
- self._pending_navigate_url = None |
+ # Marks the navigation as complete and unblocks the |
+ # PerformActionAndWaitForNavigate call. |
+ self._navigation_pending = False |
def _OnClose(self): |
pass |
- def Navigate(self, url, timeout=60): |
- """Navigates to url""" |
+ def PerformActionAndWaitForNavigate(self, action_function, timeout=60): |
+ """Executes action_function, and waits for the navigation to complete. |
+ |
+ action_function is expect to result in a navigation. This function returns |
+ when the navigation is complete or when the timeout has been exceeded. |
+ """ |
+ |
# Turn on notifications. We need them to get the Page.frameNavigated event. |
request = { |
- 'method': 'Page.enable' |
- } |
+ 'method': 'Page.enable' |
+ } |
res = self._inspector_backend.SyncRequest(request, timeout) |
assert len(res['result'].keys()) == 0 |
- # 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. |
- # |
- # So, instead of waiting for the event to actually complete, wait for the |
- # Page.frameNavigated event. |
- request = { |
- 'method': 'Page.navigate', |
- 'params': { |
- 'url': url, |
- } |
- } |
- res = self._inspector_backend.SendAndIgnoreResponse(request) |
+ def DisablePageNotifications(): |
+ request = { |
+ 'method': 'Page.disable' |
+ } |
+ res = self._inspector_backend.SyncRequest(request, timeout) |
+ assert len(res['result'].keys()) == 0 |
+ |
+ self._navigation_pending = True |
+ try: |
+ action_function() |
+ except: |
+ DisablePageNotifications() |
+ raise |
- self._pending_navigate_url = url |
def IsNavigationDone(time_left): |
self._inspector_backend.DispatchNotifications(time_left) |
- return self._pending_navigate_url == None |
- |
+ return not self._navigation_pending |
util.WaitFor(IsNavigationDone, timeout, pass_time_left_to_func=True) |
- # Turn off notifications. |
- request = { |
- 'method': 'Page.disable' |
- } |
- res = self._inspector_backend.SyncRequest(request, timeout) |
- assert len(res['result'].keys()) == 0 |
+ DisablePageNotifications() |
+ |
+ def Navigate(self, url, timeout=60): |
+ """Navigates to url""" |
+ |
+ def DoNavigate(): |
+ # 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. |
+ # |
+ # So, instead of waiting for the event to actually complete, wait for the |
+ # Page.frameNavigated event. |
+ request = { |
+ 'method': 'Page.navigate', |
+ 'params': { |
+ 'url': url, |
+ } |
+ } |
+ self._inspector_backend.SendAndIgnoreResponse(request) |
+ self.PerformActionAndWaitForNavigate(DoNavigate, timeout) |