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

Side by Side Diff: chrome/browser/net/predictor.h

Issue 7467012: Modifying prefetch to account for multi-profile. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // A Predictor object is instantiated once in the browser process, and manages 5 // A Predictor object is instantiated once in the browser process, and manages
6 // both preresolution of hostnames, as well as TCP/IP preconnection to expected 6 // both preresolution of hostnames, as well as TCP/IP preconnection to expected
7 // subresources. 7 // subresources.
8 // Most hostname lists are provided by the renderer processes, and include URLs 8 // Most hostname lists are provided by the renderer processes, and include URLs
9 // that *might* be used in the near future by the browsing user. One goal of 9 // that *might* be used in the near future by the browsing user. One goal of
10 // this class is to cause the underlying DNS structure to lookup a hostname 10 // this class is to cause the underlying DNS structure to lookup a hostname
11 // before it is really needed, and hence reduce latency in the standard lookup 11 // before it is really needed, and hence reduce latency in the standard lookup
12 // paths. 12 // paths.
13 // Subresource relationships are usually acquired from the referrer field in a 13 // Subresource relationships are usually acquired from the referrer field in a
14 // navigation. A subresource URL may be associated with a referrer URL. Later 14 // navigation. A subresource URL may be associated with a referrer URL. Later
15 // navigations may, if the likelihood of needing the subresource is high enough, 15 // navigations may, if the likelihood of needing the subresource is high enough,
16 // cause this module to speculatively create a TCP/IP connection. If there is 16 // cause this module to speculatively create a TCP/IP connection. If there is
17 // only a low likelihood, then a DNS pre-resolution operation may be performed. 17 // only a low likelihood, then a DNS pre-resolution operation may be performed.
18 18
19 #ifndef CHROME_BROWSER_NET_PREDICTOR_H_ 19 #ifndef CHROME_BROWSER_NET_PREDICTOR_H_
20 #define CHROME_BROWSER_NET_PREDICTOR_H_ 20 #define CHROME_BROWSER_NET_PREDICTOR_H_
21 #pragma once 21 #pragma once
22 22
23 #include <map> 23 #include <map>
24 #include <queue> 24 #include <queue>
25 #include <set> 25 #include <set>
26 #include <string> 26 #include <string>
27 #include <vector> 27 #include <vector>
28 28
29 #include "base/gtest_prod_util.h" 29 #include "base/gtest_prod_util.h"
30 #include "base/memory/ref_counted.h" 30 #include "base/memory/scoped_ptr.h"
31 #include "chrome/browser/net/url_info.h" 31 #include "chrome/browser/net/url_info.h"
32 #include "chrome/browser/net/referrer.h" 32 #include "chrome/browser/net/referrer.h"
33 #include "chrome/common/net/predictor_common.h" 33 #include "chrome/common/net/predictor_common.h"
34 #include "net/base/host_port_pair.h" 34 #include "net/base/host_port_pair.h"
35 35
36 namespace base { 36 namespace base {
37 class ListValue; 37 class ListValue;
38 } 38 }
39 39
40 namespace base {
41 class WaitableEvent;
42 }
43
40 namespace net { 44 namespace net {
41 class HostResolver; 45 class HostResolver;
42 } // namespace net 46 } // namespace net
43 47
48 class IOThread;
49 class PrefService;
50 class Profile;
51
44 namespace chrome_browser_net { 52 namespace chrome_browser_net {
45 53
46 typedef chrome_common_net::UrlList UrlList; 54 typedef chrome_common_net::UrlList UrlList;
47 typedef chrome_common_net::NameList NameList; 55 typedef chrome_common_net::NameList NameList;
48 typedef std::map<GURL, UrlInfo> Results; 56 typedef std::map<GURL, UrlInfo> Results;
49 57
50 // Note that Predictor is not thread safe, and must only be called from 58 // Note that Predictor is not thread safe, and must only be called from
51 // the IO thread. Failure to do so will result in a DCHECK at runtime. 59 // the IO thread. Failure to do so will result in a DCHECK at runtime.
willchan no longer on Chromium 2011/08/12 21:51:47 You should update this comment. You should have so
rpetterson 2011/08/13 00:55:17 Done.
52 class Predictor : public base::RefCountedThreadSafe<Predictor> { 60 class Predictor {
53 public: 61 public:
54 // A version number for prefs that are saved. This should be incremented when 62 // A version number for prefs that are saved. This should be incremented when
55 // we change the format so that we discard old data. 63 // we change the format so that we discard old data.
56 enum { PREDICTOR_REFERRER_VERSION = 2 }; 64 enum { PREDICTOR_REFERRER_VERSION = 2 };
57 65
58 // |max_concurrent| specifies how many concurrent (parallel) prefetches will 66 // |max_concurrent| specifies how many concurrent (parallel) prefetches will
59 // be performed. Host lookups will be issued through |host_resolver|. 67 // be performed. Host lookups will be issued through |host_resolver|.
60 Predictor(net::HostResolver* host_resolver, 68 Predictor();
61 base::TimeDelta max_queue_delay_ms, size_t max_concurrent, 69
62 bool preconnect_enabled); 70 virtual ~Predictor();
71
72 // ------------- Start UI thread methods.
73
74 virtual void InitNetworkPredictor(PrefService* user_prefs);
75
76 // The Omnibox has proposed a given url to the user, and if it is a search
77 // URL, then it also indicates that this is preconnectable (i.e., we could
78 // preconnect to the search server).
79 virtual void AnticipateOmniboxUrl(const GURL& url, bool preconnectable);
80
81 // Preconnect a URL and all of its subresource domains.
82 virtual void PreconnectUrlAndSubresources(const GURL& url);
83
84 // Instigate pre-connection to any URLs, or pre-resolution of related host,
85 // that we predict will be needed after this navigation (typically
86 // more-embedded resources on a page). This method will actually post a task
87 // to do the actual work, so as not to jump ahead of the frame navigation that
88 // instigated this activity.
89 virtual void PredictFrameSubresources(const GURL& url);
90
91 static UrlList GetPredictedUrlListAtStartup(PrefService* user_prefs,
92 PrefService* local_state);
93
94 static void set_max_queueing_delay(int max_queueing_delay_ms);
95
96 static void set_max_parallel_resolves(size_t max_parallel_resolves);
97
98 static void RegisterUserPrefs(PrefService* user_prefs);
99
100 virtual void ShutdownOnUIThread(PrefService* user_prefs);
101
102 // ------------- End UI thread methods.
103
104 // ------------- Start IO thread methods.
63 105
64 // Cancel pending requests and prevent new ones from being made. 106 // Cancel pending requests and prevent new ones from being made.
65 void Shutdown(); 107 virtual void Shutdown();
66 108
67 // In some circumstances, for privacy reasons, all results should be 109 // In some circumstances, for privacy reasons, all results should be
68 // discarded. This method gracefully handles that activity. 110 // discarded. This method gracefully handles that activity.
69 // Destroy all our internal state, which shows what names we've looked up, and 111 // Destroy all our internal state, which shows what names we've looked up, and
70 // how long each has taken, etc. etc. We also destroy records of suggesses 112 // how long each has taken, etc. etc. We also destroy records of suggesses
71 // (cache hits etc.). 113 // (cache hits etc.).
72 void DiscardAllResults(); 114 virtual void DiscardAllResults();
73 115
74 // Add hostname(s) to the queue for processing. 116 // Add hostname(s) to the queue for processing.
75 void ResolveList(const UrlList& urls, 117 virtual void ResolveList(const UrlList& urls,
76 UrlInfo::ResolutionMotivation motivation); 118 UrlInfo::ResolutionMotivation motivation);
77 void Resolve(const GURL& url,
78 UrlInfo::ResolutionMotivation motivation);
79 119
80 // Instigate pre-connection to any URLs, or pre-resolution of related host, 120 virtual void Resolve(const GURL& url,
81 // that we predict will be needed after this navigation (typically 121 UrlInfo::ResolutionMotivation motivation);
82 // more-embedded resources on a page). This method will actually post a task
83 // to do the actual work, so as not to jump ahead of the frame navigation that
84 // instigated this activity.
85 void PredictFrameSubresources(const GURL& url);
86
87 // The Omnibox has proposed a given url to the user, and if it is a search
88 // URL, then it also indicates that this is preconnectable (i.e., we could
89 // preconnect to the search server).
90 void AnticipateOmniboxUrl(const GURL& url, bool preconnectable);
91
92 // Preconnect a URL and all of its subresource domains.
93 void PreconnectUrlAndSubresources(const GURL& url);
94 122
95 // Record details of a navigation so that we can preresolve the host name 123 // Record details of a navigation so that we can preresolve the host name
96 // ahead of time the next time the users navigates to the indicated host. 124 // ahead of time the next time the users navigates to the indicated host.
97 // Should only be called when urls are distinct, and they should already be 125 // Should only be called when urls are distinct, and they should already be
98 // canonicalized to not have a path. 126 // canonicalized to not have a path.
99 void LearnFromNavigation(const GURL& referring_url, const GURL& target_url); 127 virtual void LearnFromNavigation(const GURL& referring_url,
128 const GURL& target_url);
100 129
101 // Dump HTML table containing list of referrers for about:dns. 130 // Dump HTML table containing list of referrers for about:dns.
102 void GetHtmlReferrerLists(std::string* output); 131 virtual void GetHtmlReferrerLists(std::string* output);
103 132
104 // Dump the list of currently known referrer domains and related prefetchable 133 // Dump the list of currently known referrer domains and related prefetchable
105 // domains. 134 // domains.
106 void GetHtmlInfo(std::string* output); 135 virtual void GetHtmlInfo(std::string* output);
107 136
108 // Discards any referrer for which all the suggested host names are currently 137 // Discards any referrer for which all the suggested host names are currently
109 // annotated with negligible expected-use. Scales down (diminishes) the 138 // annotated with negligible expected-use. Scales down (diminishes) the
110 // expected-use of those that remain, so that their use will go down by a 139 // expected-use of those that remain, so that their use will go down by a
111 // factor each time we trim (moving the referrer closer to being discarded in 140 // factor each time we trim (moving the referrer closer to being discarded in
112 // a future call). 141 // a future call).
113 // The task is performed synchronously and completes before returing. 142 // The task is performed synchronously and completes before returing.
114 void TrimReferrersNow(); 143 virtual void TrimReferrersNow();
115 144
116 // Construct a ListValue object that contains all the data in the referrers_ 145 // Construct a ListValue object that contains all the data in the referrers_
117 // so that it can be persisted in a pref. 146 // so that it can be persisted in a pref.
118 void SerializeReferrers(base::ListValue* referral_list); 147 virtual void SerializeReferrers(base::ListValue* referral_list);
119 148
120 // Process a ListValue that contains all the data from a previous reference 149 // Process a ListValue that contains all the data from a previous reference
121 // list, as constructed by SerializeReferrers(), and add all the identified 150 // list, as constructed by SerializeReferrers(), and add all the identified
122 // values into the current referrer list. 151 // values into the current referrer list.
123 void DeserializeReferrers(const base::ListValue& referral_list); 152 virtual void DeserializeReferrers(const base::ListValue& referral_list);
124 153
125 void DeserializeReferrersThenDelete(base::ListValue* referral_list); 154 virtual void DeserializeReferrersThenDelete(base::ListValue* referral_list);
126 155
127 // For unit test code only. 156 virtual void DiscardInitialNavigationHistory();
128 size_t max_concurrent_dns_lookups() const {
129 return max_concurrent_dns_lookups_;
130 }
131 157
132 // Flag setting to use preconnection instead of just DNS pre-fetching. 158 virtual void FinalizeInitializationOnIOThread(
133 bool preconnect_enabled() const { return preconnect_enabled_; } 159 const std::vector<GURL>& urls_to_prefetch,
160 base::ListValue* referral_list,
161 IOThread* io_thread);
162
163 // During startup, we learn what the first N urls visited are, and then
164 // resolve the associated hosts ASAP during our next startup.
165 virtual void LearnAboutInitialNavigation(const GURL& url);
166
167 // Renderer bundles up list and sends to this browser API via IPC.
168 // TODO(jar): Use UrlList instead to include port and scheme.
169 virtual void DnsPrefetchList(const NameList& hostnames);
170
171 // May be called from either the IO or UI thread and will PostTask
172 // to the IO thread if necessary.
173 virtual void Predictor::DnsPrefetchMotivatedList(
174 const UrlList& urls,
175 UrlInfo::ResolutionMotivation motivation);
176
177 // May be called from either the IO or UI thread and will PostTask
178 // to the IO thread if necessary.
179 virtual void SaveStateForNextStartupAndTrim(PrefService* prefs);
180
181 virtual void SaveDnsPrefetchStateForNextStartupAndTrim(
182 base::ListValue* startup_list,
183 base::ListValue* referral_list,
184 base::WaitableEvent* completion);
185
186 // May be called from either the IO or UI thread and will PostTask
187 // to the IO thread if necessary.
188 virtual void EnablePredictor(bool enable);
189
190 virtual void EnablePredictorOnIOThread(bool enable);
191
192 // ------------- End IO thread methods.
193
194 // The following methods may be called on either the IO or UI threads.
134 195
135 // Put URL in canonical form, including a scheme, host, and port. 196 // Put URL in canonical form, including a scheme, host, and port.
136 // Returns GURL::EmptyGURL() if the scheme is not http/https or if the url 197 // Returns GURL::EmptyGURL() if the scheme is not http/https or if the url
137 // cannot be otherwise canonicalized. 198 // cannot be otherwise canonicalized.
138 static GURL CanonicalizeUrl(const GURL& url); 199 static GURL CanonicalizeUrl(const GURL& url);
139 200
201 // Used for testing.
202 void SetHostResolver(net::HostResolver* host_resolver) {
203 host_resolver_ = host_resolver;
204 }
205 // Used for testing.
206 size_t max_concurrent_dns_lookups() const {
207 return max_concurrent_dns_lookups_;
208 }
209
210 // Flag setting to use preconnection instead of just DNS pre-fetching.
211 bool preconnect_enabled() const {
212 return preconnect_enabled_;
213 }
214
215 // Flag setting for whether we are prefetching dns lookups.
216 bool predictor_enabled() const {
217 return predictor_enabled_;
218 }
219
220 // Given that the underlying Chromium resolver defaults to a total maximum of
willchan no longer on Chromium 2011/08/12 21:17:29 constants go above methods in class declaration or
rpetterson 2011/08/13 00:55:17 Done.
221 // 8 paralell resolutions, we will avoid any chance of starving navigational
222 // resolutions by limiting the number of paralell speculative resolutions.
223 // This is used in the field trials and testing.
224 // TODO(jar): Move this limitation into the resolver.
225 static const size_t kMaxSpeculativeParallelResolves;
226
227 // To control the congestion avoidance system, we need an estimate of how
228 // many speculative requests may arrive at once. Since we currently only
229 // keep 8 subresource names for each frame, we'll use that as our basis.
230 // Note that when scanning search results lists, we might actually get 10 at
231 // a time, and wikipedia can often supply (during a page scan) upwards of 50.
232 // In those odd cases, we may discard some of the later speculative requests
233 // mistakenly assuming that the resolutions took too long.
234 static const int kTypicalSpeculativeGroupSize;
235
236 // The next constant specifies an amount of queueing delay that is
237 // "too large," and indicative of problems with resolutions (perhaps due to
238 // an overloaded router, or such). When we exceed this delay, congestion
239 // avoidance will kick in and all speculations in the queue will be discarded.
240 static const int kMaxSpeculativeResolveQueueDelayMs;
241
242
140 private: 243 private:
141 friend class base::RefCountedThreadSafe<Predictor>; 244 friend class base::RefCountedThreadSafe<Predictor>;
willchan no longer on Chromium 2011/08/12 21:17:29 Remove this
rpetterson 2011/08/13 00:55:17 Done.
142 FRIEND_TEST_ALL_PREFIXES(PredictorTest, BenefitLookupTest); 245 FRIEND_TEST_ALL_PREFIXES(PredictorTest, BenefitLookupTest);
143 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ShutdownWhenResolutionIsPendingTest); 246 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ShutdownWhenResolutionIsPendingTest);
144 FRIEND_TEST_ALL_PREFIXES(PredictorTest, SingleLookupTest); 247 FRIEND_TEST_ALL_PREFIXES(PredictorTest, SingleLookupTest);
145 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ConcurrentLookupTest); 248 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ConcurrentLookupTest);
146 FRIEND_TEST_ALL_PREFIXES(PredictorTest, MassiveConcurrentLookupTest); 249 FRIEND_TEST_ALL_PREFIXES(PredictorTest, MassiveConcurrentLookupTest);
147 FRIEND_TEST_ALL_PREFIXES(PredictorTest, PriorityQueuePushPopTest); 250 FRIEND_TEST_ALL_PREFIXES(PredictorTest, PriorityQueuePushPopTest);
148 FRIEND_TEST_ALL_PREFIXES(PredictorTest, PriorityQueueReorderTest); 251 FRIEND_TEST_ALL_PREFIXES(PredictorTest, PriorityQueueReorderTest);
149 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ReferrerSerializationTrimTest); 252 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ReferrerSerializationTrimTest);
150 friend class WaitForResolutionHelper; // For testing. 253 friend class WaitForResolutionHelper; // For testing.
151 254
(...skipping 19 matching lines...) Expand all
171 private: 274 private:
172 // The names in the queue that should be serviced (popped) ASAP. 275 // The names in the queue that should be serviced (popped) ASAP.
173 std::queue<GURL> rush_queue_; 276 std::queue<GURL> rush_queue_;
174 // The names in the queue that should only be serviced when rush_queue is 277 // The names in the queue that should only be serviced when rush_queue is
175 // empty. 278 // empty.
176 std::queue<GURL> background_queue_; 279 std::queue<GURL> background_queue_;
177 280
178 DISALLOW_COPY_AND_ASSIGN(HostNameQueue); 281 DISALLOW_COPY_AND_ASSIGN(HostNameQueue);
179 }; 282 };
180 283
284 // The InitialObserver monitors navigations made by the network stack. This
285 // is only used to identify startup time resolutions (for re-resolution
286 // during our next process startup).
287 // TODO(jar): Consider preconnecting at startup, which may be faster than
288 // waiting for render process to start and request a connection.
289 class InitialObserver {
290 public:
291 // Recording of when we observed each navigation.
292 typedef std::map<GURL, base::TimeTicks> FirstNavigations;
293
294 // Potentially add a new URL to our startup list.
295 void Append(const GURL& url, Predictor* predictor);
296
297 // Get an HTML version of our current planned first_navigations_.
298 void GetFirstResolutionsHtml(std::string* output);
299
300 // Persist the current first_navigations_ for storage in a list.
301 void GetInitialDnsResolutionList(base::ListValue* startup_list);
302
303 // Discards all initial loading history.
304 void DiscardInitialNavigationHistory() { first_navigations_.clear(); }
305
306 private:
307 // List of the first N URL resolutions observed in this run.
308 FirstNavigations first_navigations_;
309
310 // The number of URLs we'll save for pre-resolving at next startup.
311 static const size_t kStartupResolutionCount = 10;
312 };
313
181 // A map that is keyed with the host/port that we've learned were the cause 314 // A map that is keyed with the host/port that we've learned were the cause
182 // of loading additional URLs. The list of additional targets is held 315 // of loading additional URLs. The list of additional targets is held
183 // in a Referrer instance, which is a value in this map. 316 // in a Referrer instance, which is a value in this map.
184 typedef std::map<GURL, Referrer> Referrers; 317 typedef std::map<GURL, Referrer> Referrers;
185 318
186 // Depending on the expected_subresource_use_, we may either make a TCP/IP 319 // Depending on the expected_subresource_use_, we may either make a TCP/IP
187 // preconnection, or merely pre-resolve the hostname via DNS (or even do 320 // preconnection, or merely pre-resolve the hostname via DNS (or even do
188 // nothing). The following are the threasholds for taking those actions. 321 // nothing). The following are the threasholds for taking those actions.
189 static const double kPreconnectWorthyExpectedValue; 322 static const double kPreconnectWorthyExpectedValue;
190 static const double kDNSPreresolutionWorthyExpectedValue; 323 static const double kDNSPreresolutionWorthyExpectedValue;
191 // Referred hosts with a subresource_use_rate_ that are less than the 324 // Referred hosts with a subresource_use_rate_ that are less than the
192 // following threshold will be discarded when we Trim() the list. 325 // following threshold will be discarded when we Trim() the list.
193 static const double kDiscardableExpectedValue; 326 static const double kDiscardableExpectedValue;
194 // During trimming operation to discard hosts for which we don't have likely 327 // During trimming operation to discard hosts for which we don't have likely
195 // subresources, we multiply the expected_subresource_use_ value by the 328 // subresources, we multiply the expected_subresource_use_ value by the
196 // following ratio until that value is less than kDiscardableExpectedValue. 329 // following ratio until that value is less than kDiscardableExpectedValue.
197 // This number should always be less than 1, an more than 0. 330 // This number should always be less than 1, an more than 0.
198 static const double kReferrerTrimRatio; 331 static const double kReferrerTrimRatio;
199 332
200 // Interval between periodic trimming of our whole referrer list. 333 // Interval between periodic trimming of our whole referrer list.
201 // We only do a major trimming about once an hour, and then only when the user 334 // We only do a major trimming about once an hour, and then only when the user
202 // is actively browsing. 335 // is actively browsing.
203 static const base::TimeDelta kDurationBetweenTrimmings; 336 static const base::TimeDelta kDurationBetweenTrimmings;
204 // Interval between incremental trimmings (to avoid inducing Jank). 337 // Interval between incremental trimmings (to avoid inducing Jank).
205 static const base::TimeDelta kDurationBetweenTrimmingIncrements; 338 static const base::TimeDelta kDurationBetweenTrimmingIncrements;
206 // Number of referring URLs processed in an incremental trimming. 339 // Number of referring URLs processed in an incremental trimming.
207 static const size_t kUrlsTrimmedPerIncrement; 340 static const size_t kUrlsTrimmedPerIncrement;
208 341
209 ~Predictor();
210
211 // Perform actual resolution or preconnection to subresources now. This is
212 // an internal worker method that is reached via a post task from
213 // PredictFrameSubresources().
214 void PrepareFrameSubresources(const GURL& url);
215
216 // Only for testing. Returns true if hostname has been successfully resolved 342 // Only for testing. Returns true if hostname has been successfully resolved
217 // (name found). 343 // (name found).
218 bool WasFound(const GURL& url) const { 344 bool WasFound(const GURL& url) const {
219 Results::const_iterator it(results_.find(url)); 345 Results::const_iterator it(results_.find(url));
220 return (it != results_.end()) && 346 return (it != results_.end()) &&
221 it->second.was_found(); 347 it->second.was_found();
222 } 348 }
223 349
224 // Only for testing. Return how long was the resolution 350 // Only for testing. Return how long was the resolution
225 // or UrlInfo::kNullDuration if it hasn't been resolved yet. 351 // or UrlInfo::kNullDuration if it hasn't been resolved yet.
226 base::TimeDelta GetResolutionDuration(const GURL& url) { 352 base::TimeDelta GetResolutionDuration(const GURL& url) {
227 if (results_.find(url) == results_.end()) 353 if (results_.find(url) == results_.end())
228 return UrlInfo::kNullDuration; 354 return UrlInfo::kNullDuration;
229 return results_[url].resolve_duration(); 355 return results_[url].resolve_duration();
230 } 356 }
231 357
232 // Only for testing; 358 // Only for testing;
233 size_t peak_pending_lookups() const { return peak_pending_lookups_; } 359 size_t peak_pending_lookups() const { return peak_pending_lookups_; }
234 360
361 // ------------- Start IO thread methods.
362
363 // Perform actual resolution or preconnection to subresources now. This is
364 // an internal worker method that is reached via a post task from
365 // PredictFrameSubresources().
366 void PrepareFrameSubresources(const GURL& url);
367
235 // Access method for use by async lookup request to pass resolution result. 368 // Access method for use by async lookup request to pass resolution result.
236 void OnLookupFinished(LookupRequest* request, const GURL& url, bool found); 369 void OnLookupFinished(LookupRequest* request, const GURL& url, bool found);
237 370
238 // Underlying method for both async and synchronous lookup to update state. 371 // Underlying method for both async and synchronous lookup to update state.
239 void LookupFinished(LookupRequest* request, 372 void LookupFinished(LookupRequest* request,
240 const GURL& url, bool found); 373 const GURL& url, bool found);
241 374
242 // Queue hostname for resolution. If queueing was done, return the pointer 375 // Queue hostname for resolution. If queueing was done, return the pointer
243 // to the queued instance, otherwise return NULL. 376 // to the queued instance, otherwise return NULL.
244 UrlInfo* AppendToResolutionQueue(const GURL& url, 377 UrlInfo* AppendToResolutionQueue(const GURL& url,
(...skipping 25 matching lines...) Expand all
270 void LoadUrlsForTrimming(); 403 void LoadUrlsForTrimming();
271 404
272 // Posts a task to do additional incremental trimming of referrers_. 405 // Posts a task to do additional incremental trimming of referrers_.
273 void PostIncrementalTrimTask(); 406 void PostIncrementalTrimTask();
274 407
275 // Calls Trim() on some or all of urls_being_trimmed_. 408 // Calls Trim() on some or all of urls_being_trimmed_.
276 // If it does not process all the URLs in that vector, it posts a task to 409 // If it does not process all the URLs in that vector, it posts a task to
277 // continue with them shortly (i.e., it yeilds and continues). 410 // continue with them shortly (i.e., it yeilds and continues).
278 void IncrementalTrimReferrers(bool trim_all_now); 411 void IncrementalTrimReferrers(bool trim_all_now);
279 412
413 // ------------- End IO thread methods.
414
415 scoped_ptr<InitialObserver> initial_observer_;
416
417 // Status of speculative DNS resolution and speculative TCP/IP connection
418 // feature.
419 bool predictor_enabled_;
420
280 // work_queue_ holds a list of names we need to look up. 421 // work_queue_ holds a list of names we need to look up.
281 HostNameQueue work_queue_; 422 HostNameQueue work_queue_;
282 423
283 // results_ contains information for existing/prior prefetches. 424 // results_ contains information for existing/prior prefetches.
284 Results results_; 425 Results results_;
285 426
286 std::set<LookupRequest*> pending_lookups_; 427 std::set<LookupRequest*> pending_lookups_;
287 428
288 // For testing, to verify that we don't exceed the limit. 429 // For testing, to verify that we don't exceed the limit.
289 size_t peak_pending_lookups_; 430 size_t peak_pending_lookups_;
290 431
291 // When true, we don't make new lookup requests. 432 // When true, we don't make new lookup requests.
292 bool shutdown_; 433 bool shutdown_;
293 434
294 // The number of concurrent speculative lookups currently allowed to be sent 435 // The number of concurrent speculative lookups currently allowed to be sent
295 // to the resolver. Any additional lookups will be queued to avoid exceeding 436 // to the resolver. Any additional lookups will be queued to avoid exceeding
296 // this value. The queue is a priority queue that will accelerate 437 // this value. The queue is a priority queue that will accelerate
297 // sub-resource speculation, and retard resolutions suggested by page scans. 438 // sub-resource speculation, and retard resolutions suggested by page scans.
298 const size_t max_concurrent_dns_lookups_; 439 const size_t max_concurrent_dns_lookups_;
299 440
300 // The maximum queueing delay that is acceptable before we enter congestion 441 // The maximum queueing delay that is acceptable before we enter congestion
301 // reduction mode, and discard all queued (but not yet assigned) resolutions. 442 // reduction mode, and discard all queued (but not yet assigned) resolutions.
302 const base::TimeDelta max_dns_queue_delay_; 443 const base::TimeDelta max_dns_queue_delay_;
303 444
304 // The host resolver we warm DNS entries for. 445 // The host resolver we warm DNS entries for.
305 net::HostResolver* const host_resolver_; 446 net::HostResolver* host_resolver_;
306 447
307 // Are we currently using preconnection, rather than just DNS resolution, for 448 // Are we currently using preconnection, rather than just DNS resolution, for
308 // subresources and omni-box search URLs. 449 // subresources and omni-box search URLs.
309 bool preconnect_enabled_; 450 bool preconnect_enabled_;
310 451
311 // Most recent suggestion from Omnibox provided via AnticipateOmniboxUrl(). 452 // Most recent suggestion from Omnibox provided via AnticipateOmniboxUrl().
312 std::string last_omnibox_host_; 453 std::string last_omnibox_host_;
313 454
314 // The time when the last preresolve was done for last_omnibox_host_. 455 // The time when the last preresolve was done for last_omnibox_host_.
315 base::TimeTicks last_omnibox_preresolve_; 456 base::TimeTicks last_omnibox_preresolve_;
(...skipping 11 matching lines...) Expand all
327 // orginial hostname. 468 // orginial hostname.
328 Referrers referrers_; 469 Referrers referrers_;
329 470
330 // List of URLs in referrers_ currently being trimmed (scaled down to 471 // List of URLs in referrers_ currently being trimmed (scaled down to
331 // eventually be aged out of use). 472 // eventually be aged out of use).
332 std::vector<GURL> urls_being_trimmed_; 473 std::vector<GURL> urls_being_trimmed_;
333 474
334 // A time after which we need to do more trimming of referrers. 475 // A time after which we need to do more trimming of referrers.
335 base::TimeTicks next_trim_time_; 476 base::TimeTicks next_trim_time_;
336 477
337 ScopedRunnableMethodFactory<Predictor> trim_task_factory_; 478 scoped_ptr<ScopedRunnableMethodFactory<Predictor> > trim_task_factory_;
338 479
339 DISALLOW_COPY_AND_ASSIGN(Predictor); 480 DISALLOW_COPY_AND_ASSIGN(Predictor);
340 }; 481 };
341 482
342 } // namespace chrome_browser_net 483 } // namespace chrome_browser_net
343 484
344 #endif // CHROME_BROWSER_NET_PREDICTOR_H_ 485 #endif // CHROME_BROWSER_NET_PREDICTOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698