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