summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-20 15:05:08 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-20 15:05:08 +0000
commit28a05f3af8c3031d23b55630d811fc5c18505a3c (patch)
treecb4691e3b846236408c45695b72051412f68dbf3 /content
parent2937a8c72bfd28188ccd0b3f3b54bc3303b5f537 (diff)
downloadchromium_src-28a05f3af8c3031d23b55630d811fc5c18505a3c.zip
chromium_src-28a05f3af8c3031d23b55630d811fc5c18505a3c.tar.gz
chromium_src-28a05f3af8c3031d23b55630d811fc5c18505a3c.tar.bz2
Safely cancel prerenders on threads other than the UI thread.
Previously, prerendering was cancelled on the IO thread by not doing something, and then passing a task to the UI thread to abort the prerender. This resulted in a race which could result in swapping in the prerender before the task was executed. This fixes that. BUG=83062 TEST=PrerenderStatusManagerTests, PrerenderBrowserTests Review URL: http://codereview.chromium.org/7038012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86082 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/DEPS1
-rw-r--r--content/browser/renderer_host/resource_dispatcher_host.cc42
-rw-r--r--content/browser/renderer_host/resource_dispatcher_host.h11
3 files changed, 10 insertions, 44 deletions
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 055ff1a..5678284 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -62,6 +62,7 @@ include_rules = [
# http://crbug.com/77090
"+chrome/browser/prerender/prerender_manager.h",
+ "+chrome/browser/prerender/prerender_tracker.h",
# http://crbug.com/76788
"+chrome/browser/profiles/profile.h",
diff --git a/content/browser/renderer_host/resource_dispatcher_host.cc b/content/browser/renderer_host/resource_dispatcher_host.cc
index 8fdc0c3..451f99e 100644
--- a/content/browser/renderer_host/resource_dispatcher_host.cc
+++ b/content/browser/renderer_host/resource_dispatcher_host.cc
@@ -26,6 +26,7 @@
#include "chrome/browser/external_protocol_handler.h"
#include "chrome/browser/net/url_request_tracking.h"
#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_tracker.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_host/download_resource_handler.h"
#include "chrome/browser/renderer_host/safe_browsing_resource_handler.h"
@@ -432,7 +433,9 @@ void ResourceDispatcherHost::BeginRequest(
}
const GURL referrer = MaybeStripReferrer(request_data.referrer);
- const bool is_prerendering = IsPrerenderingChildRoutePair(child_id, route_id);
+ const bool is_prerendering =
+ prerender::PrerenderTracker::GetInstance()->IsPrerenderingOnIOThread(
+ child_id, route_id);
// Handle a PREFETCH resource type. If prefetch is disabled, squelch the
// request. If prerendering is enabled, trigger a prerender for the URL
@@ -467,16 +470,11 @@ void ResourceDispatcherHost::BeginRequest(
// Abort any prerenders that spawn requests that use invalid HTTP methods.
if (is_prerendering &&
!prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- NewRunnableFunction(
- prerender::DestroyPreloadForRenderView,
- resource_context.prerender_manager(),
- child_id,
- route_id,
- prerender::FINAL_STATUS_INVALID_HTTP_METHOD));
- AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id);
- return;
+ if (prerender::PrerenderTracker::GetInstance()->TryCancelOnIOThread(
+ child_id, route_id, prerender::FINAL_STATUS_INVALID_HTTP_METHOD)) {
+ AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id);
+ return;
+ }
}
// Construct the event handler.
@@ -2036,28 +2034,6 @@ net::RequestPriority ResourceDispatcherHost::DetermineRequestPriority(
}
}
-void ResourceDispatcherHost::AddPrerenderChildRoutePair(int child_id,
- int route_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(!IsPrerenderingChildRoutePair(child_id, route_id));
- prerender_child_route_pairs_.insert(std::make_pair(child_id, route_id));
-}
-
-void ResourceDispatcherHost::RemovePrerenderChildRoutePair(int child_id,
- int route_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(IsPrerenderingChildRoutePair(child_id, route_id));
- prerender_child_route_pairs_.erase(std::make_pair(child_id, route_id));
-}
-
-bool ResourceDispatcherHost::IsPrerenderingChildRoutePair(int child_id,
- int route_id) const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- std::pair<int, int> c_r_pair = std::make_pair(child_id, route_id);
- return (prerender_child_route_pairs_.find(c_r_pair) !=
- prerender_child_route_pairs_.end());
-}
-
// static
bool ResourceDispatcherHost::is_prefetch_enabled() {
diff --git a/content/browser/renderer_host/resource_dispatcher_host.h b/content/browser/renderer_host/resource_dispatcher_host.h
index f7a5c64..f8643fe 100644
--- a/content/browser/renderer_host/resource_dispatcher_host.h
+++ b/content/browser/renderer_host/resource_dispatcher_host.h
@@ -244,14 +244,6 @@ class ResourceDispatcherHost : public net::URLRequest::Delegate {
static bool is_prefetch_enabled();
static void set_is_prefetch_enabled(bool value);
- void AddPrerenderChildRoutePair(int child_id, int route_id);
- void RemovePrerenderChildRoutePair(int child_id, int route_id);
-
- typedef std::set<std::pair<int, int> > PrerenderChildRouteIdPairs;
- const PrerenderChildRouteIdPairs& prerender_child_route_id_pairs() const {
- return prerender_child_route_pairs_;
- }
-
private:
FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
TestBlockedRequestsProcessDies);
@@ -384,8 +376,6 @@ class ResourceDispatcherHost : public net::URLRequest::Delegate {
const GURL& new_first_party_for_cookies);
void OnReleaseDownloadedFile(int request_id);
- bool IsPrerenderingChildRoutePair(int child_id, int route_id) const;
-
ResourceHandler* CreateSafeBrowsingResourceHandler(
ResourceHandler* handler, int child_id, int route_id,
ResourceType::Type resource_type);
@@ -487,7 +477,6 @@ class ResourceDispatcherHost : public net::URLRequest::Delegate {
ResourceMessageFilter* filter_;
static bool is_prefetch_enabled_;
- PrerenderChildRouteIdPairs prerender_child_route_pairs_;
DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost);