| Index: chrome/browser/download/download_resource_throttle.cc
|
| diff --git a/chrome/browser/download/download_resource_throttle.cc b/chrome/browser/download/download_resource_throttle.cc
|
| index a8e2afa02b153b8f36aa26d8c0ec260aabac9a95..2d0b9e088a68892a028fb224c3aa68dbaea2533e 100644
|
| --- a/chrome/browser/download/download_resource_throttle.cc
|
| +++ b/chrome/browser/download/download_resource_throttle.cc
|
| @@ -6,10 +6,80 @@
|
|
|
| #include "base/bind.h"
|
| #include "chrome/browser/download/download_stats.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/resource_controller.h"
|
|
|
| +#if defined(OS_ANDROID)
|
| +#include "content/public/browser/android/download_controller_android.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| +
|
| +using content::DownloadControllerAndroid;
|
| +#endif
|
| +
|
| +using content::BrowserThread;
|
| +
|
| +namespace {
|
| +
|
| +void OnCanDownloadDecided(base::WeakPtr<DownloadResourceThrottle> throttle,
|
| + bool allow) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&DownloadResourceThrottle::ContinueDownload, throttle, allow));
|
| +}
|
| +
|
| +void CanDownload(
|
| + scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + info->limiter->CanDownload(info->render_process_id, info->render_view_id,
|
| + info->url, info->request_method,
|
| + info->continue_callback);
|
| +}
|
| +
|
| +#if defined(OS_ANDROID)
|
| +void OnAcquireFileAccessPermissionDone(
|
| + scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info,
|
| + bool granted) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (granted)
|
| + CanDownload(info.Pass());
|
| + else
|
| + info->continue_callback.Run(false);
|
| +}
|
| +#endif
|
| +
|
| +void CanDownloadOnUIThread(
|
| + scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| +#if defined(OS_ANDROID)
|
| + content::DownloadControllerAndroid::Get()->AcquireFileAccessPermission(
|
| + info->render_process_id, info->render_view_id,
|
| + base::Bind(&OnAcquireFileAccessPermissionDone,
|
| + base::Passed(info.Pass())));
|
| +#else
|
| + CanDownload(info.Pass());
|
| +#endif
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +DownloadResourceThrottle::DownloadRequestInfo::DownloadRequestInfo(
|
| + scoped_refptr<DownloadRequestLimiter> limiter,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + const GURL& url,
|
| + const std::string& request_method,
|
| + const DownloadRequestLimiter::Callback& continue_callback)
|
| + : limiter(limiter),
|
| + render_process_id(render_process_id),
|
| + render_view_id(render_view_id),
|
| + url(url),
|
| + request_method(request_method),
|
| + continue_callback(continue_callback) {}
|
| +
|
| +DownloadResourceThrottle::DownloadRequestInfo::~DownloadRequestInfo() {}
|
| +
|
| DownloadResourceThrottle::DownloadResourceThrottle(
|
| - DownloadRequestLimiter* limiter,
|
| + scoped_refptr<DownloadRequestLimiter> limiter,
|
| int render_process_id,
|
| int render_view_id,
|
| const GURL& url,
|
| @@ -17,13 +87,14 @@ DownloadResourceThrottle::DownloadResourceThrottle(
|
| : querying_limiter_(true),
|
| request_allowed_(false),
|
| request_deferred_(false) {
|
| - limiter->CanDownloadOnIOThread(
|
| - render_process_id,
|
| - render_view_id,
|
| - url,
|
| - request_method,
|
| - base::Bind(&DownloadResourceThrottle::ContinueDownload,
|
| - AsWeakPtr()));
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(
|
| + &CanDownloadOnUIThread,
|
| + base::Passed(scoped_ptr<DownloadRequestInfo>(new DownloadRequestInfo(
|
| + limiter, render_process_id, render_view_id, url, request_method,
|
| + base::Bind(&OnCanDownloadDecided, AsWeakPtr()))))));
|
| }
|
|
|
| DownloadResourceThrottle::~DownloadResourceThrottle() {
|
| @@ -62,6 +133,7 @@ void DownloadResourceThrottle::WillDownload(bool* defer) {
|
| }
|
|
|
| void DownloadResourceThrottle::ContinueDownload(bool allow) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| querying_limiter_ = false;
|
| request_allowed_ = allow;
|
|
|
|
|