| 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
|
|
|