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

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

Issue 2440723002: predictors: Make ResourcePrefetchPredictor observable. (Closed)
Patch Set: Rename TestObserver to TestDelegate Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/predictors/resource_prefetch_predictor.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 21 matching lines...) Expand all
32 #include "content/public/browser/resource_request_info.h" 32 #include "content/public/browser/resource_request_info.h"
33 #include "content/public/browser/web_contents.h" 33 #include "content/public/browser/web_contents.h"
34 #include "net/base/mime_util.h" 34 #include "net/base/mime_util.h"
35 #include "net/base/network_change_notifier.h" 35 #include "net/base/network_change_notifier.h"
36 #include "net/http/http_response_headers.h" 36 #include "net/http/http_response_headers.h"
37 #include "net/url_request/url_request.h" 37 #include "net/url_request/url_request.h"
38 #include "net/url_request/url_request_context_getter.h" 38 #include "net/url_request/url_request_context_getter.h"
39 39
40 using content::BrowserThread; 40 using content::BrowserThread;
41 41
42 namespace predictors {
43
42 namespace { 44 namespace {
43 45
44 // Sorted by decreasing likelihood according to HTTP archive. 46 // Sorted by decreasing likelihood according to HTTP archive.
45 const char* kFontMimeTypes[] = {"font/woff2", 47 const char* kFontMimeTypes[] = {"font/woff2",
46 "application/x-font-woff", 48 "application/x-font-woff",
47 "application/font-woff", 49 "application/font-woff",
48 "application/font-woff2", 50 "application/font-woff2",
49 "font/x-woff", 51 "font/x-woff",
50 "application/x-font-ttf", 52 "application/x-font-ttf",
51 "font/woff", 53 "font/woff",
52 "font/ttf", 54 "font/ttf",
53 "application/x-font-otf", 55 "application/x-font-otf",
54 "x-font/woff", 56 "x-font/woff",
55 "application/font-sfnt", 57 "application/font-sfnt",
56 "application/font-ttf"}; 58 "application/font-ttf"};
57 59
58 // For reporting events of interest that are not tied to any navigation. 60 // For reporting events of interest that are not tied to any navigation.
59 enum ReportingEvent { 61 enum ReportingEvent {
60 REPORTING_EVENT_ALL_HISTORY_CLEARED = 0, 62 REPORTING_EVENT_ALL_HISTORY_CLEARED = 0,
61 REPORTING_EVENT_PARTIAL_HISTORY_CLEARED = 1, 63 REPORTING_EVENT_PARTIAL_HISTORY_CLEARED = 1,
62 REPORTING_EVENT_COUNT = 2 64 REPORTING_EVENT_COUNT = 2
63 }; 65 };
64 66
65 float ComputeRedirectConfidence(const predictors::RedirectStat& redirect) { 67 float ComputeRedirectConfidence(const predictors::RedirectStat& redirect) {
66 return (redirect.number_of_hits() + 0.0) / 68 return (redirect.number_of_hits() + 0.0) /
67 (redirect.number_of_hits() + redirect.number_of_misses()); 69 (redirect.number_of_hits() + redirect.number_of_misses());
68 } 70 }
69 71
72 // Used to fetch the visit count for a URL from the History database.
73 class GetUrlVisitCountTask : public history::HistoryDBTask {
74 public:
75 using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary;
76 using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary;
77 typedef base::Callback<void(size_t, // URL visit count.
78 const PageRequestSummary&)>
79 VisitInfoCallback;
80
81 GetUrlVisitCountTask(std::unique_ptr<PageRequestSummary> summary,
82 VisitInfoCallback callback);
83
84 bool RunOnDBThread(history::HistoryBackend* backend,
85 history::HistoryDatabase* db) override;
86
87 void DoneRunOnMainThread() override;
88
89 private:
90 ~GetUrlVisitCountTask() override;
91
92 int visit_count_;
93 std::unique_ptr<PageRequestSummary> summary_;
94 VisitInfoCallback callback_;
95
96 DISALLOW_COPY_AND_ASSIGN(GetUrlVisitCountTask);
97 };
98
99 GetUrlVisitCountTask::GetUrlVisitCountTask(
100 std::unique_ptr<PageRequestSummary> summary,
101 VisitInfoCallback callback)
102 : visit_count_(0), summary_(std::move(summary)), callback_(callback) {
103 DCHECK(summary_.get());
104 }
105
106 bool GetUrlVisitCountTask::RunOnDBThread(history::HistoryBackend* backend,
107 history::HistoryDatabase* db) {
108 history::URLRow url_row;
109 if (db->GetRowForURL(summary_->main_frame_url, &url_row))
110 visit_count_ = url_row.visit_count();
111 return true;
112 }
113
114 void GetUrlVisitCountTask::DoneRunOnMainThread() {
115 callback_.Run(visit_count_, *summary_);
116 }
117
118 GetUrlVisitCountTask::~GetUrlVisitCountTask() {}
119
70 } // namespace 120 } // namespace
71 121
72 namespace predictors {
73
74 //////////////////////////////////////////////////////////////////////////////// 122 ////////////////////////////////////////////////////////////////////////////////
75 // ResourcePrefetchPredictor static functions. 123 // ResourcePrefetchPredictor static functions.
76 124
77 // static 125 // static
78 bool ResourcePrefetchPredictor::ShouldRecordRequest( 126 bool ResourcePrefetchPredictor::ShouldRecordRequest(
79 net::URLRequest* request, 127 net::URLRequest* request,
80 content::ResourceType resource_type) { 128 content::ResourceType resource_type) {
81 const content::ResourceRequestInfo* request_info = 129 const content::ResourceRequestInfo* request_info =
82 content::ResourceRequestInfo::ForRequest(request); 130 content::ResourceRequestInfo::ForRequest(request);
83 if (!request_info) 131 if (!request_info)
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 summary->has_validators = headers->HasValidators(); 351 summary->has_validators = headers->HasValidators();
304 // RFC 2616, section 14.9. 352 // RFC 2616, section 14.9.
305 summary->always_revalidate = 353 summary->always_revalidate =
306 headers->HasHeaderValue("cache-control", "no-cache") || 354 headers->HasHeaderValue("cache-control", "no-cache") ||
307 headers->HasHeaderValue("pragma", "no-cache") || 355 headers->HasHeaderValue("pragma", "no-cache") ||
308 headers->HasHeaderValue("vary", "*"); 356 headers->HasHeaderValue("vary", "*");
309 } 357 }
310 return true; 358 return true;
311 } 359 }
312 360
313 ResourcePrefetchPredictor::GetUrlVisitCountTask::GetUrlVisitCountTask( 361 ResourcePrefetchPredictor::PageRequestSummary::PageRequestSummary(
314 const NavigationID& navigation_id, 362 const GURL& i_main_frame_url)
315 std::unique_ptr<PageRequestSummary> summary, 363 : main_frame_url(i_main_frame_url), initial_url(i_main_frame_url) {}
316 VisitInfoCallback callback) 364
317 : visit_count_(0), 365 ResourcePrefetchPredictor::PageRequestSummary::PageRequestSummary(
318 navigation_id_(navigation_id), 366 const PageRequestSummary& other) = default;
319 summary_(std::move(summary)), 367
320 callback_(callback) { 368 ResourcePrefetchPredictor::PageRequestSummary::~PageRequestSummary() {}
321 DCHECK(summary_.get()); 369
370 ResourcePrefetchPredictor::TestDelegate::~TestDelegate() {
371 predictor_->SetDelegateForTesting(nullptr);
322 } 372 }
323 373
324 bool ResourcePrefetchPredictor::GetUrlVisitCountTask::RunOnDBThread( 374 ResourcePrefetchPredictor::TestDelegate::TestDelegate(
325 history::HistoryBackend* backend, 375 ResourcePrefetchPredictor* predictor)
326 history::HistoryDatabase* db) { 376 : predictor_(predictor) {
327 history::URLRow url_row; 377 predictor_->SetDelegateForTesting(this);
328 if (db->GetRowForURL(navigation_id_.main_frame_url, &url_row))
329 visit_count_ = url_row.visit_count();
330 return true;
331 } 378 }
332 379
333 void ResourcePrefetchPredictor::GetUrlVisitCountTask::DoneRunOnMainThread() {
334 callback_.Run(visit_count_, navigation_id_, *summary_);
335 }
336
337 ResourcePrefetchPredictor::GetUrlVisitCountTask::~GetUrlVisitCountTask() {}
338
339 ResourcePrefetchPredictor::PageRequestSummary::PageRequestSummary(
340 const GURL& i_initial_url)
341 : initial_url(i_initial_url) {}
342
343 ResourcePrefetchPredictor::PageRequestSummary::~PageRequestSummary() {}
344
345 //////////////////////////////////////////////////////////////////////////////// 380 ////////////////////////////////////////////////////////////////////////////////
346 // ResourcePrefetchPredictor. 381 // ResourcePrefetchPredictor.
347 382
348 ResourcePrefetchPredictor::ResourcePrefetchPredictor( 383 ResourcePrefetchPredictor::ResourcePrefetchPredictor(
349 const ResourcePrefetchPredictorConfig& config, 384 const ResourcePrefetchPredictorConfig& config,
350 Profile* profile) 385 Profile* profile)
351 : profile_(profile), 386 : profile_(profile),
387 delegate_(nullptr),
352 config_(config), 388 config_(config),
353 initialization_state_(NOT_INITIALIZED), 389 initialization_state_(NOT_INITIALIZED),
354 tables_(PredictorDatabaseFactory::GetForProfile(profile) 390 tables_(PredictorDatabaseFactory::GetForProfile(profile)
355 ->resource_prefetch_tables()), 391 ->resource_prefetch_tables()),
356 history_service_observer_(this) { 392 history_service_observer_(this) {
357 DCHECK_CURRENTLY_ON(BrowserThread::UI); 393 DCHECK_CURRENTLY_ON(BrowserThread::UI);
358 394
359 // Some form of learning has to be enabled. 395 // Some form of learning has to be enabled.
360 DCHECK(config_.IsLearningEnabled()); 396 DCHECK(config_.IsLearningEnabled());
361 if (config_.IsURLPrefetchingEnabled(profile_)) 397 if (config_.IsURLPrefetchingEnabled(profile_))
362 DCHECK(config_.IsURLLearningEnabled()); 398 DCHECK(config_.IsURLLearningEnabled());
363 if (config_.IsHostPrefetchingEnabled(profile_)) 399 if (config_.IsHostPrefetchingEnabled(profile_))
364 DCHECK(config_.IsHostLearningEnabled()); 400 DCHECK(config_.IsHostLearningEnabled());
365 } 401 }
366 402
367 ResourcePrefetchPredictor::~ResourcePrefetchPredictor() { 403 ResourcePrefetchPredictor::~ResourcePrefetchPredictor() {}
368 }
369 404
370 void ResourcePrefetchPredictor::RecordURLRequest( 405 void ResourcePrefetchPredictor::RecordURLRequest(
371 const URLRequestSummary& request) { 406 const URLRequestSummary& request) {
372 DCHECK_CURRENTLY_ON(BrowserThread::UI); 407 DCHECK_CURRENTLY_ON(BrowserThread::UI);
373 if (initialization_state_ != INITIALIZED) 408 if (initialization_state_ != INITIALIZED)
374 return; 409 return;
375 410
376 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); 411 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME);
377 OnMainFrameRequest(request); 412 OnMainFrameRequest(request);
378 } 413 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 // corresponding to the navigation has not been created yet. 447 // corresponding to the navigation has not been created yet.
413 if (!navigation_id.main_frame_url.is_empty()) 448 if (!navigation_id.main_frame_url.is_empty())
414 OnNavigationComplete(navigation_id); 449 OnNavigationComplete(navigation_id);
415 break; 450 break;
416 default: 451 default:
417 NOTREACHED() << "Unexpected initialization_state_: " 452 NOTREACHED() << "Unexpected initialization_state_: "
418 << initialization_state_; 453 << initialization_state_;
419 } 454 }
420 } 455 }
421 456
457 void ResourcePrefetchPredictor::StartPrefetching(const GURL& url) {
458 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StartPrefetching", "url",
459 url.spec());
460 if (!prefetch_manager_.get()) // Prefetching not enabled.
461 return;
462
463 std::vector<GURL> subresource_urls;
464 if (!GetPrefetchData(url, &subresource_urls)) {
465 // No prefetching data at host or URL level.
466 return;
467 }
468
469 BrowserThread::PostTask(
470 BrowserThread::IO, FROM_HERE,
471 base::Bind(&ResourcePrefetcherManager::MaybeAddPrefetch,
472 prefetch_manager_, url, subresource_urls));
473 }
474
475 void ResourcePrefetchPredictor::StopPrefetching(const GURL& url) {
476 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StopPrefetching", "url",
477 url.spec());
478 if (!prefetch_manager_.get()) // Not enabled.
479 return;
480
481 BrowserThread::PostTask(
482 BrowserThread::IO, FROM_HERE,
483 base::Bind(&ResourcePrefetcherManager::MaybeRemovePrefetch,
484 prefetch_manager_, url));
485 }
486
487 void ResourcePrefetchPredictor::SetDelegateForTesting(TestDelegate* delegate) {
488 delegate_ = delegate;
489 }
490
422 void ResourcePrefetchPredictor::Shutdown() { 491 void ResourcePrefetchPredictor::Shutdown() {
423 if (prefetch_manager_.get()) { 492 if (prefetch_manager_.get()) {
424 prefetch_manager_->ShutdownOnUIThread(); 493 prefetch_manager_->ShutdownOnUIThread();
425 prefetch_manager_ = NULL; 494 prefetch_manager_ = NULL;
426 } 495 }
427 history_service_observer_.RemoveAll(); 496 history_service_observer_.RemoveAll();
428 } 497 }
429 498
430 void ResourcePrefetchPredictor::OnMainFrameRequest( 499 void ResourcePrefetchPredictor::OnMainFrameRequest(
431 const URLRequestSummary& request) { 500 const URLRequestSummary& request) {
432 DCHECK_CURRENTLY_ON(BrowserThread::UI); 501 DCHECK_CURRENTLY_ON(BrowserThread::UI);
433 DCHECK_EQ(INITIALIZED, initialization_state_); 502 DCHECK_EQ(INITIALIZED, initialization_state_);
434 503
435 StartPrefetching(request.navigation_id.main_frame_url); 504 const GURL& main_frame_url = request.navigation_id.main_frame_url;
505 StartPrefetching(main_frame_url);
436 506
437 // Cleanup older navigations. 507 // Cleanup older navigations.
438 CleanupAbandonedNavigations(request.navigation_id); 508 CleanupAbandonedNavigations(request.navigation_id);
439 509
440 // New empty navigation entry. 510 // New empty navigation entry.
441 const GURL& initial_url = request.navigation_id.main_frame_url;
442 inflight_navigations_.insert( 511 inflight_navigations_.insert(
443 std::make_pair(request.navigation_id, 512 std::make_pair(request.navigation_id,
444 base::MakeUnique<PageRequestSummary>(initial_url))); 513 base::MakeUnique<PageRequestSummary>(main_frame_url)));
445 } 514 }
446 515
447 void ResourcePrefetchPredictor::OnMainFrameResponse( 516 void ResourcePrefetchPredictor::OnMainFrameResponse(
448 const URLRequestSummary& response) { 517 const URLRequestSummary& response) {
449 DCHECK_CURRENTLY_ON(BrowserThread::UI); 518 DCHECK_CURRENTLY_ON(BrowserThread::UI);
450 if (initialization_state_ != INITIALIZED) 519 if (initialization_state_ != INITIALIZED)
451 return; 520 return;
452 521
453 StopPrefetching(response.navigation_id.main_frame_url); 522 StopPrefetching(response.navigation_id.main_frame_url);
454 } 523 }
455 524
456 void ResourcePrefetchPredictor::OnMainFrameRedirect( 525 void ResourcePrefetchPredictor::OnMainFrameRedirect(
457 const URLRequestSummary& response) { 526 const URLRequestSummary& response) {
458 DCHECK_CURRENTLY_ON(BrowserThread::UI); 527 DCHECK_CURRENTLY_ON(BrowserThread::UI);
459 528
529 const GURL& main_frame_url = response.navigation_id.main_frame_url;
460 std::unique_ptr<PageRequestSummary> summary; 530 std::unique_ptr<PageRequestSummary> summary;
461 NavigationMap::iterator nav_it = 531 NavigationMap::iterator nav_it =
462 inflight_navigations_.find(response.navigation_id); 532 inflight_navigations_.find(response.navigation_id);
463 if (nav_it != inflight_navigations_.end()) { 533 if (nav_it != inflight_navigations_.end()) {
464 summary.reset(nav_it->second.release()); 534 summary.reset(nav_it->second.release());
465 inflight_navigations_.erase(nav_it); 535 inflight_navigations_.erase(nav_it);
466 } 536 }
467 537
468 // The redirect url may be empty if the URL was invalid. 538 // The redirect url may be empty if the URL was invalid.
469 if (response.redirect_url.is_empty()) 539 if (response.redirect_url.is_empty())
470 return; 540 return;
471 541
472 // If we lost the information about the first hop for some reason. 542 // If we lost the information about the first hop for some reason.
473 if (!summary) { 543 if (!summary) {
474 const GURL& initial_url = response.navigation_id.main_frame_url; 544 summary = base::MakeUnique<PageRequestSummary>(main_frame_url);
475 summary = base::MakeUnique<PageRequestSummary>(initial_url);
476 } 545 }
477 546
478 // A redirect will not lead to another OnMainFrameRequest call, so record the 547 // A redirect will not lead to another OnMainFrameRequest call, so record the
479 // redirect url as a new navigation id and save the initial url. 548 // redirect url as a new navigation id and save the initial url.
480 NavigationID navigation_id(response.navigation_id); 549 NavigationID navigation_id(response.navigation_id);
481 navigation_id.main_frame_url = response.redirect_url; 550 navigation_id.main_frame_url = response.redirect_url;
551 summary->main_frame_url = response.redirect_url;
482 inflight_navigations_.insert( 552 inflight_navigations_.insert(
483 std::make_pair(navigation_id, std::move(summary))); 553 std::make_pair(navigation_id, std::move(summary)));
484 } 554 }
485 555
486 void ResourcePrefetchPredictor::OnSubresourceResponse( 556 void ResourcePrefetchPredictor::OnSubresourceResponse(
487 const URLRequestSummary& response) { 557 const URLRequestSummary& response) {
488 DCHECK_CURRENTLY_ON(BrowserThread::UI); 558 DCHECK_CURRENTLY_ON(BrowserThread::UI);
489 559
490 NavigationMap::const_iterator nav_it = 560 NavigationMap::const_iterator nav_it =
491 inflight_navigations_.find(response.navigation_id); 561 inflight_navigations_.find(response.navigation_id);
492 if (nav_it == inflight_navigations_.end()) { 562 if (nav_it == inflight_navigations_.end()) {
493 return; 563 return;
494 } 564 }
495 565
496 nav_it->second->subresource_requests.push_back(response); 566 nav_it->second->subresource_requests.push_back(response);
497 } 567 }
498 568
499 void ResourcePrefetchPredictor::OnNavigationComplete( 569 void ResourcePrefetchPredictor::OnNavigationComplete(
500 const NavigationID& nav_id_without_timing_info) { 570 const NavigationID& nav_id_without_timing_info) {
501 DCHECK_CURRENTLY_ON(BrowserThread::UI); 571 DCHECK_CURRENTLY_ON(BrowserThread::UI);
502 572
503 NavigationMap::iterator nav_it = 573 NavigationMap::iterator nav_it =
504 inflight_navigations_.find(nav_id_without_timing_info); 574 inflight_navigations_.find(nav_id_without_timing_info);
505 if (nav_it == inflight_navigations_.end()) 575 if (nav_it == inflight_navigations_.end())
506 return; 576 return;
507 577
508 const NavigationID navigation_id(nav_it->first);
509
510 // Remove the navigation from the inflight navigations. 578 // Remove the navigation from the inflight navigations.
511 std::unique_ptr<PageRequestSummary> summary = std::move(nav_it->second); 579 std::unique_ptr<PageRequestSummary> summary = std::move(nav_it->second);
512 inflight_navigations_.erase(nav_it); 580 inflight_navigations_.erase(nav_it);
513 581
514 // Kick off history lookup to determine if we should record the URL. 582 // Kick off history lookup to determine if we should record the URL.
515 history::HistoryService* history_service = 583 history::HistoryService* history_service =
516 HistoryServiceFactory::GetForProfile(profile_, 584 HistoryServiceFactory::GetForProfile(profile_,
517 ServiceAccessType::EXPLICIT_ACCESS); 585 ServiceAccessType::EXPLICIT_ACCESS);
518 DCHECK(history_service); 586 DCHECK(history_service);
519 history_service->ScheduleDBTask( 587 history_service->ScheduleDBTask(
520 std::unique_ptr<history::HistoryDBTask>(new GetUrlVisitCountTask( 588 std::unique_ptr<history::HistoryDBTask>(new GetUrlVisitCountTask(
521 navigation_id, std::move(summary), 589 std::move(summary),
522 base::Bind(&ResourcePrefetchPredictor::OnVisitCountLookup, 590 base::Bind(&ResourcePrefetchPredictor::OnVisitCountLookup,
523 AsWeakPtr()))), 591 AsWeakPtr()))),
524 &history_lookup_consumer_); 592 &history_lookup_consumer_);
525 } 593 }
526 594
527 bool ResourcePrefetchPredictor::GetPrefetchData(const GURL& main_frame_url, 595 bool ResourcePrefetchPredictor::GetPrefetchData(const GURL& main_frame_url,
528 std::vector<GURL>* urls) { 596 std::vector<GURL>* urls) {
529 DCHECK(urls); 597 DCHECK(urls);
530 DCHECK(urls->empty()); 598 DCHECK(urls->empty());
531 bool use_url_data = config_.IsPrefetchingEnabled(profile_) ? 599 bool use_url_data = config_.IsPrefetchingEnabled(profile_) ?
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 resource.number_of_hits() < 647 resource.number_of_hits() <
580 config_.min_resource_hits_to_trigger_prefetch) 648 config_.min_resource_hits_to_trigger_prefetch)
581 continue; 649 continue;
582 650
583 urls->push_back(GURL(resource.resource_url())); 651 urls->push_back(GURL(resource.resource_url()));
584 } 652 }
585 653
586 return urls->size() > initial_size; 654 return urls->size() > initial_size;
587 } 655 }
588 656
589 void ResourcePrefetchPredictor::StartPrefetching(const GURL& url) {
590 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StartPrefetching", "url",
591 url.spec());
592 if (!prefetch_manager_.get()) // Prefetching not enabled.
593 return;
594
595 std::vector<GURL> subresource_urls;
596 if (!GetPrefetchData(url, &subresource_urls)) {
597 // No prefetching data at host or URL level.
598 return;
599 }
600
601 BrowserThread::PostTask(
602 BrowserThread::IO, FROM_HERE,
603 base::Bind(&ResourcePrefetcherManager::MaybeAddPrefetch,
604 prefetch_manager_, url, subresource_urls));
605 }
606
607 void ResourcePrefetchPredictor::StopPrefetching(const GURL& url) {
608 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StopPrefetching", "url",
609 url.spec());
610 if (!prefetch_manager_.get()) // Not enabled.
611 return;
612
613 BrowserThread::PostTask(
614 BrowserThread::IO, FROM_HERE,
615 base::Bind(&ResourcePrefetcherManager::MaybeRemovePrefetch,
616 prefetch_manager_, url));
617 }
618
619 void ResourcePrefetchPredictor::StartInitialization() { 657 void ResourcePrefetchPredictor::StartInitialization() {
620 DCHECK_CURRENTLY_ON(BrowserThread::UI); 658 DCHECK_CURRENTLY_ON(BrowserThread::UI);
621 659
622 DCHECK_EQ(NOT_INITIALIZED, initialization_state_); 660 DCHECK_EQ(NOT_INITIALIZED, initialization_state_);
623 initialization_state_ = INITIALIZING; 661 initialization_state_ = INITIALIZING;
624 662
625 // Create local caches using the database as loaded. 663 // Create local caches using the database as loaded.
626 auto url_data_map = base::MakeUnique<PrefetchDataMap>(); 664 auto url_data_map = base::MakeUnique<PrefetchDataMap>();
627 auto host_data_map = base::MakeUnique<PrefetchDataMap>(); 665 auto host_data_map = base::MakeUnique<PrefetchDataMap>();
628 auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>(); 666 auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>();
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 840
803 data_map->erase(key_to_delete); 841 data_map->erase(key_to_delete);
804 BrowserThread::PostTask( 842 BrowserThread::PostTask(
805 BrowserThread::DB, FROM_HERE, 843 BrowserThread::DB, FROM_HERE,
806 base::Bind( 844 base::Bind(
807 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint, 845 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint,
808 tables_, key_to_delete, key_type)); 846 tables_, key_to_delete, key_type));
809 } 847 }
810 848
811 void ResourcePrefetchPredictor::OnVisitCountLookup( 849 void ResourcePrefetchPredictor::OnVisitCountLookup(
812 size_t visit_count, 850 size_t url_visit_count,
813 const NavigationID& navigation_id,
814 const PageRequestSummary& summary) { 851 const PageRequestSummary& summary) {
815 DCHECK_CURRENTLY_ON(BrowserThread::UI); 852 DCHECK_CURRENTLY_ON(BrowserThread::UI);
816 853
817 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl", 854 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl",
818 visit_count); 855 url_visit_count);
819 856
820 // TODO(alexilin): make only one request to DB thread. 857 // TODO(alexilin): make only one request to DB thread.
821 858
822 // URL level data - merge only if we already saved the data, or it 859 // URL level data - merge only if we already saved the data, or it
823 // meets the cutoff requirement. 860 // meets the cutoff requirement.
824 const std::string url_spec = navigation_id.main_frame_url.spec(); 861 const std::string url_spec = summary.main_frame_url.spec();
825 bool already_tracking = url_table_cache_->find(url_spec) != 862 bool already_tracking = url_table_cache_->find(url_spec) !=
826 url_table_cache_->end(); 863 url_table_cache_->end();
827 bool should_track_url = already_tracking || 864 bool should_track_url =
828 (visit_count >= config_.min_url_visit_count); 865 already_tracking || (url_visit_count >= config_.min_url_visit_count);
829 866
830 if (should_track_url && config_.IsURLLearningEnabled()) { 867 if (should_track_url && config_.IsURLLearningEnabled()) {
831 LearnNavigation(url_spec, PREFETCH_KEY_TYPE_URL, 868 LearnNavigation(url_spec, PREFETCH_KEY_TYPE_URL,
832 summary.subresource_requests, config_.max_urls_to_track, 869 summary.subresource_requests, config_.max_urls_to_track,
833 url_table_cache_.get(), summary.initial_url.spec(), 870 url_table_cache_.get(), summary.initial_url.spec(),
834 url_redirect_table_cache_.get()); 871 url_redirect_table_cache_.get());
835 } 872 }
836 873
837 // Host level data - no cutoff, always learn the navigation if enabled. 874 // Host level data - no cutoff, always learn the navigation if enabled.
838 if (config_.IsHostLearningEnabled()) { 875 if (config_.IsHostLearningEnabled()) {
839 const std::string host = navigation_id.main_frame_url.host(); 876 const std::string host = summary.main_frame_url.host();
840 LearnNavigation(host, PREFETCH_KEY_TYPE_HOST, summary.subresource_requests, 877 LearnNavigation(host, PREFETCH_KEY_TYPE_HOST, summary.subresource_requests,
841 config_.max_hosts_to_track, host_table_cache_.get(), 878 config_.max_hosts_to_track, host_table_cache_.get(),
842 summary.initial_url.host(), 879 summary.initial_url.host(),
843 host_redirect_table_cache_.get()); 880 host_redirect_table_cache_.get());
844 } 881 }
882
883 if (delegate_)
884 delegate_->OnNavigationLearned(url_visit_count, summary);
845 } 885 }
846 886
847 void ResourcePrefetchPredictor::LearnNavigation( 887 void ResourcePrefetchPredictor::LearnNavigation(
848 const std::string& key, 888 const std::string& key,
849 PrefetchKeyType key_type, 889 PrefetchKeyType key_type,
850 const std::vector<URLRequestSummary>& new_resources, 890 const std::vector<URLRequestSummary>& new_resources,
851 size_t max_data_map_size, 891 size_t max_data_map_size,
852 PrefetchDataMap* data_map, 892 PrefetchDataMap* data_map,
853 const std::string& key_before_redirects, 893 const std::string& key_before_redirects,
854 RedirectDataMap* redirect_map) { 894 RedirectDataMap* redirect_map) {
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 // HistoryService is already loaded. Continue with Initialization. 1164 // HistoryService is already loaded. Continue with Initialization.
1125 OnHistoryAndCacheLoaded(); 1165 OnHistoryAndCacheLoaded();
1126 return; 1166 return;
1127 } 1167 }
1128 DCHECK(!history_service_observer_.IsObserving(history_service)); 1168 DCHECK(!history_service_observer_.IsObserving(history_service));
1129 history_service_observer_.Add(history_service); 1169 history_service_observer_.Add(history_service);
1130 return; 1170 return;
1131 } 1171 }
1132 1172
1133 } // namespace predictors 1173 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698