// 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. // This class pairs with DownloadController on Java side to forward requests // for GET downloads to the current DownloadListener. POST downloads are // handled on the native side. // // Both classes are Singleton classes. C++ object owns Java object. // // Call sequence // GET downloads: // DownloadControllerAndroid::CreateGETDownload() => // DownloadController.newHttpGetDownload() => // DownloadListener.onDownloadStart() / // DownloadListener2.requestHttpGetDownload() // #ifndef CONTENT_BROWSER_ANDROID_DOWNLOAD_CONTROLLER_ANDROID_IMPL_H_ #define CONTENT_BROWSER_ANDROID_DOWNLOAD_CONTROLLER_ANDROID_IMPL_H_ #include #include "base/android/jni_helper.h" #include "base/android/scoped_java_ref.h" #include "base/callback.h" #include "base/memory/singleton.h" #include "content/public/browser/android/download_controller_android.h" #include "content/public/browser/download_item.h" #include "net/cookies/cookie_monster.h" #include "url/gurl.h" namespace net { class URLRequest; } namespace content { struct GlobalRequestID; class RenderViewHost; class WebContents; class DownloadControllerAndroidImpl : public DownloadControllerAndroid, public DownloadItem::Observer { public: static DownloadControllerAndroidImpl* GetInstance(); static bool RegisterDownloadController(JNIEnv* env); // Called when DownloadController Java object is instantiated. void Init(JNIEnv* env, jobject obj); private: // Used to store all the information about an Android download. struct DownloadInfoAndroid { explicit DownloadInfoAndroid(net::URLRequest* request); ~DownloadInfoAndroid(); // The URL from which we are downloading. This is the final URL after any // redirection by the server for |original_url_|. GURL url; // The original URL before any redirection by the server for this URL. GURL original_url; int64 total_bytes; std::string content_disposition; std::string original_mime_type; std::string user_agent; std::string cookie; std::string referer; WebContents* web_contents; // Default copy constructor is used for passing this struct by value. }; struct JavaObject; friend struct DefaultSingletonTraits; DownloadControllerAndroidImpl(); virtual ~DownloadControllerAndroidImpl(); // DownloadControllerAndroid implementation. virtual void CreateGETDownload(int render_process_id, int render_view_id, int request_id) OVERRIDE; virtual void OnDownloadStarted(DownloadItem* download_item) OVERRIDE; virtual void StartContextMenuDownload( const ContextMenuParams& params, WebContents* web_contents, bool is_link) OVERRIDE; virtual void DangerousDownloadValidated( WebContents* web_contents, int download_id, bool accept) OVERRIDE; // DownloadItem::Observer interface. virtual void OnDownloadUpdated(DownloadItem* item) OVERRIDE; typedef base::Callback GetDownloadInfoCB; void PrepareDownloadInfo(const GlobalRequestID& global_id, const GetDownloadInfoCB& callback); void CheckPolicyAndLoadCookies(const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, const GlobalRequestID& global_id, const net::CookieList& cookie_list); void DoLoadCookies(const DownloadInfoAndroid& info, const GetDownloadInfoCB& callback, const GlobalRequestID& global_id); void OnCookieResponse(DownloadInfoAndroid info, const GetDownloadInfoCB& callback, const std::string& cookie); void StartDownloadOnUIThread(const GetDownloadInfoCB& callback, const DownloadInfoAndroid& info); void StartAndroidDownload(int render_process_id, int render_view_id, const DownloadInfoAndroid& info); // The download item contains dangerous file types. void OnDangerousDownload(DownloadItem *item); base::android::ScopedJavaLocalRef GetContentViewCoreFromWebContents( WebContents* web_contents); base::android::ScopedJavaLocalRef GetContentView( int render_process_id, int render_view_id); // Creates Java object if it is not created already and returns it. JavaObject* GetJavaObject(); JavaObject* java_object_; DISALLOW_COPY_AND_ASSIGN(DownloadControllerAndroidImpl); }; } // namespace content #endif // CONTENT_BROWSER_ANDROID_DOWNLOAD_CONTROLLER_ANDROID_IMPL_H_