Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6870)

Unified Diff: chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc

Issue 2553083002: predictors: Add browsertest that tests prefetching. (Closed)
Patch Set: Rebase. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 c9ab1bf7d49b80fd04537fa57badfb65b8920df9..70c3131eee72b3618091e2b5e499350e753622f6 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 the observer creation.
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)
+ 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:
+ 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::EXTERNAL);
+ 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): Test learning and prefetching once crbug.com/650246 is
+ // fixed.
}
IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest,
- LearningJavascriptDocumentWrite) {
+ JavascriptDocumentWrite) {
auto externalScript =
AddExternalResource(GetURL(kScriptDocumentWritePath),
content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
@@ -465,11 +528,11 @@ 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));
}
IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest,
- LearningJavascriptAppendChild) {
+ JavascriptAppendChild) {
auto externalScript =
AddExternalResource(GetURL(kScriptAppendChildPath),
content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
@@ -479,11 +542,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;
@@ -493,13 +556,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;
@@ -512,12 +574,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,
@@ -526,7 +588,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
« no previous file with comments | « chrome/browser/predictors/resource_prefetch_predictor.cc ('k') | chrome/browser/predictors/resource_prefetcher_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698