diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-20 20:04:56 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-20 20:04:56 +0000 |
commit | d3c79f39fbb1d25560aa759f4543905413cd1311 (patch) | |
tree | 02ffbc17c94081538fa6d5cd099e70cbe976da67 | |
parent | 77b6875c7aa1ecce206d52a3de98fcf5679ffe49 (diff) | |
download | chromium_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.cc | 25 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 26 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.h | 9 |
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 |