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 |