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

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc

Issue 2592243003: predictors: ResourcePrefetchPredictorBrowserTest improvements. (Closed)
Patch Set: Cover external resources also. Created 3 years, 12 months 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/command_line.h" 5 #include "base/command_line.h"
6 #include "chrome/browser/browsing_data/browsing_data_helper.h" 6 #include "chrome/browser/browsing_data/browsing_data_helper.h"
7 #include "chrome/browser/browsing_data/browsing_data_remover.h" 7 #include "chrome/browser/browsing_data/browsing_data_remover.h"
8 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" 8 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
9 #include "chrome/browser/predictors/resource_prefetch_predictor.h" 9 #include "chrome/browser/predictors/resource_prefetch_predictor.h"
10 #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h" 10 #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 const char kHtmlAppendChildPath[] = "/predictors/append_child.html"; 50 const char kHtmlAppendChildPath[] = "/predictors/append_child.html";
51 const char kScriptAppendChildPath[] = "/predictors/append_child.js"; 51 const char kScriptAppendChildPath[] = "/predictors/append_child.js";
52 const char kHtmlInnerHtmlPath[] = "/predictors/inner_html.html"; 52 const char kHtmlInnerHtmlPath[] = "/predictors/inner_html.html";
53 const char kScriptInnerHtmlPath[] = "/predictors/inner_html.js"; 53 const char kScriptInnerHtmlPath[] = "/predictors/inner_html.js";
54 const char kHtmlXHRPath[] = "/predictors/xhr.html"; 54 const char kHtmlXHRPath[] = "/predictors/xhr.html";
55 const char kScriptXHRPath[] = "/predictors/xhr.js"; 55 const char kScriptXHRPath[] = "/predictors/xhr.js";
56 const char kHtmlIframePath[] = "/predictors/html_iframe.html"; 56 const char kHtmlIframePath[] = "/predictors/html_iframe.html";
57 57
58 struct ResourceSummary { 58 struct ResourceSummary {
59 ResourceSummary() 59 ResourceSummary()
60 : is_no_store(false), 60 : version(0),
61 version(0), 61 is_no_store(false),
62 is_external(false), 62 is_external(false),
63 should_be_recorded(true) {} 63 is_observable(true),
64 is_request_prohibited(false) {}
64 65
65 ResourcePrefetchPredictor::URLRequestSummary request; 66 ResourcePrefetchPredictor::URLRequestSummary request;
66 std::string content; 67 std::string content;
68 // Allows to update HTTP ETag.
69 size_t version;
70 // True iff "Cache-control: no-store" header is present.
67 bool is_no_store; 71 bool is_no_store;
68 size_t version; 72 // True iff a request for this resource must be ignored by the custom handler.
69 bool is_external; 73 bool is_external;
70 bool should_be_recorded; 74 // True iff the LearningObserver must observe this resource.
75 bool is_observable;
76 // True iff a test must fail on request to this resource.
pasko 2016/12/26 14:12:16 nit: since we are in ResourceSummary, we could rem
pasko 2016/12/26 14:12:17 I'd rephrase slightly (because a test can fail for
alexilin 2016/12/26 17:33:22 Done.
77 bool is_request_prohibited;
71 }; 78 };
72 79
73 struct RedirectEdge { 80 struct RedirectEdge {
74 // This response code should be returned by previous url in the chain. 81 // This response code should be returned by previous url in the chain.
75 net::HttpStatusCode code; 82 net::HttpStatusCode code;
76 GURL url; 83 GURL url;
77 }; 84 };
78 85
79 // Helper class to track and allow waiting for ResourcePrefetchPredictor 86 // Helper class to track and allow waiting for ResourcePrefetchPredictor
80 // initialization. WARNING: OnPredictorInitialized event will not be fired if 87 // initialization. WARNING: OnPredictorInitialized event will not be fired if
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 168
162 for (auto& subresource : actual_subresources) 169 for (auto& subresource : actual_subresources)
163 ModifySubresourceForComparison(&subresource, match_navigation_id); 170 ModifySubresourceForComparison(&subresource, match_navigation_id);
164 for (auto& subresource : expected_subresources) 171 for (auto& subresource : expected_subresources)
165 ModifySubresourceForComparison(&subresource, match_navigation_id); 172 ModifySubresourceForComparison(&subresource, match_navigation_id);
166 173
167 EXPECT_THAT(actual_subresources, 174 EXPECT_THAT(actual_subresources,
168 testing::UnorderedElementsAreArray(expected_subresources)); 175 testing::UnorderedElementsAreArray(expected_subresources));
169 } 176 }
170 177
178 std::string GetVersionnedETag(size_t version, const std::string& path) {
pasko 2016/12/26 14:12:17 s/GetVersionned/MakeVersioned/ (we are not lookin
alexilin 2016/12/26 17:33:22 I'd prefer to name it CreateVersionnedETag since i
pasko 2016/12/26 17:56:49 sgtm on the "Create" part, but s/Versionned/Versio
alexilin 2016/12/26 18:27:07 Done.
179 return base::StringPrintf("'%zu%s'", version, path.c_str());
180 }
181
171 } // namespace 182 } // namespace
172 183
173 // Helper class to track and allow waiting for a single OnNavigationLearned 184 // Helper class to track and allow waiting for a single OnNavigationLearned
174 // event. The information provided by this event is also used to verify that 185 // event. The information provided by this event is also used to verify that
175 // ResourcePrefetchPredictor works as expected. 186 // ResourcePrefetchPredictor works as expected.
176 class LearningObserver : public TestObserver { 187 class LearningObserver : public TestObserver {
177 public: 188 public:
178 using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary; 189 using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary;
179 190
180 LearningObserver(ResourcePrefetchPredictor* predictor, 191 LearningObserver(ResourcePrefetchPredictor* predictor,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 switches::kSpeculativeResourcePrefetchingEnabledExternal); 257 switches::kSpeculativeResourcePrefetchingEnabledExternal);
247 } 258 }
248 259
249 void SetUpOnMainThread() override { 260 void SetUpOnMainThread() override {
250 embedded_test_server()->RegisterRequestHandler( 261 embedded_test_server()->RegisterRequestHandler(
251 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleRedirectRequest, 262 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleRedirectRequest,
252 base::Unretained(this))); 263 base::Unretained(this)));
253 embedded_test_server()->RegisterRequestHandler( 264 embedded_test_server()->RegisterRequestHandler(
254 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest, 265 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest,
255 base::Unretained(this))); 266 base::Unretained(this)));
267 embedded_test_server()->RegisterRequestMonitor(base::Bind(
268 &ResourcePrefetchPredictorBrowserTest::MonitorResourceRequest,
269 base::Unretained(this)));
256 ASSERT_TRUE(embedded_test_server()->Start()); 270 ASSERT_TRUE(embedded_test_server()->Start());
257 predictor_ = 271 predictor_ =
258 ResourcePrefetchPredictorFactory::GetForProfile(browser()->profile()); 272 ResourcePrefetchPredictorFactory::GetForProfile(browser()->profile());
259 ASSERT_TRUE(predictor_); 273 ASSERT_TRUE(predictor_);
260 EnsurePredictorInitialized(); 274 EnsurePredictorInitialized();
261 } 275 }
262 276
263 void TestLearningAndPrefetching(const GURL& main_frame_url) { 277 void TestLearningAndPrefetching(const GURL& main_frame_url) {
264 // Navigate to |main_frame_url| and check all the expectations. 278 // Navigate to |main_frame_url| and check all the expectations.
265 NavigateToURLAndCheckSubresources(main_frame_url); 279 NavigateToURLAndCheckSubresources(main_frame_url);
266 ClearCache(); 280 ClearCache();
267 // It is needed to have at least two resource hits to trigger prefetch. 281 // It is needed to have at least two resource hits to trigger prefetch.
268 NavigateToURLAndCheckSubresources(main_frame_url); 282 NavigateToURLAndCheckSubresources(main_frame_url);
269 ClearCache(); 283 ClearCache();
270 // Prefetch all needed resources and change expectations so that all 284 // Prefetch all needed resources and change expectations so that all
271 // cacheable resources should be served from cache next navigation. 285 // cacheable resources should be served from cache next navigation.
272 PrefetchURL(main_frame_url); 286 PrefetchURL(main_frame_url);
287 // To be sure that the browser send no requests to the server after
288 // prefetching.
289 for (auto& kv : resources_) {
290 if (kv.second.is_observable)
291 kv.second.is_request_prohibited = true;
292 }
273 NavigateToURLAndCheckSubresources(main_frame_url); 293 NavigateToURLAndCheckSubresources(main_frame_url);
294 for (auto& kv : resources_) {
295 if (kv.second.is_observable)
296 kv.second.is_request_prohibited = false;
pasko 2016/12/26 14:12:17 why should this be returned back to false? Are we
alexilin 2016/12/26 17:33:22 Potentially yes. For example, we already have Cros
pasko 2016/12/26 17:56:49 OK, makes sense, agreed.
297 }
274 } 298 }
275 299
276 void NavigateToURLAndCheckSubresources( 300 void NavigateToURLAndCheckSubresources(
277 const GURL& main_frame_url, 301 const GURL& main_frame_url,
278 WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB) { 302 WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB) {
279 GURL endpoint_url = GetRedirectEndpoint(main_frame_url); 303 GURL endpoint_url = GetRedirectEndpoint(main_frame_url);
280 std::vector<URLRequestSummary> url_request_summaries; 304 std::vector<URLRequestSummary> url_request_summaries;
281 for (const auto& kv : resources_) { 305 for (const auto& kv : resources_) {
282 if (kv.second.is_no_store || !kv.second.should_be_recorded) 306 if (kv.second.is_observable) {
283 continue; 307 url_request_summaries.push_back(
284 url_request_summaries.push_back( 308 GetURLRequestSummaryForResource(endpoint_url, kv.second));
285 GetURLRequestSummaryForResource(endpoint_url, kv.second)); 309 }
286 } 310 }
311
312 bool match_navigation_id =
pasko 2016/12/26 14:12:17 this part is already committed in crrev.com/62729f
alexilin 2016/12/26 17:33:23 Done.
313 disposition == WindowOpenDisposition::CURRENT_TAB;
314
287 LearningObserver observer( 315 LearningObserver observer(
288 predictor_, UpdateAndGetVisitCount(main_frame_url), 316 predictor_, UpdateAndGetVisitCount(main_frame_url),
289 CreatePageRequestSummary(endpoint_url.spec(), main_frame_url.spec(), 317 CreatePageRequestSummary(endpoint_url.spec(), main_frame_url.spec(),
290 url_request_summaries), 318 url_request_summaries),
291 true); // Matching navigation id by default 319 match_navigation_id);
292 ui_test_utils::NavigateToURLWithDisposition( 320 ui_test_utils::NavigateToURLWithDisposition(
293 browser(), main_frame_url, disposition, 321 browser(), main_frame_url, disposition,
294 ui_test_utils::BROWSER_TEST_NONE); 322 ui_test_utils::BROWSER_TEST_NONE);
295 observer.Wait(); 323 observer.Wait();
296 for (auto& kv : resources_) { 324 for (auto& kv : resources_) {
297 if (!kv.second.is_no_store && kv.second.should_be_recorded) 325 if (kv.second.is_observable)
298 kv.second.request.was_cached = true; 326 kv.second.request.was_cached = true;
299 } 327 }
300 } 328 }
301 329
302 void PrefetchURL(const GURL& main_frame_url) { 330 void PrefetchURL(const GURL& main_frame_url) {
303 PrefetchingObserver observer(predictor_, main_frame_url); 331 PrefetchingObserver observer(predictor_, main_frame_url);
304 predictor_->StartPrefetching(main_frame_url, PrefetchOrigin::EXTERNAL); 332 predictor_->StartPrefetching(main_frame_url, PrefetchOrigin::EXTERNAL);
305 observer.Wait(); 333 observer.Wait();
306 for (auto& kv : resources_) { 334 for (auto& kv : resources_) {
307 if (!kv.second.is_no_store && kv.second.should_be_recorded) 335 if (kv.second.is_observable)
308 kv.second.request.was_cached = true; 336 kv.second.request.was_cached = true;
309 } 337 }
310 } 338 }
311 339
312 ResourceSummary* AddResource(const GURL& resource_url, 340 ResourceSummary* AddResource(const GURL& resource_url,
313 content::ResourceType resource_type, 341 content::ResourceType resource_type,
314 net::RequestPriority priority) { 342 net::RequestPriority priority) {
315 auto pair_and_whether_inserted = 343 auto pair_and_whether_inserted =
316 resources_.insert(std::make_pair(resource_url, ResourceSummary())); 344 resources_.insert(std::make_pair(resource_url, ResourceSummary()));
317 EXPECT_TRUE(pair_and_whether_inserted.second) << resource_url 345 EXPECT_TRUE(pair_and_whether_inserted.second) << resource_url
318 << " was inserted twice"; 346 << " was inserted twice";
319 ResourceSummary* resource = &pair_and_whether_inserted.first->second; 347 ResourceSummary* resource = &pair_and_whether_inserted.first->second;
320 resource->request.resource_url = resource_url; 348 resource->request.resource_url = resource_url;
321 resource->request.resource_type = resource_type; 349 resource->request.resource_type = resource_type;
322 resource->request.priority = priority; 350 resource->request.priority = priority;
323 resource->request.has_validators = true; 351 resource->request.has_validators = true;
324 return resource; 352 return resource;
325 } 353 }
326 354
327 ResourceSummary* AddExternalResource(const GURL& resource_url, 355 ResourceSummary* AddExternalResource(const GURL& resource_url,
328 content::ResourceType resource_type, 356 content::ResourceType resource_type,
329 net::RequestPriority priority) { 357 net::RequestPriority priority) {
330 auto resource = AddResource(resource_url, resource_type, priority); 358 auto resource = AddResource(resource_url, resource_type, priority);
331 resource->is_external = true; 359 resource->is_external = true;
332 return resource; 360 return resource;
333 } 361 }
334 362
335 void AddUnrecordedResources(const std::vector<GURL>& resource_urls) { 363 void AddUnobservableResources(const std::vector<GURL>& resource_urls) {
336 for (const GURL& resource_url : resource_urls) { 364 for (const GURL& resource_url : resource_urls) {
337 auto resource = 365 auto resource =
338 AddResource(resource_url, content::RESOURCE_TYPE_SUB_RESOURCE, 366 AddResource(resource_url, content::RESOURCE_TYPE_SUB_RESOURCE,
339 net::DEFAULT_PRIORITY); 367 net::DEFAULT_PRIORITY);
340 resource->should_be_recorded = false; 368 resource->is_observable = false;
341 } 369 }
342 } 370 }
343 371
344 void AddRedirectChain(const GURL& initial_url, 372 void AddRedirectChain(const GURL& initial_url,
345 const std::vector<RedirectEdge>& redirect_chain) { 373 const std::vector<RedirectEdge>& redirect_chain) {
346 ASSERT_FALSE(redirect_chain.empty()); 374 ASSERT_FALSE(redirect_chain.empty());
347 GURL current = initial_url; 375 GURL current = initial_url;
348 for (const auto& edge : redirect_chain) { 376 for (const auto& edge : redirect_chain) {
349 auto result = redirects_.insert(std::make_pair(current, edge)); 377 auto result = redirects_.insert(std::make_pair(current, edge));
350 EXPECT_TRUE(result.second) << current << " already has a redirect."; 378 EXPECT_TRUE(result.second) << current << " already has a redirect.";
(...skipping 24 matching lines...) Expand all
375 https_server_ = base::MakeUnique<net::EmbeddedTestServer>( 403 https_server_ = base::MakeUnique<net::EmbeddedTestServer>(
376 net::EmbeddedTestServer::TYPE_HTTPS); 404 net::EmbeddedTestServer::TYPE_HTTPS);
377 https_server()->AddDefaultHandlers( 405 https_server()->AddDefaultHandlers(
378 base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 406 base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
379 https_server()->RegisterRequestHandler( 407 https_server()->RegisterRequestHandler(
380 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleRedirectRequest, 408 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleRedirectRequest,
381 base::Unretained(this))); 409 base::Unretained(this)));
382 https_server()->RegisterRequestHandler( 410 https_server()->RegisterRequestHandler(
383 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest, 411 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest,
384 base::Unretained(this))); 412 base::Unretained(this)));
413 https_server()->RegisterRequestMonitor(base::Bind(
414 &ResourcePrefetchPredictorBrowserTest::MonitorResourceRequest,
415 base::Unretained(this)));
385 ASSERT_TRUE(https_server()->Start()); 416 ASSERT_TRUE(https_server()->Start());
386 } 417 }
387 418
388 // Returns the embedded test server working over HTTPS. Must be enabled by 419 // Returns the embedded test server working over HTTPS. Must be enabled by
389 // calling EnableHttpsServer() before use. 420 // calling EnableHttpsServer() before use.
390 const net::EmbeddedTestServer* https_server() const { 421 const net::EmbeddedTestServer* https_server() const {
391 return https_server_.get(); 422 return https_server_.get();
392 } 423 }
393 424
394 net::EmbeddedTestServer* https_server() { return https_server_.get(); } 425 net::EmbeddedTestServer* https_server() { return https_server_.get(); }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 GURL current = initial_url; 458 GURL current = initial_url;
428 while (true) { 459 while (true) {
429 auto it = redirects_.find(current); 460 auto it = redirects_.find(current);
430 if (it == redirects_.end()) 461 if (it == redirects_.end())
431 break; 462 break;
432 current = it->second.url; 463 current = it->second.url;
433 } 464 }
434 return current; 465 return current;
435 } 466 }
436 467
468 void MonitorResourceRequest(
469 const net::test_server::HttpRequest& request) const {
470 auto resource_it = resources_.find(request.GetURL());
pasko 2016/12/26 14:12:17 since the type for |resources_| is declared elsewh
alexilin 2016/12/26 17:33:23 It is debatable whether "std::map<X, Y>::const_ite
pasko 2016/12/26 17:56:49 Arguably finding the definition of ResourceMap is
alexilin 2016/12/26 18:27:08 GurlToResourceSummaryMap1234567 std::map<GURL, Res
471 if (resource_it == resources_.end())
472 return;
473
474 const ResourceSummary& summary = resource_it->second;
475 EXPECT_FALSE(summary.is_request_prohibited) << request.GetURL().spec()
476 << "\n"
477 << request.all_headers;
478 }
479
437 std::unique_ptr<net::test_server::HttpResponse> HandleResourceRequest( 480 std::unique_ptr<net::test_server::HttpResponse> HandleResourceRequest(
pasko 2016/12/26 14:12:17 I think it is time for a brief comment of how requ
alexilin 2016/12/26 17:33:23 Done. + added remark about the execution thread. I
pasko 2016/12/26 17:56:49 Thanks!
438 const net::test_server::HttpRequest& request) const { 481 const net::test_server::HttpRequest& request) const {
439 auto resource_it = resources_.find(request.GetURL()); 482 auto resource_it = resources_.find(request.GetURL());
440 if (resource_it == resources_.end()) 483 if (resource_it == resources_.end())
441 return nullptr; 484 return nullptr;
442 485
443 const ResourceSummary& summary = resource_it->second; 486 const ResourceSummary& summary = resource_it->second;
444 if (summary.is_external) 487 if (summary.is_external)
445 return nullptr; 488 return nullptr;
446 489
447 auto http_response = 490 auto http_response =
448 base::MakeUnique<net::test_server::BasicHttpResponse>(); 491 base::MakeUnique<net::test_server::BasicHttpResponse>();
449 http_response->set_code(net::HTTP_OK); 492
493 if (request.headers.find("If-None-Match") != request.headers.end() &&
494 request.headers.at("If-None-Match") ==
495 GetVersionnedETag(summary.version, request.relative_url)) {
496 http_response->set_code(net::HTTP_NOT_MODIFIED);
497 } else {
498 http_response->set_code(net::HTTP_OK);
499 }
500
450 if (!summary.request.mime_type.empty()) 501 if (!summary.request.mime_type.empty())
451 http_response->set_content_type(summary.request.mime_type); 502 http_response->set_content_type(summary.request.mime_type);
452 if (!summary.content.empty()) 503 if (!summary.content.empty())
453 http_response->set_content(summary.content); 504 http_response->set_content(summary.content);
454 if (summary.is_no_store) 505 if (summary.is_no_store)
455 http_response->AddCustomHeader("Cache-Control", "no-store"); 506 http_response->AddCustomHeader("Cache-Control", "no-store");
456 if (summary.request.has_validators) { 507 if (summary.request.has_validators) {
457 http_response->AddCustomHeader( 508 http_response->AddCustomHeader(
458 "ETag", base::StringPrintf("'%zu%s'", summary.version, 509 "ETag", GetVersionnedETag(summary.version, request.relative_url));
459 request.relative_url.c_str()));
460 } 510 }
461 if (summary.request.always_revalidate) 511 if (summary.request.always_revalidate)
462 http_response->AddCustomHeader("Cache-Control", "no-cache"); 512 http_response->AddCustomHeader("Cache-Control", "no-cache");
463 else 513 else
464 http_response->AddCustomHeader("Cache-Control", "max-age=2147483648"); 514 http_response->AddCustomHeader("Cache-Control", "max-age=2147483648");
465 return std::move(http_response); 515 return std::move(http_response);
466 } 516 }
467 517
468 std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest( 518 std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest(
469 const net::test_server::HttpRequest& request) const { 519 const net::test_server::HttpRequest& request) const {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, 626 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest,
577 JavascriptInnerHtml) { 627 JavascriptInnerHtml) {
578 auto externalScript = AddExternalResource( 628 auto externalScript = AddExternalResource(
579 GetURL(kScriptInnerHtmlPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); 629 GetURL(kScriptInnerHtmlPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
580 externalScript->request.mime_type = kJavascriptMime; 630 externalScript->request.mime_type = kJavascriptMime;
581 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST); 631 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST);
582 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET, 632 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET,
583 net::HIGHEST); 633 net::HIGHEST);
584 // https://www.w3.org/TR/2014/REC-html5-20141028/scripting-1.html#the-script-e lement 634 // https://www.w3.org/TR/2014/REC-html5-20141028/scripting-1.html#the-script-e lement
585 // Script elements don't execute when inserted using innerHTML attribute. 635 // Script elements don't execute when inserted using innerHTML attribute.
586 AddUnrecordedResources({GetURL(kScriptPath)}); 636 AddUnobservableResources({GetURL(kScriptPath)});
587 TestLearningAndPrefetching(GetURL(kHtmlInnerHtmlPath)); 637 TestLearningAndPrefetching(GetURL(kHtmlInnerHtmlPath));
588 } 638 }
589 639
590 // Requests originated by XMLHttpRequest have content::RESOURCE_TYPE_XHR. 640 // Requests originated by XMLHttpRequest have content::RESOURCE_TYPE_XHR.
591 // Actual resource type is inferred from the mime-type. 641 // Actual resource type is inferred from the mime-type.
592 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, JavascriptXHR) { 642 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, JavascriptXHR) {
593 auto externalScript = AddExternalResource( 643 auto externalScript = AddExternalResource(
594 GetURL(kScriptXHRPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); 644 GetURL(kScriptXHRPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
595 externalScript->request.mime_type = kJavascriptMime; 645 externalScript->request.mime_type = kJavascriptMime;
596 auto image = AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, 646 auto image = AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE,
597 net::HIGHEST); 647 net::HIGHEST);
598 image->request.mime_type = kImageMime; 648 image->request.mime_type = kImageMime;
599 auto style = AddResource(GetURL(kStylePath), 649 auto style = AddResource(GetURL(kStylePath),
600 content::RESOURCE_TYPE_STYLESHEET, net::HIGHEST); 650 content::RESOURCE_TYPE_STYLESHEET, net::HIGHEST);
601 style->request.mime_type = kStyleMime; 651 style->request.mime_type = kStyleMime;
602 auto script = AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, 652 auto script = AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT,
603 net::HIGHEST); 653 net::HIGHEST);
604 script->request.mime_type = kJavascriptMime; 654 script->request.mime_type = kJavascriptMime;
605 TestLearningAndPrefetching(GetURL(kHtmlXHRPath)); 655 TestLearningAndPrefetching(GetURL(kHtmlXHRPath));
606 } 656 }
607 657
608 // ResourcePrefetchPredictor ignores all resources requested from subframes. 658 // ResourcePrefetchPredictor ignores all resources requested from subframes.
609 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, 659 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest,
610 IframeShouldBeIgnored) { 660 IframeShouldBeIgnored) {
611 // Included from html_iframe.html. 661 // Included from html_iframe.html.
612 AddResource(GetURL(kImagePath2), content::RESOURCE_TYPE_IMAGE, net::LOWEST); 662 AddResource(GetURL(kImagePath2), content::RESOURCE_TYPE_IMAGE, net::LOWEST);
613 AddResource(GetURL(kStylePath2), content::RESOURCE_TYPE_STYLESHEET, 663 AddResource(GetURL(kStylePath2), content::RESOURCE_TYPE_STYLESHEET,
614 net::HIGHEST); 664 net::HIGHEST);
615 AddResource(GetURL(kScriptPath2), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); 665 AddResource(GetURL(kScriptPath2), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
616 // Included from <iframe src="html_subresources.html"> and not recored. 666 // Included from <iframe src="html_subresources.html"> and shouldn't be
617 AddUnrecordedResources({GetURL(kImagePath), GetURL(kStylePath), 667 // observed.
618 GetURL(kScriptPath), GetURL(kFontPath)}); 668 AddUnobservableResources({GetURL(kImagePath), GetURL(kStylePath),
669 GetURL(kScriptPath), GetURL(kFontPath)});
619 TestLearningAndPrefetching(GetURL(kHtmlIframePath)); 670 TestLearningAndPrefetching(GetURL(kHtmlIframePath));
620 } 671 }
621 672
673 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, AlwaysRevalidate) {
674 std::vector<ResourceSummary*> resources = {
675 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE,
676 net::LOWEST),
677 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET,
678 net::HIGHEST),
679 AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT,
680 net::MEDIUM),
681 AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE,
682 net::HIGHEST),
683 };
684 for (auto& resource : resources)
685 resource->request.always_revalidate = true;
686 TestLearningAndPrefetching(GetURL(kHtmlSubresourcesPath));
687 }
688
622 } // namespace predictors 689 } // namespace predictors
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698