Chromium Code Reviews| Index: chrome/browser/android/download/chrome_download_delegate.cc |
| diff --git a/chrome/browser/android/download/chrome_download_delegate.cc b/chrome/browser/android/download/chrome_download_delegate.cc |
| index 96382979204d6b734040d2aa7980d67d80ed6d4c..804f65d05fa8df9edf9010df7437b42304ac5af7 100644 |
| --- a/chrome/browser/android/download/chrome_download_delegate.cc |
| +++ b/chrome/browser/android/download/chrome_download_delegate.cc |
| @@ -2,6 +2,7 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <chrome/browser/android/download/download_overwrite_infobar_delegate_java_initiated.h> |
|
Peter Kasting
2015/02/25 06:24:57
Both the location of this include and its use of a
Changwan Ryu
2015/03/02 14:46:36
Must be the result of eclipse auto refactoring.
Do
|
| #include "chrome/browser/android/download/chrome_download_delegate.h" |
| #include <jni.h> |
| @@ -9,18 +10,19 @@ |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| #include "base/android/scoped_java_ref.h" |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| #include "base/files/file_path.h" |
| +#include "base/memory/weak_ptr.h" |
| +#include "chrome/browser/android/download/download_overwrite_info.h" |
| #include "chrome/browser/android/tab_android.h" |
| #include "chrome/browser/download/download_extensions.h" |
| +#include "chrome/browser/infobars/infobar_service.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "content/public/browser/android/download_controller_android.h" |
| #include "jni/ChromeDownloadDelegate_jni.h" |
| #include "ui/base/l10n/l10n_util.h" |
| -bool RegisterChromeDownloadDeleagte(JNIEnv* env) { |
| - return RegisterNativesImpl(env); |
| -} |
| - |
| // Gets the download warning text for the given file name. |
| static jstring GetDownloadWarningText( |
| JNIEnv* env, jclass clazz, jstring filename) { |
| @@ -45,3 +47,97 @@ static void DangerousDownloadValidated( |
| content::DownloadControllerAndroid::Get()->DangerousDownloadValidated( |
| tab_android->web_contents(), download_id, accept); |
| } |
| + |
| +// A class for keeping track of Java ChromeDownloadDelegate object and handling |
| +// PromptUserDone callback. |
| +class PromptUserDoneCB { |
| + public: |
| + PromptUserDoneCB(JNIEnv* env, jobject obj) : weak_java_obj_(env, obj) {} |
| + |
| + ~PromptUserDoneCB() {} |
| + |
| + void PromptUserDone( |
| + const chrome::android::DownloadOverwriteInfo& download_overwrite_info) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + ScopedJavaLocalRef<jobject> jobj = weak_java_obj_.get(env); |
| + if (!jobj.obj()) |
| + return; |
| + |
| + if (download_overwrite_info.dismissed) |
| + return; |
| + |
| + ScopedJavaLocalRef<jstring> jfile_name = |
| + base::android::ConvertUTF8ToJavaString( |
| + env, download_overwrite_info.file_name); |
| + ScopedJavaLocalRef<jstring> jurl = base::android::ConvertUTF8ToJavaString( |
| + env, download_overwrite_info.url); |
| + ScopedJavaLocalRef<jstring> juser_agent = |
| + base::android::ConvertUTF8ToJavaString( |
| + env, download_overwrite_info.user_agent); |
| + ScopedJavaLocalRef<jstring> jcontent_disposition = |
| + base::android::ConvertUTF8ToJavaString( |
| + env, download_overwrite_info.content_disposition); |
| + ScopedJavaLocalRef<jstring> jmime_type = |
| + base::android::ConvertUTF8ToJavaString( |
| + env, download_overwrite_info.mime_type); |
| + ScopedJavaLocalRef<jstring> jcookie = |
| + base::android::ConvertUTF8ToJavaString(env, |
| + download_overwrite_info.cookie); |
| + ScopedJavaLocalRef<jstring> jreferer = |
| + base::android::ConvertUTF8ToJavaString(env, |
| + download_overwrite_info.referer); |
| + Java_ChromeDownloadDelegate_enqueueDownloadManagerRequestFromNative( |
|
Ted C
2015/02/26 00:57:55
and any reason the delegate of the new class can't
Changwan Ryu
2015/03/02 14:46:36
Hmm... I thought I needed it to keep reference to
|
| + env, jobj.obj(), download_overwrite_info.overwrite, jfile_name.obj(), |
| + jurl.obj(), juser_agent.obj(), jcontent_disposition.obj(), |
| + jmime_type.obj(), jcookie.obj(), jreferer.obj(), |
| + download_overwrite_info.has_user_gesture, |
| + download_overwrite_info.content_length, |
| + download_overwrite_info.is_GET_request); |
| + } |
| + |
| + private: |
| + JavaObjectWeakGlobalRef weak_java_obj_; |
| + DISALLOW_COPY_AND_ASSIGN(PromptUserDoneCB); |
| +}; |
| + |
| +// Called when we need to interrupt download and ask users whether to overwrite |
| +// an existing file. |
| +static void LaunchDownloadOverwriteInfoBar(JNIEnv* env, |
| + jclass clazz, |
| + jobject obj, |
| + jobject tab, |
| + jstring file_name, |
| + jstring dir_name, |
| + jstring dir_full_path, |
| + jstring url, |
| + jstring user_agent, |
| + jstring content_disposition, |
| + jstring mime_type, |
| + jstring cookie, |
| + jstring referer, |
| + jboolean has_user_gesture, |
| + jlong content_length, |
| + jboolean is_GET_request) { |
| + chrome::android::DownloadOverwriteInfo download_overwrite_info( |
|
Ted C
2015/02/26 00:57:55
Any reason we don't just pass down the DownloadInf
Changwan Ryu
2015/03/02 14:46:36
Done. We can pass downloadinfo by wrapping it insi
|
| + base::android::ConvertJavaStringToUTF8(env, file_name), |
| + base::android::ConvertJavaStringToUTF8(env, dir_name), |
| + base::android::ConvertJavaStringToUTF8(env, dir_full_path), |
| + base::android::ConvertJavaStringToUTF8(env, url), |
| + base::android::ConvertJavaStringToUTF8(env, content_disposition), |
| + base::android::ConvertJavaStringToUTF8(env, user_agent), |
| + base::android::ConvertJavaStringToUTF8(env, cookie), |
| + base::android::ConvertJavaStringToUTF8(env, referer), has_user_gesture, |
| + base::android::ConvertJavaStringToUTF8(env, mime_type), content_length, |
| + is_GET_request); |
| + PromptUserDoneCB* ref = new PromptUserDoneCB(env, obj); |
| + |
| + TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| + chrome::android::DownloadOverwriteInfoBarDelegateJavaInitiated::Create( |
| + InfoBarService::FromWebContents(tab_android->web_contents()), |
| + download_overwrite_info, |
| + base::Bind(&PromptUserDoneCB::PromptUserDone, base::Owned(ref))); |
| +} |
| + |
| +bool RegisterChromeDownloadDelegate(JNIEnv* env) { |
| + return RegisterNativesImpl(env); |
| +} |