| Index: content/public/browser/navigation_controller.h | 
| diff --git a/content/public/browser/navigation_controller.h b/content/public/browser/navigation_controller.h | 
| index 51093018a9ba54315560abc330ed74e3bc64f771..41d0c5d4a0a900b948f9aa3539351c5d37f04700 100644 | 
| --- a/content/public/browser/navigation_controller.h | 
| +++ b/content/public/browser/navigation_controller.h | 
| @@ -386,18 +386,39 @@ class NavigationController { | 
| virtual void CopyStateFrom(const NavigationController& source) = 0; | 
|  | 
| // A variant of CopyStateFrom. Removes all entries from this except the last | 
| -  // entry, inserts all entries from |source| before and including the active | 
| -  // entry. This method is intended for use when the last entry of |this| is the | 
| -  // active entry. For example: | 
| +  // committed entry, and inserts all entries from |source| before and including | 
| +  // its last committed entry. For example: | 
| // source: A B *C* D | 
| -  // this:   E F *G*   (last must be active or pending) | 
| +  // this:   E F *G* | 
| // result: A B C *G* | 
| -  // This ignores the transient index of the source and honors that of 'this'. | 
| +  // If there is a pending entry after *G* in |this|, it is also preserved. | 
| +  // This ignores any pending or transient entries in |source|.  Callers must | 
| +  // ensure that |CanPruneAllButVisible| returns true before calling this, or it | 
| +  // will crash. | 
| virtual void CopyStateFromAndPrune(NavigationController* source) = 0; | 
|  | 
| -  // Removes all the entries except the active entry. If there is a new pending | 
| -  // navigation it is preserved. | 
| -  virtual void PruneAllButActive() = 0; | 
| +  // Returns whether it is safe to call PruneAllButVisible or | 
| +  // CopyStateFromAndPrune.  There must be a last committed entry, no transient | 
| +  // entry, and if there is a pending entry, it must be new and not an existing | 
| +  // entry. | 
| +  // | 
| +  // If there were no last committed entry, the pending entry might not commit, | 
| +  // leaving us with a blank page.  This is unsafe when used with | 
| +  // |CopyStateFromAndPrune|, which would show an existing entry above the blank | 
| +  // page. | 
| +  // If there were a transient entry, we would not want to prune the other | 
| +  // entries, which the transient entry could be referring to. | 
| +  // If there were an existing pending entry, we could not prune the last | 
| +  // committed entry, in case it did not commit.  That would leave us with no | 
| +  // sensible place to put the pending entry when it did commit, after all other | 
| +  // entries are pruned.  For example, it could be going back several entries. | 
| +  // (New pending entries are safe, because they can always commit to the end.) | 
| +  virtual bool CanPruneAllButVisible() = 0; | 
| + | 
| +  // Removes all the entries except the last committed entry. If there is a new | 
| +  // pending navigation it is preserved.  Callers must ensure | 
| +  // |CanPruneAllButVisible| returns true before calling this, or it will crash. | 
| +  virtual void PruneAllButVisible() = 0; | 
|  | 
| // Clears all screenshots associated with navigation entries in this | 
| // controller. Useful to reduce memory consumption in low-memory situations. | 
|  |