summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-11 03:49:04 +0000
committerdominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-11 03:49:04 +0000
commitd618ea6a8b59086a2750c47199960f6900f3f007 (patch)
tree1501407c017bf6937b7b52263d8912d739c2ce94 /chrome
parent72874a8dad70024f8b4bc95120c2a4dada8f7abc (diff)
downloadchromium_src-d618ea6a8b59086a2750c47199960f6900f3f007.zip
chromium_src-d618ea6a8b59086a2750c47199960f6900f3f007.tar.gz
chromium_src-d618ea6a8b59086a2750c47199960f6900f3f007.tar.bz2
Block the creation of a new window when prerendering.
BUG=none TEST=PrerenderBrowserTest.PrerenderPopup Review URL: http://codereview.chromium.org/6955003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84922 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/prerender/prerender_contents.cc5
-rw-r--r--chrome/browser/prerender/prerender_manager.cc2
-rw-r--r--chrome/browser/tab_contents/render_view_host_delegate_helper.cc13
3 files changed, 16 insertions, 4 deletions
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 4a989bc..bfbba25 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -285,7 +285,8 @@ void PrerenderContents::StartPrerendering(
Source<RenderViewHostDelegate>(GetRenderViewHostDelegate()));
// Register for new windows from any source.
- notification_registrar_.Add(this, NotificationType::CREATING_NEW_WINDOW,
+ notification_registrar_.Add(this,
+ NotificationType::CREATING_NEW_WINDOW_CANCELLED,
Source<TabContents>(new_contents));
DCHECK(load_start_time_.is_null());
@@ -490,7 +491,7 @@ void PrerenderContents::Observe(NotificationType type,
break;
}
- case NotificationType::CREATING_NEW_WINDOW: {
+ case NotificationType::CREATING_NEW_WINDOW_CANCELLED: {
if (prerender_contents_.get()) {
CHECK(Source<TabContents>(source).ptr() ==
prerender_contents_->tab_contents());
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 9aa02fd..5425ecf 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -551,7 +551,6 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents,
new_tab_contents->controller().CopyStateFromAndPrune(
&old_tab_contents->controller(),
false);
-
old_tab_contents->delegate()->SwapTabContents(old_tab_contents,
new_tab_contents);
MarkTabContentsAsPrerendered(tab_contents);
@@ -823,6 +822,7 @@ void PrerenderManager::DeleteOldTabContents() {
while (!old_tab_contents_list_.empty()) {
TabContentsWrapper* tab_contents = old_tab_contents_list_.front();
old_tab_contents_list_.pop_front();
+ // TODO(dominich): should we use Instant Unload Handler here?
delete tab_contents;
}
MaybeStopSchedulingPeriodicCleanups();
diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
index 57c3ed8..a4f8745 100644
--- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
+++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tab_contents/background_contents.h"
#include "chrome/browser/user_style_sheet_watcher.h"
@@ -104,13 +105,23 @@ TabContents* RenderViewHostDelegateViewHelper::CreateNewWindow(
}
}
+ TabContents* base_tab_contents = opener->GetAsTabContents();
+
+ // Do not create the new TabContents if the opener is a prerender TabContents.
+ prerender::PrerenderManager* prerender_manager =
+ profile->GetPrerenderManager();
+ if (prerender_manager &&
+ prerender_manager->IsTabContentsPrerendering(base_tab_contents)) {
+ return NULL;
+ }
+
// Create the new web contents. This will automatically create the new
// TabContentsView. In the future, we may want to create the view separately.
TabContents* new_contents =
new TabContents(profile,
site,
route_id,
- opener->GetAsTabContents(),
+ base_tab_contents,
NULL);
new_contents->set_opener_web_ui_type(webui_type);
TabContentsView* new_view = new_contents->view();