| 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..dd5e7c83d50e0e0f2f2a8864817be6e3188cbd60 100644
|
| --- a/chrome/browser/prerender/prerender_manager.cc
|
| +++ b/chrome/browser/prerender/prerender_manager.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/logging.h"
|
| +#include "base/metrics/histogram.h"
|
| #include "base/stl_util.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -79,18 +80,28 @@ const int kHistoryLength = 100;
|
|
|
| } // namespace
|
|
|
| -class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
|
| +class PrerenderManager::OnCloseTabContentsDeleter
|
| + : public TabContentsDelegate,
|
| + public SupportsWeakPtr<PrerenderManager::OnCloseTabContentsDeleter> {
|
| public:
|
| OnCloseTabContentsDeleter(PrerenderManager* manager,
|
| TabContentsWrapper* tab)
|
| : manager_(manager),
|
| tab_(tab) {
|
| tab_->tab_contents()->set_delegate(this);
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + base::Bind(&OnCloseTabContentsDeleter::ScheduleTabContentsForDeletion,
|
| + 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 +109,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_;
|
|
|
|
|