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

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

Issue 360733005: Poll CanPredictNetworkActions in Predictor class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix LoginUtilsTest. Created 6 years, 5 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
« no previous file with comments | « chrome/browser/net/net_pref_observer.cc ('k') | chrome/browser/net/predictor.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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
(...skipping 10 matching lines...) Expand all
21 21
22 #include <map> 22 #include <map>
23 #include <queue> 23 #include <queue>
24 #include <set> 24 #include <set>
25 #include <string> 25 #include <string>
26 #include <vector> 26 #include <vector>
27 27
28 #include "base/gtest_prod_util.h" 28 #include "base/gtest_prod_util.h"
29 #include "base/memory/scoped_ptr.h" 29 #include "base/memory/scoped_ptr.h"
30 #include "base/memory/weak_ptr.h" 30 #include "base/memory/weak_ptr.h"
31 #include "chrome/browser/net/prediction_options.h"
31 #include "chrome/browser/net/referrer.h" 32 #include "chrome/browser/net/referrer.h"
32 #include "chrome/browser/net/spdyproxy/proxy_advisor.h" 33 #include "chrome/browser/net/spdyproxy/proxy_advisor.h"
33 #include "chrome/browser/net/timed_cache.h" 34 #include "chrome/browser/net/timed_cache.h"
34 #include "chrome/browser/net/url_info.h" 35 #include "chrome/browser/net/url_info.h"
35 #include "chrome/common/net/predictor_common.h" 36 #include "chrome/common/net/predictor_common.h"
36 #include "net/base/host_port_pair.h" 37 #include "net/base/host_port_pair.h"
37 38
38 class IOThread; 39 class IOThread;
39 class PrefService; 40 class PrefService;
40 class Profile; 41 class Profile;
42 class ProfileIOData;
41 43
42 namespace base { 44 namespace base {
43 class ListValue; 45 class ListValue;
44 class WaitableEvent; 46 class WaitableEvent;
45 } 47 }
46 48
47 namespace net { 49 namespace net {
48 class HostResolver; 50 class HostResolver;
49 class SSLConfigService; 51 class SSLConfigService;
50 class TransportSecurityState; 52 class TransportSecurityState;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 110
109 // We don't bother learning to preconnect via a GET if the original URL 111 // We don't bother learning to preconnect via a GET if the original URL
110 // navigation was so long ago, that a preconnection would have been dropped 112 // navigation was so long ago, that a preconnection would have been dropped
111 // anyway. We believe most servers will drop the connection in 10 seconds, so 113 // anyway. We believe most servers will drop the connection in 10 seconds, so
112 // we currently estimate this time-till-drop at 10 seconds. 114 // we currently estimate this time-till-drop at 10 seconds.
113 // TODO(jar): We should do a persistent field trial to validate/optimize this. 115 // TODO(jar): We should do a persistent field trial to validate/optimize this.
114 static const int kMaxUnusedSocketLifetimeSecondsWithoutAGet; 116 static const int kMaxUnusedSocketLifetimeSecondsWithoutAGet;
115 117
116 // |max_concurrent| specifies how many concurrent (parallel) prefetches will 118 // |max_concurrent| specifies how many concurrent (parallel) prefetches will
117 // be performed. Host lookups will be issued through |host_resolver|. 119 // be performed. Host lookups will be issued through |host_resolver|.
118 explicit Predictor(bool preconnect_enabled); 120 explicit Predictor(bool preconnect_enabled, bool predictor_enabled);
119 121
120 virtual ~Predictor(); 122 virtual ~Predictor();
121 123
122 // This function is used to create a predictor. For testing, we can create 124 // This function is used to create a predictor. For testing, we can create
123 // a version which does a simpler shutdown. 125 // a version which does a simpler shutdown.
124 static Predictor* CreatePredictor(bool preconnect_enabled, 126 static Predictor* CreatePredictor(bool preconnect_enabled,
127 bool predictor_enabled,
125 bool simple_shutdown); 128 bool simple_shutdown);
126 129
127 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 130 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
128 131
129 // ------------- Start UI thread methods. 132 // ------------- Start UI thread methods.
130 133
131 virtual void InitNetworkPredictor(PrefService* user_prefs, 134 virtual void InitNetworkPredictor(PrefService* user_prefs,
132 PrefService* local_state, 135 PrefService* local_state,
133 IOThread* io_thread, 136 IOThread* io_thread,
134 net::URLRequestContextGetter* getter); 137 net::URLRequestContextGetter* getter,
138 ProfileIOData* profile_io_data);
135 139
136 // The Omnibox has proposed a given url to the user, and if it is a search 140 // The Omnibox has proposed a given url to the user, and if it is a search
137 // URL, then it also indicates that this is preconnectable (i.e., we could 141 // URL, then it also indicates that this is preconnectable (i.e., we could
138 // preconnect to the search server). 142 // preconnect to the search server).
139 void AnticipateOmniboxUrl(const GURL& url, bool preconnectable); 143 void AnticipateOmniboxUrl(const GURL& url, bool preconnectable);
140 144
141 // Preconnect a URL and all of its subresource domains. 145 // Preconnect a URL and all of its subresource domains.
142 void PreconnectUrlAndSubresources(const GURL& url, 146 void PreconnectUrlAndSubresources(const GURL& url,
143 const GURL& first_party_for_cookies); 147 const GURL& first_party_for_cookies);
144 148
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 void DeserializeReferrers(const base::ListValue& referral_list); 209 void DeserializeReferrers(const base::ListValue& referral_list);
206 210
207 void DeserializeReferrersThenDelete(base::ListValue* referral_list); 211 void DeserializeReferrersThenDelete(base::ListValue* referral_list);
208 212
209 void DiscardInitialNavigationHistory(); 213 void DiscardInitialNavigationHistory();
210 214
211 void FinalizeInitializationOnIOThread( 215 void FinalizeInitializationOnIOThread(
212 const std::vector<GURL>& urls_to_prefetch, 216 const std::vector<GURL>& urls_to_prefetch,
213 base::ListValue* referral_list, 217 base::ListValue* referral_list,
214 IOThread* io_thread, 218 IOThread* io_thread,
215 bool predictor_enabled); 219 ProfileIOData* profile_io_data);
216 220
217 // During startup, we learn what the first N urls visited are, and then 221 // During startup, we learn what the first N urls visited are, and then
218 // resolve the associated hosts ASAP during our next startup. 222 // resolve the associated hosts ASAP during our next startup.
219 void LearnAboutInitialNavigation(const GURL& url); 223 void LearnAboutInitialNavigation(const GURL& url);
220 224
221 // Renderer bundles up list and sends to this browser API via IPC. 225 // Renderer bundles up list and sends to this browser API via IPC.
222 // TODO(jar): Use UrlList instead to include port and scheme. 226 // TODO(jar): Use UrlList instead to include port and scheme.
223 void DnsPrefetchList(const NameList& hostnames); 227 void DnsPrefetchList(const NameList& hostnames);
224 228
225 // May be called from either the IO or UI thread and will PostTask 229 // May be called from either the IO or UI thread and will PostTask
226 // to the IO thread if necessary. 230 // to the IO thread if necessary.
227 void DnsPrefetchMotivatedList(const UrlList& urls, 231 void DnsPrefetchMotivatedList(const UrlList& urls,
228 UrlInfo::ResolutionMotivation motivation); 232 UrlInfo::ResolutionMotivation motivation);
229 233
230 // May be called from either the IO or UI thread and will PostTask 234 // May be called from either the IO or UI thread and will PostTask
231 // to the IO thread if necessary. 235 // to the IO thread if necessary.
232 void SaveStateForNextStartupAndTrim(PrefService* prefs); 236 void SaveStateForNextStartupAndTrim();
233 237
234 void SaveDnsPrefetchStateForNextStartupAndTrim( 238 void SaveDnsPrefetchStateForNextStartupAndTrim(
235 base::ListValue* startup_list, 239 base::ListValue* startup_list,
236 base::ListValue* referral_list, 240 base::ListValue* referral_list,
237 base::WaitableEvent* completion); 241 base::WaitableEvent* completion);
238 242
239 // May be called from either the IO or UI thread and will PostTask 243 // May be called from either the IO or UI thread and will PostTask
240 // to the IO thread if necessary. 244 // to the IO thread if necessary.
241 void EnablePredictor(bool enable);
242
243 void EnablePredictorOnIOThread(bool enable);
244
245 // May be called from either the IO or UI thread and will PostTask
246 // to the IO thread if necessary.
247 void PreconnectUrl(const GURL& url, const GURL& first_party_for_cookies, 245 void PreconnectUrl(const GURL& url, const GURL& first_party_for_cookies,
248 UrlInfo::ResolutionMotivation motivation, int count); 246 UrlInfo::ResolutionMotivation motivation, int count);
249 247
250 void PreconnectUrlOnIOThread(const GURL& url, 248 void PreconnectUrlOnIOThread(const GURL& url,
251 const GURL& first_party_for_cookies, 249 const GURL& first_party_for_cookies,
252 UrlInfo::ResolutionMotivation motivation, 250 UrlInfo::ResolutionMotivation motivation,
253 int count); 251 int count);
254 252
255 // ------------- End IO thread methods. 253 // ------------- End IO thread methods.
256 254
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 } 286 }
289 // Used for testing. 287 // Used for testing.
290 void SetShutdown(bool shutdown) { 288 void SetShutdown(bool shutdown) {
291 shutdown_ = shutdown; 289 shutdown_ = shutdown;
292 } 290 }
293 // Used for testing. 291 // Used for testing.
294 void SetObserver(PredictorObserver* observer) { 292 void SetObserver(PredictorObserver* observer) {
295 observer_ = observer; 293 observer_ = observer;
296 } 294 }
297 295
298 // Flag setting to use preconnection instead of just DNS pre-fetching. 296 ProfileIOData* profile_io_data() const {
297 return profile_io_data_;
298 }
299
299 bool preconnect_enabled() const { 300 bool preconnect_enabled() const {
300 return preconnect_enabled_; 301 return preconnect_enabled_;
301 } 302 }
302 303
303 // Flag setting for whether we are prefetching dns lookups.
304 bool predictor_enabled() const { 304 bool predictor_enabled() const {
305 return predictor_enabled_; 305 return predictor_enabled_;
306 } 306 }
307 307
308 308
309 private: 309 private:
310 FRIEND_TEST_ALL_PREFIXES(PredictorTest, BenefitLookupTest); 310 FRIEND_TEST_ALL_PREFIXES(PredictorTest, BenefitLookupTest);
311 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ShutdownWhenResolutionIsPendingTest); 311 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ShutdownWhenResolutionIsPendingTest);
312 FRIEND_TEST_ALL_PREFIXES(PredictorTest, SingleLookupTest); 312 FRIEND_TEST_ALL_PREFIXES(PredictorTest, SingleLookupTest);
313 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ConcurrentLookupTest); 313 FRIEND_TEST_ALL_PREFIXES(PredictorTest, ConcurrentLookupTest);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 // Only for testing; 428 // Only for testing;
429 size_t peak_pending_lookups() const { return peak_pending_lookups_; } 429 size_t peak_pending_lookups() const { return peak_pending_lookups_; }
430 430
431 // If a proxy advisor is defined, let it know that |url| will be prefetched or 431 // If a proxy advisor is defined, let it know that |url| will be prefetched or
432 // preconnected to. Can be called on either UI or IO threads and will post to 432 // preconnected to. Can be called on either UI or IO threads and will post to
433 // the IO thread if necessary, invoking AdviseProxyOnIOThread(). 433 // the IO thread if necessary, invoking AdviseProxyOnIOThread().
434 void AdviseProxy(const GURL& url, 434 void AdviseProxy(const GURL& url,
435 UrlInfo::ResolutionMotivation motivation, 435 UrlInfo::ResolutionMotivation motivation,
436 bool is_preconnect); 436 bool is_preconnect);
437 437
438 // There two members call the corresponding global functions in
439 // prediction_options.cc.
440 virtual bool CanPredictNetworkActionsUI();
441 virtual bool CanPredictNetworkActionsIO();
442
438 // ------------- Start IO thread methods. 443 // ------------- Start IO thread methods.
439 444
440 // Perform actual resolution or preconnection to subresources now. This is 445 // Perform actual resolution or preconnection to subresources now. This is
441 // an internal worker method that is reached via a post task from 446 // an internal worker method that is reached via a post task from
442 // PredictFrameSubresources(). 447 // PredictFrameSubresources().
443 void PrepareFrameSubresources(const GURL& url, 448 void PrepareFrameSubresources(const GURL& url,
444 const GURL& first_party_for_cookies); 449 const GURL& first_party_for_cookies);
445 450
446 // Access method for use by async lookup request to pass resolution result. 451 // Access method for use by async lookup request to pass resolution result.
447 void OnLookupFinished(LookupRequest* request, const GURL& url, bool found); 452 void OnLookupFinished(LookupRequest* request, const GURL& url, bool found);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 506
502 // ------------- End IO thread methods. 507 // ------------- End IO thread methods.
503 508
504 scoped_ptr<InitialObserver> initial_observer_; 509 scoped_ptr<InitialObserver> initial_observer_;
505 510
506 // Reference to URLRequestContextGetter from the Profile which owns the 511 // Reference to URLRequestContextGetter from the Profile which owns the
507 // predictor. Used by Preconnect. 512 // predictor. Used by Preconnect.
508 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; 513 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
509 514
510 // Status of speculative DNS resolution and speculative TCP/IP connection 515 // Status of speculative DNS resolution and speculative TCP/IP connection
511 // feature. 516 // feature. This is false if and only if disabled by a command line switch.
512 bool predictor_enabled_; 517 const bool predictor_enabled_;
518
519 // This is set by InitNetworkPredictor and used for calling
520 // chrome_browser_net::CanPredictNetworkActionsUI.
521 PrefService* user_prefs_;
522
523 // This is set by InitNetworkPredictor and used for calling
524 // chrome_browser_net::CanPredictNetworkActionsIO.
525 ProfileIOData* profile_io_data_;
513 526
514 // work_queue_ holds a list of names we need to look up. 527 // work_queue_ holds a list of names we need to look up.
515 HostNameQueue work_queue_; 528 HostNameQueue work_queue_;
516 529
517 // results_ contains information for existing/prior prefetches. 530 // results_ contains information for existing/prior prefetches.
518 Results results_; 531 Results results_;
519 532
520 std::set<LookupRequest*> pending_lookups_; 533 std::set<LookupRequest*> pending_lookups_;
521 534
522 // For testing, to verify that we don't exceed the limit. 535 // For testing, to verify that we don't exceed the limit.
(...skipping 17 matching lines...) Expand all
540 553
541 // The TransportSecurityState instance we query HSTS redirects from. 554 // The TransportSecurityState instance we query HSTS redirects from.
542 net::TransportSecurityState* transport_security_state_; 555 net::TransportSecurityState* transport_security_state_;
543 556
544 // The SSLConfigService we query SNI support from (used in querying HSTS 557 // The SSLConfigService we query SNI support from (used in querying HSTS
545 // redirects). 558 // redirects).
546 net::SSLConfigService* ssl_config_service_; 559 net::SSLConfigService* ssl_config_service_;
547 560
548 // Are we currently using preconnection, rather than just DNS resolution, for 561 // Are we currently using preconnection, rather than just DNS resolution, for
549 // subresources and omni-box search URLs. 562 // subresources and omni-box search URLs.
550 bool preconnect_enabled_; 563 // This is false if and only if disabled by a command line switch.
564 const bool preconnect_enabled_;
551 565
552 // Most recent suggestion from Omnibox provided via AnticipateOmniboxUrl(). 566 // Most recent suggestion from Omnibox provided via AnticipateOmniboxUrl().
553 std::string last_omnibox_host_; 567 std::string last_omnibox_host_;
554 568
555 // The time when the last preresolve was done for last_omnibox_host_. 569 // The time when the last preresolve was done for last_omnibox_host_.
556 base::TimeTicks last_omnibox_preresolve_; 570 base::TimeTicks last_omnibox_preresolve_;
557 571
558 // The number of consecutive requests to AnticipateOmniboxUrl() that suggested 572 // The number of consecutive requests to AnticipateOmniboxUrl() that suggested
559 // preconnecting (because it was to a search service). 573 // preconnecting (because it was to a search service).
560 int consecutive_omnibox_preconnect_count_; 574 int consecutive_omnibox_preconnect_count_;
(...skipping 20 matching lines...) Expand all
581 595
582 // An observer for testing. 596 // An observer for testing.
583 PredictorObserver* observer_; 597 PredictorObserver* observer_;
584 598
585 DISALLOW_COPY_AND_ASSIGN(Predictor); 599 DISALLOW_COPY_AND_ASSIGN(Predictor);
586 }; 600 };
587 601
588 // This version of the predictor is used for testing. 602 // This version of the predictor is used for testing.
589 class SimplePredictor : public Predictor { 603 class SimplePredictor : public Predictor {
590 public: 604 public:
591 explicit SimplePredictor(bool preconnect_enabled) 605 explicit SimplePredictor(bool preconnect_enabled, bool predictor_enabled)
592 : Predictor(preconnect_enabled) {} 606 : Predictor(preconnect_enabled, predictor_enabled) {}
593 virtual ~SimplePredictor() {} 607 virtual ~SimplePredictor() {}
594 virtual void InitNetworkPredictor( 608 virtual void InitNetworkPredictor(
595 PrefService* user_prefs, 609 PrefService* user_prefs,
596 PrefService* local_state, 610 PrefService* local_state,
597 IOThread* io_thread, 611 IOThread* io_thread,
598 net::URLRequestContextGetter* getter) OVERRIDE; 612 net::URLRequestContextGetter* getter,
613 ProfileIOData* profile_io_data) OVERRIDE;
599 virtual void ShutdownOnUIThread() OVERRIDE; 614 virtual void ShutdownOnUIThread() OVERRIDE;
615 private:
616 // There member functions return True for unittests.
617 virtual bool CanPredictNetworkActionsUI() OVERRIDE;
618 virtual bool CanPredictNetworkActionsIO() OVERRIDE;
600 }; 619 };
601 620
602 } // namespace chrome_browser_net 621 } // namespace chrome_browser_net
603 622
604 #endif // CHROME_BROWSER_NET_PREDICTOR_H_ 623 #endif // CHROME_BROWSER_NET_PREDICTOR_H_
OLDNEW
« no previous file with comments | « chrome/browser/net/net_pref_observer.cc ('k') | chrome/browser/net/predictor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698