15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_vector.h" 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/weak_ptr.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task/cancelable_task_tracker.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_database.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/session_storage_namespace.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace base { 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DictionaryValue; 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace content { 28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class WebContents; 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace gfx { 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class Size; 33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class PrerenderHandle; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderManager; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderLocalPredictor maintains local browsing history to make prerender 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// predictions. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// At this point, the class is not actually creating prerenders, but just 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recording timing stats about the effect prerendering would have. 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PrerenderLocalPredictor : public history::VisitDatabaseObserver, 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public net::URLFetcherDelegate { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) struct LocalPredictorURLInfo; 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) struct CandidatePrerenderInfo; 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A class simulating a set of URLs prefetched, for statistical purposes. 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class PrefetchList; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Event { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_CONSTRUCTED = 0, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_INIT_SCHEDULED = 1, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_INIT_STARTED = 2, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_INIT_FAILED_NO_HISTORY = 3, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_INIT_SUCCEEDED = 4, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT = 5, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_INITIALIZED = 6, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_PRERENDER_IDENTIFIED = 7, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_RELEVANT_TRANSITION = 8, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_IDENTIFIED_PRERENDER_CANDIDATE = 9, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_PRERENDERING = 10, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_GOT_PRERENDER_URL = 11, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ERROR_NO_PRERENDER_URL_FOR_PLT = 12, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_PRERENDERING_EXTENDED = 13, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT = 14, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_ROOT_PAGE = 15, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_IS_HTTP = 16, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_HAS_QUERY_STRING = 17, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_CONTAINS_LOGOUT = 18, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_CONTAINS_LOGIN = 19, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_START_URL_LOOKUP = 20, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ADD_VISIT_NOT_ROOTPAGE = 21, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_URL_WHITELIST_ERROR = 22, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_URL_WHITELIST_OK = 23, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_ON_WHITELIST = 24, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_ON_WHITELIST_ROOT_PAGE = 25, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_EXTENDED_ROOT_PAGE = 26, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_RESULT_ROOT_PAGE_HTTP = 27, 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_FAILED = 28, 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_NO_SOURCE_WEBCONTENTS_FOUND = 29, 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_NO_LOGGED_IN_TABLE_FOUND = 30, 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_ISSUING_LOGGED_IN_LOOKUP = 31, 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_STARTED = 32, 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_NO_URL = 33, 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_PRIORITY_TOO_LOW = 34, 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_URLS_IDENTICAL_BUT_FRAGMENT = 35, 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_HTTPS = 36, 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_ROOT_PAGE = 37, 90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_LOGOUT_URL = 38, 91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_LOGIN_URL = 39, 92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_NOT_LOGGED_IN = 40, 93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_NOT_PRERENDERING = 41, 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_ISSUING_PRERENDER = 42, 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_ISSUING_PRERENDER = 43, 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_NO_PRERENDER_CANDIDATES = 44, 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EVENT_GOT_HISTORY_ISSUING_LOOKUP = 45, 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN = 46, 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_MATCH = 47, 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH = 48, 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_MULTIPLE_SOURCE_WEBCONTENTS_FOUND = 49, 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_ON_SIDE_EFFECT_FREE_WHITELIST = 50, 10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL = 51, 10458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EVENT_ISSUE_PRERENDER_ALREADY_PRERENDERING = 52, 10558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EVENT_ISSUE_PRERENDER_NEW_PRERENDER = 53, 10658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER = 54, 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EVENT_CONTINUE_PRERENDER_CHECK_FALLTHROUGH_PRERENDERING = 55, 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_URL_LOOKUP_SUCCESS = 56, 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_DISABLED = 57, 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_ISSUED_LOOKUP = 58, 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_LOOKUP_TIMED_OUT = 59, 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_RECEIVED_RESULT = 60, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_NO_RECORD_FOR_RESULT = 61, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_PARSED_CORRECTLY = 62, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_PARSE_ERROR = 63, 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_PARSE_ERROR_INCORRECT_JSON = 64, 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_HINTING_TIMED_OUT = 65, 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_HINTING_URL_LOOKUP_TIMED_OUT = 66, 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_PRERENDER_SERVICE_CANDIDATE_URL_LOOKUP_TIMED_OUT = 67, 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_ON_SERVICE_WHITELIST = 68, 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL_LOCAL = 69, 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL_SERVICE = 70, 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_ADD_VISIT_RELEVANT_TRANSITION_REPEAT_URL = 71, 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EVENT_ADD_VISIT_RELEVANT_TRANSITION_NEW_URL = 72, 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MISMATCH_NO_NAMESPACE = 73, 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MISMATCH_MERGE_ISSUED = 74, 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_RECEIVED = 75, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_NAMESPACE_NOT_FOUND = 76, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_NOT_LOGGING = 77, 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_NO_TRANSACTIONS = 78, 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_TOO_MANY_TRANSACTIONS = 79, 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_NOT_MERGEABLE = 80, 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_MERGEABLE = 81, 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EVENT_INIT_FAILED_UNENCRYPTED_SYNC_NOT_ENABLED = 82, 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EVENT_CONTINUE_PRERENDER_CHECK_EXAMINE_NEXT_URL_NOT_SKIPPED = 83, 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_PRERENDER_SERVICE_RETURNED_HINTING_CANDIDATES = 84, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EVENT_NAMESPACE_MISMATCH_MERGE_RESULT_NAMESPACE_NOT_ALIAS = 85, 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_MATCH_ENTRY = 86, 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_MATCH_BROWSER_NAVIGATE = 87, 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH_ENTRY = 88, 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EVENT_TAB_HELPER_URL_SEEN_NAMESPACE_MATCH_BROWSER_NAVIGATE = 89, 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EVENT_PREFETCH_LIST_ADDED = 90, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EVENT_PREFETCH_LIST_SEEN_TABCONTENTS = 91, 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EVENT_PREFETCH_LIST_SEEN_HISTORY = 92, 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EVENT_ISSUE_PRERENDER_CALLED = 93, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EVENT_ISSUE_PRERENDER_PREFETCH_ENABLED = 94, 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EVENT_ISSUE_PRERENDER_PREFETCH_ISSUED = 95, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_MAX_VALUE 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A PrerenderLocalPredictor is owned by the PrerenderManager specified 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the constructor. It will be destoryed at the time its owning 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderManager is destroyed. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PrerenderLocalPredictor(PrerenderManager* prerender_manager); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderLocalPredictor(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Shutdown(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history::VisitDatabaseObserver implementation 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAddVisit(const history::BriefVisitInfo& info) OVERRIDE; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGetInitialVisitHistory( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPLTEventForURL(const GURL& url, base::TimeDelta page_load_time); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void OnTabHelperURLSeen(const GURL& url, content::WebContents* web_contents); 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // net::URLFetcherDelegate implementation: 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void virtual OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) struct PrerenderProperties; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* GetHistoryIfExists() const; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool IsPrerenderStillValid(PrerenderProperties* prerender) const; 177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool DoesPrerenderMatchPLTRecord(PrerenderProperties* prerender, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta plt) const; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordEvent(Event event) const; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void OnLookupURL(scoped_ptr<CandidatePrerenderInfo> info); 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lookup the prerender candidate in the Prerender Service (if applicable). 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoPrerenderServiceCheck(scoped_ptr<CandidatePrerenderInfo> info); 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lookup the prerender candidate in the LoggedIn Predictor. 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoLoggedInLookup(scoped_ptr<CandidatePrerenderInfo> info); 189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns an element of issued_prerenders_, which should be replaced 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // by a new prerender of the priority indicated, or NULL, if the priority 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // is too low (or if the URL requested is already prerendering). 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PrerenderProperties* GetIssuedPrerenderSlotForPriority(const GURL& url, 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) double priority); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ContinuePrerenderCheck(scoped_ptr<CandidatePrerenderInfo> info); 197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void LogCandidateURLStats(const GURL& url) const; 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void IssuePrerender(CandidatePrerenderInfo* info, 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LocalPredictorURLInfo* url_info); 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void MaybeCancelURLFetcher(net::URLFetcher* fetcher); 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns true if the parsed response is semantically correct and could 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // be fully applied. 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool ApplyParsedPrerenderServiceResponse( 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::DictionaryValue* dict, 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CandidatePrerenderInfo* info, 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool* hinting_timed_out, 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool* hinting_url_lookup_timed_out, 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool* candidate_url_lookup_timed_out); 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void ProcessNamespaceMergeResult( 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SessionStorageNamespace::MergeResult result); 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef std::map<net::URLFetcher*, CandidatePrerenderInfo*> 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutstandingFetchers; 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutstandingFetchers outstanding_prerender_service_requests_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<PrerenderLocalPredictor> timer_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delay after which to initialize, to avoid putting to much load on the 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database thread early on when Chrome is starting up. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kInitDelayMs = 5 * 1000; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we're registered with the history service as a 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history::VisitDatabaseObserver. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visit_database_observer_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker history_db_tracker_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::vector<history::BriefVisitInfo> > visit_history_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<PrerenderProperties> current_prerender_; 230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<PrerenderProperties> last_swapped_in_prerender_; 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ScopedVector<PrerenderProperties> issued_prerenders_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::hash_set<int64> url_whitelist_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::WeakPtrFactory<PrerenderLocalPredictor> weak_factory_; 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<PrefetchList> prefetch_list_; 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrerenderLocalPredictor); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PRERENDER_PRERENDER_LOCAL_PREDICTOR_H_ 246