Index: chrome/browser/prerender/prerender_contents.cc |
=================================================================== |
--- chrome/browser/prerender/prerender_contents.cc (revision 86287) |
+++ chrome/browser/prerender/prerender_contents.cc (working copy) |
@@ -137,6 +137,7 @@ |
has_stopped_loading_(false), |
final_status_(FINAL_STATUS_MAX), |
prerendering_has_started_(false), |
+ prerendering_has_been_cancelled_(false), |
child_id_(-1), |
route_id_(-1) { |
DCHECK(prerender_manager != NULL); |
@@ -364,6 +365,9 @@ |
PrerenderContents::~PrerenderContents() { |
DCHECK(final_status_ != FINAL_STATUS_MAX); |
+ DCHECK(prerendering_has_been_cancelled_ || |
+ final_status_ == FINAL_STATUS_USED || |
+ final_status_ == FINAL_STATUS_CONTROL_GROUP); |
// If we haven't even started prerendering, we were just in the control |
// group, which means we do not want to record the status. |
@@ -710,9 +714,12 @@ |
} |
void PrerenderContents::Destroy(FinalStatus final_status) { |
- if (prerender_manager_->IsPendingDelete(this)) |
+ if (prerendering_has_been_cancelled_) |
return; |
+ prerendering_has_been_cancelled_ = true; |
+ prerender_manager_->MoveEntryToPendingDelete(this); |
cbentzel
2011/05/23 18:51:28
Is there a reason MoveEntryToPendingDelete moved u
mmenke
2011/05/23 18:55:36
Yes, it's just for style - prerender_has_been_canc
|
+ |
if (child_id_ != -1 && route_id_ != -1) { |
// Cancel the prerender in the PrerenderTracker. This is needed |
// because destroy may be called directly from the UI thread without calling |
@@ -730,9 +737,8 @@ |
NOTREACHED(); |
} |
} |
+ set_final_status(final_status); |
- prerender_manager_->MoveEntryToPendingDelete(this); |
- set_final_status(final_status); |
// We may destroy the PrerenderContents before we have initialized the |
// RenderViewHost. Otherwise set the Observer's PrerenderContents to NULL to |
// avoid any more messages being sent. |