Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: content/browser/android/download_controller_android_impl.cc

Issue 12796004: [Android] Use generated JNI bindings for Download Controller (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | content/public/android/java/src/org/chromium/content/browser/DownloadController.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "content/browser/android/content_view_core_impl.h" 12 #include "content/browser/android/content_view_core_impl.h"
13 #include "content/browser/download/download_item_impl.h" 13 #include "content/browser/download/download_item_impl.h"
14 #include "content/browser/loader/resource_dispatcher_host_impl.h" 14 #include "content/browser/loader/resource_dispatcher_host_impl.h"
15 #include "content/browser/renderer_host/render_process_host_impl.h" 15 #include "content/browser/renderer_host/render_process_host_impl.h"
16 #include "content/browser/renderer_host/render_view_host_delegate.h" 16 #include "content/browser/renderer_host/render_view_host_delegate.h"
17 #include "content/browser/renderer_host/render_view_host_impl.h" 17 #include "content/browser/renderer_host/render_view_host_impl.h"
18 #include "content/browser/web_contents/web_contents_impl.h" 18 #include "content/browser/web_contents/web_contents_impl.h"
19 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/global_request_id.h" 20 #include "content/public/browser/global_request_id.h"
21 #include "content/public/browser/web_contents_view.h" 21 #include "content/public/browser/web_contents_view.h"
22 #include "jni/DownloadController_jni.h" 22 #include "jni/DownloadController_jni.h"
23 #include "net/cookies/cookie_options.h" 23 #include "net/cookies/cookie_options.h"
24 #include "net/cookies/cookie_store.h" 24 #include "net/cookies/cookie_store.h"
25 #include "net/http/http_request_headers.h" 25 #include "net/http/http_request_headers.h"
26 #include "net/http/http_response_headers.h" 26 #include "net/http/http_response_headers.h"
27 #include "net/url_request/url_request.h" 27 #include "net/url_request/url_request.h"
28 #include "net/url_request/url_request_context.h" 28 #include "net/url_request/url_request_context.h"
29 29
30 using base::android::AttachCurrentThread;
31 using base::android::CheckException;
32 using base::android::ConvertUTF8ToJavaString; 30 using base::android::ConvertUTF8ToJavaString;
33 using base::android::GetClass;
34 using base::android::MethodID;
35 using base::android::ScopedJavaLocalRef; 31 using base::android::ScopedJavaLocalRef;
36 32
37 namespace {
38 const char kDownloadControllerClassPathName[] =
39 "org/chromium/content/browser/DownloadController";
40 } // namespace
41
42 namespace content { 33 namespace content {
43 34
44 // JNI methods 35 // JNI methods
45 static void Init(JNIEnv* env, jobject obj) { 36 static void Init(JNIEnv* env, jobject obj) {
46 DownloadControllerAndroidImpl::GetInstance()->Init(env, obj); 37 DownloadControllerAndroidImpl::GetInstance()->Init(env, obj);
47 } 38 }
48 39
49 struct DownloadControllerAndroidImpl::JavaObject { 40 struct DownloadControllerAndroidImpl::JavaObject {
50 ScopedJavaLocalRef<jobject> Controller(JNIEnv* env) { 41 ScopedJavaLocalRef<jobject> Controller(JNIEnv* env) {
51 return GetRealObject(env, obj); 42 return GetRealObject(env, obj);
(...skipping 15 matching lines...) Expand all
67 DownloadControllerAndroidImpl* DownloadControllerAndroidImpl::GetInstance() { 58 DownloadControllerAndroidImpl* DownloadControllerAndroidImpl::GetInstance() {
68 return Singleton<DownloadControllerAndroidImpl>::get(); 59 return Singleton<DownloadControllerAndroidImpl>::get();
69 } 60 }
70 61
71 DownloadControllerAndroidImpl::DownloadControllerAndroidImpl() 62 DownloadControllerAndroidImpl::DownloadControllerAndroidImpl()
72 : java_object_(NULL) { 63 : java_object_(NULL) {
73 } 64 }
74 65
75 DownloadControllerAndroidImpl::~DownloadControllerAndroidImpl() { 66 DownloadControllerAndroidImpl::~DownloadControllerAndroidImpl() {
76 if (java_object_) { 67 if (java_object_) {
77 JNIEnv* env = AttachCurrentThread(); 68 JNIEnv* env = base::android::AttachCurrentThread();
78 env->DeleteWeakGlobalRef(java_object_->obj); 69 env->DeleteWeakGlobalRef(java_object_->obj);
79 delete java_object_; 70 delete java_object_;
80 CheckException(env); 71 base::android::CheckException(env);
81 } 72 }
82 } 73 }
83 74
84 // Initialize references to Java object. 75 // Initialize references to Java object.
85 void DownloadControllerAndroidImpl::Init(JNIEnv* env, jobject obj) { 76 void DownloadControllerAndroidImpl::Init(JNIEnv* env, jobject obj) {
86 java_object_ = new JavaObject; 77 java_object_ = new JavaObject;
87 java_object_->obj = env->NewWeakGlobalRef(obj); 78 java_object_->obj = env->NewWeakGlobalRef(obj);
88 } 79 }
89 80
90 void DownloadControllerAndroidImpl::CreateGETDownload( 81 void DownloadControllerAndroidImpl::CreateGETDownload(
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 const DownloadInfoAndroid& info) { 189 const DownloadInfoAndroid& info) {
199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
200 BrowserThread::PostTask( 191 BrowserThread::PostTask(
201 BrowserThread::UI, FROM_HERE, base::Bind(callback, info)); 192 BrowserThread::UI, FROM_HERE, base::Bind(callback, info));
202 } 193 }
203 194
204 void DownloadControllerAndroidImpl::StartAndroidDownload( 195 void DownloadControllerAndroidImpl::StartAndroidDownload(
205 int render_process_id, int render_view_id, 196 int render_process_id, int render_view_id,
206 const DownloadInfoAndroid& info) { 197 const DownloadInfoAndroid& info) {
207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
208 JNIEnv* env = AttachCurrentThread(); 199 JNIEnv* env = base::android::AttachCurrentThread();
209 200
210 // Call newHttpGetDownload 201 // Call newHttpGetDownload
211 ScopedJavaLocalRef<jobject> view = GetContentView(render_process_id, 202 ScopedJavaLocalRef<jobject> view = GetContentView(render_process_id,
212 render_view_id); 203 render_view_id);
213 if (view.is_null()) { 204 if (view.is_null()) {
214 // The view went away. Can't proceed. 205 // The view went away. Can't proceed.
215 LOG(ERROR) << "Download failed on URL:" << info.url.spec(); 206 LOG(ERROR) << "Download failed on URL:" << info.url.spec();
216 return; 207 return;
217 } 208 }
218 209
(...skipping 15 matching lines...) Expand all
234 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(), 225 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(),
235 jcookie.obj(), jreferer.obj(), info.total_bytes); 226 jcookie.obj(), jreferer.obj(), info.total_bytes);
236 } 227 }
237 228
238 void DownloadControllerAndroidImpl::OnPostDownloadStarted( 229 void DownloadControllerAndroidImpl::OnPostDownloadStarted(
239 DownloadItem* download_item) { 230 DownloadItem* download_item) {
240 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
241 if (!download_item->GetWebContents()) 232 if (!download_item->GetWebContents())
242 return; 233 return;
243 234
244 JNIEnv* env = AttachCurrentThread(); 235 JNIEnv* env = base::android::AttachCurrentThread();
245 236
246 // Register for updates to the DownloadItem. 237 // Register for updates to the DownloadItem.
247 download_item->AddObserver(this); 238 download_item->AddObserver(this);
248 239
249 ScopedJavaLocalRef<jobject> view = 240 ScopedJavaLocalRef<jobject> view =
250 GetContentViewCoreFromWebContents(download_item->GetWebContents()); 241 GetContentViewCoreFromWebContents(download_item->GetWebContents());
251 // The view went away. Can't proceed. 242 // The view went away. Can't proceed.
252 if (view.is_null()) 243 if (view.is_null())
253 return; 244 return;
254 245
255 Java_DownloadController_onHttpPostDownloadStarted( 246 Java_DownloadController_onHttpPostDownloadStarted(
256 env, GetJavaObject()->Controller(env).obj(), view.obj()); 247 env, GetJavaObject()->Controller(env).obj(), view.obj());
257 } 248 }
258 249
259 void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) { 250 void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) {
260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 251 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
261 252
262 if (!item->IsComplete()) 253 if (!item->IsComplete())
263 return; 254 return;
264 255
265 // Multiple OnDownloadUpdated() notifications may be issued while the download 256 // Multiple OnDownloadUpdated() notifications may be issued while the download
266 // is in the COMPLETE state. Only handle one. 257 // is in the COMPLETE state. Only handle one.
267 item->RemoveObserver(this); 258 item->RemoveObserver(this);
268 259
269 // Call onHttpPostDownloadCompleted 260 // Call onHttpPostDownloadCompleted
270 JNIEnv* env = AttachCurrentThread(); 261 JNIEnv* env = base::android::AttachCurrentThread();
271 ScopedJavaLocalRef<jstring> jurl = 262 ScopedJavaLocalRef<jstring> jurl =
272 ConvertUTF8ToJavaString(env, item->GetURL().spec()); 263 ConvertUTF8ToJavaString(env, item->GetURL().spec());
273 ScopedJavaLocalRef<jstring> jcontent_disposition = 264 ScopedJavaLocalRef<jstring> jcontent_disposition =
274 ConvertUTF8ToJavaString(env, item->GetContentDisposition()); 265 ConvertUTF8ToJavaString(env, item->GetContentDisposition());
275 ScopedJavaLocalRef<jstring> jmime_type = 266 ScopedJavaLocalRef<jstring> jmime_type =
276 ConvertUTF8ToJavaString(env, item->GetMimeType()); 267 ConvertUTF8ToJavaString(env, item->GetMimeType());
277 ScopedJavaLocalRef<jstring> jpath = 268 ScopedJavaLocalRef<jstring> jpath =
278 ConvertUTF8ToJavaString(env, item->GetFullPath().value()); 269 ConvertUTF8ToJavaString(env, item->GetFullPath().value());
279 270
280 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents( 271 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 return view_core ? view_core->GetJavaObject() : 308 return view_core ? view_core->GetJavaObject() :
318 ScopedJavaLocalRef<jobject>(); 309 ScopedJavaLocalRef<jobject>();
319 } 310 }
320 311
321 DownloadControllerAndroidImpl::JavaObject* 312 DownloadControllerAndroidImpl::JavaObject*
322 DownloadControllerAndroidImpl::GetJavaObject() { 313 DownloadControllerAndroidImpl::GetJavaObject() {
323 if (!java_object_) { 314 if (!java_object_) {
324 // Initialize Java DownloadController by calling 315 // Initialize Java DownloadController by calling
325 // DownloadController.getInstance(), which will call Init() 316 // DownloadController.getInstance(), which will call Init()
326 // if Java DownloadController is not instantiated already. 317 // if Java DownloadController is not instantiated already.
327 JNIEnv* env = AttachCurrentThread(); 318 JNIEnv* env = base::android::AttachCurrentThread();
328 ScopedJavaLocalRef<jclass> clazz = 319 Java_DownloadController_getInstance(env);
329 GetClass(env, kDownloadControllerClassPathName);
330 jmethodID get_instance = MethodID::Get<MethodID::TYPE_STATIC>(
331 env, clazz.obj(), "getInstance",
332 "()Lorg/chromium/content/browser/DownloadController;");
333 ScopedJavaLocalRef<jobject> jobj(env,
334 env->CallStaticObjectMethod(clazz.obj(), get_instance));
335 CheckException(env);
336 } 320 }
337 321
338 DCHECK(java_object_); 322 DCHECK(java_object_);
339 return java_object_; 323 return java_object_;
340 } 324 }
341 325
342 DownloadControllerAndroidImpl::DownloadInfoAndroid::DownloadInfoAndroid( 326 DownloadControllerAndroidImpl::DownloadInfoAndroid::DownloadInfoAndroid(
343 net::URLRequest* request) { 327 net::URLRequest* request) {
344 request->GetResponseHeaderByName("content-disposition", &content_disposition); 328 request->GetResponseHeaderByName("content-disposition", &content_disposition);
345 329
346 if (request->response_headers()) 330 if (request->response_headers())
347 request->response_headers()->GetMimeType(&original_mime_type); 331 request->response_headers()->GetMimeType(&original_mime_type);
348 332
349 request->extra_request_headers().GetHeader( 333 request->extra_request_headers().GetHeader(
350 net::HttpRequestHeaders::kUserAgent, &user_agent); 334 net::HttpRequestHeaders::kUserAgent, &user_agent);
351 GURL referer_url(request->GetSanitizedReferrer()); 335 GURL referer_url(request->GetSanitizedReferrer());
352 if (referer_url.is_valid()) 336 if (referer_url.is_valid())
353 referer = referer_url.spec(); 337 referer = referer_url.spec();
354 if (!request->url_chain().empty()) { 338 if (!request->url_chain().empty()) {
355 original_url = request->url_chain().front(); 339 original_url = request->url_chain().front();
356 url = request->url_chain().back(); 340 url = request->url_chain().back();
357 } 341 }
358 } 342 }
359 343
360 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {} 344 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {}
361 345
362 } // namespace content 346 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/public/android/java/src/org/chromium/content/browser/DownloadController.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698