summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/tab_contents/interstitial_page.cc16
-rw-r--r--chrome/browser/tab_contents/interstitial_page.h6
2 files changed, 19 insertions, 3 deletions
diff --git a/chrome/browser/tab_contents/interstitial_page.cc b/chrome/browser/tab_contents/interstitial_page.cc
index 6f32c76..ca9be04 100644
--- a/chrome/browser/tab_contents/interstitial_page.cc
+++ b/chrome/browser/tab_contents/interstitial_page.cc
@@ -106,6 +106,7 @@ InterstitialPage::InterstitialPage(WebContents* tab,
: 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 @@ void InterstitialPage::Show() {
// 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 @@ void InterstitialPage::DontProceed() {
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
diff --git a/chrome/browser/tab_contents/interstitial_page.h b/chrome/browser/tab_contents/interstitial_page.h
index 1c42520..1e35ea4 100644
--- a/chrome/browser/tab_contents/interstitial_page.h
+++ b/chrome/browser/tab_contents/interstitial_page.h
@@ -151,6 +151,12 @@ class InterstitialPage : public NotificationObserver,
// which case a transient navigation entry is created).
bool new_navigation_;
+ // Whether we should discard the pending navigation entry when not proceeding.
+ // This is to deal with cases where |new_navigation_| is true but a new
+ // pending entry was created since this interstitial was shown and we should
+ // not discard it.
+ bool should_discard_pending_nav_entry_;
+
// Whether this interstitial is enabled. See Disable() for more info.
bool enabled_;