11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <map> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/gtest_prod_util.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/linked_ptr.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/weak_ptr.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/task/cancelable_task_tracker.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_common.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetcher.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/keyed_service/core/keyed_service.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/notification_observer.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/notification_registrar.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/resource_type.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PredictorsHandler; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Profile; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebContents; 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass URLRequest; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace predictors { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ResourcePrefetcherManager; 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Contains logic for learning what can be prefetched and for kicking off 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// speculative prefetching. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// - The class is a profile keyed service owned by the profile. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// - All the non-static methods of this class need to be called on the UI 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// thread. 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The overall flow of the resource prefetching algorithm is as follows: 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// * ResourcePrefetchPredictorObserver - Listens for URL requests, responses and 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// redirects on the IO thread (via ResourceDispatcherHostDelegate) and posts 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// tasks to the ResourcePrefetchPredictor on the UI thread. This is owned by 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the ProfileIOData for the profile. 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// * ResourcePrefetchPredictorTables - Persists ResourcePrefetchPredictor data 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// to a sql database. Runs entirely on the DB thread. Owned by the 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// PredictorDatabase. 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// * ResourcePrefetchPredictor - Learns about resource requirements per URL in 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the UI thread through the ResourcePrefetchPredictorObserver and persists 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// it to disk in the DB thread through the ResourcePrefetchPredictorTables. It 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// initiates resource prefetching using the ResourcePrefetcherManager. Owned 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// by profile. 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// * ResourcePrefetcherManager - Manages the ResourcePrefetchers that do the 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// prefetching on the IO thread. The manager is owned by the 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ResourcePrefetchPredictor and interfaces between the predictor on the UI 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// thread and the prefetchers on the IO thread. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// * ResourcePrefetcher - Lives entirely on the IO thread, owned by the 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ResourcePrefetcherManager, and issues net::URLRequest to fetch resources. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(shishir): Do speculative prefetching for https resources and/or https 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// main frame urls. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(zhenw): Currently only main frame requests/redirects/responses are 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// recorded. Consider recording sub-frame responses independently or together 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// with main frame. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ResourcePrefetchPredictor 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public KeyedService, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public content::NotificationObserver, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public base::SupportsWeakPtr<ResourcePrefetchPredictor> { 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Stores the data that we need to get from the URLRequest. 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct URLRequestSummary { 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequestSummary(); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequestSummary(const URLRequestSummary& other); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~URLRequestSummary(); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigationID navigation_id; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL resource_url; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::ResourceType resource_type; 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Only for responses. 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string mime_type; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool was_cached; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL redirect_url; // Empty unless request was redirected to a valid url. 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictor(const ResourcePrefetchPredictorConfig& config, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~ResourcePrefetchPredictor(); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Thread safe. 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool ShouldRecordRequest(net::URLRequest* request, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::ResourceType resource_type); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool ShouldRecordResponse(net::URLRequest* response); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool ShouldRecordRedirect(net::URLRequest* response); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Determines the ResourceType from the mime type, defaulting to the 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |fallback| if the ResourceType could not be determined. 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static content::ResourceType GetResourceTypeFromMimeType( 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& mime_type, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::ResourceType fallback); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 'ResourcePrefetchPredictorObserver' calls the below functions to inform the 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // predictor of main frame and resource requests. Should only be called if the 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // corresponding Should* functions return true. 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RecordURLRequest(const URLRequestSummary& request); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RecordURLResponse(const URLRequestSummary& response); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RecordURLRedirect(const URLRequestSummary& response); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when the main frame of a page completes loading. 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RecordMainFrameLoadComplete(const NavigationID& navigation_id); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called by ResourcePrefetcherManager to notify that prefetching has finished 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // for a navigation. Should take ownership of |requests|. 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void FinishedPrefetchForNavigation( 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const NavigationID& navigation_id, 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetcher::RequestVector* requests); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class ::PredictorsHandler; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class ResourcePrefetchPredictorTest; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, DeleteUrls); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LazilyInitializeEmpty); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LazilyInitializeWithData); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigationNotRecorded); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, NavigationUrlInDB); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, NavigationUrlNotInDB); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigationUrlNotInDBAndDBFull); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, OnMainFrameRequest); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, OnMainFrameRedirect); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(ResourcePrefetchPredictorTest, 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnSubresourceResponse); 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum InitializationState { 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOT_INITIALIZED = 0, 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci INITIALIZING = 1, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci INITIALIZED = 2 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Stores prefetching results. 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct Result { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Takes ownership of requests. 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Result(PrefetchKeyType key_type, 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetcher::RequestVector* requests); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~Result(); 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ResourcePrefetcher::RequestVector> requests; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(Result); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef ResourcePrefetchPredictorTables::ResourceRow ResourceRow; 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef ResourcePrefetchPredictorTables::ResourceRows ResourceRows; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData; 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<NavigationID, linked_ptr<std::vector<URLRequestSummary> > > 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigationMap; 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<NavigationID, Result*> ResultsMap; 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if the main page request is supported for prediction. 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool IsHandledMainPage(net::URLRequest* request); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if the subresource request is supported for prediction. 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool IsHandledSubresource(net::URLRequest* request); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if the request (should have a response in it) is cacheable. 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool IsCacheable(const net::URLRequest* request); 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // content::NotificationObserver methods OVERRIDE. 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Observe(int type, 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::NotificationSource& source, 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::NotificationDetails& details) OVERRIDE; 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // KeyedService methods OVERRIDE. 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Shutdown() OVERRIDE; 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Functions called on different network events pertaining to the loading of 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // main frame resource or sub resources. 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnMainFrameRequest(const URLRequestSummary& request); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnMainFrameResponse(const URLRequestSummary& response); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnMainFrameRedirect(const URLRequestSummary& response); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnSubresourceResponse(const URLRequestSummary& response); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when onload completes for a navigation. We treat this point as the 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "completion" of the navigation. The resources requested by the page upto 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // this point are the only ones considered for prefetching. 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnNavigationComplete(const NavigationID& navigation_id); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if there is PrefetchData that can be used for the 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // navigation and fills in the |prefetch_data| to resources that need to be 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // prefetched. 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetPrefetchData(const NavigationID& navigation_id, 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetcher::RequestVector* prefetch_requests, 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType* key_type); 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Converts a PrefetchData into a ResourcePrefetcher::RequestVector. 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void PopulatePrefetcherRequest(const PrefetchData& data, 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetcher::RequestVector* requests); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Starts prefetching if it is enabled and prefetching data exists for the 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // NavigationID either at the URL or at the host level. 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StartPrefetching(const NavigationID& navigation_id); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Stops prefetching that may be in progress corresponding to |navigation_id|. 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StopPrefetching(const NavigationID& navigation_id); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Starts initialization by posting a task to the DB thread to read the 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // predictor database. 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StartInitialization(); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Callback for task to read predictor database. Takes ownership of 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |url_data_map| and |host_data_map|. 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CreateCaches(scoped_ptr<PrefetchDataMap> url_data_map, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PrefetchDataMap> host_data_map); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called during initialization when history is read and the predictor 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // database has been read. 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnHistoryAndCacheLoaded(); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Removes data for navigations where the onload never fired. Will cleanup 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // inflight_navigations_ and results_map_. 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CleanupAbandonedNavigations(const NavigationID& navigation_id); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Deletes all URLs from the predictor database, the caches and removes all 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // inflight navigations. 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DeleteAllUrls(); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Deletes data for the input |urls| and their corresponding hosts from the 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // predictor database and caches. 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DeleteUrls(const history::URLRows& urls); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Callback for GetUrlVisitCountTask. 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnVisitCountLookup(size_t visit_count, 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const NavigationID& navigation_id, 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<URLRequestSummary>& requests); 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Removes the oldest entry in the input |data_map|, also deleting it from the 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // predictor database. 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveOldestEntryInPrefetchDataMap(PrefetchKeyType key_type, 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap* data_map); 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Merges resources in |new_resources| into the |data_map| and correspondingly 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // updates the predictor database. 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void LearnNavigation(const std::string& key, 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<URLRequestSummary>& new_resources, 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t max_data_map_size, 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap* data_map); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Reports accuracy by comparing prefetched resources with resources that are 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // actually used by the page. 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ReportAccuracyStats(PrefetchKeyType key_type, 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<URLRequestSummary>& actual, 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetcher::RequestVector* prefetched) const; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Reports predicted accuracy i.e. by comparing resources that are actually 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // used by the page with those that may have been prefetched. 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ReportPredictedAccuracyStats( 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<URLRequestSummary>& actual, 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourcePrefetcher::RequestVector& predicted) const; 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ReportPredictedAccuracyStatsHelper( 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourcePrefetcher::RequestVector& predicted, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::map<GURL, bool>& actual, 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t total_resources_fetched_from_network, 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t max_assumed_prefetched) const; 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Used for testing to inject mock tables. 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_mock_tables(scoped_refptr<ResourcePrefetchPredictorTables> tables) { 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tables_ = tables; 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* const profile_; 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorConfig const config_; 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializationState initialization_state_; 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<ResourcePrefetchPredictorTables> tables_; 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<ResourcePrefetcherManager> prefetch_manager_; 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::NotificationRegistrar notification_registrar_; 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::CancelableTaskTracker history_lookup_consumer_; 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Map of all the navigations in flight to their resource requests. 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigationMap inflight_navigations_; 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Copy of the data in the predictor tables. 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PrefetchDataMap> url_table_cache_; 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PrefetchDataMap> host_table_cache_; 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResultsMap results_map_; 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STLValueDeleter<ResultsMap> results_map_deleter_; 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(ResourcePrefetchPredictor); 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace predictors 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_H_ 315