| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/prerender/prerender_manager.h" | 5 #include "chrome/browser/prerender/prerender_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 suppressed_dialog_(false) { | 127 suppressed_dialog_(false) { |
| 128 tab_->SetDelegate(this); | 128 tab_->SetDelegate(this); |
| 129 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 129 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 130 FROM_HERE, | 130 FROM_HERE, |
| 131 base::Bind(&OnCloseWebContentsDeleter::ScheduleWebContentsForDeletion, | 131 base::Bind(&OnCloseWebContentsDeleter::ScheduleWebContentsForDeletion, |
| 132 AsWeakPtr(), true), | 132 AsWeakPtr(), true), |
| 133 base::TimeDelta::FromSeconds(kDeleteWithExtremePrejudiceSeconds)); | 133 base::TimeDelta::FromSeconds(kDeleteWithExtremePrejudiceSeconds)); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void CloseContents(WebContents* source) override { | 136 void CloseContents(WebContents* source) override { |
| 137 DCHECK_EQ(tab_, source); | 137 DCHECK_EQ(tab_.get(), source); |
| 138 ScheduleWebContentsForDeletion(false); | 138 ScheduleWebContentsForDeletion(false); |
| 139 } | 139 } |
| 140 | 140 |
| 141 void SwappedOut(WebContents* source) override { | 141 void SwappedOut(WebContents* source) override { |
| 142 DCHECK_EQ(tab_, source); | 142 DCHECK_EQ(tab_.get(), source); |
| 143 ScheduleWebContentsForDeletion(false); | 143 ScheduleWebContentsForDeletion(false); |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool ShouldSuppressDialogs(WebContents* source) override { | 146 bool ShouldSuppressDialogs(WebContents* source) override { |
| 147 // Use this as a proxy for getting statistics on how often we fail to honor | 147 // Use this as a proxy for getting statistics on how often we fail to honor |
| 148 // the beforeunload event. | 148 // the beforeunload event. |
| 149 DCHECK_EQ(tab_, source); | 149 DCHECK_EQ(tab_.get(), source); |
| 150 suppressed_dialog_ = true; | 150 suppressed_dialog_ = true; |
| 151 return true; | 151 return true; |
| 152 } | 152 } |
| 153 | 153 |
| 154 private: | 154 private: |
| 155 static const int kDeleteWithExtremePrejudiceSeconds = 3; | 155 static const int kDeleteWithExtremePrejudiceSeconds = 3; |
| 156 | 156 |
| 157 void ScheduleWebContentsForDeletion(bool timeout) { | 157 void ScheduleWebContentsForDeletion(bool timeout) { |
| 158 UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterTimeout", timeout); | 158 UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterTimeout", timeout); |
| 159 UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterSuppressedDialog", | 159 UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterSuppressedDialog", |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 } | 817 } |
| 818 }; | 818 }; |
| 819 | 819 |
| 820 PrerenderManager::PrerenderData::PrerenderData(PrerenderManager* manager, | 820 PrerenderManager::PrerenderData::PrerenderData(PrerenderManager* manager, |
| 821 PrerenderContents* contents, | 821 PrerenderContents* contents, |
| 822 base::TimeTicks expiry_time) | 822 base::TimeTicks expiry_time) |
| 823 : manager_(manager), | 823 : manager_(manager), |
| 824 contents_(contents), | 824 contents_(contents), |
| 825 handle_count_(0), | 825 handle_count_(0), |
| 826 expiry_time_(expiry_time) { | 826 expiry_time_(expiry_time) { |
| 827 DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); | 827 DCHECK(contents_); |
| 828 } | 828 } |
| 829 | 829 |
| 830 PrerenderManager::PrerenderData::~PrerenderData() { | 830 PrerenderManager::PrerenderData::~PrerenderData() { |
| 831 } | 831 } |
| 832 | 832 |
| 833 void PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement() { | 833 void PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement() { |
| 834 DCHECK(contents_); | 834 DCHECK(contents_); |
| 835 contents_->set_match_complete_status( | 835 contents_->set_match_complete_status( |
| 836 PrerenderContents::MATCH_COMPLETE_REPLACED); | 836 PrerenderContents::MATCH_COMPLETE_REPLACED); |
| 837 PrerenderData* to_delete = new PrerenderData(manager_, contents_.release(), | 837 PrerenderData* to_delete = new PrerenderData(manager_, contents_.release(), |
| 838 expiry_time_); | 838 expiry_time_); |
| 839 contents_.reset(to_delete->contents_->CreateMatchCompleteReplacement()); | 839 contents_.reset(to_delete->contents_->CreateMatchCompleteReplacement()); |
| 840 manager_->to_delete_prerenders_.push_back(to_delete); | 840 manager_->to_delete_prerenders_.push_back(to_delete); |
| 841 } | 841 } |
| 842 | 842 |
| 843 void PrerenderManager::PrerenderData::OnHandleCreated(PrerenderHandle* handle) { | 843 void PrerenderManager::PrerenderData::OnHandleCreated(PrerenderHandle* handle) { |
| 844 DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); | 844 DCHECK(contents_); |
| 845 ++handle_count_; | 845 ++handle_count_; |
| 846 contents_->AddObserver(handle); | 846 contents_->AddObserver(handle); |
| 847 } | 847 } |
| 848 | 848 |
| 849 void PrerenderManager::PrerenderData::OnHandleNavigatedAway( | 849 void PrerenderManager::PrerenderData::OnHandleNavigatedAway( |
| 850 PrerenderHandle* handle) { | 850 PrerenderHandle* handle) { |
| 851 DCHECK_LT(0, handle_count_); | 851 DCHECK_LT(0, handle_count_); |
| 852 DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); | 852 DCHECK(contents_); |
| 853 if (abandon_time_.is_null()) | 853 if (abandon_time_.is_null()) |
| 854 abandon_time_ = base::TimeTicks::Now(); | 854 abandon_time_ = base::TimeTicks::Now(); |
| 855 // We intentionally don't decrement the handle count here, so that the | 855 // We intentionally don't decrement the handle count here, so that the |
| 856 // prerender won't be canceled until it times out. | 856 // prerender won't be canceled until it times out. |
| 857 manager_->SourceNavigatedAway(this); | 857 manager_->SourceNavigatedAway(this); |
| 858 } | 858 } |
| 859 | 859 |
| 860 void PrerenderManager::PrerenderData::OnHandleCanceled( | 860 void PrerenderManager::PrerenderData::OnHandleCanceled( |
| 861 PrerenderHandle* handle) { | 861 PrerenderHandle* handle) { |
| 862 DCHECK_LT(0, handle_count_); | 862 DCHECK_LT(0, handle_count_); |
| 863 DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); | 863 DCHECK(contents_); |
| 864 | 864 |
| 865 if (--handle_count_ == 0) { | 865 if (--handle_count_ == 0) { |
| 866 // This will eventually remove this object from active_prerenders_. | 866 // This will eventually remove this object from active_prerenders_. |
| 867 contents_->Destroy(FINAL_STATUS_CANCELLED); | 867 contents_->Destroy(FINAL_STATUS_CANCELLED); |
| 868 } | 868 } |
| 869 } | 869 } |
| 870 | 870 |
| 871 PrerenderContents* PrerenderManager::PrerenderData::ReleaseContents() { | 871 PrerenderContents* PrerenderManager::PrerenderData::ReleaseContents() { |
| 872 return contents_.release(); | 872 return contents_.release(); |
| 873 } | 873 } |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 } | 1286 } |
| 1287 | 1287 |
| 1288 void PrerenderManager::RenderProcessHostDestroyed( | 1288 void PrerenderManager::RenderProcessHostDestroyed( |
| 1289 content::RenderProcessHost* host) { | 1289 content::RenderProcessHost* host) { |
| 1290 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1290 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1291 size_t erased = prerender_process_hosts_.erase(host); | 1291 size_t erased = prerender_process_hosts_.erase(host); |
| 1292 DCHECK_EQ(1u, erased); | 1292 DCHECK_EQ(1u, erased); |
| 1293 } | 1293 } |
| 1294 | 1294 |
| 1295 } // namespace prerender | 1295 } // namespace prerender |
| OLD | NEW |