Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Unified Diff: content/browser/download/url_downloader.cc

Issue 1533583002: [Downloads] Factor out request handling logic between DRH and UD. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments and change .Pass() -> std::move(...) per PRESUBMIT check Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/download/url_downloader.h ('k') | content/test/data/download/gzip-content.gz » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/download/url_downloader.cc
diff --git a/content/browser/download/url_downloader.cc b/content/browser/download/url_downloader.cc
index ffaea7115086ee20f813405ac72dc133c92f7606..1b05228cffa2397e247b49e545123cc2677f1f7e 100644
--- a/content/browser/download/url_downloader.cc
+++ b/content/browser/download/url_downloader.cc
@@ -4,18 +4,17 @@
#include "content/browser/download/url_downloader.h"
+#include "base/callback_helpers.h"
#include "base/location.h"
-#include "base/thread_task_runner_handle.h"
-#include "content/browser/appcache/appcache_interceptor.h"
+#include "base/macros.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "content/browser/byte_stream.h"
+#include "content/browser/download/download_create_info.h"
#include "content/browser/download/download_manager_impl.h"
-#include "content/browser/service_worker/service_worker_request_handler.h"
-#include "content/browser/ssl/ssl_policy.h"
-#include "content/common/ssl_status_serialization.h"
-#include "content/public/browser/cert_store.h"
+#include "content/browser/download/download_request_handle.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/download_interrupt_reasons.h"
#include "content/public/browser/download_save_info.h"
-#include "content/public/browser/signed_certificate_timestamp_store.h"
-#include "content/public/common/process_type.h"
-#include "content/public/common/security_style.h"
#include "net/base/io_buffer.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
@@ -25,14 +24,58 @@
namespace content {
+class UrlDownloader::RequestHandle : public DownloadRequestHandleInterface {
+ public:
+ RequestHandle(base::WeakPtr<UrlDownloader> downloader,
+ base::WeakPtr<DownloadManagerImpl> download_manager_impl,
+ scoped_refptr<base::SequencedTaskRunner> downloader_task_runner)
+ : downloader_(downloader),
+ download_manager_impl_(download_manager_impl),
+ downloader_task_runner_(downloader_task_runner) {}
+ RequestHandle(RequestHandle&& other)
+ : downloader_(std::move(other.downloader_)),
+ download_manager_impl_(std::move(other.download_manager_impl_)),
+ downloader_task_runner_(std::move(other.downloader_task_runner_)) {}
+ RequestHandle& operator=(RequestHandle&& other) {
+ downloader_ = std::move(other.downloader_);
+ download_manager_impl_ = std::move(other.download_manager_impl_);
+ downloader_task_runner_ = std::move(other.downloader_task_runner_);
+ return *this;
+ }
+
+ // DownloadRequestHandleInterface
+ WebContents* GetWebContents() const override { return nullptr; }
+ DownloadManager* GetDownloadManager() const override {
+ return download_manager_impl_ ? download_manager_impl_.get() : nullptr;
+ }
+ void PauseRequest() const override {
+ downloader_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&UrlDownloader::PauseRequest, downloader_));
+ }
+ void ResumeRequest() const override {
+ downloader_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&UrlDownloader::ResumeRequest, downloader_));
+ }
+ void CancelRequest() const override {
+ downloader_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&UrlDownloader::CancelRequest, downloader_));
+ }
+ std::string DebugString() const override { return std::string(); }
+
+ private:
+ base::WeakPtr<UrlDownloader> downloader_;
+ base::WeakPtr<DownloadManagerImpl> download_manager_impl_;
+ scoped_refptr<base::SequencedTaskRunner> downloader_task_runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(RequestHandle);
+};
+
// static
scoped_ptr<UrlDownloader> UrlDownloader::BeginDownload(
base::WeakPtr<DownloadManagerImpl> download_manager,
scoped_ptr<net::URLRequest> request,
const Referrer& referrer,
- bool is_content_initiated,
bool prefer_cache,
- bool do_not_prompt_for_login,
scoped_ptr<DownloadSaveInfo> save_info,
uint32 download_id,
const DownloadUrlParameters::OnStartedCallback& started_callback) {
@@ -59,32 +102,34 @@ scoped_ptr<UrlDownloader> UrlDownloader::BeginDownload(
if (request->url().SchemeIs(url::kBlobScheme))
return nullptr;
- scoped_ptr<DownloadRequestCore> handler(
- new DownloadRequestCore(download_id, request.get(), started_callback,
- save_info.Pass(), download_manager));
-
// From this point forward, the |UrlDownloader| is responsible for
// |started_callback|.
scoped_ptr<UrlDownloader> downloader(
- new UrlDownloader(request.Pass(), handler.Pass(), download_manager));
-
+ new UrlDownloader(std::move(request), download_manager,
+ std::move(save_info), download_id, started_callback));
downloader->Start();
return downloader;
}
-UrlDownloader::UrlDownloader(scoped_ptr<net::URLRequest> request,
- scoped_ptr<DownloadRequestCore> handler,
- base::WeakPtr<DownloadManagerImpl> manager)
- : request_(request.Pass()),
- handler_(handler.Pass()),
+UrlDownloader::UrlDownloader(
+ scoped_ptr<net::URLRequest> request,
+ base::WeakPtr<DownloadManagerImpl> manager,
+ scoped_ptr<DownloadSaveInfo> save_info,
+ uint32 download_id,
+ const DownloadUrlParameters::OnStartedCallback& on_started_callback)
+ : request_(std::move(request)),
manager_(manager),
- weak_ptr_factory_(this) {
- handler_->set_downloader(this);
-}
+ download_id_(download_id),
+ on_started_callback_(on_started_callback),
+ handler_(
+ request_.get(),
+ std::move(save_info),
+ base::Bind(&UrlDownloader::ResumeReading, base::Unretained(this))),
+ weak_ptr_factory_(this) {}
UrlDownloader::~UrlDownloader() {
- handler_.reset();
+ CallStartedCallbackOnFailure(DOWNLOAD_INTERRUPT_REASON_USER_CANCELED);
}
void UrlDownloader::Start() {
@@ -112,7 +157,20 @@ void UrlDownloader::OnResponseStarted(net::URLRequest* request) {
return;
}
- handler_->OnResponseStarted();
+ scoped_ptr<DownloadCreateInfo> create_info;
+ scoped_ptr<ByteStreamReader> stream_reader;
+
+ handler_.OnResponseStarted(&create_info, &stream_reader);
+
+ create_info->download_id = download_id_;
+ create_info->request_handle.reset(
+ new RequestHandle(weak_ptr_factory_.GetWeakPtr(), manager_,
+ base::SequencedTaskRunnerHandle::Get()));
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&DownloadManagerImpl::StartDownload, manager_,
+ base::Passed(&create_info), base::Passed(&stream_reader),
+ base::ResetAndReturn(&on_started_callback_)));
if (request_->status().is_success())
StartReading(false); // Read the first chunk.
@@ -128,9 +186,9 @@ void UrlDownloader::StartReading(bool is_continuation) {
// doesn't use the buffer.
scoped_refptr<net::IOBuffer> buf;
int buf_size;
- if (!handler_->OnWillRead(&buf, &buf_size, -1)) {
+ if (!handler_.OnWillRead(&buf, &buf_size, -1)) {
request_->CancelWithError(net::ERR_ABORTED);
- base::ThreadTaskRunnerHandle::Get()->PostTask(
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&UrlDownloader::ResponseCompleted,
weak_ptr_factory_.GetWeakPtr()));
return;
@@ -150,7 +208,7 @@ void UrlDownloader::StartReading(bool is_continuation) {
} else {
// Else, trigger OnReadCompleted asynchronously to avoid starving the IO
// thread in case the URLRequest can provide data synchronously.
- base::ThreadTaskRunnerHandle::Get()->PostTask(
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&UrlDownloader::OnReadCompleted,
weak_ptr_factory_.GetWeakPtr(), request_.get(), bytes_read));
@@ -171,7 +229,7 @@ void UrlDownloader::OnReadCompleted(net::URLRequest* request, int bytes_read) {
DCHECK(request_->status().is_success());
bool defer = false;
- if (!handler_->OnReadCompleted(bytes_read, &defer)) {
+ if (!handler_.OnReadCompleted(bytes_read, &defer)) {
request_->CancelWithError(net::ERR_ABORTED);
return;
} else if (defer) {
@@ -193,7 +251,7 @@ void UrlDownloader::OnReadCompleted(net::URLRequest* request, int bytes_read) {
void UrlDownloader::ResponseCompleted() {
DVLOG(1) << "ResponseCompleted: " << request_->url().spec();
- handler_->OnResponseCompleted(request_->status());
+ handler_.OnResponseCompleted(request_->status());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this));
@@ -207,4 +265,27 @@ void UrlDownloader::ResumeReading() {
}
}
+void UrlDownloader::CallStartedCallbackOnFailure(
+ DownloadInterruptReason result) {
+ if (on_started_callback_.is_null())
+ return;
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(base::ResetAndReturn(&on_started_callback_), nullptr, result));
+}
+
+void UrlDownloader::PauseRequest() {
+ handler_.PauseRequest();
+}
+
+void UrlDownloader::ResumeRequest() {
+ handler_.ResumeRequest();
+}
+
+void UrlDownloader::CancelRequest() {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this));
+}
+
} // namespace content
« no previous file with comments | « content/browser/download/url_downloader.h ('k') | content/test/data/download/gzip-content.gz » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698