Index: content/browser/android/download_controller.cc |
diff --git a/content/browser/android/download_controller.cc b/content/browser/android/download_controller.cc |
deleted file mode 100644 |
index 1e1be21d2c1cc1342ce637c0cc113fe3c6e475bd..0000000000000000000000000000000000000000 |
--- a/content/browser/android/download_controller.cc |
+++ /dev/null |
@@ -1,333 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/android/download_controller.h" |
- |
-#include "base/android/jni_android.h" |
-#include "base/android/jni_string.h" |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "content/browser/android/content_view_core_impl.h" |
-#include "content/browser/download/download_item_impl.h" |
-#include "content/browser/renderer_host/render_process_host_impl.h" |
-#include "content/browser/renderer_host/render_view_host_delegate.h" |
-#include "content/browser/renderer_host/render_view_host_impl.h" |
-#include "content/browser/renderer_host/resource_dispatcher_host_impl.h" |
-#include "content/browser/web_contents/web_contents_impl.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/global_request_id.h" |
-#include "jni/DownloadController_jni.h" |
-#include "net/cookies/cookie_options.h" |
-#include "net/cookies/cookie_store.h" |
-#include "net/http/http_request_headers.h" |
-#include "net/url_request/url_request.h" |
-#include "net/url_request/url_request_context.h" |
- |
-using base::android::AttachCurrentThread; |
-using base::android::CheckException; |
-using base::android::ConvertUTF8ToJavaString; |
-using base::android::GetClass; |
-using base::android::ScopedJavaLocalRef; |
- |
-namespace { |
-const char kDownloadControllerClassPathName[] = |
- "org/chromium/content/browser/DownloadController"; |
-} // namespace |
- |
-namespace content { |
- |
-// JNI methods |
-static void Init(JNIEnv* env, jobject obj) { |
- DownloadController::GetInstance()->Init(env, obj); |
-} |
- |
-struct DownloadController::JavaObject { |
- ScopedJavaLocalRef<jobject> Controller(JNIEnv* env) { |
- return GetRealObject(env, obj); |
- } |
- jweak obj; |
-}; |
- |
-// static |
-bool DownloadController::RegisterDownloadController(JNIEnv* env) { |
- return RegisterNativesImpl(env); |
-} |
- |
-DownloadController* DownloadController::GetInstance() { |
- return Singleton<DownloadController>::get(); |
-} |
- |
-DownloadController::DownloadController() |
- : java_object_(NULL) { |
-} |
- |
-DownloadController::~DownloadController() { |
- if (java_object_) { |
- JNIEnv* env = AttachCurrentThread(); |
- env->DeleteWeakGlobalRef(java_object_->obj); |
- delete java_object_; |
- CheckException(env); |
- } |
-} |
- |
-// Initialize references to Java object. |
-void DownloadController::Init(JNIEnv* env, jobject obj) { |
- java_object_ = new JavaObject; |
- java_object_->obj = env->NewWeakGlobalRef(obj); |
-} |
- |
-void DownloadController::CreateGETDownload( |
- RenderViewHost* render_view_host, |
- int request_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- int render_process_id = render_view_host->GetProcess()->GetID(); |
- GlobalRequestID global_id(render_process_id, request_id); |
- |
- // We are yielding the UI thread and render_view_host may go away by |
- // the time we come back. Pass along render_process_id and render_view_id |
- // to retrieve it later (if it still exists). |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&DownloadController::PrepareDownloadInfo, |
- base::Unretained(this), global_id, |
- render_process_id, |
- render_view_host->GetRoutingID())); |
-} |
- |
-void DownloadController::PrepareDownloadInfo( |
- const GlobalRequestID& global_id, |
- int render_process_id, int render_view_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- net::URLRequest* request = |
- ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
- DCHECK(request) << "Request to download not found."; |
- |
- DownloadInfoAndroid info_android(request); |
- |
- net::CookieStore* cookie_store = request->context()->cookie_store(); |
- if (cookie_store) { |
- net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster(); |
- if (cookie_monster) { |
- cookie_monster->GetAllCookiesForURLAsync( |
- request->url(), |
- base::Bind(&DownloadController::CheckPolicyAndLoadCookies, |
- base::Unretained(this), info_android, render_process_id, |
- render_view_id, global_id)); |
- } else { |
- DoLoadCookies( |
- info_android, render_process_id, render_view_id, global_id); |
- } |
- } else { |
- // Can't get any cookies, start android download. |
- StartAndroidDownload(info_android, render_process_id, render_view_id); |
- } |
-} |
- |
-void DownloadController::CheckPolicyAndLoadCookies( |
- const DownloadInfoAndroid& info, int render_process_id, |
- int render_view_id, const GlobalRequestID& global_id, |
- const net::CookieList& cookie_list) { |
- net::URLRequest* request = |
- ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
- DCHECK(request) << "Request to download not found."; |
- |
- if (request->context()->network_delegate()->CanGetCookies( |
- *request, cookie_list)) { |
- DoLoadCookies(info, render_process_id, render_view_id, global_id); |
- } else { |
- StartAndroidDownload(info, render_process_id, render_view_id); |
- } |
-} |
- |
-void DownloadController::DoLoadCookies( |
- const DownloadInfoAndroid& info, int render_process_id, |
- int render_view_id, const GlobalRequestID& global_id) { |
- net::CookieOptions options; |
- options.set_include_httponly(); |
- |
- net::URLRequest* request = |
- ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); |
- DCHECK(request) << "Request to download not found."; |
- |
- request->context()->cookie_store()->GetCookiesWithOptionsAsync( |
- info.url, options, |
- base::Bind(&DownloadController::OnCookieResponse, |
- base::Unretained(this), info, render_process_id, |
- render_view_id)); |
-} |
- |
-void DownloadController::OnCookieResponse(DownloadInfoAndroid download_info, |
- int render_process_id, |
- int render_view_id, |
- const std::string& cookie) { |
- download_info.cookie = cookie; |
- |
- // We have everything we need, start Android download. |
- StartAndroidDownload(download_info, render_process_id, render_view_id); |
-} |
- |
-void DownloadController::StartAndroidDownload( |
- const DownloadInfoAndroid& info, |
- int render_process_id, |
- int render_view_id) { |
- // Call ourself on the UI thread if not already on it. |
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&DownloadController::StartAndroidDownload, |
- base::Unretained(this), info, render_process_id, |
- render_view_id)); |
- return; |
- } |
- |
- JNIEnv* env = AttachCurrentThread(); |
- |
- // Call newHttpGetDownload |
- ScopedJavaLocalRef<jobject> view = GetContentView(render_process_id, |
- render_view_id); |
- if (view.is_null()) { |
- // The view went away. Can't proceed. |
- LOG(ERROR) << "Download failed on URL:" << info.url.spec(); |
- return; |
- } |
- |
- ScopedJavaLocalRef<jstring> jurl = |
- ConvertUTF8ToJavaString(env, info.url.spec()); |
- ScopedJavaLocalRef<jstring> juser_agent = |
- ConvertUTF8ToJavaString(env, info.user_agent); |
- ScopedJavaLocalRef<jstring> jcontent_disposition = |
- ConvertUTF8ToJavaString(env, info.content_disposition); |
- ScopedJavaLocalRef<jstring> jmime_type = |
- ConvertUTF8ToJavaString(env, info.original_mime_type); |
- ScopedJavaLocalRef<jstring> jcookie = |
- ConvertUTF8ToJavaString(env, info.cookie); |
- ScopedJavaLocalRef<jstring> jreferer = |
- ConvertUTF8ToJavaString(env, info.referer); |
- |
- Java_DownloadController_newHttpGetDownload( |
- env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(), |
- juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(), |
- jcookie.obj(), jreferer.obj(), info.total_bytes); |
-} |
- |
-void DownloadController::OnPostDownloadStarted( |
- WebContents* web_contents, |
- DownloadItem* download_item) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- JNIEnv* env = AttachCurrentThread(); |
- |
- // Register for updates to the DownloadItem. |
- download_item->AddObserver(this); |
- |
- ScopedJavaLocalRef<jobject> view = |
- GetContentViewCoreFromWebContents(web_contents); |
- if(view.is_null()) { |
- // The view went away. Can't proceed. |
- return; |
- } |
- |
- Java_DownloadController_onHttpPostDownloadStarted( |
- env, GetJavaObject()->Controller(env).obj(), view.obj()); |
-} |
- |
-void DownloadController::OnDownloadUpdated(DownloadItem* item) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- if (item->GetState() != DownloadItem::COMPLETE) |
- return; |
- |
- // Call onHttpPostDownloadCompleted |
- JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jstring> jurl = |
- ConvertUTF8ToJavaString(env, item->GetURL().spec()); |
- ScopedJavaLocalRef<jstring> jcontent_disposition = |
- ConvertUTF8ToJavaString(env, item->GetContentDisposition()); |
- ScopedJavaLocalRef<jstring> jmime_type = |
- ConvertUTF8ToJavaString(env, item->GetMimeType()); |
- ScopedJavaLocalRef<jstring> jpath = |
- ConvertUTF8ToJavaString(env, item->GetFullPath().value()); |
- |
- ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents( |
- item->GetWebContents()); |
- if (view_core.is_null()) { |
- // We can get NULL WebContents from the DownloadItem. |
- return; |
- } |
- |
- Java_DownloadController_onHttpPostDownloadCompleted(env, |
- GetJavaObject()->Controller(env).obj(), view_core.obj(), jurl.obj(), |
- jcontent_disposition.obj(), jmime_type.obj(), jpath.obj(), |
- item->GetReceivedBytes(), true); |
-} |
- |
-void DownloadController::OnDownloadOpened(DownloadItem* item) { |
-} |
- |
-ScopedJavaLocalRef<jobject> DownloadController::GetContentView( |
- int render_process_id, int render_view_id) { |
- RenderViewHost* render_view_host = |
- RenderViewHost::FromID(render_process_id, render_view_id); |
- |
- if (!render_view_host) |
- return ScopedJavaLocalRef<jobject>(); |
- |
- WebContents* web_contents = |
- render_view_host->GetDelegate()->GetAsWebContents(); |
- |
- if (!web_contents) |
- return ScopedJavaLocalRef<jobject>(); |
- |
- return GetContentViewCoreFromWebContents(web_contents); |
-} |
- |
-ScopedJavaLocalRef<jobject> |
- DownloadController::GetContentViewCoreFromWebContents( |
- WebContents* web_contents) { |
- if (!web_contents) |
- return ScopedJavaLocalRef<jobject>(); |
- |
- ContentViewCore* view_core = web_contents->GetContentNativeView(); |
- return view_core ? view_core->GetJavaObject() : |
- ScopedJavaLocalRef<jobject>(); |
-} |
- |
-DownloadController::JavaObject* DownloadController::GetJavaObject() { |
- if (!java_object_) { |
- // Initialize Java DownloadController by calling |
- // DownloadController.getInstance(), which will call Init() |
- // if Java DownloadController is not instantiated already. |
- JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jclass> clazz = |
- GetClass(env, kDownloadControllerClassPathName); |
- jmethodID get_instance = GetStaticMethodID(env, clazz, "getInstance", |
- "()Lorg/chromium/content/browser/DownloadController;"); |
- ScopedJavaLocalRef<jobject> jobj(env, |
- env->CallStaticObjectMethod(clazz.obj(), get_instance)); |
- CheckException(env); |
- } |
- |
- DCHECK(java_object_); |
- return java_object_; |
-} |
- |
-DownloadController::DownloadInfoAndroid::DownloadInfoAndroid( |
- net::URLRequest* request) { |
- request->GetResponseHeaderByName("content-disposition", &content_disposition); |
- request->GetMimeType(&original_mime_type); |
- request->extra_request_headers().GetHeader( |
- net::HttpRequestHeaders::kUserAgent, &user_agent); |
- GURL referer_url(request->GetSanitizedReferrer()); |
- if (referer_url.is_valid()) |
- referer = referer_url.spec(); |
- if (!request->url_chain().empty()) { |
- original_url = request->url_chain().front(); |
- url = request->url_chain().back(); |
- } |
-} |
- |
-DownloadController::DownloadInfoAndroid::~DownloadInfoAndroid() {} |
- |
-} // namespace content |