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 render_view_host_ext()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 GetPermissionRequestHandler()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