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); |