Index: content/browser/tab_contents/navigation_controller.cc |
diff --git a/content/browser/tab_contents/navigation_controller.cc b/content/browser/tab_contents/navigation_controller.cc |
index 0144fef9b691ea047279e75249cd6688102e25f0..315a47110bb8661c0e91c1ceb31b4f643c9b59c0 100644 |
--- a/content/browser/tab_contents/navigation_controller.cc |
+++ b/content/browser/tab_contents/navigation_controller.cc |
@@ -883,6 +883,14 @@ void NavigationController::CopyStateFrom(const NavigationController& source) { |
void NavigationController::CopyStateFromAndPrune(NavigationController* source, |
bool remove_first_entry) { |
+ // The SiteInstance and page_id of the last committed entry needs to be |
+ // remembered at this point, in case there is only one committed entry |
+ // and it is pruned. |
+ NavigationEntry* last_committed = GetLastCommittedEntry(); |
+ SiteInstance* site_instance = |
+ last_committed ? last_committed->site_instance() : NULL; |
+ int32 minimum_page_id = last_committed ? last_committed->page_id() : -1; |
+ |
// This code is intended for use when the last entry is the active entry. |
DCHECK((transient_entry_index_ != -1 && |
transient_entry_index_ == entry_count() - 1) || |
@@ -891,6 +899,16 @@ void NavigationController::CopyStateFromAndPrune(NavigationController* source, |
(!pending_entry_ && last_committed_entry_index_ == entry_count() - 1)); |
if (remove_first_entry && entry_count()) { |
+ // If there is only one committed entry and |remove_first_entry| is true, |
+ // it needs to be pruned. This is accomplished by specifying a larger |
+ // |minimum_page_id| than the committed entry's page_id in the |
+ // ViewMsg_SetHistoryLengthAndPrune message. However, any pages which are |
+ // committed between now and when the RenderView handles the message will |
+ // need to be retained. Both constraints can be met by incrementing the |
+ // |minimum_page_id| by 1. |
+ DCHECK(minimum_page_id >= 0); |
+ if (entry_count() == 1) |
+ ++minimum_page_id; |
// Save then restore the pending entry (RemoveEntryAtIndexInternal chucks |
// the pending entry). |
NavigationEntry* pending_entry = pending_entry_; |
@@ -932,8 +950,9 @@ void NavigationController::CopyStateFromAndPrune(NavigationController* source, |
last_committed_entry_index_--; |
} |
- // Update the history in the RenderView. |
- tab_contents_->SetHistoryLengthAndClear(max_source_index); |
+ tab_contents_->SetHistoryLengthAndPrune(site_instance, |
+ max_source_index, |
+ minimum_page_id); |
} |
void NavigationController::PruneAllButActive() { |