| 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 |