| Index: content/browser/download/url_downloader.cc
 | 
| diff --git a/content/browser/download/url_downloader.cc b/content/browser/download/url_downloader.cc
 | 
| index b178a1d4b2654f52099ef953e1b179b18ed5554a..aea18cc02d4f3f35f68a2cf22862c77c7aaa603b 100644
 | 
| --- a/content/browser/download/url_downloader.cc
 | 
| +++ b/content/browser/download/url_downloader.cc
 | 
| @@ -74,62 +74,32 @@ class UrlDownloader::RequestHandle : public DownloadRequestHandleInterface {
 | 
|  scoped_ptr<UrlDownloader> UrlDownloader::BeginDownload(
 | 
|      base::WeakPtr<DownloadManagerImpl> download_manager,
 | 
|      scoped_ptr<net::URLRequest> request,
 | 
| -    const Referrer& referrer,
 | 
| -    bool prefer_cache,
 | 
| -    scoped_ptr<DownloadSaveInfo> save_info,
 | 
| -    uint32_t download_id,
 | 
| -    const DownloadUrlParameters::OnStartedCallback& started_callback) {
 | 
| +    const Referrer& referrer) {
 | 
|    if (!referrer.url.is_valid())
 | 
|      request->SetReferrer(std::string());
 | 
|    else
 | 
|      request->SetReferrer(referrer.url.spec());
 | 
|  
 | 
| -  int extra_load_flags = net::LOAD_NORMAL;
 | 
| -  if (prefer_cache) {
 | 
| -    // If there is upload data attached, only retrieve from cache because there
 | 
| -    // is no current mechanism to prompt the user for their consent for a
 | 
| -    // re-post. For GETs, try to retrieve data from the cache and skip
 | 
| -    // validating the entry if present.
 | 
| -    if (request->get_upload() != NULL)
 | 
| -      extra_load_flags |= net::LOAD_ONLY_FROM_CACHE;
 | 
| -    else
 | 
| -      extra_load_flags |= net::LOAD_PREFERRING_CACHE;
 | 
| -  } else {
 | 
| -    extra_load_flags |= net::LOAD_DISABLE_CACHE;
 | 
| -  }
 | 
| -  request->SetLoadFlags(request->load_flags() | extra_load_flags);
 | 
| -
 | 
|    if (request->url().SchemeIs(url::kBlobScheme))
 | 
|      return nullptr;
 | 
|  
 | 
|    // From this point forward, the |UrlDownloader| is responsible for
 | 
|    // |started_callback|.
 | 
|    scoped_ptr<UrlDownloader> downloader(
 | 
| -      new UrlDownloader(std::move(request), download_manager,
 | 
| -                        std::move(save_info), download_id, started_callback));
 | 
| +      new UrlDownloader(std::move(request), download_manager));
 | 
|    downloader->Start();
 | 
|  
 | 
|    return downloader;
 | 
|  }
 | 
|  
 | 
| -UrlDownloader::UrlDownloader(
 | 
| -    scoped_ptr<net::URLRequest> request,
 | 
| -    base::WeakPtr<DownloadManagerImpl> manager,
 | 
| -    scoped_ptr<DownloadSaveInfo> save_info,
 | 
| -    uint32_t download_id,
 | 
| -    const DownloadUrlParameters::OnStartedCallback& on_started_callback)
 | 
| +UrlDownloader::UrlDownloader(scoped_ptr<net::URLRequest> request,
 | 
| +                             base::WeakPtr<DownloadManagerImpl> manager)
 | 
|      : request_(std::move(request)),
 | 
|        manager_(manager),
 | 
| -      download_id_(download_id),
 | 
| -      on_started_callback_(on_started_callback),
 | 
| -      handler_(
 | 
| -          request_.get(),
 | 
| -          std::move(save_info),
 | 
| -          base::Bind(&UrlDownloader::ResumeReading, base::Unretained(this))),
 | 
| +      core_(request_.get(), this),
 | 
|        weak_ptr_factory_(this) {}
 | 
|  
 | 
|  UrlDownloader::~UrlDownloader() {
 | 
| -  CallStartedCallbackOnFailure(DOWNLOAD_INTERRUPT_REASON_USER_CANCELED);
 | 
|  }
 | 
|  
 | 
|  void UrlDownloader::Start() {
 | 
| @@ -157,22 +127,7 @@ void UrlDownloader::OnResponseStarted(net::URLRequest* request) {
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  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())
 | 
| +  if (core_.OnResponseStarted(std::string()))
 | 
|      StartReading(false);  // Read the first chunk.
 | 
|    else
 | 
|      ResponseCompleted();
 | 
| @@ -186,7 +141,7 @@ 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 (!core_.OnWillRead(&buf, &buf_size, -1)) {
 | 
|      request_->CancelWithError(net::ERR_ABORTED);
 | 
|      base::SequencedTaskRunnerHandle::Get()->PostTask(
 | 
|          FROM_HERE, base::Bind(&UrlDownloader::ResponseCompleted,
 | 
| @@ -229,7 +184,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 (!core_.OnReadCompleted(bytes_read, &defer)) {
 | 
|      request_->CancelWithError(net::ERR_ABORTED);
 | 
|      return;
 | 
|    } else if (defer) {
 | 
| @@ -251,38 +206,43 @@ void UrlDownloader::OnReadCompleted(net::URLRequest* request, int bytes_read) {
 | 
|  void UrlDownloader::ResponseCompleted() {
 | 
|    DVLOG(1) << "ResponseCompleted: " << request_->url().spec();
 | 
|  
 | 
| -  handler_.OnResponseCompleted(request_->status());
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::UI, FROM_HERE,
 | 
| -      base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this));
 | 
| +  core_.OnResponseCompleted(request_->status());
 | 
| +  Destroy();
 | 
|  }
 | 
|  
 | 
| -void UrlDownloader::ResumeReading() {
 | 
| -  if (request_->status().is_success()) {
 | 
| -    StartReading(false);  // Read the next chunk (OK to complete synchronously).
 | 
| -  } else {
 | 
| -    ResponseCompleted();
 | 
| -  }
 | 
| +void UrlDownloader::OnStart(
 | 
| +    scoped_ptr<DownloadCreateInfo> create_info,
 | 
| +    scoped_ptr<ByteStreamReader> stream_reader,
 | 
| +    const DownloadUrlParameters::OnStartedCallback& callback) {
 | 
| +  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), callback));
 | 
|  }
 | 
|  
 | 
| -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::OnReadyToRead() {
 | 
| +  if (request_->status().is_success())
 | 
| +    StartReading(false);  // Read the next chunk (OK to complete synchronously).
 | 
| +  else
 | 
| +    ResponseCompleted();
 | 
|  }
 | 
|  
 | 
|  void UrlDownloader::PauseRequest() {
 | 
| -  handler_.PauseRequest();
 | 
| +  core_.PauseRequest();
 | 
|  }
 | 
|  
 | 
|  void UrlDownloader::ResumeRequest() {
 | 
| -  handler_.ResumeRequest();
 | 
| +  core_.ResumeRequest();
 | 
|  }
 | 
|  
 | 
|  void UrlDownloader::CancelRequest() {
 | 
| +  Destroy();
 | 
| +}
 | 
| +
 | 
| +void UrlDownloader::Destroy() {
 | 
|    BrowserThread::PostTask(
 | 
|        BrowserThread::UI, FROM_HERE,
 | 
|        base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this));
 | 
| 
 |