diff options
author | achuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-07 03:33:28 +0000 |
---|---|---|
committer | achuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-07 03:33:28 +0000 |
commit | b8342e09e739edeaa99b0c34e6e85b62f18b7277 (patch) | |
tree | 33ceaceae5558afcbed705cd33bfa9e4d8cc3303 /tools/telemetry | |
parent | f2bf2c18df08fb2264de4c498e39df7da0d2adc3 (diff) | |
download | chromium_src-b8342e09e739edeaa99b0c34e6e85b62f18b7277.zip chromium_src-b8342e09e739edeaa99b0c34e6e85b62f18b7277.tar.gz chromium_src-b8342e09e739edeaa99b0c34e6e85b62f18b7277.tar.bz2 |
Fix a race on cros where a WebSocketException is raised if we navigate too early.
We see this bug with the perf tests because they navigate right away as they are launched.
BUG=324916
TEST=manual
Review URL: https://codereview.chromium.org/105253002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239304 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/telemetry')
5 files changed, 29 insertions, 20 deletions
diff --git a/tools/telemetry/telemetry/core/backends/chrome/android_browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/android_browser_backend.py index 20a55b1..6d98d36 100644 --- a/tools/telemetry/telemetry/core/backends/chrome/android_browser_backend.py +++ b/tools/telemetry/telemetry/core/backends/chrome/android_browser_backend.py @@ -274,6 +274,7 @@ class AndroidBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): try: self._WaitForBrowserToComeUp() self._PostBrowserStartupInitialization() + self._WaitForInitialTabNavigation() except exceptions.BrowserGoneException: logging.critical('Failed to connect to browser.') if not self._adb.Adb().CanAccessProtectedFileContents(): diff --git a/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py index e1fdbb5..0da000f 100644 --- a/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py +++ b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py @@ -212,6 +212,10 @@ class ChromeBrowserBackend(browser_backend.BrowserBackend): self._inspector_protocol_version = 1.0 self._chrome_branch_number = 1025 + def _WaitForInitialTabNavigation(self): + """Wait for the first tab to finish navigating.""" + self.tab_list_backend[0].WaitForDocumentReadyStateToBeComplete() + def Request(self, path, timeout=None, throw_network_exception=False): url = 'http://127.0.0.1:%i/json' % self._port if path: diff --git a/tools/telemetry/telemetry/core/backends/chrome/cros_browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/cros_browser_backend.py index 76921b7..81f945c 100644 --- a/tools/telemetry/telemetry/core/backends/chrome/cros_browser_backend.py +++ b/tools/telemetry/telemetry/core/backends/chrome/cros_browser_backend.py @@ -244,10 +244,17 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): # Guest browsing shuts down the current browser and launches an # incognito browser in a separate process, which we need to wait for. util.WaitFor(lambda: pid != self.pid, 10) - self._WaitForBrowserToComeUp() else: self._NavigateLogin() + try: + self._WaitForBrowserToComeUp() + self._WaitForInitialTabNavigation() + except util.TimeoutException: + logging.error('Chrome args: %s' % self._GetChromeProcess()['args']) + self._cri.TakeScreenShot('extension-timeout') + raise + logging.info('Browser is up!') def Close(self): @@ -420,13 +427,21 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): # Open a new window/tab. self.tab_list_backend.New(15) - # Wait for extensions to load. - try: - self._WaitForBrowserToComeUp() - except util.TimeoutException: - logging.error('Chrome args: %s' % self._GetChromeProcess()['args']) - self._cri.TakeScreenShot('extension-timeout') - raise + def _WaitForInitialTabNavigation(self): + """A new tab starts with about:blank and then navigates to the NTP. + The debugger_url changes during this navigation, so if we attempt to access + the page during this time, we get a WebSocketException/TabCrashException + (that the tab doesn't actually crash). + """ + def InitialTabNavigationComplete(): + try: + ret = self._tab_list_backend[0].url != 'about:blank' + if ret: + self.tab_list_backend[0].WaitForDocumentReadyStateToBeComplete() + return ret + except exceptions.TabCrashException: + return False + util.WaitFor(InitialTabNavigationComplete, timeout=10) class SSHForwarder(object): diff --git a/tools/telemetry/telemetry/core/backends/chrome/desktop_browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/desktop_browser_backend.py index 5f4e3dc..1aa8903 100644 --- a/tools/telemetry/telemetry/core/backends/chrome/desktop_browser_backend.py +++ b/tools/telemetry/telemetry/core/backends/chrome/desktop_browser_backend.py @@ -93,6 +93,7 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): try: self._WaitForBrowserToComeUp() self._PostBrowserStartupInitialization() + self._WaitForInitialTabNavigation() except: self.Close() raise diff --git a/tools/telemetry/telemetry/page/page_runner.py b/tools/telemetry/telemetry/page/page_runner.py index 7d1f024..253bc92 100644 --- a/tools/telemetry/telemetry/page/page_runner.py +++ b/tools/telemetry/telemetry/page/page_runner.py @@ -37,7 +37,6 @@ class _RunState(object): def StartBrowser(self, test, page_set, page, possible_browser, credentials_path, archive_path): - started_browser = not self.browser # Create a browser. if not self.browser: self.browser = possible_browser.Create() @@ -92,17 +91,6 @@ class _RunState(object): while len(self.browser.tabs) > 1: self.browser.tabs[-1].Close() - # Must wait for tab to commit otherwise it can commit after the next - # navigation has begun and RenderFrameHostManager::DidNavigateMainFrame() - # will cancel the next navigation because it's pending. This manifests as - # the first navigation in a PageSet freezing indefinitly because the - # navigation was silently cancelled when |self.browser.tabs[0]| was - # committed. Only do this when we just started the browser, otherwise - # there are cases where previous pages in a PageSet never complete - # loading so we'll wait forever. - if started_browser: - self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete() - if self.first_page[page]: self.first_page[page] = False |