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
27class SkBitmap;
28class TabContents;
29struct AwDrawGLInfo;
30
31namespace content {
32class WebContents;
33}
34
35namespace android_webview {
36
37class AwContentsContainer;
38class AwContentsClientBridge;
39class AwPdfExporter;
40class AwWebContentsDelegate;
41class HardwareRenderer;
42class 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.
57class 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
261bool RegisterAwContents(JNIEnv* env);
262
263}  // namespace android_webview
264
265#endif  // ANDROID_WEBVIEW_NATIVE_AW_CONTENTS_H_
266