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 |