| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/download_controller.h" | 5 #include "chrome/browser/android/download/download_controller.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/android/context_utils.h" | 10 #include "base/android/context_utils.h" |
| 11 #include "base/android/jni_android.h" | 11 #include "base/android/jni_android.h" |
| 12 #include "base/android/jni_string.h" | 12 #include "base/android/jni_string.h" |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/lazy_instance.h" | 14 #include "base/lazy_instance.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/synchronization/lock.h" | 17 #include "base/synchronization/lock.h" |
| 18 #include "base/time/time.h" | |
| 19 #include "chrome/browser/android/download/chrome_download_delegate.h" | 18 #include "chrome/browser/android/download/chrome_download_delegate.h" |
| 20 #include "chrome/browser/android/download/dangerous_download_infobar_delegate.h" | 19 #include "chrome/browser/android/download/dangerous_download_infobar_delegate.h" |
| 20 #include "chrome/browser/android/download/download_manager_service.h" |
| 21 #include "chrome/browser/infobars/infobar_service.h" | 21 #include "chrome/browser/infobars/infobar_service.h" |
| 22 #include "chrome/browser/ui/android/view_android_helper.h" | 22 #include "chrome/browser/ui/android/view_android_helper.h" |
| 23 #include "content/public/browser/browser_context.h" | 23 #include "content/public/browser/browser_context.h" |
| 24 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
| 25 #include "content/public/browser/download_manager.h" | 25 #include "content/public/browser/download_manager.h" |
| 26 #include "content/public/browser/download_url_parameters.h" | 26 #include "content/public/browser/download_url_parameters.h" |
| 27 #include "content/public/browser/render_process_host.h" | 27 #include "content/public/browser/render_process_host.h" |
| 28 #include "content/public/browser/render_view_host.h" | 28 #include "content/public/browser/render_view_host.h" |
| 29 #include "content/public/common/referrer.h" | 29 #include "content/public/common/referrer.h" |
| 30 #include "jni/DownloadController_jni.h" | 30 #include "jni/DownloadController_jni.h" |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 void DownloadController::OnDownloadUpdated(DownloadItem* item) { | 253 void DownloadController::OnDownloadUpdated(DownloadItem* item) { |
| 254 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 254 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 255 if (item->IsDangerous() && (item->GetState() != DownloadItem::CANCELLED)) { | 255 if (item->IsDangerous() && (item->GetState() != DownloadItem::CANCELLED)) { |
| 256 // Dont't show notification for a dangerous download, as user can resume | 256 // Dont't show notification for a dangerous download, as user can resume |
| 257 // the download after browser crash through notification. | 257 // the download after browser crash through notification. |
| 258 OnDangerousDownload(item); | 258 OnDangerousDownload(item); |
| 259 return; | 259 return; |
| 260 } | 260 } |
| 261 | 261 |
| 262 JNIEnv* env = base::android::AttachCurrentThread(); | 262 JNIEnv* env = base::android::AttachCurrentThread(); |
| 263 ScopedJavaLocalRef<jstring> jguid = | 263 ScopedJavaLocalRef<jobject> j_item = |
| 264 ConvertUTF8ToJavaString(env, item->GetGuid()); | 264 DownloadManagerService::CreateJavaDownloadInfo(env, item); |
| 265 ScopedJavaLocalRef<jstring> jurl = | |
| 266 ConvertUTF8ToJavaString(env, item->GetURL().spec()); | |
| 267 ScopedJavaLocalRef<jstring> jmime_type = | |
| 268 ConvertUTF8ToJavaString(env, item->GetMimeType()); | |
| 269 ScopedJavaLocalRef<jstring> jpath = | |
| 270 ConvertUTF8ToJavaString(env, item->GetTargetFilePath().value()); | |
| 271 ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString( | |
| 272 env, item->GetTargetFilePath().BaseName().value()); | |
| 273 ScopedJavaLocalRef<jstring> joriginal_url = | |
| 274 ConvertUTF8ToJavaString(env, item->GetOriginalUrl().spec()); | |
| 275 ScopedJavaLocalRef<jstring> jreferrer_url = | |
| 276 ConvertUTF8ToJavaString(env, item->GetReferrerUrl().spec()); | |
| 277 | |
| 278 ui::PageTransition base_transition = | |
| 279 ui::PageTransitionStripQualifier(item->GetTransitionType()); | |
| 280 bool user_initiated = | |
| 281 item->GetTransitionType() & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR || | |
| 282 base_transition == ui::PAGE_TRANSITION_TYPED || | |
| 283 base_transition == ui::PAGE_TRANSITION_AUTO_BOOKMARK || | |
| 284 base_transition == ui::PAGE_TRANSITION_GENERATED || | |
| 285 base_transition == ui::PAGE_TRANSITION_RELOAD || | |
| 286 base_transition == ui::PAGE_TRANSITION_KEYWORD; | |
| 287 bool hasUserGesture = item->HasUserGesture() || user_initiated; | |
| 288 switch (item->GetState()) { | 265 switch (item->GetState()) { |
| 289 case DownloadItem::IN_PROGRESS: { | 266 case DownloadItem::IN_PROGRESS: { |
| 290 base::TimeDelta time_delta; | |
| 291 item->TimeRemaining(&time_delta); | |
| 292 Java_DownloadController_onDownloadUpdated( | 267 Java_DownloadController_onDownloadUpdated( |
| 293 env, GetJavaObject()->Controller(env), jurl, jmime_type, jfilename, | 268 env, GetJavaObject()->Controller(env), j_item); |
| 294 jpath, item->GetReceivedBytes(), jguid, item->PercentComplete(), | |
| 295 time_delta.InMilliseconds(), hasUserGesture, item->IsPaused(), | |
| 296 item->GetBrowserContext()->IsOffTheRecord()); | |
| 297 break; | 269 break; |
| 298 } | 270 } |
| 299 case DownloadItem::COMPLETE: | 271 case DownloadItem::COMPLETE: |
| 300 // Multiple OnDownloadUpdated() notifications may be issued while the | 272 // Multiple OnDownloadUpdated() notifications may be issued while the |
| 301 // download is in the COMPLETE state. Only handle one. | 273 // download is in the COMPLETE state. Only handle one. |
| 302 item->RemoveObserver(this); | 274 item->RemoveObserver(this); |
| 303 | 275 |
| 304 // Call onDownloadCompleted | 276 // Call onDownloadCompleted |
| 305 Java_DownloadController_onDownloadCompleted( | 277 Java_DownloadController_onDownloadCompleted( |
| 306 env, GetJavaObject()->Controller(env), jurl, jmime_type, jfilename, | 278 env, GetJavaObject()->Controller(env), j_item); |
| 307 jpath, item->GetReceivedBytes(), jguid, joriginal_url, jreferrer_url, | |
| 308 hasUserGesture); | |
| 309 DownloadController::RecordDownloadCancelReason( | 279 DownloadController::RecordDownloadCancelReason( |
| 310 DownloadController::CANCEL_REASON_NOT_CANCELED); | 280 DownloadController::CANCEL_REASON_NOT_CANCELED); |
| 311 break; | 281 break; |
| 312 case DownloadItem::CANCELLED: | 282 case DownloadItem::CANCELLED: |
| 313 Java_DownloadController_onDownloadCancelled( | 283 Java_DownloadController_onDownloadCancelled( |
| 314 env, GetJavaObject()->Controller(env), jguid); | 284 env, GetJavaObject()->Controller(env), j_item); |
| 315 DownloadController::RecordDownloadCancelReason( | 285 DownloadController::RecordDownloadCancelReason( |
| 316 DownloadController::CANCEL_REASON_OTHER_NATIVE_RESONS); | 286 DownloadController::CANCEL_REASON_OTHER_NATIVE_RESONS); |
| 317 break; | 287 break; |
| 318 case DownloadItem::INTERRUPTED: | 288 case DownloadItem::INTERRUPTED: |
| 319 // When device loses/changes network, we get a NETWORK_TIMEOUT, | 289 // When device loses/changes network, we get a NETWORK_TIMEOUT, |
| 320 // NETWORK_FAILED or NETWORK_DISCONNECTED error. Download should auto | 290 // NETWORK_FAILED or NETWORK_DISCONNECTED error. Download should auto |
| 321 // resume in this case. | 291 // resume in this case. |
| 322 Java_DownloadController_onDownloadInterrupted( | 292 Java_DownloadController_onDownloadInterrupted( |
| 323 env, GetJavaObject()->Controller(env), jurl, jmime_type, jfilename, | 293 env, GetJavaObject()->Controller(env), j_item, |
| 324 jpath, item->GetReceivedBytes(), jguid, item->CanResume(), | 294 IsInterruptedDownloadAutoResumable(item)); |
| 325 IsInterruptedDownloadAutoResumable(item), | |
| 326 item->GetBrowserContext()->IsOffTheRecord()); | |
| 327 item->RemoveObserver(this); | 295 item->RemoveObserver(this); |
| 328 break; | 296 break; |
| 329 case DownloadItem::MAX_DOWNLOAD_STATE: | 297 case DownloadItem::MAX_DOWNLOAD_STATE: |
| 330 NOTREACHED(); | 298 NOTREACHED(); |
| 331 } | 299 } |
| 332 } | 300 } |
| 333 | 301 |
| 334 void DownloadController::OnDangerousDownload(DownloadItem* item) { | 302 void DownloadController::OnDangerousDownload(DownloadItem* item) { |
| 335 WebContents* web_contents = item->GetWebContents(); | 303 WebContents* web_contents = item->GetWebContents(); |
| 336 if (!web_contents) { | 304 if (!web_contents) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 359 void DownloadController::StartContextMenuDownload( | 327 void DownloadController::StartContextMenuDownload( |
| 360 const ContextMenuParams& params, WebContents* web_contents, bool is_link, | 328 const ContextMenuParams& params, WebContents* web_contents, bool is_link, |
| 361 const std::string& extra_headers) { | 329 const std::string& extra_headers) { |
| 362 int process_id = web_contents->GetRenderProcessHost()->GetID(); | 330 int process_id = web_contents->GetRenderProcessHost()->GetID(); |
| 363 int routing_id = web_contents->GetRoutingID(); | 331 int routing_id = web_contents->GetRoutingID(); |
| 364 AcquireFileAccessPermission( | 332 AcquireFileAccessPermission( |
| 365 web_contents, base::Bind(&CreateContextMenuDownload, process_id, | 333 web_contents, base::Bind(&CreateContextMenuDownload, process_id, |
| 366 routing_id, params, is_link, extra_headers)); | 334 routing_id, params, is_link, extra_headers)); |
| 367 } | 335 } |
| 368 | 336 |
| OLD | NEW |