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 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 seen_target_route_id_(false), | 1061 seen_target_route_id_(false), |
1062 swap_successful_(false), | 1062 swap_successful_(false), |
1063 weak_factory_(this) { | 1063 weak_factory_(this) { |
1064 } | 1064 } |
1065 | 1065 |
1066 PrerenderManager::PendingSwap::~PendingSwap() { | 1066 PrerenderManager::PendingSwap::~PendingSwap() { |
1067 manager_->prerender_tracker()->RemovePrerenderPendingSwap( | 1067 manager_->prerender_tracker()->RemovePrerenderPendingSwap( |
1068 target_route_id_, swap_successful_); | 1068 target_route_id_, swap_successful_); |
1069 } | 1069 } |
1070 | 1070 |
1071 WebContents* PrerenderManager::PendingSwap::target_contents() const { | |
1072 return web_contents(); | |
1073 } | |
1074 | |
1075 void PrerenderManager::PendingSwap::BeginSwap() { | 1071 void PrerenderManager::PendingSwap::BeginSwap() { |
1076 if (g_hang_session_storage_merges_for_testing) | 1072 if (g_hang_session_storage_merges_for_testing) |
1077 return; | 1073 return; |
1078 | 1074 |
1079 SessionStorageNamespace* target_namespace = | 1075 SessionStorageNamespace* target_namespace = |
1080 target_contents()->GetController().GetDefaultSessionStorageNamespace(); | 1076 web_contents()->GetController().GetDefaultSessionStorageNamespace(); |
1081 SessionStorageNamespace* prerender_namespace = | 1077 SessionStorageNamespace* prerender_namespace = |
1082 prerender_data_->contents()->GetSessionStorageNamespace(); | 1078 prerender_data_->contents()->GetSessionStorageNamespace(); |
1083 | 1079 |
1084 prerender_namespace->Merge( | 1080 prerender_namespace->Merge( |
1085 true, prerender_data_->contents()->child_id(), | 1081 true, prerender_data_->contents()->child_id(), |
1086 target_namespace, | 1082 target_namespace, |
1087 base::Bind(&PrerenderManager::PendingSwap::OnMergeCompleted, | 1083 base::Bind(&PrerenderManager::PendingSwap::OnMergeCompleted, |
1088 weak_factory_.GetWeakPtr())); | 1084 weak_factory_.GetWeakPtr())); |
1089 | 1085 |
1090 merge_timeout_.Start( | 1086 merge_timeout_.Start( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPPING_IN); | 1187 RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPPING_IN); |
1192 | 1188 |
1193 // Note that SwapInternal will, on success, delete |prerender_data_| and | 1189 // Note that SwapInternal will, on success, delete |prerender_data_| and |
1194 // |this|. It will also delete |this| in some failure cases. Pass in a new | 1190 // |this|. It will also delete |this| in some failure cases. Pass in a new |
1195 // GURL object rather than a reference to |url_|. Also hold on to |manager_| | 1191 // GURL object rather than a reference to |url_|. Also hold on to |manager_| |
1196 // and |prerender_data_|. | 1192 // and |prerender_data_|. |
1197 // | 1193 // |
1198 // TODO(davidben): Can we make this less fragile? | 1194 // TODO(davidben): Can we make this less fragile? |
1199 PrerenderManager* manager = manager_; | 1195 PrerenderManager* manager = manager_; |
1200 PrerenderData* prerender_data = prerender_data_; | 1196 PrerenderData* prerender_data = prerender_data_; |
1201 WebContents* new_web_contents = manager_->SwapInternal( | 1197 WebContents* new_web_contents = |
1202 GURL(url_), target_contents(), prerender_data_, | 1198 manager_->SwapInternal(GURL(url_), |
1203 should_replace_current_entry_); | 1199 web_contents(), |
| 1200 prerender_data_, |
| 1201 should_replace_current_entry_); |
1204 if (!new_web_contents) { | 1202 if (!new_web_contents) { |
1205 manager->RecordEvent(prerender_data->contents(), | 1203 manager->RecordEvent(prerender_data->contents(), |
1206 PRERENDER_EVENT_MERGE_RESULT_SWAPIN_FAILED); | 1204 PRERENDER_EVENT_MERGE_RESULT_SWAPIN_FAILED); |
1207 // Depending on whether SwapInternal called Destroy() or simply failed to | 1205 // Depending on whether SwapInternal called Destroy() or simply failed to |
1208 // swap, |this| may or may not be deleted. Either way, if the swap failed, | 1206 // swap, |this| may or may not be deleted. Either way, if the swap failed, |
1209 // |prerender_data| is deleted asynchronously, so this call is a no-op if | 1207 // |prerender_data| is deleted asynchronously, so this call is a no-op if |
1210 // |this| is already gone. | 1208 // |this| is already gone. |
1211 prerender_data->ClearPendingSwap(); | 1209 prerender_data->ClearPendingSwap(); |
1212 } | 1210 } |
1213 } | 1211 } |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1495 } | 1493 } |
1496 return NULL; | 1494 return NULL; |
1497 } | 1495 } |
1498 | 1496 |
1499 PrerenderManager::PrerenderData* | 1497 PrerenderManager::PrerenderData* |
1500 PrerenderManager::FindPrerenderDataForTargetContents( | 1498 PrerenderManager::FindPrerenderDataForTargetContents( |
1501 WebContents* target_contents) { | 1499 WebContents* target_contents) { |
1502 for (ScopedVector<PrerenderData>::iterator it = active_prerenders_.begin(); | 1500 for (ScopedVector<PrerenderData>::iterator it = active_prerenders_.begin(); |
1503 it != active_prerenders_.end(); ++it) { | 1501 it != active_prerenders_.end(); ++it) { |
1504 if ((*it)->pending_swap() && | 1502 if ((*it)->pending_swap() && |
1505 (*it)->pending_swap()->target_contents() == target_contents) | 1503 (*it)->pending_swap()->web_contents() == target_contents) |
1506 return *it; | 1504 return *it; |
1507 } | 1505 } |
1508 return NULL; | 1506 return NULL; |
1509 } | 1507 } |
1510 | 1508 |
1511 ScopedVector<PrerenderManager::PrerenderData>::iterator | 1509 ScopedVector<PrerenderManager::PrerenderData>::iterator |
1512 PrerenderManager::FindIteratorForPrerenderContents( | 1510 PrerenderManager::FindIteratorForPrerenderContents( |
1513 PrerenderContents* prerender_contents) { | 1511 PrerenderContents* prerender_contents) { |
1514 for (ScopedVector<PrerenderData>::iterator it = active_prerenders_.begin(); | 1512 for (ScopedVector<PrerenderData>::iterator it = active_prerenders_.begin(); |
1515 it != active_prerenders_.end(); ++it) { | 1513 it != active_prerenders_.end(); ++it) { |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1902 content::RenderProcessHost* host) { | 1900 content::RenderProcessHost* host) { |
1903 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1901 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1904 prerender_process_hosts_.erase(host); | 1902 prerender_process_hosts_.erase(host); |
1905 BrowserThread::PostTask( | 1903 BrowserThread::PostTask( |
1906 BrowserThread::IO, FROM_HERE, | 1904 BrowserThread::IO, FROM_HERE, |
1907 base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread, | 1905 base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread, |
1908 base::Unretained(prerender_tracker()), host->GetID(), false)); | 1906 base::Unretained(prerender_tracker()), host->GetID(), false)); |
1909 } | 1907 } |
1910 | 1908 |
1911 } // namespace prerender | 1909 } // namespace prerender |
OLD | NEW |