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

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

Issue 7017014: Fix issues when PrerenderContents::Destroy() is called during TabContents destruction. (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_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.
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698