summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tab_contents/interstitial_page.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/tab_contents/interstitial_page.cc')
-rw-r--r--chrome/browser/tab_contents/interstitial_page.cc54
1 files changed, 43 insertions, 11 deletions
diff --git a/chrome/browser/tab_contents/interstitial_page.cc b/chrome/browser/tab_contents/interstitial_page.cc
index bc65504..942c126 100644
--- a/chrome/browser/tab_contents/interstitial_page.cc
+++ b/chrome/browser/tab_contents/interstitial_page.cc
@@ -21,11 +21,12 @@ namespace {
class ResourceRequestTask : public Task {
public:
- ResourceRequestTask(RenderViewHost* render_view_host,
+ ResourceRequestTask(int process_id,
+ int render_view_host_id,
ResourceRequestAction action)
: action_(action),
- process_id_(render_view_host->process()->host_id()),
- render_view_host_id_(render_view_host->routing_id()),
+ process_id_(process_id),
+ render_view_host_id_(render_view_host_id),
resource_dispatcher_host_(
g_browser_process->resource_dispatcher_host()) {
}
@@ -72,7 +73,10 @@ InterstitialPage::InterstitialPage(WebContents* tab,
action_taken_(false),
enabled_(true),
new_navigation_(new_navigation),
+ original_rvh_process_id_(tab->render_view_host()->process()->host_id()),
+ original_rvh_id_(tab->render_view_host()->routing_id()),
render_view_host_(NULL),
+ resource_dispatcher_host_notified_(false),
should_revert_tab_title_(false),
ui_loop_(MessageLoop::current()) {
InitInterstitialPageMap();
@@ -157,16 +161,26 @@ void InterstitialPage::Observe(NotificationType type,
const NotificationDetails& details) {
switch (type) {
case NOTIFY_NAV_ENTRY_PENDING:
- // We are navigating away from the interstitial. Make sure clicking on
- // the interstitial will have no effect.
+ // We are navigating away from the interstitial (the user has typed a URL
+ // in the location bar or clicked a bookmark). Make sure clicking on the
+ // interstitial will have no effect. Also cancel any blocked requests
+ // on the ResourceDispatcherHost. Note that when we get this notification
+ // the RenderViewHost has not yet navigated so we'll unblock the
+ // RenderViewHost before the resource request for the new page we are
+ // navigating arrives in the ResourceDispatcherHost. This ensures that
+ // request won't be blocked if the same RenderViewHost was used for the
+ // new navigation.
Disable();
+ DCHECK(!resource_dispatcher_host_notified_);
+ TakeActionOnResourceDispatcher(CANCEL);
break;
case NOTIFY_RENDER_WIDGET_HOST_DESTROYED:
if (!action_taken_) {
// The RenderViewHost is being destroyed (as part of the tab being
// closed), make sure we clear the blocked requests.
- DCHECK(Source<RenderViewHost>(source).ptr() ==
- tab_->render_view_host());
+ RenderViewHost* rvh = Source<RenderViewHost>(source).ptr();
+ DCHECK(rvh->process()->host_id() == original_rvh_process_id_ &&
+ rvh->routing_id() == original_rvh_id_);
TakeActionOnResourceDispatcher(CANCEL);
}
break;
@@ -210,7 +224,10 @@ RenderViewHost* InterstitialPage::CreateRenderViewHost() {
}
void InterstitialPage::Proceed() {
- DCHECK(!action_taken_);
+ if (action_taken_) {
+ NOTREACHED();
+ return;
+ }
Disable();
action_taken_ = true;
@@ -235,7 +252,10 @@ void InterstitialPage::Proceed() {
}
void InterstitialPage::DontProceed() {
- DCHECK(!action_taken_);
+ if (action_taken_) {
+ NOTREACHED();
+ return;
+ }
Disable();
action_taken_ = true;
@@ -326,14 +346,25 @@ void InterstitialPage::TakeActionOnResourceDispatcher(
ResourceRequestAction action) {
DCHECK(MessageLoop::current() == ui_loop_) <<
"TakeActionOnResourceDispatcher should be called on the main thread.";
+
+ if (action == CANCEL || action == RESUME) {
+ if (resource_dispatcher_host_notified_)
+ return;
+ resource_dispatcher_host_notified_ = true;
+ }
+
// The tab might not have a render_view_host if it was closed (in which case,
// we have taken care of the blocked requests when processing
// NOTIFY_RENDER_WIDGET_HOST_DESTROYED.
// Also we need to test there is an IO thread, as when unit-tests we don't
// have one.
- if (tab_->render_view_host() && g_browser_process->io_thread()) {
+ RenderViewHost* rvh = RenderViewHost::FromID(original_rvh_process_id_,
+ original_rvh_id_);
+ if (rvh && g_browser_process->io_thread()) {
g_browser_process->io_thread()->message_loop()->PostTask(
- FROM_HERE, new ResourceRequestTask(tab_->render_view_host(), action));
+ FROM_HERE, new ResourceRequestTask(original_rvh_process_id_,
+ original_rvh_id_,
+ action));
}
}
@@ -354,3 +385,4 @@ InterstitialPage* InterstitialPage::GetInterstitialPage(
return iter->second;
}
+