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 |