| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/android/download_controller_android_impl.h" | 5 #include "content/browser/android/download_controller_android_impl.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 iter != deferred_downloads_.end(); ++iter) { | 91 iter != deferred_downloads_.end(); ++iter) { |
| 92 if (*iter == observer) { | 92 if (*iter == observer) { |
| 93 deferred_downloads_.erase(iter); | 93 deferred_downloads_.erase(iter); |
| 94 return; | 94 return; |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 void DownloadControllerAndroidImpl::CreateGETDownload( | 99 void DownloadControllerAndroidImpl::CreateGETDownload( |
| 100 int render_process_id, int render_view_id, int request_id) { | 100 int render_process_id, int render_view_id, int request_id) { |
| 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 101 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 102 GlobalRequestID global_id(render_process_id, request_id); | 102 GlobalRequestID global_id(render_process_id, request_id); |
| 103 | 103 |
| 104 // We are yielding the UI thread and render_view_host may go away by | 104 // We are yielding the UI thread and render_view_host may go away by |
| 105 // the time we come back. Pass along render_process_id and render_view_id | 105 // the time we come back. Pass along render_process_id and render_view_id |
| 106 // to retrieve it later (if it still exists). | 106 // to retrieve it later (if it still exists). |
| 107 GetDownloadInfoCB cb = base::Bind( | 107 GetDownloadInfoCB cb = base::Bind( |
| 108 &DownloadControllerAndroidImpl::StartAndroidDownload, | 108 &DownloadControllerAndroidImpl::StartAndroidDownload, |
| 109 base::Unretained(this), render_process_id, | 109 base::Unretained(this), render_process_id, |
| 110 render_view_id); | 110 render_view_id); |
| 111 | 111 |
| 112 PrepareDownloadInfo( | 112 PrepareDownloadInfo( |
| 113 global_id, | 113 global_id, |
| 114 base::Bind(&DownloadControllerAndroidImpl::StartDownloadOnUIThread, | 114 base::Bind(&DownloadControllerAndroidImpl::StartDownloadOnUIThread, |
| 115 base::Unretained(this), cb)); | 115 base::Unretained(this), cb)); |
| 116 } | 116 } |
| 117 | 117 |
| 118 void DownloadControllerAndroidImpl::PrepareDownloadInfo( | 118 void DownloadControllerAndroidImpl::PrepareDownloadInfo( |
| 119 const GlobalRequestID& global_id, | 119 const GlobalRequestID& global_id, |
| 120 const GetDownloadInfoCB& callback) { | 120 const GetDownloadInfoCB& callback) { |
| 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 121 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 122 | 122 |
| 123 net::URLRequest* request = | 123 net::URLRequest* request = |
| 124 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); | 124 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
| 125 if (!request) { | 125 if (!request) { |
| 126 LOG(ERROR) << "Request to download not found."; | 126 LOG(ERROR) << "Request to download not found."; |
| 127 return; | 127 return; |
| 128 } | 128 } |
| 129 | 129 |
| 130 DownloadInfoAndroid info_android(request); | 130 DownloadInfoAndroid info_android(request); |
| 131 | 131 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 143 } | 143 } |
| 144 } else { | 144 } else { |
| 145 // Can't get any cookies, start android download. | 145 // Can't get any cookies, start android download. |
| 146 callback.Run(info_android); | 146 callback.Run(info_android); |
| 147 } | 147 } |
| 148 } | 148 } |
| 149 | 149 |
| 150 void DownloadControllerAndroidImpl::CheckPolicyAndLoadCookies( | 150 void DownloadControllerAndroidImpl::CheckPolicyAndLoadCookies( |
| 151 const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, | 151 const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, |
| 152 const GlobalRequestID& global_id, const net::CookieList& cookie_list) { | 152 const GlobalRequestID& global_id, const net::CookieList& cookie_list) { |
| 153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 153 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 154 | 154 |
| 155 net::URLRequest* request = | 155 net::URLRequest* request = |
| 156 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); | 156 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
| 157 if (!request) { | 157 if (!request) { |
| 158 LOG(ERROR) << "Request to download not found."; | 158 LOG(ERROR) << "Request to download not found."; |
| 159 return; | 159 return; |
| 160 } | 160 } |
| 161 | 161 |
| 162 if (request->context()->network_delegate()->CanGetCookies( | 162 if (request->context()->network_delegate()->CanGetCookies( |
| 163 *request, cookie_list)) { | 163 *request, cookie_list)) { |
| 164 DoLoadCookies(info, callback, global_id); | 164 DoLoadCookies(info, callback, global_id); |
| 165 } else { | 165 } else { |
| 166 callback.Run(info); | 166 callback.Run(info); |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| 170 void DownloadControllerAndroidImpl::DoLoadCookies( | 170 void DownloadControllerAndroidImpl::DoLoadCookies( |
| 171 const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, | 171 const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, |
| 172 const GlobalRequestID& global_id) { | 172 const GlobalRequestID& global_id) { |
| 173 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 173 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 174 | 174 |
| 175 net::CookieOptions options; | 175 net::CookieOptions options; |
| 176 options.set_include_httponly(); | 176 options.set_include_httponly(); |
| 177 | 177 |
| 178 net::URLRequest* request = | 178 net::URLRequest* request = |
| 179 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); | 179 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
| 180 if (!request) { | 180 if (!request) { |
| 181 LOG(ERROR) << "Request to download not found."; | 181 LOG(ERROR) << "Request to download not found."; |
| 182 return; | 182 return; |
| 183 } | 183 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 194 const std::string& cookie) { | 194 const std::string& cookie) { |
| 195 download_info.cookie = cookie; | 195 download_info.cookie = cookie; |
| 196 | 196 |
| 197 // We have everything we need, start Android download. | 197 // We have everything we need, start Android download. |
| 198 callback.Run(download_info); | 198 callback.Run(download_info); |
| 199 } | 199 } |
| 200 | 200 |
| 201 void DownloadControllerAndroidImpl::StartDownloadOnUIThread( | 201 void DownloadControllerAndroidImpl::StartDownloadOnUIThread( |
| 202 const GetDownloadInfoCB& callback, | 202 const GetDownloadInfoCB& callback, |
| 203 const DownloadInfoAndroid& info) { | 203 const DownloadInfoAndroid& info) { |
| 204 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 204 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 205 BrowserThread::PostTask( | 205 BrowserThread::PostTask( |
| 206 BrowserThread::UI, FROM_HERE, base::Bind(callback, info)); | 206 BrowserThread::UI, FROM_HERE, base::Bind(callback, info)); |
| 207 } | 207 } |
| 208 | 208 |
| 209 void DownloadControllerAndroidImpl::StartAndroidDownload( | 209 void DownloadControllerAndroidImpl::StartAndroidDownload( |
| 210 int render_process_id, int render_view_id, | 210 int render_process_id, int render_view_id, |
| 211 const DownloadInfoAndroid& info) { | 211 const DownloadInfoAndroid& info) { |
| 212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 212 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 213 JNIEnv* env = base::android::AttachCurrentThread(); | 213 JNIEnv* env = base::android::AttachCurrentThread(); |
| 214 | 214 |
| 215 // Call newHttpGetDownload | 215 // Call newHttpGetDownload |
| 216 WebContents* web_contents = GetWebContents(render_process_id, render_view_id); | 216 WebContents* web_contents = GetWebContents(render_process_id, render_view_id); |
| 217 if (!web_contents) { | 217 if (!web_contents) { |
| 218 // The view went away. Can't proceed. | 218 // The view went away. Can't proceed. |
| 219 LOG(ERROR) << "Download failed on URL:" << info.url.spec(); | 219 LOG(ERROR) << "Download failed on URL:" << info.url.spec(); |
| 220 return; | 220 return; |
| 221 } | 221 } |
| 222 ScopedJavaLocalRef<jobject> view = | 222 ScopedJavaLocalRef<jobject> view = |
| (...skipping 30 matching lines...) Expand all Loading... |
| 253 | 253 |
| 254 Java_DownloadController_newHttpGetDownload( | 254 Java_DownloadController_newHttpGetDownload( |
| 255 env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(), | 255 env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(), |
| 256 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(), | 256 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(), |
| 257 jcookie.obj(), jreferer.obj(), info.has_user_gesture, jfilename.obj(), | 257 jcookie.obj(), jreferer.obj(), info.has_user_gesture, jfilename.obj(), |
| 258 info.total_bytes); | 258 info.total_bytes); |
| 259 } | 259 } |
| 260 | 260 |
| 261 void DownloadControllerAndroidImpl::OnDownloadStarted( | 261 void DownloadControllerAndroidImpl::OnDownloadStarted( |
| 262 DownloadItem* download_item) { | 262 DownloadItem* download_item) { |
| 263 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 263 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 264 if (!download_item->GetWebContents()) | 264 if (!download_item->GetWebContents()) |
| 265 return; | 265 return; |
| 266 | 266 |
| 267 JNIEnv* env = base::android::AttachCurrentThread(); | 267 JNIEnv* env = base::android::AttachCurrentThread(); |
| 268 | 268 |
| 269 // Register for updates to the DownloadItem. | 269 // Register for updates to the DownloadItem. |
| 270 download_item->AddObserver(this); | 270 download_item->AddObserver(this); |
| 271 | 271 |
| 272 ScopedJavaLocalRef<jobject> view = | 272 ScopedJavaLocalRef<jobject> view = |
| 273 GetContentViewCoreFromWebContents(download_item->GetWebContents()); | 273 GetContentViewCoreFromWebContents(download_item->GetWebContents()); |
| 274 // The view went away. Can't proceed. | 274 // The view went away. Can't proceed. |
| 275 if (view.is_null()) | 275 if (view.is_null()) |
| 276 return; | 276 return; |
| 277 | 277 |
| 278 ScopedJavaLocalRef<jstring> jmime_type = | 278 ScopedJavaLocalRef<jstring> jmime_type = |
| 279 ConvertUTF8ToJavaString(env, download_item->GetMimeType()); | 279 ConvertUTF8ToJavaString(env, download_item->GetMimeType()); |
| 280 ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString( | 280 ScopedJavaLocalRef<jstring> jfilename = ConvertUTF8ToJavaString( |
| 281 env, download_item->GetTargetFilePath().BaseName().value()); | 281 env, download_item->GetTargetFilePath().BaseName().value()); |
| 282 Java_DownloadController_onDownloadStarted( | 282 Java_DownloadController_onDownloadStarted( |
| 283 env, GetJavaObject()->Controller(env).obj(), view.obj(), jfilename.obj(), | 283 env, GetJavaObject()->Controller(env).obj(), view.obj(), jfilename.obj(), |
| 284 jmime_type.obj()); | 284 jmime_type.obj()); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) { | 287 void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) { |
| 288 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 288 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 289 if (item->IsDangerous() && (item->GetState() != DownloadItem::CANCELLED)) | 289 if (item->IsDangerous() && (item->GetState() != DownloadItem::CANCELLED)) |
| 290 OnDangerousDownload(item); | 290 OnDangerousDownload(item); |
| 291 | 291 |
| 292 JNIEnv* env = base::android::AttachCurrentThread(); | 292 JNIEnv* env = base::android::AttachCurrentThread(); |
| 293 ScopedJavaLocalRef<jstring> jurl = | 293 ScopedJavaLocalRef<jstring> jurl = |
| 294 ConvertUTF8ToJavaString(env, item->GetURL().spec()); | 294 ConvertUTF8ToJavaString(env, item->GetURL().spec()); |
| 295 ScopedJavaLocalRef<jstring> jmime_type = | 295 ScopedJavaLocalRef<jstring> jmime_type = |
| 296 ConvertUTF8ToJavaString(env, item->GetMimeType()); | 296 ConvertUTF8ToJavaString(env, item->GetMimeType()); |
| 297 ScopedJavaLocalRef<jstring> jpath = | 297 ScopedJavaLocalRef<jstring> jpath = |
| 298 ConvertUTF8ToJavaString(env, item->GetTargetFilePath().value()); | 298 ConvertUTF8ToJavaString(env, item->GetTargetFilePath().value()); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 | 445 |
| 446 const content::ResourceRequestInfo* info = | 446 const content::ResourceRequestInfo* info = |
| 447 content::ResourceRequestInfo::ForRequest(request); | 447 content::ResourceRequestInfo::ForRequest(request); |
| 448 if (info) | 448 if (info) |
| 449 has_user_gesture = info->HasUserGesture(); | 449 has_user_gesture = info->HasUserGesture(); |
| 450 } | 450 } |
| 451 | 451 |
| 452 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {} | 452 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {} |
| 453 | 453 |
| 454 } // namespace content | 454 } // namespace content |
| OLD | NEW |