Commit c8b32bc3 authored by John Abd-El-Malek's avatar John Abd-El-Malek Committed by Commit Bot

Fix downloads from webui with network service.

Bug: 851901
Change-Id: I739438315126443e5557b096bc47c28039c95688
Reviewed-on: https://chromium-review.googlesource.com/1131830Reviewed-by: default avatarMin Qin <qinmin@chromium.org>
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#573912}
parent 562da519
...@@ -774,6 +774,8 @@ jumbo_source_set("browser") { ...@@ -774,6 +774,8 @@ jumbo_source_set("browser") {
"download/url_downloader.h", "download/url_downloader.h",
"download/url_downloader_factory.cc", "download/url_downloader_factory.cc",
"download/url_downloader_factory.h", "download/url_downloader_factory.h",
"download/web_ui_download_url_loader_factory_getter.cc",
"download/web_ui_download_url_loader_factory_getter.h",
"field_trial_recorder.cc", "field_trial_recorder.cc",
"field_trial_recorder.h", "field_trial_recorder.h",
"file_url_loader_factory.cc", "file_url_loader_factory.cc",
......
...@@ -3504,6 +3504,25 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, FetchErrorResponseBodyResumption) { ...@@ -3504,6 +3504,25 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, FetchErrorResponseBodyResumption) {
std::string("header_value")); std::string("header_value"));
} }
IN_PROC_BROWSER_TEST_F(DownloadContentTest, DownloadFromWebUI) {
GURL webui_url("chrome://resources/images/apps/blue_button.png");
NavigateToURL(shell(), webui_url);
SetupEnsureNoPendingDownloads();
std::unique_ptr<download::DownloadUrlParameters> download_parameters(
DownloadRequestUtils::CreateDownloadForWebContentsMainFrame(
shell()->web_contents(), webui_url, TRAFFIC_ANNOTATION_FOR_TESTS));
std::unique_ptr<DownloadTestObserver> observer(CreateWaiter(shell(), 1));
DownloadManagerForShell(shell())->DownloadUrl(std::move(download_parameters));
observer->WaitForFinished();
EXPECT_TRUE(EnsureNoPendingDownloads());
std::vector<download::DownloadItem*> downloads;
DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
ASSERT_EQ(1u, downloads.size());
ASSERT_EQ(download::DownloadItem::COMPLETE, downloads[0]->GetState());
}
// Test fixture for forcing MHTML download. // Test fixture for forcing MHTML download.
class MhtmlDownloadTest : public DownloadContentTest { class MhtmlDownloadTest : public DownloadContentTest {
protected: protected:
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "content/browser/download/network_download_url_loader_factory_getter.h" #include "content/browser/download/network_download_url_loader_factory_getter.h"
#include "content/browser/download/url_downloader.h" #include "content/browser/download/url_downloader.h"
#include "content/browser/download/url_downloader_factory.h" #include "content/browser/download/url_downloader_factory.h"
#include "content/browser/download/web_ui_download_url_loader_factory_getter.h"
#include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_dispatcher_host_impl.h"
#include "content/browser/loader/resource_request_info_impl.h" #include "content/browser/loader/resource_request_info_impl.h"
#include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_view_host_impl.h"
...@@ -1105,6 +1106,10 @@ void DownloadManagerImpl::BeginResourceDownloadOnChecksComplete( ...@@ -1105,6 +1106,10 @@ void DownloadManagerImpl::BeginResourceDownloadOnChecksComplete(
url_loader_factory_getter = url_loader_factory_getter =
base::MakeRefCounted<FileDownloadURLLoaderFactoryGetter>( base::MakeRefCounted<FileDownloadURLLoaderFactoryGetter>(
params->url(), browser_context_->GetPath()); params->url(), browser_context_->GetPath());
} else if (params->url().SchemeIs(content::kChromeUIScheme)) {
url_loader_factory_getter =
base::MakeRefCounted<WebUIDownloadURLLoaderFactoryGetter>(
rfh, params->url());
} else { } else {
StoragePartitionImpl* storage_partition = StoragePartitionImpl* storage_partition =
static_cast<StoragePartitionImpl*>( static_cast<StoragePartitionImpl*>(
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/download/web_ui_download_url_loader_factory_getter.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui_url_loader_factory.h"
#include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
namespace content {
WebUIDownloadURLLoaderFactoryGetter::WebUIDownloadURLLoaderFactoryGetter(
RenderFrameHost* rfh,
const GURL& url) {
auto factory_request = mojo::MakeRequest(&factory_info_);
factory_ =
CreateWebUIURLLoader(rfh, url.scheme(), base::flat_set<std::string>());
factory_->Clone(std::move(factory_request));
}
WebUIDownloadURLLoaderFactoryGetter::~WebUIDownloadURLLoaderFactoryGetter() {
BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)
->DeleteSoon(FROM_HERE, std::move(factory_));
}
scoped_refptr<network::SharedURLLoaderFactory>
WebUIDownloadURLLoaderFactoryGetter::GetURLLoaderFactory() {
return base::MakeRefCounted<network::WrapperSharedURLLoaderFactory>(
std::move(factory_info_));
}
} // namespace content
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_DOWNLOAD_WEB_UI_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
#define CONTENT_BROWSER_DOWNLOAD_WEB_UI_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
#include "base/files/file_path.h"
#include "components/download/public/common/download_url_loader_factory_getter.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
class GURL;
namespace content {
class RenderFrameHost;
// Class for retrieving the URLLoaderFactory for a webui URL.
class WebUIDownloadURLLoaderFactoryGetter
: public download::DownloadURLLoaderFactoryGetter {
public:
WebUIDownloadURLLoaderFactoryGetter(RenderFrameHost* rfh, const GURL& url);
// download::DownloadURLLoaderFactoryGetter implementation.
scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
protected:
~WebUIDownloadURLLoaderFactoryGetter() override;
private:
network::mojom::URLLoaderFactoryPtrInfo factory_info_;
// Lives on the UI thread and must be deleted there.
std::unique_ptr<network::mojom::URLLoaderFactory> factory_;
DISALLOW_COPY_AND_ASSIGN(WebUIDownloadURLLoaderFactoryGetter);
};
} // namespace content
#endif // CONTENT_BROWSER_DOWNLOAD_WEB_UI_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment