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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/net/predictor.h
===================================================================
--- chrome/browser/net/predictor.h (revision 89645)
+++ chrome/browser/net/predictor.h (working copy)
@@ -28,13 +28,20 @@
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "chrome/browser/net/url_info.h"
#include "chrome/browser/net/referrer.h"
#include "chrome/common/net/predictor_common.h"
#include "net/base/host_port_pair.h"
class ListValue;
+class PrefService;
+class Profile;
+namespace base {
+class WaitableEvent;
+}
+
namespace net {
class HostResolver;
} // namespace net
@@ -57,8 +64,10 @@
// be performed. Host lookups will be issued through |host_resolver|.
Predictor(net::HostResolver* host_resolver,
base::TimeDelta max_queue_delay_ms, size_t max_concurrent,
- bool preconnect_enabled);
+ bool preconnect_enabled, bool predictor_enabled);
+ ~Predictor();
+
// Cancel pending requests and prevent new ones from being made.
void Shutdown();
@@ -122,19 +131,71 @@
void DeserializeReferrersThenDelete(ListValue* referral_list);
+ void DiscardInitialNavigationHistory();
+
+ void FinalizeInitialization(const std::vector<GURL>& urls_to_prefetch,
+ ListValue* referral_list);
+
+ // During startup, we learn what the first N urls visited are, and then
+ // resolve the associated hosts ASAP during our next startup.
+ void LearnAboutInitialNavigation(const GURL& url);
+
+ // Renderer bundles up list and sends to this browser API via IPC.
+ // TODO(jar): Use UrlList instead to include port and scheme.
+ void DnsPrefetchList(const NameList& hostnames);
+
+ void Predictor::DnsPrefetchMotivatedList(
+ const UrlList& urls,
+ UrlInfo::ResolutionMotivation motivation);
+
+ void SaveStateForNextStartupAndTrim(PrefService* prefs, Profile* profile);
+
+ void SaveDnsPrefetchStateForNextStartupAndTrim(
+ ListValue* startup_list,
+ ListValue* referral_list,
+ base::WaitableEvent* completion);
+
// For unit test code only.
size_t max_concurrent_dns_lookups() const {
return max_concurrent_dns_lookups_;
}
// Flag setting to use preconnection instead of just DNS pre-fetching.
- bool preconnect_enabled() const { return preconnect_enabled_; }
+ bool preconnect_enabled() const {
+ return preconnect_enabled_;
+ }
+ // Flag setting for whether we are prefetching dns lookups.
+ bool predictor_enabled() const {
+ return predictor_enabled_;
+ }
+
+ void EnablePredictor(bool enable) {
+ predictor_enabled_ = enable;
+ }
+
+ // See variable description for explanation.
+ bool on_the_record() const {
+ return on_the_record_;
+ }
+
+ void SetOnTheRecord(bool on_the_record) {
+ on_the_record_ = on_the_record;
+ }
+
+ // Return value indicates whether to go back on the record.
+ bool HandleIncognitoBrowserClosed();
+
+ void HandleIncognitoBrowserOpened();
+
// Put URL in canonical form, including a scheme, host, and port.
// Returns GURL::EmptyGURL() if the scheme is not http/https or if the url
// cannot be otherwise canonicalized.
static GURL CanonicalizeUrl(const GURL& url);
+ static UrlList GetPredictedUrlListAtStartup(PrefService* user_prefs,
+ PrefService* local_state);
+
private:
friend class base::RefCountedThreadSafe<Predictor>;
FRIEND_TEST_ALL_PREFIXES(PredictorTest, BenefitLookupTest);
@@ -176,6 +237,36 @@
DISALLOW_COPY_AND_ASSIGN(HostNameQueue);
};
+ // The InitialObserver monitors navigations made by the network stack. This
+ // is only used to identify startup time resolutions (for re-resolution
+ // during our next process startup).
+ // TODO(jar): Consider preconnecting at startup, which may be faster than
+ // waiting for render process to start and request a connection.
+ class InitialObserver {
+ public:
+ // Recording of when we observed each navigation.
+ typedef std::map<GURL, base::TimeTicks> FirstNavigations;
+
+ // Potentially add a new URL to our startup list.
+ void Append(const GURL& url, Predictor* predictor);
+
+ // Get an HTML version of our current planned first_navigations_.
+ void GetFirstResolutionsHtml(std::string* output);
+
+ // Persist the current first_navigations_ for storage in a list.
+ void GetInitialDnsResolutionList(ListValue* startup_list);
+
+ // Discards all initial loading history.
+ void DiscardInitialNavigationHistory() { first_navigations_.clear(); }
+
+ private:
+ // List of the first N URL resolutions observed in this run.
+ FirstNavigations first_navigations_;
+
+ // The number of URLs we'll save for pre-resolving at next startup.
+ static const size_t kStartupResolutionCount = 10;
+ };
+
// A map that is keyed with the host/port that we've learned were the cause
// of loading additional URLs. The list of additional targets is held
// in a Referrer instance, which is a value in this map.
@@ -204,8 +295,6 @@
// Number of referring URLs processed in an incremental trimming.
static const size_t kUrlsTrimmedPerIncrement;
- ~Predictor();
-
// Perform actual resolution or preconnection to subresources now. This is
// an internal worker method that is reached via a post task from
// PredictFrameSubresources().
@@ -275,6 +364,19 @@
// continue with them shortly (i.e., it yeilds and continues).
void IncrementalTrimReferrers(bool trim_all_now);
+ scoped_ptr<InitialObserver> initial_observer_;
+
+ // Status of speculative DNS resolution and speculative TCP/IP connection
+ // feature.
+ bool predictor_enabled_;
+
+ // If there are any incognito windows at all, we don't want to keep prefetch
+ // information since it would be visible in about:dns, for example.
+ int off_the_record_windows_count_;
+
+ // Cached inverted copy of the off_the_record pref.
+ bool on_the_record_;
+
// work_queue_ holds a list of names we need to look up.
HostNameQueue work_queue_;

Powered by Google App Engine
This is Rietveld 408576698