Chromium Code Reviews| Index: content/browser/download/download_request_core.cc |
| diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_request_core.cc |
| similarity index 73% |
| copy from content/browser/download/download_resource_handler.cc |
| copy to content/browser/download/download_request_core.cc |
| index 2b6ac35783780818dc028d2abf139151c68607a5..e206b586808a4523784306663c08c4ac92baa0e7 100644 |
| --- a/content/browser/download/download_resource_handler.cc |
| +++ b/content/browser/download/download_request_core.cc |
| @@ -2,7 +2,7 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "content/browser/download/download_resource_handler.h" |
| +#include "content/browser/download/download_request_core.h" |
| #include <string> |
| @@ -18,10 +18,7 @@ |
| #include "content/browser/download/download_create_info.h" |
| #include "content/browser/download/download_interrupt_reasons_impl.h" |
| #include "content/browser/download/download_manager_impl.h" |
| -#include "content/browser/download/download_request_handle.h" |
| #include "content/browser/download/download_stats.h" |
| -#include "content/browser/loader/resource_dispatcher_host_impl.h" |
| -#include "content/browser/loader/resource_request_info_impl.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/download_interrupt_reasons.h" |
| #include "content/public/browser/download_item.h" |
| @@ -29,7 +26,6 @@ |
| #include "content/public/browser/navigation_entry.h" |
| #include "content/public/browser/power_save_blocker.h" |
| #include "content/public/browser/web_contents.h" |
| -#include "content/public/common/resource_response.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| #include "net/http/http_response_headers.h" |
| @@ -38,11 +34,6 @@ |
| namespace content { |
| -struct DownloadResourceHandler::DownloadTabInfo { |
| - GURL tab_url; |
| - GURL tab_referrer_url; |
| -}; |
| - |
| namespace { |
| void CallStartedCBOnUIThread( |
| @@ -57,15 +48,14 @@ void CallStartedCBOnUIThread( |
| } |
| // Static function in order to prevent any accidental accesses to |
| -// DownloadResourceHandler members from the UI thread. |
| +// DownloadRequestCore members from the UI thread. |
| static void StartOnUIThread( |
| scoped_ptr<DownloadCreateInfo> info, |
| - scoped_ptr<DownloadResourceHandler::DownloadTabInfo> tab_info, |
| scoped_ptr<ByteStreamReader> stream, |
| + base::WeakPtr<DownloadManager> download_manager, |
| const DownloadUrlParameters::OnStartedCallback& started_cb) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - DownloadManager* download_manager = info->request_handle.GetDownloadManager(); |
| if (!download_manager) { |
| // NULL in unittests or if the page closed right after starting the |
| // download. |
| @@ -78,81 +68,54 @@ static void StartOnUIThread( |
| return; |
| } |
| - info->tab_url = tab_info->tab_url; |
| - info->tab_referrer_url = tab_info->tab_referrer_url; |
| - |
| download_manager->StartDownload(info.Pass(), stream.Pass(), started_cb); |
| } |
| -void InitializeDownloadTabInfoOnUIThread( |
| - const DownloadRequestHandle& request_handle, |
| - DownloadResourceHandler::DownloadTabInfo* tab_info) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - |
| - WebContents* web_contents = request_handle.GetWebContents(); |
| - if (web_contents) { |
| - NavigationEntry* entry = web_contents->GetController().GetVisibleEntry(); |
| - if (entry) { |
| - tab_info->tab_url = entry->GetURL(); |
| - tab_info->tab_referrer_url = entry->GetReferrer().url; |
| - } |
| - } |
| -} |
| - |
| -void DeleteOnUIThread( |
| - scoped_ptr<DownloadResourceHandler::DownloadTabInfo> tab_info) {} |
| - |
| } // namespace |
| -const int DownloadResourceHandler::kDownloadByteStreamSize = 100 * 1024; |
| +const int DownloadRequestCore::kDownloadByteStreamSize = 100 * 1024; |
| -DownloadResourceHandler::DownloadResourceHandler( |
| +DownloadRequestCore::DownloadRequestCore( |
| uint32 id, |
| net::URLRequest* request, |
| const DownloadUrlParameters::OnStartedCallback& started_cb, |
| - scoped_ptr<DownloadSaveInfo> save_info) |
| - : ResourceHandler(request), |
| + scoped_ptr<DownloadSaveInfo> save_info, |
| + base::WeakPtr<DownloadManagerImpl> download_manager) |
| + : request_(request), |
| download_id_(id), |
| started_cb_(started_cb), |
| save_info_(save_info.Pass()), |
| - tab_info_(new DownloadTabInfo()), |
| last_buffer_size_(0), |
| bytes_read_(0), |
| pause_count_(0), |
| was_deferred_(false), |
| - on_response_started_called_(false) { |
| + on_response_started_called_(false), |
| + download_manager_(download_manager) { |
| RecordDownloadCount(UNTHROTTLED_COUNT); |
| - // Do UI thread initialization for tab_info_ asap after |
| - // DownloadResourceHandler creation since the tab could be navigated |
| - // before StartOnUIThread gets called. This is safe because deletion |
| - // will occur via PostTask() as well, which will serialized behind this |
| - // PostTask() |
| - const ResourceRequestInfoImpl* request_info = GetRequestInfo(); |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&InitializeDownloadTabInfoOnUIThread, |
| - DownloadRequestHandle(AsWeakPtr(), request_info->GetChildID(), |
| - request_info->GetRouteID(), |
| - request_info->GetRequestID(), |
| - request_info->frame_tree_node_id()), |
| - tab_info_.get())); |
| power_save_blocker_ = PowerSaveBlocker::Create( |
| PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| PowerSaveBlocker::kReasonOther, "Download in progress"); |
| } |
| -bool DownloadResourceHandler::OnRequestRedirected( |
| - const net::RedirectInfo& redirect_info, |
| - ResourceResponse* response, |
| - bool* defer) { |
| - return true; |
| +DownloadRequestCore::~DownloadRequestCore() { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + |
| + // This won't do anything if the callback was called before. |
| + // If it goes through, it will likely be because OnWillStart() returned |
| + // false somewhere in the chain of resource handlers. |
| + CallStartedCB(NULL, DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); |
|
asanka
2015/12/08 16:58:33
nit: nullptr for new code.
svaldez
2015/12/08 20:39:26
Done.
|
| + |
| + // Remove output stream callback if a stream exists. |
| + if (stream_writer_) |
| + stream_writer_->RegisterCallback(base::Closure()); |
| + |
| + UMA_HISTOGRAM_TIMES("SB2.DownloadDuration", |
|
asanka
2015/12/08 16:58:32
Do we have lifetime guarantee that the DownloadReq
svaldez
2015/12/08 20:39:26
We don't have good lifetime guarantees about DRC's
asanka
2015/12/08 21:53:56
This is a guarantee currently afforded by Resource
svaldez
2015/12/09 17:20:41
Actually I ended up adding destruction of UrlDownl
|
| + base::TimeTicks::Now() - download_start_time_); |
| } |
| // Send the download creation information to the download thread. |
| -bool DownloadResourceHandler::OnResponseStarted( |
| - ResourceResponse* response, |
| - bool* defer) { |
| +bool DownloadRequestCore::OnResponseStarted() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| // There can be only one (call) |
| DCHECK(!on_response_started_called_); |
| @@ -171,18 +134,16 @@ bool DownloadResourceHandler::OnResponseStarted( |
| // If the content-length header is not present (or contains something other |
| // than numbers), the incoming content_length is -1 (unknown size). |
| // Set the content length to 0 to indicate unknown size to DownloadManager. |
| - int64 content_length = |
| - response->head.content_length > 0 ? response->head.content_length : 0; |
| - |
| - const ResourceRequestInfoImpl* request_info = GetRequestInfo(); |
| + int64 content_length = request()->GetExpectedContentSize() > 0 ? |
| + request()->GetExpectedContentSize() : 0; |
| // Deleted in DownloadManager. |
| scoped_ptr<DownloadCreateInfo> info( |
| new DownloadCreateInfo(base::Time::Now(), |
| content_length, |
| request()->net_log(), |
| - request_info->HasUserGesture(), |
| - request_info->GetPageTransition(), |
| + false, |
| + ui::PAGE_TRANSITION_LINK, |
| save_info_.Pass())); |
| // Create the ByteStream for sending data to the download sink. |
| @@ -192,12 +153,14 @@ bool DownloadResourceHandler::OnResponseStarted( |
| BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE), |
| kDownloadByteStreamSize, &stream_writer_, &stream_reader); |
| stream_writer_->RegisterCallback( |
| - base::Bind(&DownloadResourceHandler::ResumeRequest, AsWeakPtr())); |
| + base::Bind(&DownloadRequestCore::ResumeRequest, AsWeakPtr())); |
| info->download_id = download_id_; |
| info->url_chain = request()->url_chain(); |
| info->referrer_url = GURL(request()->referrer()); |
| - info->mime_type = response->head.mime_type; |
| + string mime_type; |
| + request()->GetMimeType(&mime_type); |
| + info->mime_type = mime_type; |
| info->remote_address = request()->GetSocketAddress().host(); |
| if (request()->response_headers()) { |
| // Grab the first content-disposition header. There may be more than one, |
| @@ -209,10 +172,6 @@ bool DownloadResourceHandler::OnResponseStarted( |
| RecordDownloadMimeType(info->mime_type); |
| RecordDownloadContentDisposition(info->content_disposition); |
| - info->request_handle = DownloadRequestHandle( |
| - AsWeakPtr(), request_info->GetChildID(), request_info->GetRouteID(), |
| - request_info->GetRequestID(), request_info->frame_tree_node_id()); |
| - |
| // Get the last modified time and etag. |
| const net::HttpResponseHeaders* headers = request()->response_headers(); |
| if (headers) { |
| @@ -248,10 +207,9 @@ bool DownloadResourceHandler::OnResponseStarted( |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| - base::Bind(&StartOnUIThread, |
| - base::Passed(&info), |
| - base::Passed(&tab_info_), |
| + base::Bind(&StartOnUIThread, base::Passed(&info), |
| base::Passed(&stream_reader), |
| + download_manager_, |
| // Pass to StartOnUIThread so that variable |
| // access is always on IO thread but function |
| // is called on UI thread. |
| @@ -262,7 +220,7 @@ bool DownloadResourceHandler::OnResponseStarted( |
| return true; |
| } |
| -void DownloadResourceHandler::CallStartedCB( |
| +void DownloadRequestCore::CallStartedCB( |
| DownloadItem* item, |
| DownloadInterruptReason interrupt_reason) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| @@ -276,18 +234,9 @@ void DownloadResourceHandler::CallStartedCB( |
| started_cb_.Reset(); |
| } |
| -bool DownloadResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
| - return true; |
| -} |
| - |
| -bool DownloadResourceHandler::OnBeforeNetworkStart(const GURL& url, |
| - bool* defer) { |
| - return true; |
| -} |
| - |
| // Create a new buffer, which will be handed to the download thread for file |
| // writing and deletion. |
| -bool DownloadResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| +bool DownloadRequestCore::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| int* buf_size, |
| int min_size) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| @@ -302,7 +251,7 @@ bool DownloadResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| } |
| // Pass the buffer to the download file writer. |
| -bool DownloadResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| +bool DownloadRequestCore::OnReadCompleted(int bytes_read, bool* defer) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK(read_buffer_.get()); |
| @@ -341,10 +290,8 @@ bool DownloadResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| return true; |
| } |
| -void DownloadResourceHandler::OnResponseCompleted( |
| - const net::URLRequestStatus& status, |
| - const std::string& security_info, |
| - bool* defer) { |
| +void DownloadRequestCore::OnResponseCompleted( |
| + const net::URLRequestStatus& status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| int response_code = status.is_success() ? request()->GetResponseCode() : 0; |
| DVLOG(20) << __FUNCTION__ << "()" << DebugString() |
| @@ -466,17 +413,13 @@ void DownloadResourceHandler::OnResponseCompleted( |
| read_buffer_ = NULL; |
| } |
| -void DownloadResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| - NOTREACHED(); |
| -} |
| - |
| -void DownloadResourceHandler::PauseRequest() { |
| +void DownloadRequestCore::PauseRequest() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| ++pause_count_; |
| } |
| -void DownloadResourceHandler::ResumeRequest() { |
| +void DownloadRequestCore::ResumeRequest() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK_LT(0, pause_count_); |
| @@ -492,60 +435,15 @@ void DownloadResourceHandler::ResumeRequest() { |
| total_pause_time_ += (base::TimeTicks::Now() - last_stream_pause_time_); |
| last_stream_pause_time_ = base::TimeTicks(); |
| } |
| - |
| - controller()->Resume(); |
| } |
| -void DownloadResourceHandler::CancelRequest() { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - |
| - const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| - ResourceDispatcherHostImpl::Get()->CancelRequest( |
| - info->GetChildID(), |
| - info->GetRequestID()); |
| - // This object has been deleted. |
| -} |
| - |
| -std::string DownloadResourceHandler::DebugString() const { |
| - const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| +std::string DownloadRequestCore::DebugString() const { |
| return base::StringPrintf("{" |
| " url_ = " "\"%s\"" |
| - " info = {" |
| - " child_id = " "%d" |
| - " request_id = " "%d" |
| - " route_id = " "%d" |
| - " }" |
| " }", |
| request() ? |
| request()->url().spec().c_str() : |
| - "<NULL request>", |
| - info->GetChildID(), |
| - info->GetRequestID(), |
| - info->GetRouteID()); |
| -} |
| - |
| -DownloadResourceHandler::~DownloadResourceHandler() { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - |
| - // This won't do anything if the callback was called before. |
| - // If it goes through, it will likely be because OnWillStart() returned |
| - // false somewhere in the chain of resource handlers. |
| - CallStartedCB(NULL, DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); |
| - |
| - // Remove output stream callback if a stream exists. |
| - if (stream_writer_) |
| - stream_writer_->RegisterCallback(base::Closure()); |
| - |
| - // tab_info_ must be destroyed on UI thread, since |
| - // InitializeDownloadTabInfoOnUIThread might still be using it. |
| - if (tab_info_.get()) { |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&DeleteOnUIThread, base::Passed(&tab_info_))); |
| - } |
| - |
| - UMA_HISTOGRAM_TIMES("SB2.DownloadDuration", |
| - base::TimeTicks::Now() - download_start_time_); |
| + "<NULL request>"); |
| } |
| } // namespace content |