| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/download/chrome_download_delegate.h" | 5 #include "chrome/browser/android/download/chrome_download_delegate.h" |
| 6 | 6 |
| 7 #include <jni.h> | 7 #include <jni.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <type_traits> | 10 #include <type_traits> |
| 11 | 11 |
| 12 #include "base/android/jni_android.h" | 12 #include "base/android/jni_android.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/callback.h" | 16 #include "base/callback.h" |
| 17 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
| 18 #include "base/memory/weak_ptr.h" | |
| 19 #include "chrome/browser/android/download/android_download_manager_overwrite_inf
obar_delegate.h" | 18 #include "chrome/browser/android/download/android_download_manager_overwrite_inf
obar_delegate.h" |
| 19 #include "chrome/browser/android/download/download_controller_base.h" |
| 20 #include "chrome/browser/android/tab_android.h" | 20 #include "chrome/browser/android/tab_android.h" |
| 21 #include "chrome/browser/infobars/infobar_service.h" | 21 #include "chrome/browser/infobars/infobar_service.h" |
| 22 #include "chrome/browser/permissions/permission_update_infobar_delegate_android.
h" | 22 #include "chrome/browser/permissions/permission_update_infobar_delegate_android.
h" |
| 23 #include "chrome/common/safe_browsing/file_type_policies.h" | 23 #include "chrome/common/safe_browsing/file_type_policies.h" |
| 24 #include "chrome/grit/chromium_strings.h" | 24 #include "chrome/grit/chromium_strings.h" |
| 25 #include "chrome/grit/generated_resources.h" | 25 #include "chrome/grit/generated_resources.h" |
| 26 #include "content/public/browser/android/download_controller_android.h" | |
| 27 #include "jni/ChromeDownloadDelegate_jni.h" | 26 #include "jni/ChromeDownloadDelegate_jni.h" |
| 28 #include "ui/base/l10n/l10n_util.h" | 27 #include "ui/base/l10n/l10n_util.h" |
| 29 | 28 |
| 30 using content::DownloadControllerAndroid; | 29 using base::android::ConvertUTF8ToJavaString; |
| 30 using base::android::ScopedJavaLocalRef; |
| 31 using content::WebContents; |
| 31 | 32 |
| 32 // Gets the download warning text for the given file name. | 33 // Gets the download warning text for the given file name. |
| 33 static ScopedJavaLocalRef<jstring> GetDownloadWarningText( | 34 static ScopedJavaLocalRef<jstring> GetDownloadWarningText( |
| 34 JNIEnv* env, | 35 JNIEnv* env, |
| 35 const JavaParamRef<jclass>& clazz, | 36 const JavaParamRef<jclass>& clazz, |
| 36 const JavaParamRef<jstring>& filename) { | 37 const JavaParamRef<jstring>& filename) { |
| 37 return base::android::ConvertUTF8ToJavaString( | 38 return base::android::ConvertUTF8ToJavaString( |
| 38 env, l10n_util::GetStringFUTF8( | 39 env, l10n_util::GetStringFUTF8( |
| 39 IDS_PROMPT_DANGEROUS_DOWNLOAD, | 40 IDS_PROMPT_DANGEROUS_DOWNLOAD, |
| 40 base::android::ConvertJavaStringToUTF16(env, filename))); | 41 base::android::ConvertJavaStringToUTF16(env, filename))); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 52 // Called when a dangerous download is validated. | 53 // Called when a dangerous download is validated. |
| 53 static void DangerousDownloadValidated( | 54 static void DangerousDownloadValidated( |
| 54 JNIEnv* env, | 55 JNIEnv* env, |
| 55 const JavaParamRef<jclass>& clazz, | 56 const JavaParamRef<jclass>& clazz, |
| 56 const JavaParamRef<jobject>& tab, | 57 const JavaParamRef<jobject>& tab, |
| 57 const JavaParamRef<jstring>& jdownload_guid, | 58 const JavaParamRef<jstring>& jdownload_guid, |
| 58 jboolean accept) { | 59 jboolean accept) { |
| 59 std::string download_guid = | 60 std::string download_guid = |
| 60 base::android::ConvertJavaStringToUTF8(env, jdownload_guid); | 61 base::android::ConvertJavaStringToUTF8(env, jdownload_guid); |
| 61 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 62 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 62 DownloadControllerAndroid::Get()->DangerousDownloadValidated( | 63 DownloadControllerBase::Get()->DangerousDownloadValidated( |
| 63 tab_android->web_contents(), download_guid, accept); | 64 tab_android->web_contents(), download_guid, accept); |
| 64 } | 65 } |
| 65 | 66 |
| 66 // static | 67 // static |
| 67 bool ChromeDownloadDelegate::EnqueueDownloadManagerRequest( | 68 bool ChromeDownloadDelegate::EnqueueDownloadManagerRequest( |
| 68 jobject chrome_download_delegate, | 69 jobject chrome_download_delegate, |
| 69 bool overwrite, | 70 bool overwrite, |
| 70 jobject download_info) { | 71 jobject download_info) { |
| 71 JNIEnv* env = base::android::AttachCurrentThread(); | 72 JNIEnv* env = base::android::AttachCurrentThread(); |
| 72 | 73 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 const JavaParamRef<jstring>& jpermission, | 106 const JavaParamRef<jstring>& jpermission, |
| 106 jlong callback_id) { | 107 jlong callback_id) { |
| 107 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 108 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 108 | 109 |
| 109 std::string permission = | 110 std::string permission = |
| 110 base::android::ConvertJavaStringToUTF8(env, jpermission); | 111 base::android::ConvertJavaStringToUTF8(env, jpermission); |
| 111 | 112 |
| 112 // Convert java long long int to c++ pointer, take ownership. | 113 // Convert java long long int to c++ pointer, take ownership. |
| 113 static_assert( | 114 static_assert( |
| 114 std::is_same< | 115 std::is_same< |
| 115 DownloadControllerAndroid::AcquireFileAccessPermissionCallback, | 116 DownloadControllerBase::AcquireFileAccessPermissionCallback, |
| 116 base::Callback<void(bool)>>::value, | 117 base::Callback<void(bool)>>::value, |
| 117 "Callback types don't match!"); | 118 "Callback types don't match!"); |
| 118 std::unique_ptr<base::Callback<void(bool)>> cb( | 119 std::unique_ptr<base::Callback<void(bool)>> cb( |
| 119 reinterpret_cast<base::Callback<void(bool)>*>(callback_id)); | 120 reinterpret_cast<base::Callback<void(bool)>*>(callback_id)); |
| 120 | 121 |
| 121 std::vector<std::string> permissions; | 122 std::vector<std::string> permissions; |
| 122 permissions.push_back(permission); | 123 permissions.push_back(permission); |
| 123 | 124 |
| 124 PermissionUpdateInfoBarDelegate::Create( | 125 PermissionUpdateInfoBarDelegate::Create( |
| 125 tab_android->web_contents(), | 126 tab_android->web_contents(), |
| 126 permissions, | 127 permissions, |
| 127 IDS_MISSING_STORAGE_PERMISSION_DOWNLOAD_EDUCATION_TEXT, | 128 IDS_MISSING_STORAGE_PERMISSION_DOWNLOAD_EDUCATION_TEXT, |
| 128 *cb); | 129 *cb); |
| 129 } | 130 } |
| 130 | 131 |
| 132 ChromeDownloadDelegate::ChromeDownloadDelegate( |
| 133 WebContents* web_contents) {} |
| 134 |
| 135 ChromeDownloadDelegate::~ChromeDownloadDelegate() { |
| 136 JNIEnv* env = base::android::AttachCurrentThread(); |
| 137 env->DeleteGlobalRef(java_ref_); |
| 138 } |
| 139 |
| 140 void ChromeDownloadDelegate::SetJavaRef(JNIEnv* env, jobject jobj) { |
| 141 java_ref_ = env->NewGlobalRef(jobj); |
| 142 } |
| 143 |
| 144 void ChromeDownloadDelegate::RequestHTTPGetDownload( |
| 145 const std::string& url, |
| 146 const std::string& user_agent, |
| 147 const std::string& content_disposition, |
| 148 const std::string& mime_type, |
| 149 const std::string& cookie, |
| 150 const std::string& referer, |
| 151 const base::string16& file_name, |
| 152 int64_t content_length, |
| 153 bool has_user_gesture, |
| 154 bool must_download) { |
| 155 JNIEnv* env = base::android::AttachCurrentThread(); |
| 156 ScopedJavaLocalRef<jstring> jurl = |
| 157 ConvertUTF8ToJavaString(env, url); |
| 158 ScopedJavaLocalRef<jstring> juser_agent = |
| 159 ConvertUTF8ToJavaString(env, user_agent); |
| 160 ScopedJavaLocalRef<jstring> jcontent_disposition = |
| 161 ConvertUTF8ToJavaString(env, content_disposition); |
| 162 ScopedJavaLocalRef<jstring> jmime_type = |
| 163 ConvertUTF8ToJavaString(env, mime_type); |
| 164 ScopedJavaLocalRef<jstring> jcookie = |
| 165 ConvertUTF8ToJavaString(env, cookie); |
| 166 ScopedJavaLocalRef<jstring> jreferer = |
| 167 ConvertUTF8ToJavaString(env, referer); |
| 168 |
| 169 // net::GetSuggestedFilename will fallback to "download" as filename. |
| 170 ScopedJavaLocalRef<jstring> jfilename = |
| 171 base::android::ConvertUTF16ToJavaString(env, file_name); |
| 172 Java_ChromeDownloadDelegate_requestHttpGetDownload( |
| 173 env, java_ref_, |
| 174 jurl.obj(), juser_agent.obj(), jcontent_disposition.obj(), |
| 175 jmime_type.obj(), jcookie.obj(), jreferer.obj(), has_user_gesture, |
| 176 jfilename.obj(), content_length, must_download); |
| 177 } |
| 178 |
| 179 void ChromeDownloadDelegate::OnDownloadStarted(const std::string& filename, |
| 180 const std::string& mime_type) { |
| 181 JNIEnv* env = base::android::AttachCurrentThread(); |
| 182 ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString( |
| 183 env, filename); |
| 184 ScopedJavaLocalRef<jstring> jmime_type = |
| 185 ConvertUTF8ToJavaString(env, mime_type); |
| 186 Java_ChromeDownloadDelegate_onDownloadStarted( |
| 187 env, java_ref_, jfilename.obj(), jmime_type.obj()); |
| 188 } |
| 189 |
| 190 void ChromeDownloadDelegate::OnDangerousDownload(const std::string& filename, |
| 191 const std::string& guid) { |
| 192 JNIEnv* env = base::android::AttachCurrentThread(); |
| 193 ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString( |
| 194 env, filename); |
| 195 ScopedJavaLocalRef<jstring> jguid = ConvertUTF8ToJavaString(env, guid); |
| 196 Java_ChromeDownloadDelegate_onDangerousDownload( |
| 197 env, java_ref_, jfilename.obj(), jguid.obj()); |
| 198 } |
| 199 |
| 200 void ChromeDownloadDelegate::RequestFileAccess(intptr_t callback_id) { |
| 201 JNIEnv* env = base::android::AttachCurrentThread(); |
| 202 Java_ChromeDownloadDelegate_requestFileAccess( |
| 203 env, java_ref_, callback_id); |
| 204 } |
| 205 |
| 206 void Init(JNIEnv* env, |
| 207 const JavaParamRef<jobject>& obj, |
| 208 const JavaParamRef<jobject>& jweb_contents) { |
| 209 auto web_contents = WebContents::FromJavaWebContents(jweb_contents); |
| 210 ChromeDownloadDelegate::CreateForWebContents(web_contents); |
| 211 ChromeDownloadDelegate::FromWebContents(web_contents)->SetJavaRef(env, obj); |
| 212 } |
| 213 |
| 131 bool RegisterChromeDownloadDelegate(JNIEnv* env) { | 214 bool RegisterChromeDownloadDelegate(JNIEnv* env) { |
| 132 return RegisterNativesImpl(env); | 215 return RegisterNativesImpl(env); |
| 133 } | 216 } |
| 217 |
| 218 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ChromeDownloadDelegate); |
| OLD | NEW |