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); |
+} |