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

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

Issue 8539027: Add SwappedOut to TabContentsDelegate to allow us to correctly delete TabContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix linux compile Created 9 years, 1 month 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
« no previous file with comments | « no previous file | content/browser/renderer_host/render_view_host.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/prerender/prerender_manager.cc
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index ebce46e6a110f93b577b985ec4197514186ad5eb..b68b022f3836bca35daec6c36f6ef45d1a6d7045 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -9,6 +9,8 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram.h"
#include "base/stl_util.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
@@ -79,18 +81,29 @@ const int kHistoryLength = 100;
} // namespace
-class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
+class PrerenderManager::OnCloseTabContentsDeleter
+ : public TabContentsDelegate,
+ public base::SupportsWeakPtr<
+ PrerenderManager::OnCloseTabContentsDeleter> {
public:
OnCloseTabContentsDeleter(PrerenderManager* manager,
TabContentsWrapper* tab)
: manager_(manager),
tab_(tab) {
tab_->tab_contents()->set_delegate(this);
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
cbentzel 2011/11/15 12:20:34 Why is this needed? Do the other mechanisms not gu
+ base::Bind(&OnCloseTabContentsDeleter::ScheduleTabContentsForDeletion,
cbentzel 2011/11/15 12:20:34 There's already some hang timers in RenderViewHost
dominich 2011/11/15 15:33:28 The hang timers didn't fire in this case as the RV
+ this->AsWeakPtr(), true), kDeleteWithExtremePrejudiceTimeMs);
}
virtual void CloseContents(TabContents* source) OVERRIDE {
- tab_->tab_contents()->set_delegate(NULL);
- manager_->ScheduleDeleteOldTabContents(tab_.release(), this);
+ DCHECK_EQ(tab_->tab_contents(), source);
+ ScheduleTabContentsForDeletion(false);
+ }
+
+ virtual void SwappedOut(TabContents* source) OVERRIDE {
+ DCHECK_EQ(tab_->tab_contents(), source);
+ ScheduleTabContentsForDeletion(false);
}
virtual bool ShouldSuppressDialogs() OVERRIDE {
@@ -98,6 +111,14 @@ class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
}
private:
+ static const int kDeleteWithExtremePrejudiceTimeMs = 3000;
+
+ void ScheduleTabContentsForDeletion(bool timeout) {
+ tab_->tab_contents()->set_delegate(NULL);
+ manager_->ScheduleDeleteOldTabContents(tab_.release(), this);
+ UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterTimeout", timeout);
+ }
+
PrerenderManager* manager_;
scoped_ptr<TabContentsWrapper> tab_;
« no previous file with comments | « no previous file | content/browser/renderer_host/render_view_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698