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

Unified Diff: chrome/browser/prerender/prerender_manager.cc

Issue 7038012: Safely cancel prerenders on threads other than the UI thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync Created 9 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_manager.cc
===================================================================
--- chrome/browser/prerender/prerender_manager.cc (revision 86075)
+++ chrome/browser/prerender/prerender_manager.cc (working copy)
@@ -14,6 +14,7 @@
#include "chrome/browser/favicon/favicon_tab_helper.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.h"
+#include "chrome/browser/prerender/prerender_tracker.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h"
@@ -390,9 +391,7 @@
PrerenderContentsData data = prerender_list_.front();
if (IsPrerenderElementFresh(data.start_time_))
return;
- prerender_list_.pop_front();
- data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT);
- delete data.contents_;
+ data.contents_->Destroy(FINAL_STATUS_TIMED_OUT);
}
MaybeStopSchedulingPeriodicCleanups();
}
@@ -439,6 +438,16 @@
return false;
}
+ int child_id, route_id;
+ CHECK(prerender_contents->GetChildId(&child_id));
+ CHECK(prerender_contents->GetRouteId(&route_id));
+
+ // Try to set the prerendered page as used, so any subsequent attempts to
+ // cancel on other threads will fail. If this fails because the prerender
+ // was already cancelled, possibly on another thread, fail.
+ if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id))
+ return false;
+
if (!prerender_contents->load_start_time().is_null())
RecordTimeUntilUsed(GetCurrentTimeTicks() -
prerender_contents->load_start_time());
@@ -447,11 +456,6 @@
++prerenders_per_session_count_);
prerender_contents->set_final_status(FINAL_STATUS_USED);
- int child_id;
- int route_id;
- CHECK(prerender_contents->GetChildId(&child_id));
- CHECK(prerender_contents->GetRouteId(&route_id));
-
RenderViewHost* render_view_host =
prerender_contents->render_view_host_mutable();
prerender_contents->set_render_view_host(NULL);
@@ -531,6 +535,16 @@
return false;
}
+ int child_id, route_id;
+ CHECK(prerender_contents->GetChildId(&child_id));
+ CHECK(prerender_contents->GetRouteId(&route_id));
+
+ // Try to set the prerendered page as used, so any subsequent attempts to
+ // cancel on other threads will fail. If this fails because the prerender
+ // was already cancelled, possibly on another thread, fail.
+ if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id))
+ return false;
+
if (!prerender_contents->load_start_time().is_null())
RecordTimeUntilUsed(GetCurrentTimeTicks() -
prerender_contents->load_start_time());
@@ -539,11 +553,6 @@
++prerenders_per_session_count_);
prerender_contents->set_final_status(FINAL_STATUS_USED);
- int child_id;
- int route_id;
- CHECK(prerender_contents->GetChildId(&child_id));
- CHECK(prerender_contents->GetRouteId(&route_id));
-
RenderViewHost* render_view_host =
prerender_contents->prerender_contents()->render_view_host();
DCHECK(render_view_host);

Powered by Google App Engine
This is Rietveld 408576698