| Index: content/browser/tab_contents/navigation_controller.cc
|
| ===================================================================
|
| --- content/browser/tab_contents/navigation_controller.cc (revision 96734)
|
| +++ content/browser/tab_contents/navigation_controller.cc (working copy)
|
| @@ -888,6 +888,14 @@
|
|
|
| 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) ||
|
| @@ -896,6 +904,16 @@
|
| (!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_;
|
| @@ -937,8 +955,9 @@
|
| 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() {
|
|
|