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

Side by Side Diff: chrome/browser/predictors/resource_prefetcher.h

Issue 10817004: Adds speculative prefetching of resources. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Addressing Dominich's comments. Created 8 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_H_
6 #define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_H_
7
8 #include <map>
9 #include <list>
10 #include <vector>
11
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/threading/non_thread_safe.h"
15 #include "chrome/browser/predictors/resource_prefetch_common.h"
16 #include "googleurl/src/gurl.h"
17 #include "net/url_request/url_request.h"
18
19 namespace net {
20 class URLRequestContext;
21 }
22
23 namespace predictors {
24
25 class ResourcePrefetcherManager;
26
27 // Responsible for prefetching resources for a single navigation based on the
28 // input list of resources.
29 // - Limits the max number of resources in flight for any host and also across
30 // hosts.
31 // - When stopped, will wait for the pending requests to finish.
32 // - Lives entirely on the IO thread.
33 class ResourcePrefetcher : public base::NonThreadSafe,
34 public net::URLRequest::Delegate {
35 public:
36 // Denotes the prefetch request for a single subresource.
37 struct Request {
38 explicit Request(const GURL& i_resource_url);
39 Request(const Request& other);
40
41 enum PrefetchStatus {
42 PREFETCH_STATUS_NOT_STARTED,
43 PREFETCH_STATUS_STARTED,
44
45 // Cancellation reasons.
46 PREFETCH_STATUS_REDIRECTED,
47 PREFETCH_STATUS_AUTH_REQUIRED,
48 PREFETCH_STATUS_CERT_REQUIRED,
49 PREFETCH_STATUS_CERT_ERROR,
50 PREFETCH_STATUS_CANCELLED,
51 PREFETCH_STATUS_FAILED,
52
53 // Successful prefetch states.
54 PREFETCH_STATUS_FROM_CACHE,
55 PREFETCH_STATUS_FROM_NETWORK
56 };
57
58 enum UsageStatus {
59 USAGE_STATUS_NOT_REQUESTED,
60 USAGE_STATUS_FROM_CACHE,
61 USAGE_STATUS_FROM_NETWORK,
62 USAGE_STATUS_NAVIGATION_ABANDONED
63 };
64
65 GURL resource_url;
66 PrefetchStatus prefetch_status;
67 UsageStatus usage_status;
68 };
69 typedef ScopedVector<Request> RequestVector;
70
71 // 'manager' has to outlive the ResourcePrefetcher. The ResourcePrefetcher
dominich 2012/08/02 15:00:50 nit: chromium style uses || around parameters refe
Shishir 2012/08/02 22:06:54 Done.
72 // takes ownership of 'requests'.
73 ResourcePrefetcher(ResourcePrefetcherManager* manager,
74 const ResourcePrefetchPredictorConfig& config,
75 const NavigationID& navigation_id,
76 scoped_ptr<RequestVector> requests);
77 virtual ~ResourcePrefetcher();
78
79 void Start(); // Kicks off the prefetching. Can only be called once.
80 void Stop(); // No additional prefetches will be queued after this.
81
82 const NavigationID& navigation_id() const {
83 return navigation_id_;
84 }
85
86 private:
87 // Launches new prefetch requests if possible.
88 void TryToLaunchPrefetchRequests();
89
90 // Starts a net::URLRequest for the input 'request'.
91 void SendRequest(Request* request);
92
93 // Marks the request as finished, with the given status.
94 void FinishRequest(net::URLRequest* request, Request::PrefetchStatus status);
95
96 // Reads the response data from the response - required for the resource to
97 // be cached correctly.
98 void ReadFullResponse(net::URLRequest* request);
99
100 // net::URLRequest::Delegate methods.
101 virtual void OnReceivedRedirect(net::URLRequest* request,
102 const GURL& new_url,
103 bool* defer_redirect) OVERRIDE;
104 virtual void OnAuthRequired(net::URLRequest* request,
105 net::AuthChallengeInfo* auth_info) OVERRIDE;
106 virtual void OnCertificateRequested(
107 net::URLRequest* request,
108 net::SSLCertRequestInfo* cert_request_info) OVERRIDE;
109 virtual void OnSSLCertificateError(net::URLRequest* request,
110 const net::SSLInfo& ssl_info,
111 bool fatal) OVERRIDE;
112 virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
113 virtual void OnReadCompleted(net::URLRequest* request,
114 int bytes_read) OVERRIDE;
115
116 enum PrefetcherState {
117 INITIALIZED = 0, // Prefetching hasn't started.
118 RUNNING = 1, // Prefetching started, allowed to add more requests.
119 STOPPED = 2, // Prefetching started, not allowed to add more requests.
120 FINISHED = 3 // No more inflight request, new requests not possible.
121 };
122
123 PrefetcherState state_;
124 ResourcePrefetcherManager* const manager_;
125 ResourcePrefetchPredictorConfig const config_;
126 NavigationID navigation_id_;
127 scoped_ptr<RequestVector> request_vector_;
128
129 std::map<net::URLRequest*, Request*> inflight_requests_;
130 std::list<Request*> request_queue_;
131 std::map<std::string, int> host_inflight_counts_;
132
133 DISALLOW_COPY_AND_ASSIGN(ResourcePrefetcher);
134 };
135
136 } // namespace predictors
137
138 #endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698