Chromium Code Reviews| Index: tools/perf/profile_creators/fast_navigation_profile_extender.py |
| diff --git a/tools/perf/profile_creators/fast_navigation_profile_extender.py b/tools/perf/profile_creators/fast_navigation_profile_extender.py |
| index ec2cb7ce7f137fa9ba72841560f071cd8e6f6261..3b3b2ddad1310428e88af68c5d2427c2aeecd2d0 100644 |
| --- a/tools/perf/profile_creators/fast_navigation_profile_extender.py |
| +++ b/tools/perf/profile_creators/fast_navigation_profile_extender.py |
| @@ -8,6 +8,7 @@ from telemetry.core import browser_finder_exceptions |
| from telemetry.core import exceptions |
| from telemetry.core import platform |
| from telemetry.core import util |
| +from telemetry.core.backends.chrome_inspector import devtools_http |
| class FastNavigationProfileExtender(object): |
| @@ -40,6 +41,10 @@ class FastNavigationProfileExtender(object): |
| # This member is initialized during SetUp(). |
| self._browser = None |
| + # The list of tabs to use for url navigations. This list may not contain |
| + # all tabs in the browser. |
| + self._navigation_tabs = [] |
| + |
| # The number of tabs to use. |
| self._NUM_TABS = maximum_batch_size |
| @@ -95,9 +100,6 @@ class FastNavigationProfileExtender(object): |
| ["win", "mac", "linux"]) |
| self._browser = possible_browser.Create(finder_options) |
| - while(len(self._browser.tabs) < self._NUM_TABS): |
| - self._browser.tabs.New() |
| - |
| def TearDown(self): |
| """Teardown that is guaranteed to be executed before the instance is |
| destroyed. |
| @@ -121,6 +123,26 @@ class FastNavigationProfileExtender(object): |
| def profile_path(self): |
| return self._profile_path |
| + def _RefreshNavigationTabs(self): |
| + """Updates the member self._navigation_tabs to contain self._NUM_TABS |
| + elements, each of which is not crashed. The crashed tabs are intentionally |
| + leaked, since Telemetry doesn't have a good way of killing crashed tabs.""" |
| + live_tabs = [] |
| + for tab in self._navigation_tabs: |
| + try: |
| + live_tab = self._browser.tabs.GetTabById(tab.id) |
|
nednguyen
2015/02/19 20:05:04
If you have to do this just to get the "live tab",
erikchen
2015/02/19 21:55:12
I've added comments - this method is doing more th
|
| + live_tabs.append(live_tab) |
| + except KeyError: |
| + pass |
| + |
| + self._navigation_tabs = live_tabs |
| + |
| + while len(self._navigation_tabs) < self._NUM_TABS: |
| + self._navigation_tabs.append(self._browser.tabs.New()) |
| + |
| + def _RemoveNavigationTab(self, tab): |
| + self._navigation_tabs.remove(tab) |
| + |
| def _GetPossibleBrowser(self, finder_options): |
| """Return a possible_browser with the given options.""" |
| possible_browser = browser_finder.FindBrowser(finder_options) |
| @@ -137,7 +159,9 @@ class FastNavigationProfileExtender(object): |
| """Retrives the URL of the tab.""" |
| try: |
| return tab.EvaluateJavaScript('document.URL', timeout) |
| - except exceptions.DevtoolsTargetCrashException: |
| + except (exceptions.DevtoolsTargetCrashException, |
| + devtools_http.DevToolsClientConnectionError, |
| + devtools_http.DevToolsClientUrlError): |
| return None |
| def _WaitForUrlToChange(self, tab, initial_url, timeout): |
| @@ -178,9 +202,12 @@ class FastNavigationProfileExtender(object): |
| try: |
| tab.Navigate(url, None, timeout_in_seconds) |
| - except exceptions.DevtoolsTargetCrashException: |
| - # We expect a time out, and don't mind if the webpage crashes. Ignore |
| - # both exceptions. |
| + except (exceptions.DevtoolsTargetCrashException, |
| + devtools_http.DevToolsClientConnectionError, |
| + devtools_http.DevToolsClientUrlError): |
| + # We expect a time out. It's possible for other problems to arise, but |
| + # this method is not responsible for dealing with them. Ignore all |
| + # exceptions. |
| pass |
| queued_tabs.append((tab, initial_url)) |
| @@ -210,9 +237,15 @@ class FastNavigationProfileExtender(object): |
| try: |
| tab.WaitForDocumentReadyStateToBeComplete(seconds_to_wait) |
| - except (util.TimeoutException, exceptions.DevtoolsTargetCrashException): |
| - # Ignore time outs and web page crashes. |
| + except util.TimeoutException: |
| + # Ignore time outs. |
| pass |
| + except (exceptions.DevtoolsTargetCrashException, |
| + devtools_http.DevToolsClientConnectionError, |
| + devtools_http.DevToolsClientUrlError): |
| + # If any error occurs, remove the tab. it's probably in an |
| + # unrecoverable state. |
| + self._RemoveNavigationTab(tab) |
| def _GetUrlsToNavigate(self, url_iterator): |
| """Returns an array of urls to navigate to, given a url_iterator.""" |
| @@ -231,6 +264,7 @@ class FastNavigationProfileExtender(object): |
| """ |
| url_iterator = self.GetUrlIterator() |
| while True: |
| + self._RefreshNavigationTabs() |
| urls = self._GetUrlsToNavigate(url_iterator) |
| if len(urls) == 0: |
| @@ -239,7 +273,7 @@ class FastNavigationProfileExtender(object): |
| batch = [] |
| for i in range(len(urls)): |
| url = urls[i] |
| - tab = self._browser.tabs[i] |
| + tab = self._navigation_tabs[i] |
| batch.append((tab, url)) |
| queued_tabs = self._BatchNavigateTabs(batch) |