Commit 7e12ca68 authored by slamm's avatar slamm Committed by Commit bot

Drop DidStartHTTPServer to simplify object interactions.

(Will make it easier to move the memory_cache_http_server ownership
from browser to platform.)

The page_cycler measurement was the only customer. This CL includes
an alternate implementation for that.

BUG=404771

Review URL: https://codereview.chromium.org/543243002

Cr-Commit-Position: refs/heads/master@{#294691}
parent e49301cf
...@@ -45,6 +45,7 @@ class PageCycler(page_test.PageTest): ...@@ -45,6 +45,7 @@ class PageCycler(page_test.PageTest):
self._cpu_metric = None self._cpu_metric = None
self._v8_object_stats_metric = None self._v8_object_stats_metric = None
self._has_loaded_page = collections.defaultdict(int) self._has_loaded_page = collections.defaultdict(int)
self._initial_renderer_url = None # to avoid cross-renderer navigation
@classmethod @classmethod
def AddCommandLineArgs(cls, parser): def AddCommandLineArgs(cls, parser):
...@@ -94,12 +95,15 @@ class PageCycler(page_test.PageTest): ...@@ -94,12 +95,15 @@ class PageCycler(page_test.PageTest):
if self._record_v8_object_stats: if self._record_v8_object_stats:
self._v8_object_stats_metric = v8_object_stats.V8ObjectStatsMetric() self._v8_object_stats_metric = v8_object_stats.V8ObjectStatsMetric()
def DidStartHTTPServer(self, tab):
# Avoid paying for a cross-renderer navigation on the first page on legacy
# page cyclers which use the filesystem.
tab.Navigate(tab.browser.http_server.UrlOf('nonexistent.html'))
def WillNavigateToPage(self, page, tab): def WillNavigateToPage(self, page, tab):
if page.is_file:
# For legacy page cyclers which use the filesystem, do an initial
# navigate to avoid paying for a cross-renderer navigation.
initial_url = tab.browser.http_server.UrlOf('nonexistent.html')
if self._initial_renderer_url != initial_url:
self._initial_renderer_url = initial_url
tab.Navigate(self._initial_renderer_url)
page.script_to_evaluate_on_commit = self._page_cycler_js page.script_to_evaluate_on_commit = self._page_cycler_js
if self.ShouldRunCold(page.url): if self.ShouldRunCold(page.url):
tab.ClearCache(force=True) tab.ClearCache(force=True)
......
...@@ -38,17 +38,21 @@ class FakePage(object): ...@@ -38,17 +38,21 @@ class FakePage(object):
"""Used to mock loading a page.""" """Used to mock loading a page."""
def __init__(self, url): def __init__(self, url):
self.url = url self.url = url
self.is_file = url.startswith('file://')
class FakeTab(object): class FakeTab(object):
"""Used to mock a browser tab.""" """Used to mock a browser tab."""
def __init__(self): def __init__(self):
self.clear_cache_calls = 0 self.clear_cache_calls = 0
self.navigated_urls = []
def ClearCache(self, force=False): def ClearCache(self, force=False):
assert force assert force
self.clear_cache_calls += 1 self.clear_cache_calls += 1
def EvaluateJavaScript(self, _): def EvaluateJavaScript(self, _):
return 1 return 1
def Navigate(self, url):
self.navigated_urls.append(url)
def WaitForJavaScriptExpression(self, _, __): def WaitForJavaScriptExpression(self, _, __):
pass pass
@property @property
...@@ -73,6 +77,13 @@ class FakeBrowser(object): ...@@ -73,6 +77,13 @@ class FakeBrowser(object):
def platform(self): def platform(self):
return FakePlatform() return FakePlatform()
@property
def http_server(self):
class FakeHttpServer(object):
def UrlOf(self, url_path):
return 'http://fakeserver:99999/%s' % url_path
return FakeHttpServer()
class FakePlatform(object): class FakePlatform(object):
def GetOSName(self): def GetOSName(self):
...@@ -213,3 +224,16 @@ class PageCyclerUnitTest(unittest.TestCase): ...@@ -213,3 +224,16 @@ class PageCyclerUnitTest(unittest.TestCase):
self.assertEqual(value.units, '%') self.assertEqual(value.units, '%')
cycler.DidNavigateToPage(page, tab) cycler.DidNavigateToPage(page, tab)
def testLegacyPagesAvoidCrossRenderNavigation(self):
# For legacy page cyclers with file URLs, verify that WillNavigateToPage
# does an initial navigate to avoid paying for a cross-renderer navigation.
cycler = self.SetUpCycler([], True)
pages = [FakePage('file://fakepage1.com'), FakePage('file://fakepage2.com')]
tab = FakeTab()
self.assertEqual([], tab.navigated_urls)
for page in pages * 2:
cycler.WillNavigateToPage(page, tab)
self.assertEqual(
['http://fakeserver:99999/nonexistent.html'], tab.navigated_urls)
...@@ -152,10 +152,8 @@ class PageState(object): ...@@ -152,10 +152,8 @@ class PageState(object):
def PreparePage(self, test=None): def PreparePage(self, test=None):
if self.page.is_file: if self.page.is_file:
server_started = self.tab.browser.SetHTTPServerDirectories( self.tab.browser.SetHTTPServerDirectories(
self.page.page_set.serving_dirs | set([self.page.serving_dir])) self.page.page_set.serving_dirs | set([self.page.serving_dir]))
if server_started and test:
test.DidStartHTTPServer(self.tab)
if self.page.credentials: if self.page.credentials:
if not self.tab.browser.credentials.LoginNeeded( if not self.tab.browser.credentials.LoginNeeded(
......
...@@ -222,9 +222,6 @@ class PageTest(command_line.Command): ...@@ -222,9 +222,6 @@ class PageTest(command_line.Command):
def DidRunPageRepeats(self, page): def DidRunPageRepeats(self, page):
"""Override to do operations after each page is iterated over.""" """Override to do operations after each page is iterated over."""
def DidStartHTTPServer(self, tab):
"""Override to do operations after the HTTP server is started."""
def WillNavigateToPage(self, page, tab): def WillNavigateToPage(self, page, tab):
"""Override to do operations before the page is navigated, notably Telemetry """Override to do operations before the page is navigated, notably Telemetry
will already have performed the following operations on the browser before will already have performed the following operations on the browser before
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment