| Index: content/browser/android/download_controller_android_impl.cc
|
| diff --git a/content/browser/android/download_controller_android_impl.cc b/content/browser/android/download_controller_android_impl.cc
|
| index 874e47a361e1c8d3902820bf84da03321c1a2557..23c594182cff47f07c7fafb723577e1035a16149 100644
|
| --- a/content/browser/android/download_controller_android_impl.cc
|
| +++ b/content/browser/android/download_controller_android_impl.cc
|
| @@ -23,7 +23,9 @@
|
| #include "content/browser/renderer_host/render_process_host_impl.h"
|
| #include "content/browser/renderer_host/render_view_host_delegate.h"
|
| #include "content/browser/renderer_host/render_view_host_impl.h"
|
| +#include "content/browser/web_contents/web_contents_android.h"
|
| #include "content/browser/web_contents/web_contents_impl.h"
|
| +#include "content/public/browser/android/download_delegate.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/download_url_parameters.h"
|
| @@ -40,6 +42,7 @@
|
| #include "net/http/http_response_headers.h"
|
| #include "net/url_request/url_request.h"
|
| #include "net/url_request/url_request_context.h"
|
| +#include "ui/android/window_android.h"
|
|
|
| using base::android::ConvertUTF8ToJavaString;
|
| using base::android::ScopedJavaLocalRef;
|
| @@ -59,6 +62,12 @@ content::WebContents* GetWebContents(int render_process_id,
|
| return content::WebContents::FromRenderViewHost(render_view_host);
|
| }
|
|
|
| +ScopedJavaLocalRef<jobject>
|
| +GetJavaWebContents(content::WebContents* web_contents) {
|
| + return (static_cast<content::WebContentsImpl*>(web_contents))
|
| + ->GetJavaWebContents();
|
| +}
|
| +
|
| void CreateContextMenuDownload(int render_process_id,
|
| int render_view_id,
|
| const content::ContextMenuParams& params,
|
| @@ -203,26 +212,27 @@ void DownloadControllerAndroidImpl::AcquireFileAccessPermission(
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| DCHECK(web_contents);
|
|
|
| - ScopedJavaLocalRef<jobject> view =
|
| - GetContentViewCoreFromWebContents(web_contents);
|
| - if (view.is_null()) {
|
| + ContentViewCore* view_core = ContentViewCore::FromWebContents(web_contents);
|
| + if (!view_core) {
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE, base::Bind(cb, false));
|
| return;
|
| }
|
|
|
| - if (HasFileAccessPermission(view)) {
|
| + ScopedJavaLocalRef<jobject> jweb_contents =
|
| + GetJavaWebContents(web_contents);
|
| + if (HasFileAccessPermission(view_core->GetWindowAndroid())) {
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE, base::Bind(cb, true));
|
| return;
|
| }
|
| -
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| // Make copy on the heap so we can pass the pointer through JNI.
|
| intptr_t callback_id = reinterpret_cast<intptr_t>(
|
| new DownloadControllerAndroid::AcquireFileAccessPermissionCallback(cb));
|
| - Java_DownloadController_requestFileAccess(
|
| - env, GetJavaObject()->Controller(env).obj(), view.obj(), callback_id);
|
| + content::WebContentsImpl* web_contents_impl =
|
| + static_cast<content::WebContentsImpl*>(web_contents);
|
| + web_contents_impl->GetWebContentsAndroid()->GetDownloadDelegate()->
|
| + RequestFileAccess(callback_id);
|
| }
|
|
|
| void DownloadControllerAndroidImpl::SetDefaultDownloadFileName(
|
| @@ -231,13 +241,15 @@ void DownloadControllerAndroidImpl::SetDefaultDownloadFileName(
|
| }
|
|
|
| bool DownloadControllerAndroidImpl::HasFileAccessPermission(
|
| - ScopedJavaLocalRef<jobject> j_content_view_core) {
|
| + ui::WindowAndroid* window_android) {
|
| + ScopedJavaLocalRef<jobject> jwindow_android = window_android->GetJavaObject();
|
| +
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - DCHECK(!j_content_view_core.is_null());
|
| + DCHECK(!jwindow_android.is_null());
|
|
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| return Java_DownloadController_hasFileAccess(
|
| - env, GetJavaObject()->Controller(env).obj(), j_content_view_core.obj());
|
| + env, GetJavaObject()->Controller(env).obj(), jwindow_android.obj());
|
| }
|
|
|
| void DownloadControllerAndroidImpl::CreateGETDownload(
|
| @@ -356,19 +368,6 @@ void DownloadControllerAndroidImpl::StartAndroidDownload(
|
| LOG(ERROR) << "Download failed on URL:" << info.url.spec();
|
| return;
|
| }
|
| - ScopedJavaLocalRef<jobject> view =
|
| - GetContentViewCoreFromWebContents(web_contents);
|
| - if (view.is_null()) {
|
| - // ContentViewCore might not have been created yet, pass a callback to
|
| - // DeferredDownloadTaskManager so that the download can restart when
|
| - // ContentViewCore is created.
|
| - deferred_downloads_.push_back(new DeferredDownloadObserver(
|
| - web_contents,
|
| - base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownload,
|
| - base::Unretained(this), render_process_id, render_view_id,
|
| - must_download, info)));
|
| - return;
|
| - }
|
|
|
| AcquireFileAccessPermission(
|
| web_contents,
|
| @@ -389,39 +388,21 @@ void DownloadControllerAndroidImpl::StartAndroidDownloadInternal(
|
| // The view went away. Can't proceed.
|
| if (!web_contents)
|
| return;
|
| - ScopedJavaLocalRef<jobject> view =
|
| - GetContentViewCoreFromWebContents(web_contents);
|
| - if (view.is_null())
|
| - return;
|
|
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jstring> jurl =
|
| - ConvertUTF8ToJavaString(env, info.url.spec());
|
| - ScopedJavaLocalRef<jstring> juser_agent =
|
| - ConvertUTF8ToJavaString(env, info.user_agent);
|
| - ScopedJavaLocalRef<jstring> jcontent_disposition =
|
| - ConvertUTF8ToJavaString(env, info.content_disposition);
|
| - ScopedJavaLocalRef<jstring> jmime_type =
|
| - ConvertUTF8ToJavaString(env, info.original_mime_type);
|
| - ScopedJavaLocalRef<jstring> jcookie =
|
| - ConvertUTF8ToJavaString(env, info.cookie);
|
| - ScopedJavaLocalRef<jstring> jreferer =
|
| - ConvertUTF8ToJavaString(env, info.referer);
|
| -
|
| - // net::GetSuggestedFilename will fallback to "download" as filename.
|
| - ScopedJavaLocalRef<jstring> jfilename =
|
| - base::android::ConvertUTF16ToJavaString(
|
| - env, net::GetSuggestedFilename(info.url, info.content_disposition,
|
| - std::string(), // referrer_charset
|
| - std::string(), // suggested_name
|
| - info.original_mime_type,
|
| - default_file_name_));
|
| -
|
| - Java_DownloadController_newHttpGetDownload(
|
| - env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(),
|
| - juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(),
|
| - jcookie.obj(), jreferer.obj(), info.has_user_gesture, jfilename.obj(),
|
| - info.total_bytes, must_download);
|
| + content::WebContentsImpl* web_contents_impl =
|
| + (static_cast<content::WebContentsImpl*>(web_contents));
|
| + base::string16 filename = net::GetSuggestedFilename(
|
| + info.url, info.content_disposition,
|
| + std::string(), // referrer_charset
|
| + std::string(), // suggested_name
|
| + info.original_mime_type,
|
| + default_file_name_);
|
| + web_contents_impl->GetWebContentsAndroid()->GetDownloadDelegate()->
|
| + NewHTTPGetDownload(info.url.spec(), info.user_agent,
|
| + info.content_disposition, info.original_mime_type,
|
| + info.cookie, info.referer, filename,
|
| + info.total_bytes, info.has_user_gesture,
|
| + must_download);
|
| }
|
|
|
| void DownloadControllerAndroidImpl::OnDownloadStarted(
|
| @@ -430,24 +411,15 @@ void DownloadControllerAndroidImpl::OnDownloadStarted(
|
| if (!download_item->GetWebContents())
|
| return;
|
|
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| -
|
| // Register for updates to the DownloadItem.
|
| download_item->AddObserver(this);
|
|
|
| - ScopedJavaLocalRef<jobject> view =
|
| - GetContentViewCoreFromWebContents(download_item->GetWebContents());
|
| - // The view went away. Can't proceed.
|
| - if (view.is_null())
|
| - return;
|
| + content::WebContentsImpl* web_contents_impl =
|
| + (static_cast<content::WebContentsImpl*>(download_item->GetWebContents()));
|
| + web_contents_impl->GetWebContentsAndroid()->GetDownloadDelegate()->
|
| + OnDownloadStarted(download_item->GetTargetFilePath().BaseName().value(),
|
| + download_item->GetMimeType());
|
|
|
| - ScopedJavaLocalRef<jstring> jmime_type =
|
| - ConvertUTF8ToJavaString(env, download_item->GetMimeType());
|
| - ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString(
|
| - env, download_item->GetTargetFilePath().BaseName().value());
|
| - Java_DownloadController_onDownloadStarted(
|
| - env, GetJavaObject()->Controller(env).obj(), view.obj(), jfilename.obj(),
|
| - jmime_type.obj());
|
| }
|
|
|
| void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) {
|
| @@ -518,18 +490,11 @@ void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) {
|
| }
|
|
|
| void DownloadControllerAndroidImpl::OnDangerousDownload(DownloadItem* item) {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString(
|
| - env, item->GetTargetFilePath().BaseName().value());
|
| - ScopedJavaLocalRef<jstring> jguid =
|
| - ConvertUTF8ToJavaString(env, item->GetGuid());
|
| - ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents(
|
| - item->GetWebContents());
|
| - if (!view_core.is_null()) {
|
| - Java_DownloadController_onDangerousDownload(
|
| - env, GetJavaObject()->Controller(env).obj(), view_core.obj(),
|
| - jfilename.obj(), jguid.obj());
|
| - }
|
| + content::WebContentsImpl* web_contents_impl =
|
| + (static_cast<content::WebContentsImpl*>(item->GetWebContents()));
|
| + web_contents_impl->GetWebContentsAndroid()->GetDownloadDelegate()->
|
| + OnDownloadStarted(item->GetTargetFilePath().BaseName().value(),
|
| + item->GetGuid());
|
| }
|
|
|
| ScopedJavaLocalRef<jobject>
|
|
|