Chromium Code Reviews| Index: chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc |
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc b/chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc |
| index 3016a1eb5e99b5916dc97171ce5b1fea228e3c2d..a50815c75eb6218b8c4adbc6f8d631c727791fc1 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc |
| @@ -8,6 +8,7 @@ |
| #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| @@ -73,6 +74,9 @@ struct RedirectEdge { |
| GURL url; |
| }; |
| +// Helper class to track and allow waiting for ResourcePrefetchPredictor |
| +// initialization. WARNING: OnPredictorInitialized event will not be fired if |
| +// ResourcePrefetchPredictor is initialized before observer creation. |
|
Benoit L
2016/12/19 12:32:00
nit: before the observer creation.
alexilin
2016/12/19 12:58:09
Done.
|
| class InitializationObserver : public TestObserver { |
| public: |
| explicit InitializationObserver(ResourcePrefetchPredictor* predictor) |
| @@ -145,18 +149,17 @@ void CompareSubresources(std::vector<URLRequestSummary> actual_subresources, |
| } // namespace |
| -// Helper class to track and allow waiting for ResourcePrefetchPredictor events. |
| -// These events are also used to verify that ResourcePrefetchPredictor works as |
| -// expected. |
| -class ResourcePrefetchPredictorTestObserver : public TestObserver { |
| +// Helper class to track and allow waiting for a single OnNavigationLearned |
| +// event. The information provided by this event is also used to verify that |
| +// ResourcePrefetchPredictor works as expected. |
| +class LearningObserver : public TestObserver { |
| public: |
| using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary; |
| - explicit ResourcePrefetchPredictorTestObserver( |
| - ResourcePrefetchPredictor* predictor, |
| - const size_t expected_url_visit_count, |
| - const PageRequestSummary& expected_summary, |
| - bool match_navigation_id) |
| + explicit LearningObserver(ResourcePrefetchPredictor* predictor, |
| + const size_t expected_url_visit_count, |
| + const PageRequestSummary& expected_summary, |
| + bool match_navigation_id) |
| : TestObserver(predictor), |
| url_visit_count_(expected_url_visit_count), |
| summary_(expected_summary), |
| @@ -181,7 +184,35 @@ class ResourcePrefetchPredictorTestObserver : public TestObserver { |
| PageRequestSummary summary_; |
| bool match_navigation_id_; |
| - DISALLOW_COPY_AND_ASSIGN(ResourcePrefetchPredictorTestObserver); |
| + DISALLOW_COPY_AND_ASSIGN(LearningObserver); |
| +}; |
| + |
| +// Helper class to track and allow waiting for a single OnPrefetchingFinished |
| +// event. No learning events should be fired while this observer is active. |
| +class PrefetchingObserver : public TestObserver { |
| + public: |
| + explicit PrefetchingObserver(ResourcePrefetchPredictor* predictor, |
| + const GURL& expected_main_frame_url) |
| + : TestObserver(predictor), main_frame_url_(expected_main_frame_url) {} |
| + |
| + // TestObserver: |
| + void OnNavigationLearned(size_t url_visit_count, |
| + const PageRequestSummary& summary) override { |
| + ADD_FAILURE() << "Prefetching shouldn't activate learning"; |
| + } |
| + |
| + void OnPrefetchingFinished(const GURL& main_frame_url) override { |
| + EXPECT_EQ(main_frame_url_, main_frame_url); |
| + run_loop_.Quit(); |
| + } |
| + |
| + void Wait() { run_loop_.Run(); } |
| + |
| + private: |
| + base::RunLoop run_loop_; |
| + GURL main_frame_url_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(PrefetchingObserver); |
| }; |
| class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| @@ -208,6 +239,19 @@ class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| EnsurePredictorInitialized(); |
| } |
| + void TestLearningAndPrefetching(const GURL& main_frame_url) { |
| + // Navigate to |main_frame_url| and check all the expectations. |
| + NavigateToURLAndCheckSubresources(main_frame_url); |
| + ClearCache(); |
| + // It is needed to have at least two resource hits to trigger prefetch. |
| + NavigateToURLAndCheckSubresources(main_frame_url); |
| + ClearCache(); |
| + // Prefetch all needed resources and change expectations so that all |
| + // cacheable resources should be served from cache next navigation. |
| + PrefetchURL(main_frame_url); |
| + NavigateToURLAndCheckSubresources(main_frame_url); |
| + } |
| + |
| void NavigateToURLAndCheckSubresources( |
| const GURL& main_frame_url, |
| WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB) { |
| @@ -219,7 +263,7 @@ class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| url_request_summaries.push_back( |
| GetURLRequestSummaryForResource(endpoint_url, kv.second)); |
| } |
| - ResourcePrefetchPredictorTestObserver observer( |
| + LearningObserver observer( |
| predictor_, UpdateAndGetVisitCount(main_frame_url), |
| CreatePageRequestSummary(endpoint_url.spec(), main_frame_url.spec(), |
| url_request_summaries), |
| @@ -228,6 +272,20 @@ class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| browser(), main_frame_url, disposition, |
| ui_test_utils::BROWSER_TEST_NONE); |
| observer.Wait(); |
| + for (auto& kv : resources_) { |
| + if (!kv.second.is_no_store && kv.second.should_be_recorded) |
| + kv.second.request.was_cached = true; |
| + } |
| + } |
| + |
| + void PrefetchURL(const GURL& main_frame_url) { |
| + PrefetchingObserver observer(predictor_, main_frame_url); |
| + predictor_->StartPrefetching(main_frame_url, PrefetchOrigin::NAVIGATION); |
|
Benoit L
2016/12/19 12:32:00
nit: What you're doing here maps more closely to "
alexilin
2016/12/19 12:58:09
I hope that the behavior of predictor in this two
Benoit L
2016/12/19 15:19:05
Good point.
I'm sure that if either of us change t
|
| + observer.Wait(); |
| + for (auto& kv : resources_) { |
| + if (!kv.second.is_no_store && kv.second.should_be_recorded) |
| + kv.second.request.was_cached = true; |
| + } |
| } |
| ResourceSummary* AddResource(const GURL& resource_url, |
| @@ -273,6 +331,12 @@ class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| } |
| } |
| + void ClearCache() { |
| + chrome::ClearCache(browser()); |
| + for (auto& kv : resources_) |
| + kv.second.request.was_cached = false; |
| + } |
| + |
| // Shortcut for convenience. |
| GURL GetURL(const std::string& path) const { |
| return embedded_test_server()->GetURL(path); |
| @@ -397,7 +461,7 @@ class ResourcePrefetchPredictorBrowserTest : public InProcessBrowserTest { |
| std::map<GURL, size_t> visit_count_; |
| }; |
| -IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, LearningSimple) { |
| +IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Simple) { |
| // These resources have default priorities that correspond to |
| // blink::typeToPriority function. |
| AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST); |
| @@ -406,11 +470,10 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, LearningSimple) { |
| AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE, |
| net::HIGHEST); |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlSubresourcesPath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlSubresourcesPath)); |
| } |
| -IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningAfterRedirect) { |
| +IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Redirect) { |
| AddRedirectChain(GetURL(kRedirectPath), {{net::HTTP_MOVED_PERMANENTLY, |
| GetURL(kHtmlSubresourcesPath)}}); |
| AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST); |
| @@ -419,11 +482,10 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE, |
| net::HIGHEST); |
| - NavigateToURLAndCheckSubresources(GetURL(kRedirectPath)); |
| + TestLearningAndPrefetching(GetURL(kRedirectPath)); |
| } |
| -IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningAfterRedirectChain) { |
| +IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, RedirectChain) { |
| AddRedirectChain(GetURL(kRedirectPath), |
| {{net::HTTP_FOUND, GetURL(kRedirectPath2)}, |
| {net::HTTP_MOVED_PERMANENTLY, GetURL(kRedirectPath3)}, |
| @@ -434,15 +496,14 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE, |
| net::HIGHEST); |
| - NavigateToURLAndCheckSubresources(GetURL(kRedirectPath)); |
| + TestLearningAndPrefetching(GetURL(kRedirectPath)); |
| } |
| IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| LearningAfterHttpToHttpsRedirect) { |
| EnableHttpsServer(); |
| AddRedirectChain(GetURL(kRedirectPath), |
| - {{net::HTTP_FOUND, https_server()->GetURL(kRedirectPath2)}, |
| - {net::HTTP_MOVED_PERMANENTLY, |
| + {{net::HTTP_MOVED_PERMANENTLY, |
| https_server()->GetURL(kHtmlSubresourcesPath)}}); |
| AddResource(https_server()->GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, |
| net::LOWEST); |
| @@ -453,10 +514,12 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| AddResource(https_server()->GetURL(kFontPath), |
| content::RESOURCE_TYPE_FONT_RESOURCE, net::HIGHEST); |
| NavigateToURLAndCheckSubresources(GetURL(kRedirectPath)); |
| + // TODO(alexilin): activate it after new NavigationID introduced. |
| + // TestLearningAndPrefetching(GetURL(kRedirectPath)); |
|
Benoit L
2016/12/19 12:32:00
nit: Don't put commented-out code. However the com
alexilin
2016/12/19 12:58:09
Done.
Is there some rule in styleguide about that
Benoit L
2016/12/19 15:19:05
I'm not sure, but I'm quite confident that no-one
alexilin
2016/12/19 15:36:13
Well, now even this never commited commented-out c
|
| } |
| IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningJavascriptDocumentWrite) { |
| + JavascriptDocumentWrite) { |
| auto externalScript = |
| AddExternalResource(GetURL(kScriptDocumentWritePath), |
| content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| @@ -465,12 +528,12 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET, |
| net::HIGHEST); |
| AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlDocumentWritePath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlDocumentWritePath)); |
| } |
| // Disabled due to flakiness (crbug.com/673028). |
| IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - DISABLED_LearningJavascriptAppendChild) { |
| + JavascriptAppendChild) { |
| auto externalScript = |
| AddExternalResource(GetURL(kScriptAppendChildPath), |
| content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| @@ -480,11 +543,11 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| net::HIGHEST); |
| // This script has net::LOWEST priority because it's executed asynchronously. |
| AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::LOWEST); |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlAppendChildPath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlAppendChildPath)); |
| } |
| IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningJavascriptInnerHtml) { |
| + JavascriptInnerHtml) { |
| auto externalScript = AddExternalResource( |
| GetURL(kScriptInnerHtmlPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| externalScript->request.mime_type = kJavascriptMime; |
| @@ -494,13 +557,12 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| // https://www.w3.org/TR/2014/REC-html5-20141028/scripting-1.html#the-script-element |
| // Script elements don't execute when inserted using innerHTML attribute. |
| AddUnrecordedResources({GetURL(kScriptPath)}); |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlInnerHtmlPath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlInnerHtmlPath)); |
| } |
| // Requests originated by XMLHttpRequest have content::RESOURCE_TYPE_XHR. |
| // Actual resource type is inferred from the mime-type. |
| -IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningJavascriptXHR) { |
| +IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, JavascriptXHR) { |
| auto externalScript = AddExternalResource( |
| GetURL(kScriptXHRPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); |
| externalScript->request.mime_type = kJavascriptMime; |
| @@ -513,12 +575,12 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| auto script = AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, |
| net::HIGHEST); |
| script->request.mime_type = kJavascriptMime; |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlXHRPath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlXHRPath)); |
| } |
| // ResourcePrefetchPredictor ignores all resources requested from subframes. |
| IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| - LearningWithIframe) { |
| + IframeShouldBeIgnored) { |
| // Included from html_iframe.html. |
| AddResource(GetURL(kImagePath2), content::RESOURCE_TYPE_IMAGE, net::LOWEST); |
| AddResource(GetURL(kStylePath2), content::RESOURCE_TYPE_STYLESHEET, |
| @@ -527,7 +589,7 @@ IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, |
| // Included from <iframe src="html_subresources.html"> and not recored. |
| AddUnrecordedResources({GetURL(kImagePath), GetURL(kStylePath), |
| GetURL(kScriptPath), GetURL(kFontPath)}); |
| - NavigateToURLAndCheckSubresources(GetURL(kHtmlIframePath)); |
| + TestLearningAndPrefetching(GetURL(kHtmlIframePath)); |
| } |
| } // namespace predictors |