1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is the global interface for the dns prefetch services. It centralizes 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// initialization, along with all the callbacks etc. to connect to the browser 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// process. This allows the more standard DNS prefetching services, such as 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provided by Predictor to be left as more generally usable code, and possibly 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be shared across multiple client projects. 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_NET_PREDICTOR_API_H_ 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_NET_PREDICTOR_API_H_ 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/predictor.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base { 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass FieldTrial; 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chrome_browser_net { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Deletes |referral_list| when done. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FinalizePredictorInitialization( 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Predictor* global_predictor, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<GURL>& urls_to_prefetch, 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* referral_list); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Free all resources allocated by FinalizePredictorInitialization. After that 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// you must not call any function from this file. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FreePredictorResources(); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------ 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Global APIs relating to predictions in browser. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid EnablePredictor(bool enable); 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid DiscardInitialNavigationHistory(); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegisterUserPrefs(PrefService* user_prefs); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Renderer bundles up list and sends to this browser API via IPC. 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(jar): Use UrlList instead to include port and scheme. 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DnsPrefetchList(const NameList& hostnames); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This API is used by the autocomplete popup box (as user types). 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This will either preresolve the domain name, or possibly preconnect creating 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// an open TCP/IP connection to the host. 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid AnticipateOmniboxUrl(const GURL& url, bool preconnectable); 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This API should only be called when we're absolutely certain that we will 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// be connecting to the URL. It will preconnect the url and it's associated 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// subresource domains immediately. 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PreconnectUrlAndSubresources(const GURL& url); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// When displaying info in about:dns, the following API is called. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PredictorGetHtmlInfo(std::string* output); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Destroy the predictor's internal state: referrers and work queue. 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ClearPredictorCache(); 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------ 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// When we navigate to a frame that may contain embedded resources, we may know 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in advance some other URLs that will need to be connected to (via TCP and 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// sometimes SSL). This function initiates those connections 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PredictFrameSubresources(const GURL& url); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// During startup, we learn what the first N urls visited are, and then resolve 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the associated hosts ASAP during our next startup. 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid LearnAboutInitialNavigation(const GURL& url); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Call when we should learn from a navigation about a relationship to a 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subresource target, and its containing frame, which was loaded as a referring 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URL. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LearnFromNavigation(const GURL& referring_url, const GURL& target_url); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------ 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SavePredictorStateForNextStartupAndTrim(PrefService* prefs); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper class to handle global init and shutdown. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PredictorInit { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Too many concurrent lookups performed in parallel may overload a resolver, 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // or may cause problems for a local router. The following limits that count. 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const size_t kMaxSpeculativeParallelResolves; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When prefetch requests are queued beyond some period of time, then the 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // system is congested, and we need to clear all queued requests to get out 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of that state. The following is the suggested default time limit. 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const int kMaxSpeculativeResolveQueueDelayMs; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PredictorInit(PrefService* user_prefs, PrefService* local_state, 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool preconnect_enabled); 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~PredictorInit(); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Maintain a field trial instance when we do A/B testing. 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<base::FieldTrial> trial_; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(PredictorInit); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chrome_browser_net 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_NET_PREDICTOR_API_H_ 110