| Index: chrome/browser/prerender/prerender_manager.cc
|
| ===================================================================
|
| --- chrome/browser/prerender/prerender_manager.cc (revision 85771)
|
| +++ 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"
|
| @@ -378,9 +379,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();
|
| }
|
| @@ -427,6 +426,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());
|
| @@ -435,11 +444,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);
|
| @@ -519,6 +523,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());
|
| @@ -527,11 +541,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);
|
|
|