| Index: tools/telemetry/telemetry/page/page_runner.py
|
| diff --git a/tools/telemetry/telemetry/page/page_runner.py b/tools/telemetry/telemetry/page/page_runner.py
|
| index d576254f6ca038a80eda399000521b488909f4b8..ebae4a8c657cd0d5e31a68fa535ae462348d436d 100644
|
| --- a/tools/telemetry/telemetry/page/page_runner.py
|
| +++ b/tools/telemetry/telemetry/page/page_runner.py
|
| @@ -28,12 +28,16 @@ from telemetry.value import skip
|
|
|
|
|
| class _RunState(object):
|
| - def __init__(self):
|
| + def __init__(self, test):
|
| self.browser = None
|
|
|
| self._append_to_existing_wpr = False
|
| self._last_archive_path = None
|
| self._first_browser = True
|
| + self._test = test
|
| + self._did_login_for_current_page = False
|
| + self._current_page = None
|
| + self._current_tab = None
|
| self.profiler_dir = None
|
|
|
| def StartBrowserIfNeeded(self, test, page_set, page, possible_browser,
|
| @@ -113,6 +117,44 @@ class _RunState(object):
|
| if started_browser:
|
| self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete()
|
|
|
| + def PreparePage(self, page):
|
| + self._current_page = page
|
| + self._current_tab = self._test.TabForPage(page, self.browser)
|
| + if self._current_page.is_file:
|
| + self.browser.SetHTTPServerDirectories(
|
| + self._current_page.page_set.serving_dirs |
|
| + set([self._current_page.serving_dir]))
|
| +
|
| + if self._current_page.credentials:
|
| + if not self.browser.credentials.LoginNeeded(
|
| + self._current_tab, self._current_page.credentials):
|
| + raise page_test.Failure('Login as ' + self.page.credentials + ' failed')
|
| + self._did_login_for_current_page = True
|
| +
|
| + if self._test.clear_cache_before_each_run:
|
| + self._current_tab.ClearCache(force=True)
|
| +
|
| + def ImplicitPageNavigation(self):
|
| + """Executes the implicit navigation that occurs for every page iteration.
|
| +
|
| + This function will be called once per page before any actions are executed.
|
| + """
|
| + self._test.WillNavigateToPage(self._current_page, self._current_tab)
|
| + self._test.RunNavigateSteps(self._current_page, self._current_tab)
|
| + self._test.DidNavigateToPage(self._current_page, self._current_tab)
|
| +
|
| + def RunPage(self, results):
|
| + self._test.RunPage(self._current_page, self._current_tab, results)
|
| + util.CloseConnections(self._current_tab)
|
| +
|
| + def CleanUpPage(self):
|
| + self._test.CleanUpAfterPage(self._current_page, self._current_tab)
|
| + if self._current_page.credentials and self._did_login_for_current_page:
|
| + self.browser.credentials.LoginNoLongerNeeded(
|
| + self._current_tab, self._current_page.credentials)
|
| + self._current_page = None
|
| + self._current_tab = None
|
| +
|
| def StopBrowser(self):
|
| if self.browser:
|
| self.browser.Close()
|
| @@ -139,43 +181,6 @@ class _RunState(object):
|
| self.browser.platform.profiling_controller.Stop()
|
|
|
|
|
| -class _PageState(object):
|
| - def __init__(self, page, tab):
|
| - self.page = page
|
| - self.tab = tab
|
| -
|
| - self._did_login = False
|
| -
|
| - def PreparePage(self, test):
|
| - if self.page.is_file:
|
| - self.tab.browser.SetHTTPServerDirectories(
|
| - self.page.page_set.serving_dirs | set([self.page.serving_dir]))
|
| -
|
| - if self.page.credentials:
|
| - if not self.tab.browser.credentials.LoginNeeded(
|
| - self.tab, self.page.credentials):
|
| - raise page_test.Failure('Login as ' + self.page.credentials + ' failed')
|
| - self._did_login = True
|
| -
|
| - if test.clear_cache_before_each_run:
|
| - self.tab.ClearCache(force=True)
|
| -
|
| - def ImplicitPageNavigation(self, test):
|
| - """Executes the implicit navigation that occurs for every page iteration.
|
| -
|
| - This function will be called once per page before any actions are executed.
|
| - """
|
| - test.WillNavigateToPage(self.page, self.tab)
|
| - test.RunNavigateSteps(self.page, self.tab)
|
| - test.DidNavigateToPage(self.page, self.tab)
|
| -
|
| - def CleanUpPage(self, test):
|
| - test.CleanUpAfterPage(self.page, self.tab)
|
| - if self.page.credentials and self._did_login:
|
| - self.tab.browser.credentials.LoginNoLongerNeeded(
|
| - self.tab, self.page.credentials)
|
| -
|
| -
|
| def AddCommandLineArgs(parser):
|
| page_filter.PageFilter.AddCommandLineArgs(parser)
|
| results_options.AddResultsOptions(parser)
|
| @@ -226,7 +231,7 @@ def ProcessCommandLineArgs(parser, args):
|
| parser.error('--pageset-repeat must be a positive integer.')
|
|
|
|
|
| -def _PrepareAndRunPage(test, page_set, expectations, finder_options,
|
| +def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
|
| browser_options, page, possible_browser, results, state):
|
| if finder_options.use_live_sites:
|
| browser_options.wpr_mode = wpr_modes.WPR_OFF
|
| @@ -262,7 +267,7 @@ def _PrepareAndRunPage(test, page_set, expectations, finder_options,
|
| state.StartProfiling(page, finder_options)
|
|
|
| try:
|
| - _RunPage(test, page, state, expectation, results)
|
| + _RunPageAndProcessErrorIfNeeded(page, state, expectation, results)
|
| _CheckThermalThrottling(state.browser.platform)
|
| except exceptions.TabCrashException as e:
|
| if test.is_multi_tab_test:
|
| @@ -369,7 +374,7 @@ def Run(test, page_set, expectations, finder_options, results):
|
| if not pages:
|
| return
|
|
|
| - state = _RunState()
|
| + state = _RunState(test)
|
| pages_with_discarded_first_result = set()
|
| max_failures = finder_options.max_failures # command-line gets priority
|
| if max_failures is None:
|
| @@ -384,7 +389,7 @@ def Run(test, page_set, expectations, finder_options, results):
|
| for _ in xrange(finder_options.page_repeat):
|
| results.WillRunPage(page)
|
| try:
|
| - _PrepareAndRunPage(
|
| + _RunPageAndRetryRunIfNeeded(
|
| test, page_set, expectations, finder_options, browser_options,
|
| page, possible_browser, results, state)
|
| finally:
|
| @@ -458,14 +463,12 @@ def _CheckArchives(page_set, pages, results):
|
| return valid_pages
|
|
|
|
|
| -def _RunPage(test, page, state, expectation, results):
|
| +def _RunPageAndProcessErrorIfNeeded(page, state, expectation, results):
|
| if expectation == 'skip':
|
| logging.debug('Skipping test: Skip expectation for %s', page.url)
|
| results.AddValue(skip.SkipValue(page, 'Skipped by test expectations'))
|
| return
|
|
|
| - page_state = _PageState(page, test.TabForPage(page, state.browser))
|
| -
|
| def ProcessError():
|
| if expectation == 'fail':
|
| msg = 'Expected exception while running %s' % page.url
|
| @@ -475,10 +478,9 @@ def _RunPage(test, page, state, expectation, results):
|
| exception_formatter.PrintFormattedException(msg=msg)
|
|
|
| try:
|
| - page_state.PreparePage(test)
|
| - page_state.ImplicitPageNavigation(test)
|
| - test.RunPage(page, page_state.tab, results)
|
| - util.CloseConnections(page_state.tab)
|
| + state.PreparePage(page)
|
| + state.ImplicitPageNavigation()
|
| + state.RunPage(results)
|
| except page_test.TestNotSupportedOnPlatformFailure:
|
| raise
|
| except page_test.Failure:
|
| @@ -506,7 +508,7 @@ def _RunPage(test, page, state, expectation, results):
|
| if expectation == 'fail':
|
| logging.warning('%s was expected to fail, but passed.\n', page.url)
|
| finally:
|
| - page_state.CleanUpPage(test)
|
| + state.CleanUpPage()
|
|
|
|
|
| def _WaitForThermalThrottlingIfNeeded(platform):
|
|
|