Home | History | Annotate | Download | only in native
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef ANDROID_WEBVIEW_NATIVE_AW_CONTENTS_H_
      6 #define ANDROID_WEBVIEW_NATIVE_AW_CONTENTS_H_
      7 
      8 #include <jni.h>
      9 #include <list>
     10 #include <string>
     11 #include <utility>
     12 
     13 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
     14 #include "android_webview/browser/browser_view_renderer.h"
     15 #include "android_webview/browser/browser_view_renderer_client.h"
     16 #include "android_webview/browser/find_helper.h"
     17 #include "android_webview/browser/gl_view_renderer_manager.h"
     18 #include "android_webview/browser/icon_helper.h"
     19 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
     20 #include "android_webview/browser/shared_renderer_state.h"
     21 #include "android_webview/native/permission/permission_request_handler_client.h"
     22 #include "base/android/jni_weak_ref.h"
     23 #include "base/android/scoped_java_ref.h"
     24 #include "base/callback_forward.h"
     25 #include "base/memory/scoped_ptr.h"
     26 
     27 class SkBitmap;
     28 class TabContents;
     29 struct AwDrawGLInfo;
     30 
     31 namespace content {
     32 class WebContents;
     33 }
     34 
     35 namespace android_webview {
     36 
     37 class AwContentsContainer;
     38 class AwContentsClientBridge;
     39 class AwPdfExporter;
     40 class AwWebContentsDelegate;
     41 class HardwareRenderer;
     42 class PermissionRequestHandler;
     43 
     44 // Native side of java-class of same name.
     45 // Provides the ownership of and access to browser components required for
     46 // WebView functionality; analogous to chrome's TabContents, but with a
     47 // level of indirection provided by the AwContentsContainer abstraction.
     48 //
     49 // Object lifetime:
     50 // For most purposes the java and native objects can be considered to have
     51 // 1:1 lifetime and relationship. The exception is the java instance that
     52 // hosts a popup will be rebound to a second native instance (carrying the
     53 // popup content) and discard the 'default' native instance it made on
     54 // construction. A native instance is only bound to at most one Java peer over
     55 // its entire lifetime - see Init() and SetPendingWebContentsForPopup() for the
     56 // construction points, and SetJavaPeers() where these paths join.
     57 class AwContents : public FindHelper::Listener,
     58                    public IconHelper::Listener,
     59                    public AwRenderViewHostExtClient,
     60                    public BrowserViewRendererClient,
     61                    public PermissionRequestHandlerClient,
     62                    public AwBrowserPermissionRequestDelegate {
     63  public:
     64   // Returns the AwContents instance associated with |web_contents|, or NULL.
     65   static AwContents* FromWebContents(content::WebContents* web_contents);
     66 
     67   // Returns the AwContents instance associated with with the given
     68   // render_process_id and render_view_id, or NULL.
     69   static AwContents* FromID(int render_process_id, int render_view_id);
     70 
     71   AwContents(scoped_ptr<content::WebContents> web_contents);
     72   virtual ~AwContents();
     73 
     74   AwRenderViewHostExt* render_view_host_ext() {
     75     return render_view_host_ext_.get();
     76   }
     77 
     78   // |handler| is an instance of
     79   // org.chromium.android_webview.AwHttpAuthHandler.
     80   bool OnReceivedHttpAuthRequest(const base::android::JavaRef<jobject>& handler,
     81                                  const std::string& host,
     82                                  const std::string& realm);
     83 
     84   // Methods called from Java.
     85   void SetJavaPeers(JNIEnv* env,
     86                     jobject obj,
     87                     jobject aw_contents,
     88                     jobject web_contents_delegate,
     89                     jobject contents_client_bridge,
     90                     jobject io_thread_client,
     91                     jobject intercept_navigation_delegate);
     92   jlong GetWebContents(JNIEnv* env, jobject obj);
     93 
     94   void Destroy(JNIEnv* env, jobject obj);
     95   void DocumentHasImages(JNIEnv* env, jobject obj, jobject message);
     96   void GenerateMHTML(JNIEnv* env, jobject obj, jstring jpath, jobject callback);
     97   void CreatePdfExporter(JNIEnv* env, jobject obj, jobject pdfExporter);
     98   void AddVisitedLinks(JNIEnv* env, jobject obj, jobjectArray jvisited_links);
     99   base::android::ScopedJavaLocalRef<jbyteArray> GetCertificate(
    100       JNIEnv* env, jobject obj);
    101   void RequestNewHitTestDataAt(JNIEnv* env, jobject obj, jint x, jint y);
    102   void UpdateLastHitTestData(JNIEnv* env, jobject obj);
    103   void OnSizeChanged(JNIEnv* env, jobject obj, int w, int h, int ow, int oh);
    104   void SetViewVisibility(JNIEnv* env, jobject obj, bool visible);
    105   void SetWindowVisibility(JNIEnv* env, jobject obj, bool visible);
    106   void SetIsPaused(JNIEnv* env, jobject obj, bool paused);
    107   void OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h);
    108   void OnDetachedFromWindow(JNIEnv* env, jobject obj);
    109   base::android::ScopedJavaLocalRef<jbyteArray> GetOpaqueState(
    110       JNIEnv* env, jobject obj);
    111   jboolean RestoreFromOpaqueState(JNIEnv* env, jobject obj, jbyteArray state);
    112   void FocusFirstNode(JNIEnv* env, jobject obj);
    113   void SetBackgroundColor(JNIEnv* env, jobject obj, jint color);
    114   bool OnDraw(JNIEnv* env,
    115               jobject obj,
    116               jobject canvas,
    117               jboolean is_hardware_accelerated,
    118               jint scroll_x,
    119               jint scroll_y,
    120               jint visible_left,
    121               jint visible_top,
    122               jint visible_right,
    123               jint visible_bottom);
    124   jlong GetAwDrawGLViewContext(JNIEnv* env, jobject obj);
    125   jlong CapturePicture(JNIEnv* env, jobject obj, int width, int height);
    126   void EnableOnNewPicture(JNIEnv* env, jobject obj, jboolean enabled);
    127   void ClearView(JNIEnv* env, jobject obj);
    128   void SetExtraHeadersForUrl(JNIEnv* env, jobject obj,
    129                              jstring url, jstring extra_headers);
    130 
    131   void DrawGL(AwDrawGLInfo* draw_info);
    132 
    133   void InvokeGeolocationCallback(JNIEnv* env,
    134                                  jobject obj,
    135                                  jboolean value,
    136                                  jstring origin);
    137 
    138   // PermissionRequestHandlerClient implementation.
    139   virtual void OnPermissionRequest(AwPermissionRequest* request) OVERRIDE;
    140   virtual void OnPermissionRequestCanceled(
    141       AwPermissionRequest* request) OVERRIDE;
    142 
    143   PermissionRequestHandler* GetPermissionRequestHandler() {
    144     return permission_request_handler_.get();
    145   }
    146 
    147   void PreauthorizePermission(JNIEnv* env,
    148                               jobject obj,
    149                               jstring origin,
    150                               jlong resources);
    151 
    152   // AwBrowserPermissionRequestDelegate implementation.
    153   virtual void RequestProtectedMediaIdentifierPermission(
    154       const GURL& origin,
    155       const base::Callback<void(bool)>& callback) OVERRIDE;
    156   virtual void CancelProtectedMediaIdentifierPermissionRequests(
    157       const GURL& origin) OVERRIDE;
    158   virtual void RequestGeolocationPermission(
    159       const GURL& origin,
    160       const base::Callback<void(bool)>& callback) OVERRIDE;
    161   virtual void CancelGeolocationPermissionRequests(
    162       const GURL& origin) OVERRIDE;
    163 
    164 
    165   // Find-in-page API and related methods.
    166   void FindAllAsync(JNIEnv* env, jobject obj, jstring search_string);
    167   void FindNext(JNIEnv* env, jobject obj, jboolean forward);
    168   void ClearMatches(JNIEnv* env, jobject obj);
    169   FindHelper* GetFindHelper();
    170 
    171   // Per WebView Cookie Policy
    172   bool AllowThirdPartyCookies();
    173 
    174   // FindHelper::Listener implementation.
    175   virtual void OnFindResultReceived(int active_ordinal,
    176                                     int match_count,
    177                                     bool finished) OVERRIDE;
    178   // IconHelper::Listener implementation.
    179   virtual bool ShouldDownloadFavicon(const GURL& icon_url) OVERRIDE;
    180   virtual void OnReceivedIcon(const GURL& icon_url,
    181                               const SkBitmap& bitmap) OVERRIDE;
    182   virtual void OnReceivedTouchIconUrl(const std::string& url,
    183                                       const bool precomposed) OVERRIDE;
    184 
    185   // AwRenderViewHostExtClient implementation.
    186   virtual void OnWebLayoutPageScaleFactorChanged(
    187       float page_scale_factor) OVERRIDE;
    188   virtual void OnWebLayoutContentsSizeChanged(
    189       const gfx::Size& contents_size) OVERRIDE;
    190 
    191   // BrowserViewRendererClient implementation.
    192   virtual bool RequestDrawGL(jobject canvas, bool wait_for_completion) OVERRIDE;
    193   virtual void PostInvalidate() OVERRIDE;
    194   virtual void UpdateParentDrawConstraints() OVERRIDE;
    195   virtual void DidSkipCommitFrame() OVERRIDE;
    196   virtual void OnNewPicture() OVERRIDE;
    197   virtual gfx::Point GetLocationOnScreen() OVERRIDE;
    198   virtual void ScrollContainerViewTo(gfx::Vector2d new_value) OVERRIDE;
    199   virtual bool IsFlingActive() const OVERRIDE;
    200   virtual void UpdateScrollState(gfx::Vector2d max_scroll_offset,
    201                                  gfx::SizeF contents_size_dip,
    202                                  float page_scale_factor,
    203                                  float min_page_scale_factor,
    204                                  float max_page_scale_factor) OVERRIDE;
    205   virtual void DidOverscroll(gfx::Vector2d overscroll_delta) OVERRIDE;
    206 
    207   const BrowserViewRenderer* GetBrowserViewRenderer() const;
    208 
    209   void ClearCache(JNIEnv* env, jobject obj, jboolean include_disk_files);
    210   void SetPendingWebContentsForPopup(scoped_ptr<content::WebContents> pending);
    211   jlong ReleasePopupAwContents(JNIEnv* env, jobject obj);
    212 
    213   void ScrollTo(JNIEnv* env, jobject obj, jint x, jint y);
    214   void SetDipScale(JNIEnv* env, jobject obj, jfloat dip_scale);
    215   void SetSaveFormData(bool enabled);
    216 
    217   // Sets the java client
    218   void SetAwAutofillClient(jobject client);
    219 
    220   void SetJsOnlineProperty(JNIEnv* env, jobject obj, jboolean network_up);
    221   void TrimMemory(JNIEnv* env, jobject obj, jint level, jboolean visible);
    222 
    223  private:
    224   void InitDataReductionProxyIfNecessary();
    225   void InitAutofillIfNecessary(bool enabled);
    226 
    227   void InitializeHardwareDrawIfNeeded();
    228   void ReleaseHardwareDrawIfNeeded();
    229 
    230   // Geolocation API support
    231   void ShowGeolocationPrompt(const GURL& origin, base::Callback<void(bool)>);
    232   void HideGeolocationPrompt(const GURL& origin);
    233 
    234   JavaObjectWeakGlobalRef java_ref_;
    235   scoped_ptr<content::WebContents> web_contents_;
    236   scoped_ptr<AwWebContentsDelegate> web_contents_delegate_;
    237   scoped_ptr<AwContentsClientBridge> contents_client_bridge_;
    238   scoped_ptr<AwRenderViewHostExt> render_view_host_ext_;
    239   scoped_ptr<FindHelper> find_helper_;
    240   scoped_ptr<IconHelper> icon_helper_;
    241   scoped_ptr<AwContents> pending_contents_;
    242   SharedRendererState shared_renderer_state_;
    243   BrowserViewRenderer browser_view_renderer_;
    244   scoped_ptr<HardwareRenderer> hardware_renderer_;
    245   scoped_ptr<AwPdfExporter> pdf_exporter_;
    246   scoped_ptr<PermissionRequestHandler> permission_request_handler_;
    247 
    248   // GURL is supplied by the content layer as requesting frame.
    249   // Callback is supplied by the content layer, and is invoked with the result
    250   // from the permission prompt.
    251   typedef std::pair<const GURL, base::Callback<void(bool)> > OriginCallback;
    252   // The first element in the list is always the currently pending request.
    253   std::list<OriginCallback> pending_geolocation_prompts_;
    254 
    255   base::Lock render_thread_lock_;
    256   GLViewRendererManager::Key renderer_manager_key_;
    257 
    258   DISALLOW_COPY_AND_ASSIGN(AwContents);
    259 };
    260 
    261 bool RegisterAwContents(JNIEnv* env);
    262 
    263 }  // namespace android_webview
    264 
    265 #endif  // ANDROID_WEBVIEW_NATIVE_AW_CONTENTS_H_
    266