summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-20 20:04:56 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-20 20:04:56 +0000
commitd3c79f39fbb1d25560aa759f4543905413cd1311 (patch)
tree02ffbc17c94081538fa6d5cd099e70cbe976da67
parent77b6875c7aa1ecce206d52a3de98fcf5679ffe49 (diff)
downloadchromium_src-d3c79f39fbb1d25560aa759f4543905413cd1311.zip
chromium_src-d3c79f39fbb1d25560aa759f4543905413cd1311.tar.gz
chromium_src-d3c79f39fbb1d25560aa759f4543905413cd1311.tar.bz2
Cancel downloads earlier when prerendering.
Downloads while prerendering should no longer create history items, and this should fix the flake in the prerendering download tests. BUG=81798, 81985 TEST=PrerenderBrowserTest.PrerenderDownloadLocation and several others. Review URL: http://codereview.chromium.org/7004039 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86134 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc25
-rw-r--r--chrome/browser/prerender/prerender_contents.cc26
-rw-r--r--chrome/browser/prerender/prerender_contents.h9
3 files changed, 34 insertions, 26 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 2011b6d..6e8d079 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -6,7 +6,6 @@
#include "base/command_line.h"
#include "base/path_service.h"
-#include "base/scoped_temp_dir.h"
#include "base/string_util.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/prefs/pref_service.h"
@@ -242,15 +241,8 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
}
virtual void SetUpOnMainThread() OVERRIDE {
- // TODO(mmenke): Once downloading is stopped earlier, remove this.
browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload,
false);
-
- ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
-
- browser()->profile()->GetPrefs()->SetFilePath(
- prefs::kDownloadDefaultDirectory,
- downloads_directory_.path());
}
// Overload for a single expected final status
@@ -434,9 +426,6 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
GURL dest_url_;
bool use_https_src_server_;
bool call_javascript_;
-
- // Location of the downloads directory for these tests
- ScopedTempDir downloads_directory_;
};
// Checks that a page is correctly prerendered in the case of a
@@ -670,8 +659,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
// Prerenders a page that contains an automatic download triggered through an
// iframe. This should not prerender successfully.
-// Flaky: http://crbug.com/81985
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FLAKY_PrerenderDownloadIframe) {
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) {
PrerenderTestURL("files/prerender/prerender_download_iframe.html",
FINAL_STATUS_DOWNLOAD,
1);
@@ -680,9 +668,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FLAKY_PrerenderDownloadIframe) {
// Prerenders a page that contains an automatic download triggered through
// Javascript changing the window.location. This should not prerender
// successfully
-// Flaky: http://crbug.com/81985
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
- FLAKY_PrerenderDownloadLocation) {
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) {
PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"),
FINAL_STATUS_DOWNLOAD,
1);
@@ -690,9 +676,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
// Prerenders a page that contains an automatic download triggered through a
// client-issued redirect. This should not prerender successfully.
-// Flaky: http://crbug.com/81985
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
- FLAKY_PrerenderDownloadClientRedirect) {
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) {
PrerenderTestURL("files/prerender/prerender_download_refresh.html",
FINAL_STATUS_DOWNLOAD,
1);
@@ -968,8 +952,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) {
// Checks that a prerender of a CRX will result in a cancellation due to
// download.
-// Flaky: http://crbug.com/81985
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FLAKY_PrerenderCrx) {
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) {
PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 1);
}
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 343c61a..5d5a3be 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/prerender/prerender_tracker.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_preferences_util.h"
+#include "chrome/browser/ui/download/download_tab_helper.h"
#include "chrome/browser/ui/login/login_prompt.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/common/extensions/extension_constants.h"
@@ -253,6 +254,7 @@ void PrerenderContents::StartPrerendering(
NULL, NULL);
prerender_contents_.reset(new TabContentsWrapper(new_contents));
tab_contents_observer_registrar_.Observe(new_contents);
+ prerender_contents_->download_tab_helper()->set_delegate(this);
TabContents* source_tc =
source_render_view_host->delegate()->GetAsTabContents();
@@ -307,10 +309,6 @@ void PrerenderContents::StartPrerendering(
notification_registrar_.Add(this, NotificationType::AUTH_CANCELLED,
NotificationService::AllSources());
- // Register all responses to see if we should cancel.
- notification_registrar_.Add(this, NotificationType::DOWNLOAD_INITIATED,
- NotificationService::AllSources());
-
// Register to inform new RenderViews that we're prerendering.
notification_registrar_.Add(
this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB,
@@ -380,6 +378,11 @@ PrerenderContents::~PrerenderContents() {
PrerenderTracker::GetInstance()->OnPrerenderingFinished(
child_id_, route_id_);
}
+
+ // If we still have a TabContents, clean up anything we need to and then
+ // destroy it.
+ if (prerender_contents_.get())
+ delete ReleasePrerenderContents();
}
RenderViewHostDelegate::View* PrerenderContents::GetViewDelegate() {
@@ -462,6 +465,8 @@ void PrerenderContents::Observe(NotificationType type,
break;
}
+ // TODO(mmenke): Once we get rid of the old RenderViewHost code, remove
+ // this.
case NotificationType::DOWNLOAD_INITIATED: {
// If the download is started from a RenderViewHost that we are
// delegating, kill the prerender. This cancels any pending requests
@@ -740,6 +745,18 @@ void PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host,
Destroy(FINAL_STATUS_RENDERER_UNRESPONSIVE);
}
+bool PrerenderContents::CanDownload(int request_id) {
+ Destroy(FINAL_STATUS_DOWNLOAD);
+ // Cancel the download.
+ return false;
+}
+
+void PrerenderContents::OnStartDownload(DownloadItem* download,
+ TabContentsWrapper* tab) {
+ // Prerendered pages should never be able to download files.
+ NOTREACHED();
+}
+
base::ProcessMetrics* PrerenderContents::MaybeGetProcessMetrics() {
if (process_metrics_.get() == NULL) {
// If a PrenderContents hasn't started prerending, don't be fully formed.
@@ -776,6 +793,7 @@ void PrerenderContents::DestroyWhenUsingTooManyResources() {
TabContentsWrapper* PrerenderContents::ReleasePrerenderContents() {
render_view_host_observer_.reset();
+ prerender_contents_->download_tab_helper()->set_delegate(NULL);
return prerender_contents_.release();
}
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index 31c115e..b2289c5 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -15,6 +15,7 @@
#include "chrome/browser/prerender/prerender_render_view_host_observer.h"
#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
+#include "chrome/browser/ui/download/download_tab_helper_delegate.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/tab_contents/tab_contents_observer.h"
#include "content/common/notification_registrar.h"
@@ -51,7 +52,8 @@ class PrerenderContents : public RenderViewHostDelegate,
public RenderViewHostDelegate::View,
public NotificationObserver,
public TabContentsObserver,
- public JavaScriptAppModalDialogDelegate {
+ public JavaScriptAppModalDialogDelegate,
+ public DownloadTabHelperDelegate {
public:
// PrerenderContents::Create uses the currently registered Factory to create
// the PrerenderContents. Factory is intended for testing.
@@ -218,6 +220,11 @@ class PrerenderContents : public RenderViewHostDelegate,
virtual void RendererUnresponsive(RenderViewHost* render_view_host,
bool is_during_unload) OVERRIDE;
+ // DownloadTabHelperDelegate implementation.
+ virtual bool CanDownload(int request_id) OVERRIDE;
+ virtual void OnStartDownload(DownloadItem* download,
+ TabContentsWrapper* tab) OVERRIDE;
+
// Adds an alias URL, for one of the many redirections. If the URL can not
// be prerendered - for example, it's an ftp URL - |this| will be destroyed
// and false is returned. Otherwise, true is returned and the alias is