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