| OLD | NEW |
| (Empty) |
| 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 | |
| 10 #include <list> | |
| 11 #include <memory> | |
| 12 #include <string> | |
| 13 #include <utility> | |
| 14 | |
| 15 #include "android_webview/browser/aw_browser_permission_request_delegate.h" | |
| 16 #include "android_webview/browser/aw_render_process_gone_delegate.h" | |
| 17 #include "android_webview/browser/aw_safe_browsing_ui_manager.h" | |
| 18 #include "android_webview/browser/browser_view_renderer.h" | |
| 19 #include "android_webview/browser/browser_view_renderer_client.h" | |
| 20 #include "android_webview/browser/find_helper.h" | |
| 21 #include "android_webview/browser/gl_view_renderer_manager.h" | |
| 22 #include "android_webview/browser/icon_helper.h" | |
| 23 #include "android_webview/browser/render_thread_manager.h" | |
| 24 #include "android_webview/browser/render_thread_manager_client.h" | |
| 25 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h" | |
| 26 #include "android_webview/native/aw_renderer_priority_manager.h" | |
| 27 #include "android_webview/native/permission/permission_request_handler_client.h" | |
| 28 #include "base/android/jni_weak_ref.h" | |
| 29 #include "base/android/scoped_java_ref.h" | |
| 30 #include "base/callback_forward.h" | |
| 31 #include "base/macros.h" | |
| 32 #include "content/public/browser/render_process_host_observer.h" | |
| 33 #include "content/public/browser/web_contents_observer.h" | |
| 34 | |
| 35 class SkBitmap; | |
| 36 class TabContents; | |
| 37 | |
| 38 namespace content { | |
| 39 class WebContents; | |
| 40 } | |
| 41 | |
| 42 namespace android_webview { | |
| 43 | |
| 44 class AwContentsContainer; | |
| 45 class AwContentsClientBridge; | |
| 46 class AwGLFunctor; | |
| 47 class AwPdfExporter; | |
| 48 class AwWebContentsDelegate; | |
| 49 class PermissionRequestHandler; | |
| 50 | |
| 51 // Native side of java-class of same name. | |
| 52 // Provides the ownership of and access to browser components required for | |
| 53 // WebView functionality; analogous to chrome's TabContents, but with a | |
| 54 // level of indirection provided by the AwContentsContainer abstraction. | |
| 55 // | |
| 56 // Object lifetime: | |
| 57 // For most purposes the java and native objects can be considered to have | |
| 58 // 1:1 lifetime and relationship. The exception is the java instance that | |
| 59 // hosts a popup will be rebound to a second native instance (carrying the | |
| 60 // popup content) and discard the 'default' native instance it made on | |
| 61 // construction. A native instance is only bound to at most one Java peer over | |
| 62 // its entire lifetime - see Init() and SetPendingWebContentsForPopup() for the | |
| 63 // construction points, and SetJavaPeers() where these paths join. | |
| 64 class AwContents : public FindHelper::Listener, | |
| 65 public IconHelper::Listener, | |
| 66 public AwRenderViewHostExtClient, | |
| 67 public BrowserViewRendererClient, | |
| 68 public PermissionRequestHandlerClient, | |
| 69 public AwBrowserPermissionRequestDelegate, | |
| 70 public AwRenderProcessGoneDelegate, | |
| 71 public content::WebContentsObserver, | |
| 72 public content::RenderProcessHostObserver, | |
| 73 public AwSafeBrowsingUIManager::UIManagerClient { | |
| 74 public: | |
| 75 // Returns the AwContents instance associated with |web_contents|, or NULL. | |
| 76 static AwContents* FromWebContents(content::WebContents* web_contents); | |
| 77 | |
| 78 // Returns the AwContents instance associated with with the given | |
| 79 // render_process_id and render_view_id, or NULL. | |
| 80 static AwContents* FromID(int render_process_id, int render_view_id); | |
| 81 | |
| 82 static std::string GetLocale(); | |
| 83 | |
| 84 static std::string GetLocaleList(); | |
| 85 | |
| 86 AwContents(std::unique_ptr<content::WebContents> web_contents); | |
| 87 ~AwContents() override; | |
| 88 | |
| 89 AwRenderViewHostExt* render_view_host_ext() { | |
| 90 return render_view_host_ext_.get(); | |
| 91 } | |
| 92 | |
| 93 // |handler| is an instance of | |
| 94 // org.chromium.android_webview.AwHttpAuthHandler. | |
| 95 bool OnReceivedHttpAuthRequest(const base::android::JavaRef<jobject>& handler, | |
| 96 const std::string& host, | |
| 97 const std::string& realm); | |
| 98 | |
| 99 void SetOffscreenPreRaster(bool enabled); | |
| 100 | |
| 101 // Methods called from Java. | |
| 102 void SetJavaPeers( | |
| 103 JNIEnv* env, | |
| 104 const base::android::JavaParamRef<jobject>& obj, | |
| 105 const base::android::JavaParamRef<jobject>& aw_contents, | |
| 106 const base::android::JavaParamRef<jobject>& web_contents_delegate, | |
| 107 const base::android::JavaParamRef<jobject>& contents_client_bridge, | |
| 108 const base::android::JavaParamRef<jobject>& io_thread_client, | |
| 109 const base::android::JavaParamRef<jobject>& | |
| 110 intercept_navigation_delegate); | |
| 111 base::android::ScopedJavaLocalRef<jobject> GetWebContents( | |
| 112 JNIEnv* env, | |
| 113 const base::android::JavaParamRef<jobject>& obj); | |
| 114 void SetAwGLFunctor(JNIEnv* env, | |
| 115 const base::android::JavaParamRef<jobject>& obj, | |
| 116 jlong gl_functor); | |
| 117 | |
| 118 void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); | |
| 119 void DocumentHasImages(JNIEnv* env, | |
| 120 const base::android::JavaParamRef<jobject>& obj, | |
| 121 const base::android::JavaParamRef<jobject>& message); | |
| 122 void GenerateMHTML(JNIEnv* env, | |
| 123 const base::android::JavaParamRef<jobject>& obj, | |
| 124 const base::android::JavaParamRef<jstring>& jpath, | |
| 125 const base::android::JavaParamRef<jobject>& callback); | |
| 126 void CreatePdfExporter( | |
| 127 JNIEnv* env, | |
| 128 const base::android::JavaParamRef<jobject>& obj, | |
| 129 const base::android::JavaParamRef<jobject>& pdfExporter); | |
| 130 void AddVisitedLinks( | |
| 131 JNIEnv* env, | |
| 132 const base::android::JavaParamRef<jobject>& obj, | |
| 133 const base::android::JavaParamRef<jobjectArray>& jvisited_links); | |
| 134 base::android::ScopedJavaLocalRef<jbyteArray> GetCertificate( | |
| 135 JNIEnv* env, | |
| 136 const base::android::JavaParamRef<jobject>& obj); | |
| 137 void RequestNewHitTestDataAt(JNIEnv* env, | |
| 138 const base::android::JavaParamRef<jobject>& obj, | |
| 139 jfloat x, | |
| 140 jfloat y, | |
| 141 jfloat touch_major); | |
| 142 void UpdateLastHitTestData(JNIEnv* env, | |
| 143 const base::android::JavaParamRef<jobject>& obj); | |
| 144 void OnSizeChanged(JNIEnv* env, | |
| 145 const base::android::JavaParamRef<jobject>& obj, | |
| 146 int w, | |
| 147 int h, | |
| 148 int ow, | |
| 149 int oh); | |
| 150 void SetViewVisibility(JNIEnv* env, | |
| 151 const base::android::JavaParamRef<jobject>& obj, | |
| 152 bool visible); | |
| 153 void SetWindowVisibility(JNIEnv* env, | |
| 154 const base::android::JavaParamRef<jobject>& obj, | |
| 155 bool visible); | |
| 156 void SetIsPaused(JNIEnv* env, | |
| 157 const base::android::JavaParamRef<jobject>& obj, | |
| 158 bool paused); | |
| 159 void OnAttachedToWindow(JNIEnv* env, | |
| 160 const base::android::JavaParamRef<jobject>& obj, | |
| 161 int w, | |
| 162 int h); | |
| 163 void OnDetachedFromWindow(JNIEnv* env, | |
| 164 const base::android::JavaParamRef<jobject>& obj); | |
| 165 bool IsVisible(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); | |
| 166 base::android::ScopedJavaLocalRef<jbyteArray> GetOpaqueState( | |
| 167 JNIEnv* env, | |
| 168 const base::android::JavaParamRef<jobject>& obj); | |
| 169 jboolean RestoreFromOpaqueState( | |
| 170 JNIEnv* env, | |
| 171 const base::android::JavaParamRef<jobject>& obj, | |
| 172 const base::android::JavaParamRef<jbyteArray>& state); | |
| 173 void FocusFirstNode(JNIEnv* env, | |
| 174 const base::android::JavaParamRef<jobject>& obj); | |
| 175 void SetBackgroundColor(JNIEnv* env, | |
| 176 const base::android::JavaParamRef<jobject>& obj, | |
| 177 jint color); | |
| 178 void ZoomBy(JNIEnv* env, | |
| 179 const base::android::JavaParamRef<jobject>& obj, | |
| 180 jfloat delta); | |
| 181 void OnComputeScroll(JNIEnv* env, | |
| 182 const base::android::JavaParamRef<jobject>& obj, | |
| 183 jlong animation_time_millis); | |
| 184 bool OnDraw(JNIEnv* env, | |
| 185 const base::android::JavaParamRef<jobject>& obj, | |
| 186 const base::android::JavaParamRef<jobject>& canvas, | |
| 187 jboolean is_hardware_accelerated, | |
| 188 jint scroll_x, | |
| 189 jint scroll_y, | |
| 190 jint visible_left, | |
| 191 jint visible_top, | |
| 192 jint visible_right, | |
| 193 jint visible_bottom); | |
| 194 jlong CapturePicture(JNIEnv* env, | |
| 195 const base::android::JavaParamRef<jobject>& obj, | |
| 196 int width, | |
| 197 int height); | |
| 198 void EnableOnNewPicture(JNIEnv* env, | |
| 199 const base::android::JavaParamRef<jobject>& obj, | |
| 200 jboolean enabled); | |
| 201 void InsertVisualStateCallback( | |
| 202 JNIEnv* env, | |
| 203 const base::android::JavaParamRef<jobject>& obj, | |
| 204 jlong request_id, | |
| 205 const base::android::JavaParamRef<jobject>& callback); | |
| 206 void ClearView(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); | |
| 207 void SetExtraHeadersForUrl( | |
| 208 JNIEnv* env, | |
| 209 const base::android::JavaParamRef<jobject>& obj, | |
| 210 const base::android::JavaParamRef<jstring>& url, | |
| 211 const base::android::JavaParamRef<jstring>& extra_headers); | |
| 212 | |
| 213 void InvokeGeolocationCallback( | |
| 214 JNIEnv* env, | |
| 215 const base::android::JavaParamRef<jobject>& obj, | |
| 216 jboolean value, | |
| 217 const base::android::JavaParamRef<jstring>& origin); | |
| 218 | |
| 219 AwRendererPriorityManager::RendererPriority GetCurrentRendererPriority(); | |
| 220 jint GetRendererCurrentPriority( | |
| 221 JNIEnv* env, | |
| 222 const base::android::JavaParamRef<jobject>& obj); | |
| 223 jint GetRendererRequestedPriority( | |
| 224 JNIEnv* env, | |
| 225 const base::android::JavaParamRef<jobject>& obj); | |
| 226 jboolean GetRendererPriorityWaivedWhenNotVisible( | |
| 227 JNIEnv* env, | |
| 228 const base::android::JavaParamRef<jobject>& obj); | |
| 229 void SetRendererPriorityPolicy( | |
| 230 JNIEnv* env, | |
| 231 const base::android::JavaParamRef<jobject>& obj, | |
| 232 jint rendererRequestedPriority, | |
| 233 jboolean waivedhenNotVisible); | |
| 234 | |
| 235 // PermissionRequestHandlerClient implementation. | |
| 236 void OnPermissionRequest(base::android::ScopedJavaLocalRef<jobject> j_request, | |
| 237 AwPermissionRequest* request) override; | |
| 238 void OnPermissionRequestCanceled(AwPermissionRequest* request) override; | |
| 239 | |
| 240 PermissionRequestHandler* GetPermissionRequestHandler() { | |
| 241 return permission_request_handler_.get(); | |
| 242 } | |
| 243 | |
| 244 void PreauthorizePermission( | |
| 245 JNIEnv* env, | |
| 246 const base::android::JavaParamRef<jobject>& obj, | |
| 247 const base::android::JavaParamRef<jstring>& origin, | |
| 248 jlong resources); | |
| 249 | |
| 250 // AwBrowserPermissionRequestDelegate implementation. | |
| 251 void RequestProtectedMediaIdentifierPermission( | |
| 252 const GURL& origin, | |
| 253 const base::Callback<void(bool)>& callback) override; | |
| 254 void CancelProtectedMediaIdentifierPermissionRequests( | |
| 255 const GURL& origin) override; | |
| 256 void RequestGeolocationPermission( | |
| 257 const GURL& origin, | |
| 258 const base::Callback<void(bool)>& callback) override; | |
| 259 void CancelGeolocationPermissionRequests(const GURL& origin) override; | |
| 260 void RequestMIDISysexPermission( | |
| 261 const GURL& origin, | |
| 262 const base::Callback<void(bool)>& callback) override; | |
| 263 void CancelMIDISysexPermissionRequests(const GURL& origin) override; | |
| 264 | |
| 265 // Find-in-page API and related methods. | |
| 266 void FindAllAsync(JNIEnv* env, | |
| 267 const base::android::JavaParamRef<jobject>& obj, | |
| 268 const base::android::JavaParamRef<jstring>& search_string); | |
| 269 void FindNext(JNIEnv* env, | |
| 270 const base::android::JavaParamRef<jobject>& obj, | |
| 271 jboolean forward); | |
| 272 void ClearMatches(JNIEnv* env, | |
| 273 const base::android::JavaParamRef<jobject>& obj); | |
| 274 FindHelper* GetFindHelper(); | |
| 275 | |
| 276 // Per WebView Cookie Policy | |
| 277 bool AllowThirdPartyCookies(); | |
| 278 | |
| 279 // FindHelper::Listener implementation. | |
| 280 void OnFindResultReceived(int active_ordinal, | |
| 281 int match_count, | |
| 282 bool finished) override; | |
| 283 // IconHelper::Listener implementation. | |
| 284 bool ShouldDownloadFavicon(const GURL& icon_url) override; | |
| 285 void OnReceivedIcon(const GURL& icon_url, const SkBitmap& bitmap) override; | |
| 286 void OnReceivedTouchIconUrl(const std::string& url, | |
| 287 const bool precomposed) override; | |
| 288 | |
| 289 // AwRenderViewHostExtClient implementation. | |
| 290 void OnWebLayoutPageScaleFactorChanged(float page_scale_factor) override; | |
| 291 void OnWebLayoutContentsSizeChanged(const gfx::Size& contents_size) override; | |
| 292 | |
| 293 // BrowserViewRendererClient implementation. | |
| 294 void PostInvalidate() override; | |
| 295 void OnNewPicture() override; | |
| 296 gfx::Point GetLocationOnScreen() override; | |
| 297 void ScrollContainerViewTo(const gfx::Vector2d& new_value) override; | |
| 298 void UpdateScrollState(const gfx::Vector2d& max_scroll_offset, | |
| 299 const gfx::SizeF& contents_size_dip, | |
| 300 float page_scale_factor, | |
| 301 float min_page_scale_factor, | |
| 302 float max_page_scale_factor) override; | |
| 303 void DidOverscroll(const gfx::Vector2d& overscroll_delta, | |
| 304 const gfx::Vector2dF& overscroll_velocity) override; | |
| 305 ui::TouchHandleDrawable* CreateDrawable() override; | |
| 306 | |
| 307 void ClearCache(JNIEnv* env, | |
| 308 const base::android::JavaParamRef<jobject>& obj, | |
| 309 jboolean include_disk_files); | |
| 310 void KillRenderProcess(JNIEnv* env, | |
| 311 const base::android::JavaParamRef<jobject>& obj); | |
| 312 void SetPendingWebContentsForPopup( | |
| 313 std::unique_ptr<content::WebContents> pending); | |
| 314 jlong ReleasePopupAwContents(JNIEnv* env, | |
| 315 const base::android::JavaParamRef<jobject>& obj); | |
| 316 | |
| 317 void ScrollTo(JNIEnv* env, | |
| 318 const base::android::JavaParamRef<jobject>& obj, | |
| 319 jint x, | |
| 320 jint y); | |
| 321 void SmoothScroll(JNIEnv* env, | |
| 322 const base::android::JavaParamRef<jobject>& obj, | |
| 323 jint target_x, | |
| 324 jint target_y, | |
| 325 jlong duration_ms); | |
| 326 void SetDipScale(JNIEnv* env, | |
| 327 const base::android::JavaParamRef<jobject>& obj, | |
| 328 jfloat dip_scale); | |
| 329 void SetSaveFormData(bool enabled); | |
| 330 | |
| 331 // Sets the java client | |
| 332 void SetAwAutofillClient(const base::android::JavaRef<jobject>& client); | |
| 333 | |
| 334 void SetJsOnlineProperty(JNIEnv* env, | |
| 335 const base::android::JavaParamRef<jobject>& obj, | |
| 336 jboolean network_up); | |
| 337 void TrimMemory(JNIEnv* env, | |
| 338 const base::android::JavaParamRef<jobject>& obj, | |
| 339 jint level, | |
| 340 jboolean visible); | |
| 341 void PostMessageToFrame( | |
| 342 JNIEnv* env, | |
| 343 const base::android::JavaParamRef<jobject>& obj, | |
| 344 const base::android::JavaParamRef<jstring>& frame_id, | |
| 345 const base::android::JavaParamRef<jstring>& message, | |
| 346 const base::android::JavaParamRef<jstring>& target_origin, | |
| 347 const base::android::JavaParamRef<jobjectArray>& ports); | |
| 348 | |
| 349 void GrantFileSchemeAccesstoChildProcess( | |
| 350 JNIEnv* env, | |
| 351 const base::android::JavaParamRef<jobject>& obj); | |
| 352 | |
| 353 void ResumeLoadingCreatedPopupWebContents( | |
| 354 JNIEnv* env, | |
| 355 const base::android::JavaParamRef<jobject>& obj); | |
| 356 | |
| 357 // content::WebContentsObserver overrides | |
| 358 void RenderViewHostChanged(content::RenderViewHost* old_host, | |
| 359 content::RenderViewHost* new_host) override; | |
| 360 void DidAttachInterstitialPage() override; | |
| 361 void DidDetachInterstitialPage() override; | |
| 362 | |
| 363 // content::RenderProcessHostObserver overrides | |
| 364 void RenderProcessReady(content::RenderProcessHost* host) override; | |
| 365 | |
| 366 // AwSafeBrowsingUIManager::UIManagerClient implementation | |
| 367 bool CanShowBigInterstitial() override; | |
| 368 | |
| 369 void CallProceedOnInterstitialForTesting( | |
| 370 JNIEnv* env, | |
| 371 const base::android::JavaParamRef<jobject>& obj); | |
| 372 void CallDontProceedOnInterstitialForTesting( | |
| 373 JNIEnv* env, | |
| 374 const base::android::JavaParamRef<jobject>& obj); | |
| 375 | |
| 376 // AwRenderProcessGoneDelegate overrides | |
| 377 void OnRenderProcessGone(int child_process_id) override; | |
| 378 bool OnRenderProcessGoneDetail(int child_process_id, bool crashed) override; | |
| 379 | |
| 380 private: | |
| 381 void InitAutofillIfNecessary(bool enabled); | |
| 382 | |
| 383 // Geolocation API support | |
| 384 void ShowGeolocationPrompt(const GURL& origin, base::Callback<void(bool)>); | |
| 385 void HideGeolocationPrompt(const GURL& origin); | |
| 386 | |
| 387 void SetDipScaleInternal(float dip_scale); | |
| 388 | |
| 389 void SetAwGLFunctor(AwGLFunctor* functor); | |
| 390 | |
| 391 AwRendererPriorityManager* GetAwRendererPriorityManager(); | |
| 392 AwRendererPriorityManager::RendererPriority GetComputedRendererPriority(); | |
| 393 void UpdateRendererPriority( | |
| 394 AwRendererPriorityManager::RendererPriority base_priority); | |
| 395 void UpdateRendererPriority(); | |
| 396 | |
| 397 JavaObjectWeakGlobalRef java_ref_; | |
| 398 AwGLFunctor* functor_; | |
| 399 BrowserViewRenderer browser_view_renderer_; // Must outlive |web_contents_|. | |
| 400 std::unique_ptr<content::WebContents> web_contents_; | |
| 401 std::unique_ptr<AwWebContentsDelegate> web_contents_delegate_; | |
| 402 std::unique_ptr<AwContentsClientBridge> contents_client_bridge_; | |
| 403 std::unique_ptr<AwRenderViewHostExt> render_view_host_ext_; | |
| 404 std::unique_ptr<FindHelper> find_helper_; | |
| 405 std::unique_ptr<IconHelper> icon_helper_; | |
| 406 std::unique_ptr<AwContents> pending_contents_; | |
| 407 std::unique_ptr<AwPdfExporter> pdf_exporter_; | |
| 408 std::unique_ptr<PermissionRequestHandler> permission_request_handler_; | |
| 409 | |
| 410 // GURL is supplied by the content layer as requesting frame. | |
| 411 // Callback is supplied by the content layer, and is invoked with the result | |
| 412 // from the permission prompt. | |
| 413 typedef std::pair<const GURL, base::Callback<void(bool)>> OriginCallback; | |
| 414 // The first element in the list is always the currently pending request. | |
| 415 std::list<OriginCallback> pending_geolocation_prompts_; | |
| 416 | |
| 417 GLViewRendererManager::Key renderer_manager_key_; | |
| 418 | |
| 419 AwRendererPriorityManager::RendererPriority renderer_requested_priority_; | |
| 420 bool renderer_priority_waived_when_not_visible_; | |
| 421 | |
| 422 DISALLOW_COPY_AND_ASSIGN(AwContents); | |
| 423 }; | |
| 424 | |
| 425 bool RegisterAwContents(JNIEnv* env); | |
| 426 | |
| 427 } // namespace android_webview | |
| 428 | |
| 429 #endif // ANDROID_WEBVIEW_NATIVE_AW_CONTENTS_H_ | |
| OLD | NEW |