summaryrefslogtreecommitdiffstats
path: root/tools/telemetry
diff options
context:
space:
mode:
authorachuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-07 03:33:28 +0000
committerachuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-07 03:33:28 +0000
commitb8342e09e739edeaa99b0c34e6e85b62f18b7277 (patch)
tree33ceaceae5558afcbed705cd33bfa9e4d8cc3303 /tools/telemetry
parentf2bf2c18df08fb2264de4c498e39df7da0d2adc3 (diff)
downloadchromium_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')
-rw-r--r--tools/telemetry/telemetry/core/backends/chrome/android_browser_backend.py1
-rw-r--r--tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py4
-rw-r--r--tools/telemetry/telemetry/core/backends/chrome/cros_browser_backend.py31
-rw-r--r--tools/telemetry/telemetry/core/backends/chrome/desktop_browser_backend.py1
-rw-r--r--tools/telemetry/telemetry/page/page_runner.py12
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