Chromium Code Reviews| 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..f9843cadcd779a3a019f7803d56e00eee5dd20fc 100644 |
| --- a/content/browser/android/download_controller_android_impl.cc |
| +++ b/content/browser/android/download_controller_android_impl.cc |
| @@ -40,6 +40,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 +60,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,15 +210,18 @@ 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); |
| + ScopedJavaLocalRef<jobject> jwindow_android = |
| + view_core->GetWindowAndroid()->GetJavaObject(); |
| + if (HasFileAccessPermission(jwindow_android)) { |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, base::Bind(cb, true)); |
| return; |
| @@ -222,7 +232,8 @@ void DownloadControllerAndroidImpl::AcquireFileAccessPermission( |
| intptr_t callback_id = reinterpret_cast<intptr_t>( |
| new DownloadControllerAndroid::AcquireFileAccessPermissionCallback(cb)); |
| Java_DownloadController_requestFileAccess( |
| - env, GetJavaObject()->Controller(env).obj(), view.obj(), callback_id); |
| + env, GetJavaObject()->Controller(env).obj(), jweb_contents.obj(), |
| + jwindow_android.obj(), callback_id); |
| } |
| void DownloadControllerAndroidImpl::SetDefaultDownloadFileName( |
| @@ -231,13 +242,13 @@ void DownloadControllerAndroidImpl::SetDefaultDownloadFileName( |
| } |
| bool DownloadControllerAndroidImpl::HasFileAccessPermission( |
| - ScopedJavaLocalRef<jobject> j_content_view_core) { |
| + ScopedJavaLocalRef<jobject> jwindow_android) { |
| 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 +367,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. |
|
no sievers
2016/05/27 19:09:25
That would be really neat if we can get rid of thi
Jinsuk Kim
2016/05/30 01:20:57
I don't think we need it any more once the depende
|
| - 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,10 +387,7 @@ 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; |
| + ScopedJavaLocalRef<jobject> jweb_contents = GetJavaWebContents(web_contents); |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| ScopedJavaLocalRef<jstring> jurl = |
| @@ -418,10 +413,10 @@ void DownloadControllerAndroidImpl::StartAndroidDownloadInternal( |
| 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); |
| + env, GetJavaObject()->Controller(env).obj(), jweb_contents.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); |
| } |
| void DownloadControllerAndroidImpl::OnDownloadStarted( |
| @@ -435,19 +430,16 @@ void DownloadControllerAndroidImpl::OnDownloadStarted( |
| // 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; |
| + ScopedJavaLocalRef<jobject> jweb_contents = |
| + GetJavaWebContents(download_item->GetWebContents()); |
| 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()); |
| + env, GetJavaObject()->Controller(env).obj(), jweb_contents.obj(), |
| + jfilename.obj(), jmime_type.obj()); |
| } |
| void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) { |
| @@ -523,11 +515,11 @@ void DownloadControllerAndroidImpl::OnDangerousDownload(DownloadItem* item) { |
| env, item->GetTargetFilePath().BaseName().value()); |
| ScopedJavaLocalRef<jstring> jguid = |
| ConvertUTF8ToJavaString(env, item->GetGuid()); |
| - ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents( |
| + ScopedJavaLocalRef<jobject> jweb_contents = GetJavaWebContents( |
| item->GetWebContents()); |
| - if (!view_core.is_null()) { |
| + if (!jweb_contents.is_null()) { |
| Java_DownloadController_onDangerousDownload( |
| - env, GetJavaObject()->Controller(env).obj(), view_core.obj(), |
| + env, GetJavaObject()->Controller(env).obj(), jweb_contents.obj(), |
| jfilename.obj(), jguid.obj()); |
| } |
| } |