Index: chrome/browser/prerender/prerender_resource_handler.cc |
diff --git a/chrome/browser/prerender/prerender_resource_handler.cc b/chrome/browser/prerender/prerender_resource_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7d1eccea9f02d3d9135318298017a722638460a3 |
--- /dev/null |
+++ b/chrome/browser/prerender/prerender_resource_handler.cc |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/prerender/prerender_resource_handler.h" |
+ |
+#include "chrome/common/resource_response.h" |
+#include "net/base/load_flags.h" |
+#include "net/http/http_response_headers.h" |
+#include "net/url_request/url_request.h" |
+ |
+PrerenderResourceHandler::PrerenderResourceHandler( |
+ ResourceHandler* next_handler, |
+ PrerenderManager* prerender_manager) |
+ : next_handler_(next_handler), |
+ prerender_manager_(prerender_manager), |
+ ALLOW_THIS_IN_INITIALIZER_LIST( |
+ prerender_callback_(NewCallback( |
+ this, &PrerenderResourceHandler::StartPrerender))) { |
+ DCHECK(next_handler); |
+ DCHECK(prerender_manager); |
+} |
+ |
+// This constructor is only used from unit tests. |
+PrerenderResourceHandler::PrerenderResourceHandler( |
+ ResourceHandler* next_handler, |
+ PrerenderCallback* callback) |
+ : next_handler_(next_handler), |
+ prerender_callback_(callback) { |
+ DCHECK(next_handler); |
+ } |
+ |
+PrerenderResourceHandler::~PrerenderResourceHandler() { |
+} |
+ |
+bool PrerenderResourceHandler::OnUploadProgress(int request_id, |
+ uint64 position, |
+ uint64 size) { |
+ return next_handler_->OnUploadProgress(request_id, position, size); |
+} |
+ |
+bool PrerenderResourceHandler::OnRequestRedirected(int request_id, |
+ const GURL& url, |
+ ResourceResponse* response, |
+ bool* defer) { |
+ bool will_redirect = next_handler_->OnRequestRedirected( |
+ request_id, url, response, defer); |
+ if (will_redirect) |
+ url_ = url; |
+ return will_redirect; |
+} |
+ |
+bool PrerenderResourceHandler::OnResponseStarted(int request_id, |
+ ResourceResponse* response) { |
+ if (ShouldPrerender(url_, response)) { |
+ // DCHECK(url_.is_valid()); |
gavinp
2010/12/17 16:15:33
lose the comment.
cbentzel
2010/12/17 16:23:21
Done.
|
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ NewRunnableMethod( |
+ this, |
+ &PrerenderResourceHandler::RunCallbackFromUIThread, |
+ url_)); |
+ } |
+ return next_handler_->OnResponseStarted(request_id, response); |
+} |
+ |
+bool PrerenderResourceHandler::OnWillStart(int request_id, |
+ const GURL& url, |
+ bool* defer) { |
+ bool will_start = next_handler_->OnWillStart(request_id, url, defer); |
+ if (will_start) |
+ url_ = url; |
+ return will_start; |
+} |
+ |
+bool PrerenderResourceHandler::OnWillRead(int request_id, |
+ net::IOBuffer** buf, |
+ int* buf_size, |
+ int min_size) { |
+ return next_handler_->OnWillRead(request_id, buf, buf_size, min_size); |
+} |
+ |
+bool PrerenderResourceHandler::OnReadCompleted(int request_id, |
+ int* bytes_read) { |
+ return next_handler_->OnReadCompleted(request_id, bytes_read); |
+} |
+ |
+bool PrerenderResourceHandler::OnResponseCompleted( |
+ int request_id, |
+ const URLRequestStatus& status, |
+ const std::string& security_info) { |
+ return next_handler_->OnResponseCompleted(request_id, status, security_info); |
+} |
+ |
+void PrerenderResourceHandler::OnRequestClosed() { |
+ next_handler_->OnRequestClosed(); |
+} |
+ |
+void PrerenderResourceHandler::RunCallbackFromUIThread(const GURL& url) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ prerender_callback_->Run(url); |
+} |
+ |
+void PrerenderResourceHandler::StartPrerender(const GURL& url) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ prerender_manager_->AddPreload(url); |
+} |
+ |
+// static |
+bool PrerenderResourceHandler::CouldPrerender(const net::URLRequest* request) { |
+ return ((request->load_flags() & net::LOAD_PREFETCH) && |
+ request->method() == "GET"); |
+} |
+ |
+// static |
+bool PrerenderResourceHandler::ShouldPrerender( |
gavinp
2010/12/17 16:15:33
anon namespace?
cbentzel
2010/12/17 16:23:21
Huh? These are static methods on PrerenderResource
|
+ const GURL& url, |
+ const ResourceResponse* response) { |
+ return (url.is_valid() && |
+ (url.SchemeIs("http") || url.SchemeIs("https")) && |
+ response->response_head.headers && |
+ response->response_head.headers->response_code() == 200 && |
+ response->response_head.mime_type == "text/html"); |
+} |
+ |