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

Side by Side Diff: chrome/browser/prerender/prerender_resource_handler.cc

Issue 5912001: Add PrerenderResourceHandler and hook it into the ResourceDispatcherHost.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: More comments and fixing nits Created 9 years, 11 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/prerender/prerender_resource_handler.h"
6
7 #include "chrome/browser/net/chrome_url_request_context.h"
8 #include "chrome/common/resource_response.h"
9 #include "net/base/load_flags.h"
10 #include "net/http/http_response_headers.h"
11 #include "net/url_request/url_request.h"
12
13 namespace {
14
15 class StandardTimer : public PrerenderResourceHandler::Timer {
16 public:
17 StandardTimer() {}
18 virtual ~StandardTimer() {}
19 virtual base::Time GetTime() const {
20 return base::Time::Now();
21 }
22 };
23
24 bool ShouldPrerender(const GURL& url,
25 const ResourceResponse* response,
26 const PrerenderResourceHandler::Timer* timer,
27 base::TimeDelta prerender_duration) {
28 if (!response)
29 return false;
30 const ResourceResponseHead& rrh = response->response_head;
31 if (!url.is_valid())
32 return false;
33 if (!rrh.headers)
34 return false;
35 if (!(url.SchemeIs("http") || url.SchemeIs("https")))
36 return false;
37 if (rrh.mime_type != "text/html")
38 return false;
39 if (rrh.headers->response_code() != 200)
40 return false;
41 if (rrh.headers->RequiresValidation(
42 rrh.request_time,
43 rrh.response_time,
44 timer->GetTime() + prerender_duration))
45 return false;
46 return true;
47 }
48
49 } // namespace
50
51 PrerenderResourceHandler::Timer::~Timer() {
52 }
53
54 PrerenderResourceHandler* PrerenderResourceHandler::MaybeCreate(
55 const net::URLRequest& request,
56 ChromeURLRequestContext* context,
57 ResourceHandler* next_handler) {
58 if (!context || !context->prerender_manager())
59 return NULL;
60 if (!(request.load_flags() & net::LOAD_PREFETCH))
61 return NULL;
62 if (request.method() != "GET")
63 return NULL;
64 return new PrerenderResourceHandler(next_handler,
65 context->prerender_manager());
66 }
67
68 PrerenderResourceHandler::PrerenderResourceHandler(
69 ResourceHandler* next_handler,
70 PrerenderManager* prerender_manager)
71 : next_handler_(next_handler),
72 prerender_manager_(prerender_manager),
73 ALLOW_THIS_IN_INITIALIZER_LIST(
74 prerender_callback_(NewCallback(
75 this, &PrerenderResourceHandler::StartPrerender))),
76 timer_(new StandardTimer()),
77 prerender_duration_(
78 base::TimeDelta::FromSeconds(kDefaultPrerenderDurationSeconds)) {
79 DCHECK(next_handler);
80 DCHECK(prerender_manager);
81 }
82
83 // This constructor is only used from unit tests.
84 PrerenderResourceHandler::PrerenderResourceHandler(
85 ResourceHandler* next_handler,
86 PrerenderCallback* callback)
87 : next_handler_(next_handler),
88 prerender_callback_(callback),
89 timer_(new StandardTimer()),
90 prerender_duration_(
91 base::TimeDelta::FromSeconds(kDefaultPrerenderDurationSeconds)) {
92 DCHECK(next_handler);
93 DCHECK(callback);
94 }
95
96 PrerenderResourceHandler::~PrerenderResourceHandler() {
97 }
98
99 bool PrerenderResourceHandler::OnUploadProgress(int request_id,
100 uint64 position,
101 uint64 size) {
102 return next_handler_->OnUploadProgress(request_id, position, size);
103 }
104
105 bool PrerenderResourceHandler::OnRequestRedirected(int request_id,
106 const GURL& url,
107 ResourceResponse* response,
108 bool* defer) {
109 bool will_redirect = next_handler_->OnRequestRedirected(
110 request_id, url, response, defer);
111 if (will_redirect)
112 url_ = url;
113 return will_redirect;
114 }
115
116 bool PrerenderResourceHandler::OnResponseStarted(int request_id,
117 ResourceResponse* response) {
118 if (ShouldPrerender(url_,
119 response,
120 timer_.get(),
121 prerender_duration_)) {
122 BrowserThread::PostTask(
123 BrowserThread::UI,
124 FROM_HERE,
125 NewRunnableMethod(
126 this,
127 &PrerenderResourceHandler::RunCallbackFromUIThread,
128 url_));
129 }
130 return next_handler_->OnResponseStarted(request_id, response);
131 }
132
133 bool PrerenderResourceHandler::OnWillStart(int request_id,
134 const GURL& url,
135 bool* defer) {
136 bool will_start = next_handler_->OnWillStart(request_id, url, defer);
137 if (will_start)
138 url_ = url;
139 return will_start;
140 }
141
142 bool PrerenderResourceHandler::OnWillRead(int request_id,
143 net::IOBuffer** buf,
144 int* buf_size,
145 int min_size) {
146 return next_handler_->OnWillRead(request_id, buf, buf_size, min_size);
147 }
148
149 bool PrerenderResourceHandler::OnReadCompleted(int request_id,
150 int* bytes_read) {
151 return next_handler_->OnReadCompleted(request_id, bytes_read);
152 }
153
154 bool PrerenderResourceHandler::OnResponseCompleted(
155 int request_id,
156 const URLRequestStatus& status,
157 const std::string& security_info) {
158 return next_handler_->OnResponseCompleted(request_id, status, security_info);
159 }
160
161 void PrerenderResourceHandler::OnRequestClosed() {
162 next_handler_->OnRequestClosed();
163 }
164
165 void PrerenderResourceHandler::RunCallbackFromUIThread(const GURL& url) {
166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
167 prerender_callback_->Run(url);
168 }
169
170 void PrerenderResourceHandler::StartPrerender(const GURL& url) {
171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
172 prerender_manager_->AddPreload(url);
173 }
174
175 void PrerenderResourceHandler::set_timer(Timer* timer) {
176 DCHECK(timer);
177 timer_.reset(timer);
178 }
179
180 void PrerenderResourceHandler::set_prerender_duration(base::TimeDelta dt) {
181 prerender_duration_ = dt;
182 }
183
184 // Note: this should stay in line with prerendermanager
185 // static
186 const int PrerenderResourceHandler::kDefaultPrerenderDurationSeconds = 20;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698