summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-17 20:03:07 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-17 20:03:07 +0000
commitf4dda48296102f4401ecf82c6dbd91c706cb6ecd (patch)
treeb5a49a20431706013a8f82edf73670b00593d7ad /chrome/browser/prerender
parent4c1170fc4c576c74bf9dfaa400cdfdfb255f65bb (diff)
downloadchromium_src-f4dda48296102f4401ecf82c6dbd91c706cb6ecd.zip
chromium_src-f4dda48296102f4401ecf82c6dbd91c706cb6ecd.tar.gz
chromium_src-f4dda48296102f4401ecf82c6dbd91c706cb6ecd.tar.bz2
Eliminate ResourceDispatcherHostDelegate::ShouldDeferStart in favor of ResourceThrottle.
Also, eliminates direct use of ResourceDispatcherHost::{CancelPendingRequest,StartDeferredRequest} in prerender_tracker.cc. Review URL: http://codereview.chromium.org/9384028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@122560 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r--chrome/browser/prerender/prerender_resource_throttle.cc42
-rw-r--r--chrome/browser/prerender/prerender_resource_throttle.h49
-rw-r--r--chrome/browser/prerender/prerender_tracker.cc30
-rw-r--r--chrome/browser/prerender/prerender_tracker.h9
4 files changed, 104 insertions, 26 deletions
diff --git a/chrome/browser/prerender/prerender_resource_throttle.cc b/chrome/browser/prerender/prerender_resource_throttle.cc
new file mode 100644
index 0000000..df4be12
--- /dev/null
+++ b/chrome/browser/prerender/prerender_resource_throttle.cc
@@ -0,0 +1,42 @@
+// Copyright (c) 2012 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_throttle.h"
+
+#include "base/bind.h"
+#include "chrome/browser/prerender/prerender_tracker.h"
+#include "content/public/browser/resource_throttle_controller.h"
+#include "net/url_request/url_request.h"
+
+namespace prerender {
+
+PrerenderResourceThrottle::PrerenderResourceThrottle(
+ PrerenderTracker* prerender_tracker,
+ const net::URLRequest* request,
+ int child_id,
+ int route_id)
+ : prerender_tracker_(prerender_tracker),
+ request_(request),
+ child_id_(child_id),
+ route_id_(route_id) {
+}
+
+PrerenderResourceThrottle::~PrerenderResourceThrottle() {
+}
+
+void PrerenderResourceThrottle::WillStartRequest(bool* defer) {
+ *defer = prerender_tracker_->PotentiallyDelayRequestOnIOThread(
+ request_->url(), child_id_, route_id_,
+ base::Bind(&PrerenderResourceThrottle::ContinueRequest, AsWeakPtr()));
+}
+
+void PrerenderResourceThrottle::ContinueRequest(bool proceed) {
+ if (proceed) {
+ controller()->Resume();
+ } else {
+ controller()->Cancel();
+ }
+}
+
+} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_resource_throttle.h b/chrome/browser/prerender/prerender_resource_throttle.h
new file mode 100644
index 0000000..e6fc3ae
--- /dev/null
+++ b/chrome/browser/prerender/prerender_resource_throttle.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2012 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.
+
+#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_THROTTLE_H_
+#define CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_THROTTLE_H_
+#pragma once
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/resource_throttle.h"
+
+namespace net {
+class URLRequest;
+}
+
+namespace prerender {
+class PrerenderTracker;
+
+class PrerenderResourceThrottle
+ : public content::ResourceThrottle,
+ public base::SupportsWeakPtr<PrerenderResourceThrottle> {
+ public:
+ PrerenderResourceThrottle(PrerenderTracker* prerender_tracker,
+ const net::URLRequest* request,
+ int child_id,
+ int route_id);
+
+ // content::ResourceThrottle implementation:
+ virtual void WillStartRequest(bool* defer) OVERRIDE;
+
+ private:
+ virtual ~PrerenderResourceThrottle();
+
+ void ContinueRequest(bool proceed);
+
+ PrerenderTracker* prerender_tracker_;
+ const net::URLRequest* request_;
+ int child_id_;
+ int route_id_;
+ int request_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrerenderResourceThrottle);
+};
+
+} // namespace prerender
+
+#endif // CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_THROTTLE_H_
diff --git a/chrome/browser/prerender/prerender_tracker.cc b/chrome/browser/prerender/prerender_tracker.cc
index b82be79..8672762 100644
--- a/chrome/browser/prerender/prerender_tracker.cc
+++ b/chrome/browser/prerender/prerender_tracker.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -20,16 +20,6 @@ namespace prerender {
namespace {
-void CancelDeferredRequestOnIOThread(int child_id, int request_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- ResourceDispatcherHost::Get()->CancelRequest(child_id, request_id, false);
-}
-
-void StartDeferredRequestOnIOThread(int child_id, int request_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- ResourceDispatcherHost::Get()->StartDeferredRequest(child_id, request_id);
-}
-
bool ShouldCancelRequest(
int child_id,
int route_id) {
@@ -53,17 +43,11 @@ bool ShouldCancelRequest(
void HandleDelayedRequestOnUIThread(
int child_id,
int route_id,
- int request_id) {
+ const PrerenderTracker::CheckURLCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (ShouldCancelRequest(child_id, route_id)) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&CancelDeferredRequestOnIOThread, child_id, request_id));
- } else {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&StartDeferredRequestOnIOThread, child_id, request_id));
- }
+ bool should_cancel = ShouldCancelRequest(child_id, route_id);
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE, base::Bind(callback, !should_cancel));
}
void DestroyPrerenderForRenderViewOnUI(
@@ -189,7 +173,7 @@ bool PrerenderTracker::PotentiallyDelayRequestOnIOThread(
const GURL& gurl,
int process_id,
int route_id,
- int request_id) {
+ const CheckURLCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!url_counter_.MatchesURL(gurl))
return false;
@@ -197,7 +181,7 @@ bool PrerenderTracker::PotentiallyDelayRequestOnIOThread(
BrowserThread::UI,
FROM_HERE,
base::Bind(&HandleDelayedRequestOnUIThread, process_id, route_id,
- request_id));
+ callback));
return true;
}
diff --git a/chrome/browser/prerender/prerender_tracker.h b/chrome/browser/prerender/prerender_tracker.h
index 5a3e138..56d5dff 100644
--- a/chrome/browser/prerender/prerender_tracker.h
+++ b/chrome/browser/prerender/prerender_tracker.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -47,6 +47,8 @@ class URLCounter : public base::NonThreadSafe {
// and can be modified on any thread.
class PrerenderTracker {
public:
+ typedef base::Callback<void(bool /* proceed */)> CheckURLCallback;
+
PrerenderTracker();
~PrerenderTracker();
@@ -78,12 +80,13 @@ class PrerenderTracker {
FinalStatus final_status);
// Potentially delay a resource request on the IO thread to prevent a double
- // get.
+ // get. When this method returns true, the callback will be run later to
+ // indicate if the request should be allowed or canceled.
bool PotentiallyDelayRequestOnIOThread(
const GURL& gurl,
int child_id,
int route_id,
- int request_id);
+ const CheckURLCallback& callback);
void AddPrerenderURLOnUIThread(const GURL& url);
void RemovePrerenderURLsOnUIThread(const std::vector<GURL>& urls);