Commit 098549fc authored by Xing Liu's avatar Xing Liu Committed by Commit Bot

Fix an issue in download with network service.

Download code uses frame_tree_node_id to find WebContents when browser
side navigation is enabled. The WebContents is used in UI layer code
to close the tab when the request is a download.


Bug: 715630, 781565
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_site_isolation
Change-Id: Ib9490a64692027e3b16c70b77b54aceebcfcb9b7
Reviewed-on: https://chromium-review.googlesource.com/761269
Commit-Queue: Xing Liu <xingliu@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarMin Qin <qinmin@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#515816}
parent 09cd842d
...@@ -194,6 +194,7 @@ void InterceptNavigationResponse( ...@@ -194,6 +194,7 @@ void InterceptNavigationResponse(
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status, const SSLStatus& ssl_status,
int frame_tree_node_id,
std::unique_ptr<ResourceRequest> resource_request, std::unique_ptr<ResourceRequest> resource_request,
std::unique_ptr<ThrottlingURLLoader> url_loader, std::unique_ptr<ThrottlingURLLoader> url_loader,
std::vector<GURL> url_chain, std::vector<GURL> url_chain,
...@@ -202,8 +203,9 @@ void InterceptNavigationResponse( ...@@ -202,8 +203,9 @@ void InterceptNavigationResponse(
DownloadManagerImpl::UniqueUrlDownloadHandlerPtr resource_downloader( DownloadManagerImpl::UniqueUrlDownloadHandlerPtr resource_downloader(
ResourceDownloader::InterceptNavigationResponse( ResourceDownloader::InterceptNavigationResponse(
download_manager, std::move(resource_request), response, download_manager, std::move(resource_request), response,
std::move(consumer_handle), ssl_status, std::move(url_loader), std::move(consumer_handle), ssl_status, frame_tree_node_id,
std::move(url_chain), std::move(completion_status)) std::move(url_loader), std::move(url_chain),
std::move(completion_status))
.release()); .release());
BrowserThread::PostTask( BrowserThread::PostTask(
...@@ -673,13 +675,14 @@ NavigationURLLoader::NavigationInterceptionCB ...@@ -673,13 +675,14 @@ NavigationURLLoader::NavigationInterceptionCB
DownloadManagerImpl::GetNavigationInterceptionCB( DownloadManagerImpl::GetNavigationInterceptionCB(
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status) { const SSLStatus& ssl_status,
int frame_tree_node_id) {
return base::BindOnce( return base::BindOnce(
&InterceptNavigationResponse, &InterceptNavigationResponse,
base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler, base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler,
weak_factory_.GetWeakPtr()), weak_factory_.GetWeakPtr()),
weak_factory_.GetWeakPtr(), response, std::move(consumer_handle), weak_factory_.GetWeakPtr(), response, std::move(consumer_handle),
ssl_status); ssl_status, frame_tree_node_id);
} }
int DownloadManagerImpl::RemoveDownloadsByURLAndTime( int DownloadManagerImpl::RemoveDownloadsByURLAndTime(
......
...@@ -147,7 +147,8 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager, ...@@ -147,7 +147,8 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
NavigationURLLoader::NavigationInterceptionCB GetNavigationInterceptionCB( NavigationURLLoader::NavigationInterceptionCB GetNavigationInterceptionCB(
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status); const SSLStatus& ssl_status,
int frame_tree_node_id);
private: private:
using DownloadSet = std::set<DownloadItem*>; using DownloadSet = std::set<DownloadItem*>;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "content/common/throttling_url_loader.h" #include "content/common/throttling_url_loader.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/browser_side_navigation_policy.h"
#include "storage/browser/fileapi/file_system_context.h" #include "storage/browser/fileapi/file_system_context.h"
namespace content { namespace content {
...@@ -16,29 +17,24 @@ namespace content { ...@@ -16,29 +17,24 @@ namespace content {
// This class is only used for providing the WebContents to DownloadItemImpl. // This class is only used for providing the WebContents to DownloadItemImpl.
class RequestHandle : public DownloadRequestHandleInterface { class RequestHandle : public DownloadRequestHandleInterface {
public: public:
RequestHandle(int render_process_id, int render_frame_id) RequestHandle(int frame_tree_node_id)
: render_process_id_(render_process_id), : frame_tree_node_id_(frame_tree_node_id) {}
render_frame_id_(render_frame_id) {}
RequestHandle(RequestHandle&& other) RequestHandle(RequestHandle&& other)
: render_process_id_(other.render_process_id_), : frame_tree_node_id_(other.frame_tree_node_id_) {}
render_frame_id_(other.render_frame_id_) {}
// DownloadRequestHandleInterface // DownloadRequestHandleInterface
WebContents* GetWebContents() const override { WebContents* GetWebContents() const override {
RenderFrameHost* host = DCHECK(IsBrowserSideNavigationEnabled());
RenderFrameHost::FromID(render_process_id_, render_frame_id_); return WebContents::FromFrameTreeNodeId(frame_tree_node_id_);
if (host)
return WebContents::FromRenderFrameHost(host);
return nullptr;
} }
DownloadManager* GetDownloadManager() const override { return nullptr; } DownloadManager* GetDownloadManager() const override { return nullptr; }
void PauseRequest() const override {} void PauseRequest() const override {}
void ResumeRequest() const override {} void ResumeRequest() const override {}
void CancelRequest(bool user_cancel) const override {} void CancelRequest(bool user_cancel) const override {}
private: private:
int render_process_id_; int frame_tree_node_id_;
int render_frame_id_;
DISALLOW_COPY_AND_ASSIGN(RequestHandle); DISALLOW_COPY_AND_ASSIGN(RequestHandle);
}; };
...@@ -73,6 +69,7 @@ ResourceDownloader::InterceptNavigationResponse( ...@@ -73,6 +69,7 @@ ResourceDownloader::InterceptNavigationResponse(
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status, const SSLStatus& ssl_status,
int frame_tree_node_id,
std::unique_ptr<ThrottlingURLLoader> url_loader, std::unique_ptr<ThrottlingURLLoader> url_loader,
std::vector<GURL> url_chain, std::vector<GURL> url_chain,
base::Optional<ResourceRequestCompletionStatus> completion_status) { base::Optional<ResourceRequestCompletionStatus> completion_status) {
...@@ -80,10 +77,9 @@ ResourceDownloader::InterceptNavigationResponse( ...@@ -80,10 +77,9 @@ ResourceDownloader::InterceptNavigationResponse(
delegate, std::move(resource_request), delegate, std::move(resource_request),
std::make_unique<DownloadSaveInfo>(), content::DownloadItem::kInvalidId, std::make_unique<DownloadSaveInfo>(), content::DownloadItem::kInvalidId,
std::string(), false, false, false); std::string(), false, false, false);
downloader->InterceptResponse(std::move(url_loader), response, downloader->InterceptResponse(
std::move(consumer_handle), ssl_status, std::move(url_loader), response, std::move(consumer_handle), ssl_status,
std::move(url_chain), frame_tree_node_id, std::move(url_chain), std::move(completion_status));
std::move(completion_status));
return downloader; return downloader;
} }
...@@ -142,12 +138,14 @@ void ResourceDownloader::InterceptResponse( ...@@ -142,12 +138,14 @@ void ResourceDownloader::InterceptResponse(
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status, const SSLStatus& ssl_status,
int frame_tree_node_id,
std::vector<GURL> url_chain, std::vector<GURL> url_chain,
base::Optional<ResourceRequestCompletionStatus> completion_status) { base::Optional<ResourceRequestCompletionStatus> completion_status) {
url_loader_ = std::move(url_loader); url_loader_ = std::move(url_loader);
url_loader_->set_forwarding_client(&response_handler_); url_loader_->set_forwarding_client(&response_handler_);
net::SSLInfo info; net::SSLInfo info;
info.cert_status = ssl_status.cert_status; info.cert_status = ssl_status.cert_status;
frame_tree_node_id_ = frame_tree_node_id;
response_handler_.SetURLChain(std::move(url_chain)); response_handler_.SetURLChain(std::move(url_chain));
response_handler_.OnReceiveResponse(response->head, response_handler_.OnReceiveResponse(response->head,
base::Optional<net::SSLInfo>(info), base::Optional<net::SSLInfo>(info),
...@@ -163,8 +161,8 @@ void ResourceDownloader::OnResponseStarted( ...@@ -163,8 +161,8 @@ void ResourceDownloader::OnResponseStarted(
download_create_info->download_id = download_id_; download_create_info->download_id = download_id_;
download_create_info->guid = guid_; download_create_info->guid = guid_;
if (resource_request_->origin_pid >= 0) { if (resource_request_->origin_pid >= 0) {
download_create_info->request_handle.reset(new RequestHandle( download_create_info->request_handle.reset(
resource_request_->origin_pid, resource_request_->render_frame_id)); new RequestHandle(frame_tree_node_id_));
} }
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
......
...@@ -38,6 +38,7 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -38,6 +38,7 @@ class ResourceDownloader : public UrlDownloadHandler,
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status, const SSLStatus& ssl_status,
int frame_tree_node_id,
std::unique_ptr<ThrottlingURLLoader> url_loader, std::unique_ptr<ThrottlingURLLoader> url_loader,
std::vector<GURL> url_chain, std::vector<GURL> url_chain,
base::Optional<ResourceRequestCompletionStatus> completion_status); base::Optional<ResourceRequestCompletionStatus> completion_status);
...@@ -72,6 +73,7 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -72,6 +73,7 @@ class ResourceDownloader : public UrlDownloadHandler,
const scoped_refptr<ResourceResponse>& response, const scoped_refptr<ResourceResponse>& response,
mojo::ScopedDataPipeConsumerHandle consumer_handle, mojo::ScopedDataPipeConsumerHandle consumer_handle,
const SSLStatus& ssl_status, const SSLStatus& ssl_status,
int frame_tree_node_id,
std::vector<GURL> url_chain, std::vector<GURL> url_chain,
base::Optional<ResourceRequestCompletionStatus> completion_status); base::Optional<ResourceRequestCompletionStatus> completion_status);
...@@ -99,6 +101,9 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -99,6 +101,9 @@ class ResourceDownloader : public UrlDownloadHandler,
// Callback to run after download starts. // Callback to run after download starts.
DownloadUrlParameters::OnStartedCallback callback_; DownloadUrlParameters::OnStartedCallback callback_;
// Used to get WebContents in browser process.
int frame_tree_node_id_ = 0;
base::WeakPtrFactory<ResourceDownloader> weak_ptr_factory_; base::WeakPtrFactory<ResourceDownloader> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ResourceDownloader); DISALLOW_COPY_AND_ASSIGN(ResourceDownloader);
......
...@@ -1124,7 +1124,8 @@ void NavigationRequest::OnWillProcessResponseChecksComplete( ...@@ -1124,7 +1124,8 @@ void NavigationRequest::OnWillProcessResponseChecksComplete(
BrowserContext::GetDownloadManager(browser_context)); BrowserContext::GetDownloadManager(browser_context));
loader_->InterceptNavigation( loader_->InterceptNavigation(
download_manager->GetNavigationInterceptionCB( download_manager->GetNavigationInterceptionCB(
response_, std::move(handle_), ssl_status_)); response_, std::move(handle_), ssl_status_,
frame_tree_node_->frame_tree_node_id()));
OnRequestFailed(false, net::ERR_ABORTED, base::nullopt, false); OnRequestFailed(false, net::ERR_ABORTED, base::nullopt, false);
return; return;
} }
......
...@@ -926,11 +926,6 @@ ...@@ -926,11 +926,6 @@
-ReferrerPolicyTest.HttpsContextMenuOrigin -ReferrerPolicyTest.HttpsContextMenuOrigin
-ReferrerPolicyTest.HttpsContextMenuRedirect -ReferrerPolicyTest.HttpsContextMenuRedirect
# crbug.com/781565
-DownloadTest.CloseNewTab1
-DownloadTest.CloseNewTab2
-DownloadTest.CloseNewTab3
# http://crbug.com/783990 # http://crbug.com/783990
# Add support for http auth. # Add support for http auth.
-LoginPromptBrowserTest.AllowCrossdomainPromptForSubframes -LoginPromptBrowserTest.AllowCrossdomainPromptForSubframes
......
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