Chromium Code Reviews| 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_; |