| Index: chrome/browser/tab_contents/interstitial_page.cc
|
| ===================================================================
|
| --- chrome/browser/tab_contents/interstitial_page.cc (revision 14399)
|
| +++ chrome/browser/tab_contents/interstitial_page.cc (working copy)
|
| @@ -106,6 +106,7 @@
|
| : tab_(tab),
|
| url_(url),
|
| new_navigation_(new_navigation),
|
| + should_discard_pending_nav_entry_(new_navigation),
|
| enabled_(true),
|
| action_taken_(false),
|
| render_view_host_(NULL),
|
| @@ -138,10 +139,19 @@
|
| // If an interstitial is already showing, close it before showing the new one.
|
| // Be careful not to take an action on the old interstitial more than once.
|
| if (tab_->interstitial_page()) {
|
| - if (tab_->interstitial_page()->action_taken())
|
| + if (tab_->interstitial_page()->action_taken()) {
|
| tab_->interstitial_page()->Hide();
|
| - else
|
| + } else {
|
| + // If we are currently showing an interstitial page for which we created
|
| + // a transient entry and a new interstitial is shown as the result of a
|
| + // new browser initiated navigation, then that transient entry has already
|
| + // been discarded and a new pending navigation entry created.
|
| + // So we should not discard that new pending navigation entry.
|
| + // See http://crbug.com/9791
|
| + if (new_navigation_ && tab_->interstitial_page()->new_navigation_)
|
| + tab_->interstitial_page()->should_discard_pending_nav_entry_= false;
|
| tab_->interstitial_page()->DontProceed();
|
| + }
|
| }
|
|
|
| // Block the resource requests for the render view host while it is hidden.
|
| @@ -316,7 +326,7 @@
|
| else
|
| TakeActionOnResourceDispatcher(CANCEL);
|
|
|
| - if (new_navigation_) {
|
| + if (should_discard_pending_nav_entry_) {
|
| // Since no navigation happens we have to discard the transient entry
|
| // explicitely. Note that by calling DiscardNonCommittedEntries() we also
|
| // discard the pending entry, which is what we want, since the navigation is
|
|
|