OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/browser/frame_host/navigation_controller_impl.h" | 5 #include "content/browser/frame_host/navigation_controller_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" // Temporary | 10 #include "base/strings/string_number_conversions.h" // Temporary |
(...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 | 1222 |
1223 // Copy the max page id map from the old tab to the new tab. This ensures | 1223 // Copy the max page id map from the old tab to the new tab. This ensures |
1224 // that new and existing navigations in the tab's current SiteInstances | 1224 // that new and existing navigations in the tab's current SiteInstances |
1225 // are identified properly. | 1225 // are identified properly. |
1226 delegate_->CopyMaxPageIDsFrom(source.delegate()->GetWebContents()); | 1226 delegate_->CopyMaxPageIDsFrom(source.delegate()->GetWebContents()); |
1227 } | 1227 } |
1228 | 1228 |
1229 void NavigationControllerImpl::CopyStateFromAndPrune( | 1229 void NavigationControllerImpl::CopyStateFromAndPrune( |
1230 NavigationController* temp) { | 1230 NavigationController* temp) { |
1231 // It is up to callers to check the invariants before calling this. | 1231 // It is up to callers to check the invariants before calling this. |
1232 CHECK(CanPruneAllButVisible()); | 1232 CHECK(CanPruneAllButLastCommitted()); |
1233 | 1233 |
1234 NavigationControllerImpl* source = | 1234 NavigationControllerImpl* source = |
1235 static_cast<NavigationControllerImpl*>(temp); | 1235 static_cast<NavigationControllerImpl*>(temp); |
1236 // The SiteInstance and page_id of the last committed entry needs to be | 1236 // The SiteInstance and page_id of the last committed entry needs to be |
1237 // remembered at this point, in case there is only one committed entry | 1237 // remembered at this point, in case there is only one committed entry |
1238 // and it is pruned. We use a scoped_refptr to ensure the SiteInstance | 1238 // and it is pruned. We use a scoped_refptr to ensure the SiteInstance |
1239 // can't be freed during this time period. | 1239 // can't be freed during this time period. |
1240 NavigationEntryImpl* last_committed = | 1240 NavigationEntryImpl* last_committed = |
1241 NavigationEntryImpl::FromNavigationEntry(GetLastCommittedEntry()); | 1241 NavigationEntryImpl::FromNavigationEntry(GetLastCommittedEntry()); |
1242 scoped_refptr<SiteInstance> site_instance( | 1242 scoped_refptr<SiteInstance> site_instance( |
1243 last_committed->site_instance()); | 1243 last_committed->site_instance()); |
1244 int32 minimum_page_id = last_committed->GetPageID(); | 1244 int32 minimum_page_id = last_committed->GetPageID(); |
1245 int32 max_page_id = | 1245 int32 max_page_id = |
1246 delegate_->GetMaxPageIDForSiteInstance(site_instance.get()); | 1246 delegate_->GetMaxPageIDForSiteInstance(site_instance.get()); |
1247 | 1247 |
1248 // Remove all the entries leaving the active entry. | 1248 // Remove all the entries leaving the active entry. |
1249 PruneAllButVisibleInternal(); | 1249 PruneAllButLastCommittedInternal(); |
1250 | 1250 |
1251 // We now have one entry, possibly with a new pending entry. Ensure that | 1251 // We now have one entry, possibly with a new pending entry. Ensure that |
1252 // adding the entries from source won't put us over the limit. | 1252 // adding the entries from source won't put us over the limit. |
1253 DCHECK_EQ(1, GetEntryCount()); | 1253 DCHECK_EQ(1, GetEntryCount()); |
1254 source->PruneOldestEntryIfFull(); | 1254 source->PruneOldestEntryIfFull(); |
1255 | 1255 |
1256 // Insert the entries from source. Don't use source->GetCurrentEntryIndex as | 1256 // Insert the entries from source. Don't use source->GetCurrentEntryIndex as |
1257 // we don't want to copy over the transient entry. Ignore any pending entry, | 1257 // we don't want to copy over the transient entry. Ignore any pending entry, |
1258 // since it has not committed in source. | 1258 // since it has not committed in source. |
1259 int max_source_index = source->last_committed_entry_index_; | 1259 int max_source_index = source->last_committed_entry_index_; |
(...skipping 16 matching lines...) Expand all Loading... |
1276 delegate_->CopyMaxPageIDsFrom(source->delegate()->GetWebContents()); | 1276 delegate_->CopyMaxPageIDsFrom(source->delegate()->GetWebContents()); |
1277 | 1277 |
1278 // If there is a last committed entry, be sure to include it in the new | 1278 // If there is a last committed entry, be sure to include it in the new |
1279 // max page ID map. | 1279 // max page ID map. |
1280 if (max_page_id > -1) { | 1280 if (max_page_id > -1) { |
1281 delegate_->UpdateMaxPageIDForSiteInstance(site_instance.get(), | 1281 delegate_->UpdateMaxPageIDForSiteInstance(site_instance.get(), |
1282 max_page_id); | 1282 max_page_id); |
1283 } | 1283 } |
1284 } | 1284 } |
1285 | 1285 |
1286 bool NavigationControllerImpl::CanPruneAllButVisible() { | 1286 bool NavigationControllerImpl::CanPruneAllButLastCommitted() { |
1287 // If there is no last committed entry, we cannot prune. Even if there is a | 1287 // If there is no last committed entry, we cannot prune. Even if there is a |
1288 // pending entry, it may not commit, leaving this WebContents blank, despite | 1288 // pending entry, it may not commit, leaving this WebContents blank, despite |
1289 // possibly giving it new entries via CopyStateFromAndPrune. | 1289 // possibly giving it new entries via CopyStateFromAndPrune. |
1290 if (last_committed_entry_index_ == -1) | 1290 if (last_committed_entry_index_ == -1) |
1291 return false; | 1291 return false; |
1292 | 1292 |
1293 // We cannot prune if there is a pending entry at an existing entry index. | 1293 // We cannot prune if there is a pending entry at an existing entry index. |
1294 // It may not commit, so we have to keep the last committed entry, and thus | 1294 // It may not commit, so we have to keep the last committed entry, and thus |
1295 // there is no sensible place to keep the pending entry. It is ok to have | 1295 // there is no sensible place to keep the pending entry. It is ok to have |
1296 // a new pending entry, which can optionally commit as a new navigation. | 1296 // a new pending entry, which can optionally commit as a new navigation. |
1297 if (pending_entry_index_ != -1) | 1297 if (pending_entry_index_ != -1) |
1298 return false; | 1298 return false; |
1299 | 1299 |
1300 // We should not prune if we are currently showing a transient entry. | 1300 // We should not prune if we are currently showing a transient entry. |
1301 if (transient_entry_index_ != -1) | 1301 if (transient_entry_index_ != -1) |
1302 return false; | 1302 return false; |
1303 | 1303 |
1304 return true; | 1304 return true; |
1305 } | 1305 } |
1306 | 1306 |
1307 void NavigationControllerImpl::PruneAllButVisible() { | 1307 void NavigationControllerImpl::PruneAllButLastCommitted() { |
1308 PruneAllButVisibleInternal(); | 1308 PruneAllButLastCommittedInternal(); |
1309 | 1309 |
1310 // We should still have a last committed entry. | 1310 // We should still have a last committed entry. |
1311 DCHECK_NE(-1, last_committed_entry_index_); | 1311 DCHECK_NE(-1, last_committed_entry_index_); |
1312 | 1312 |
1313 // We pass 0 instead of GetEntryCount() for the history_length parameter of | 1313 // We pass 0 instead of GetEntryCount() for the history_length parameter of |
1314 // SetHistoryLengthAndPrune, because it will create history_length additional | 1314 // SetHistoryLengthAndPrune, because it will create history_length additional |
1315 // history entries. | 1315 // history entries. |
1316 // TODO(jochen): This API is confusing and we should clean it up. | 1316 // TODO(jochen): This API is confusing and we should clean it up. |
1317 // http://crbug.com/178491 | 1317 // http://crbug.com/178491 |
1318 NavigationEntryImpl* entry = | 1318 NavigationEntryImpl* entry = |
1319 NavigationEntryImpl::FromNavigationEntry(GetVisibleEntry()); | 1319 NavigationEntryImpl::FromNavigationEntry(GetVisibleEntry()); |
1320 delegate_->SetHistoryLengthAndPrune( | 1320 delegate_->SetHistoryLengthAndPrune( |
1321 entry->site_instance(), 0, entry->GetPageID()); | 1321 entry->site_instance(), 0, entry->GetPageID()); |
1322 } | 1322 } |
1323 | 1323 |
1324 void NavigationControllerImpl::PruneAllButVisibleInternal() { | 1324 void NavigationControllerImpl::PruneAllButLastCommittedInternal() { |
1325 // It is up to callers to check the invariants before calling this. | 1325 // It is up to callers to check the invariants before calling this. |
1326 CHECK(CanPruneAllButVisible()); | 1326 CHECK(CanPruneAllButLastCommitted()); |
1327 | 1327 |
1328 // Erase all entries but the last committed entry. There may still be a | 1328 // Erase all entries but the last committed entry. There may still be a |
1329 // new pending entry after this. | 1329 // new pending entry after this. |
1330 entries_.erase(entries_.begin(), | 1330 entries_.erase(entries_.begin(), |
1331 entries_.begin() + last_committed_entry_index_); | 1331 entries_.begin() + last_committed_entry_index_); |
1332 entries_.erase(entries_.begin() + 1, entries_.end()); | 1332 entries_.erase(entries_.begin() + 1, entries_.end()); |
1333 last_committed_entry_index_ = 0; | 1333 last_committed_entry_index_ = 0; |
1334 } | 1334 } |
1335 | 1335 |
1336 void NavigationControllerImpl::ClearAllScreenshots() { | 1336 void NavigationControllerImpl::ClearAllScreenshots() { |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 } | 1681 } |
1682 } | 1682 } |
1683 } | 1683 } |
1684 | 1684 |
1685 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 1685 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
1686 const base::Callback<base::Time()>& get_timestamp_callback) { | 1686 const base::Callback<base::Time()>& get_timestamp_callback) { |
1687 get_timestamp_callback_ = get_timestamp_callback; | 1687 get_timestamp_callback_ = get_timestamp_callback; |
1688 } | 1688 } |
1689 | 1689 |
1690 } // namespace content | 1690 } // namespace content |
OLD | NEW |