• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 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 CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_
6 #define CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_
7 
8 #include <vector>
9 
10 #include "base/android/jni_android.h"
11 #include "base/android/jni_weak_ref.h"
12 #include "base/compiler_specific.h"
13 #include "base/i18n/rtl.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/process/process.h"
16 #include "content/browser/renderer_host/render_widget_host_view_android.h"
17 #include "content/browser/web_contents/web_contents_impl.h"
18 #include "content/public/browser/android/content_view_core.h"
19 #include "content/public/browser/web_contents_observer.h"
20 #include "third_party/WebKit/public/web/WebInputEvent.h"
21 #include "ui/gfx/rect.h"
22 #include "ui/gfx/rect_f.h"
23 #include "url/gurl.h"
24 
25 namespace ui {
26 class ViewAndroid;
27 class WindowAndroid;
28 }
29 
30 namespace content {
31 class GinJavaBridgeDispatcherHost;
32 class RenderWidgetHostViewAndroid;
33 struct MenuItem;
34 
35 // TODO(jrg): this is a shell.  Upstream the rest.
36 class ContentViewCoreImpl : public ContentViewCore,
37                             public WebContentsObserver {
38  public:
39   static ContentViewCoreImpl* FromWebContents(WebContents* web_contents);
40   ContentViewCoreImpl(JNIEnv* env,
41                       jobject obj,
42                       WebContents* web_contents,
43                       ui::ViewAndroid* view_android,
44                       ui::WindowAndroid* window_android,
45                       jobject java_bridge_retained_object_set);
46 
47   // ContentViewCore implementation.
48   virtual base::android::ScopedJavaLocalRef<jobject> GetJavaObject() OVERRIDE;
49   virtual WebContents* GetWebContents() const OVERRIDE;
50   virtual ui::ViewAndroid* GetViewAndroid() const OVERRIDE;
51   virtual ui::WindowAndroid* GetWindowAndroid() const OVERRIDE;
52   virtual scoped_refptr<cc::Layer> GetLayer() const OVERRIDE;
53   virtual void LoadUrl(NavigationController::LoadURLParams& params) OVERRIDE;
54   virtual void ShowPastePopup(int x, int y) OVERRIDE;
55   virtual void GetScaledContentBitmap(
56       float scale,
57       jobject bitmap_config,
58       gfx::Rect src_subrect,
59       const base::Callback<void(bool, const SkBitmap&)>& result_callback)
60       OVERRIDE;
61   virtual float GetDpiScale() const OVERRIDE;
62   virtual void PauseVideo() OVERRIDE;
63   virtual void PauseOrResumeGeolocation(bool should_pause) OVERRIDE;
64   virtual void PauseOrResumeVideoCaptureStream(bool should_pause) OVERRIDE;
65   virtual void RequestTextSurroundingSelection(
66       int max_length,
67       const base::Callback<void(const base::string16& content,
68                                 int start_offset,
69                                 int end_offset)>& callback) OVERRIDE;
70 
71   // --------------------------------------------------------------------------
72   // Methods called from Java via JNI
73   // --------------------------------------------------------------------------
74 
75   base::android::ScopedJavaLocalRef<jobject> GetWebContentsAndroid(JNIEnv* env,
76                                                                    jobject obj);
77 
78   void OnJavaContentViewCoreDestroyed(JNIEnv* env, jobject obj);
79 
80   // Notifies the ContentViewCore that items were selected in the currently
81   // showing select popup.
82   void SelectPopupMenuItems(JNIEnv* env, jobject obj, jintArray indices);
83 
84   void LoadUrl(
85       JNIEnv* env, jobject obj,
86       jstring url,
87       jint load_url_type,
88       jint transition_type,
89       jstring j_referrer_url,
90       jint referrer_policy,
91       jint ua_override_option,
92       jstring extra_headers,
93       jbyteArray post_data,
94       jstring base_url_for_data_url,
95       jstring virtual_url_for_data_url,
96       jboolean can_load_local_resources,
97       jboolean is_renderer_initiated);
98   base::android::ScopedJavaLocalRef<jstring> GetURL(JNIEnv* env, jobject) const;
99   jboolean IsIncognito(JNIEnv* env, jobject obj);
100   void SendOrientationChangeEvent(JNIEnv* env, jobject obj, jint orientation);
101   jboolean OnTouchEvent(JNIEnv* env,
102                         jobject obj,
103                         jobject motion_event,
104                         jlong time_ms,
105                         jint android_action,
106                         jint pointer_count,
107                         jint history_size,
108                         jint action_index,
109                         jfloat pos_x_0,
110                         jfloat pos_y_0,
111                         jfloat pos_x_1,
112                         jfloat pos_y_1,
113                         jint pointer_id_0,
114                         jint pointer_id_1,
115                         jfloat touch_major_0,
116                         jfloat touch_major_1,
117                         jfloat raw_pos_x,
118                         jfloat raw_pos_y,
119                         jint android_tool_type_0,
120                         jint android_tool_type_1,
121                         jint android_button_state);
122   jboolean SendMouseMoveEvent(JNIEnv* env,
123                               jobject obj,
124                               jlong time_ms,
125                               jfloat x,
126                               jfloat y);
127   jboolean SendMouseWheelEvent(JNIEnv* env,
128                                jobject obj,
129                                jlong time_ms,
130                                jfloat x,
131                                jfloat y,
132                                jfloat vertical_axis);
133   void ScrollBegin(JNIEnv* env, jobject obj, jlong time_ms,
134                    jfloat x, jfloat y, jfloat hintx, jfloat hinty);
135   void ScrollEnd(JNIEnv* env, jobject obj, jlong time_ms);
136   void ScrollBy(JNIEnv* env, jobject obj, jlong time_ms,
137                 jfloat x, jfloat y, jfloat dx, jfloat dy);
138   void FlingStart(JNIEnv* env, jobject obj, jlong time_ms,
139                   jfloat x, jfloat y, jfloat vx, jfloat vy);
140   void FlingCancel(JNIEnv* env, jobject obj, jlong time_ms);
141   void SingleTap(JNIEnv* env, jobject obj, jlong time_ms,
142                  jfloat x, jfloat y);
143   void DoubleTap(JNIEnv* env, jobject obj, jlong time_ms,
144                  jfloat x, jfloat y) ;
145   void LongPress(JNIEnv* env, jobject obj, jlong time_ms,
146                  jfloat x, jfloat y);
147   void PinchBegin(JNIEnv* env, jobject obj, jlong time_ms, jfloat x, jfloat y);
148   void PinchEnd(JNIEnv* env, jobject obj, jlong time_ms);
149   void PinchBy(JNIEnv* env, jobject obj, jlong time_ms,
150                jfloat x, jfloat y, jfloat delta);
151   void SelectBetweenCoordinates(JNIEnv* env, jobject obj,
152                                 jfloat x1, jfloat y1,
153                                 jfloat x2, jfloat y2);
154   void MoveCaret(JNIEnv* env, jobject obj, jfloat x, jfloat y);
155 
156   void ResetGestureDetection(JNIEnv* env, jobject obj);
157   void SetDoubleTapSupportEnabled(JNIEnv* env, jobject obj, jboolean enabled);
158   void SetMultiTouchZoomSupportEnabled(JNIEnv* env,
159                                        jobject obj,
160                                        jboolean enabled);
161 
162   void LoadIfNecessary(JNIEnv* env, jobject obj);
163   void RequestRestoreLoad(JNIEnv* env, jobject obj);
164   void Reload(JNIEnv* env, jobject obj, jboolean check_for_repost);
165   void ReloadIgnoringCache(JNIEnv* env, jobject obj, jboolean check_for_repost);
166   void CancelPendingReload(JNIEnv* env, jobject obj);
167   void ContinuePendingReload(JNIEnv* env, jobject obj);
168   void AddStyleSheetByURL(JNIEnv* env, jobject obj, jstring url);
169   void ClearHistory(JNIEnv* env, jobject obj);
170   void EvaluateJavaScript(JNIEnv* env,
171                           jobject obj,
172                           jstring script,
173                           jobject callback,
174                           jboolean start_renderer);
175   long GetNativeImeAdapter(JNIEnv* env, jobject obj);
176   void SetFocus(JNIEnv* env, jobject obj, jboolean focused);
177   void ScrollFocusedEditableNodeIntoView(JNIEnv* env, jobject obj);
178   void SelectWordAroundCaret(JNIEnv* env, jobject obj);
179 
180   jint GetBackgroundColor(JNIEnv* env, jobject obj);
181   void SetBackgroundColor(JNIEnv* env, jobject obj, jint color);
182   void OnShow(JNIEnv* env, jobject obj);
183   void OnHide(JNIEnv* env, jobject obj);
184   void ClearSslPreferences(JNIEnv* env, jobject /* obj */);
185   void SetUseDesktopUserAgent(JNIEnv* env,
186                               jobject /* obj */,
187                               jboolean state,
188                               jboolean reload_on_state_change);
189   bool GetUseDesktopUserAgent(JNIEnv* env, jobject /* obj */);
190   void Show();
191   void Hide();
192   void SetAllowJavascriptInterfacesInspection(JNIEnv* env,
193                                               jobject obj,
194                                               jboolean allow);
195   void AddJavascriptInterface(JNIEnv* env,
196                               jobject obj,
197                               jobject object,
198                               jstring name,
199                               jclass safe_annotation_clazz);
200   void RemoveJavascriptInterface(JNIEnv* env, jobject obj, jstring name);
201   int GetNavigationHistory(JNIEnv* env, jobject obj, jobject history);
202   void GetDirectedNavigationHistory(JNIEnv* env,
203                                     jobject obj,
204                                     jobject history,
205                                     jboolean is_forward,
206                                     jint max_entries);
207   base::android::ScopedJavaLocalRef<jstring>
208       GetOriginalUrlForActiveNavigationEntry(JNIEnv* env, jobject obj);
209   void WasResized(JNIEnv* env, jobject obj);
210   jboolean IsRenderWidgetHostViewReady(JNIEnv* env, jobject obj);
211   void ExitFullscreen(JNIEnv* env, jobject obj);
212   void UpdateTopControlsState(JNIEnv* env,
213                               jobject obj,
214                               bool enable_hiding,
215                               bool enable_showing,
216                               bool animate);
217   void ShowImeIfNeeded(JNIEnv* env, jobject obj);
218 
219   void ShowInterstitialPage(JNIEnv* env,
220                             jobject obj,
221                             jstring jurl,
222                             jlong delegate);
223   jboolean IsShowingInterstitialPage(JNIEnv* env, jobject obj);
224 
225   void SetAccessibilityEnabled(JNIEnv* env, jobject obj, bool enabled);
226 
227   void ExtractSmartClipData(JNIEnv* env,
228                             jobject obj,
229                             jint x,
230                             jint y,
231                             jint width,
232                             jint height);
233 
234   void SetBackgroundOpaque(JNIEnv* env, jobject jobj, jboolean opaque);
235 
236   jint GetCurrentRenderProcessId(JNIEnv* env, jobject obj);
237 
238   // --------------------------------------------------------------------------
239   // Public methods that call to Java via JNI
240   // --------------------------------------------------------------------------
241 
242   void OnSmartClipDataExtracted(const base::string16& text,
243                                 const base::string16& html,
244                                 const gfx::Rect& clip_rect);
245 
246   // Creates a popup menu with |items|.
247   // |multiple| defines if it should support multi-select.
248   // If not |multiple|, |selected_item| sets the initially selected item.
249   // Otherwise, item's "checked" flag selects it.
250   void ShowSelectPopupMenu(const gfx::Rect& bounds,
251                            const std::vector<MenuItem>& items,
252                            int selected_item,
253                            bool multiple);
254   // Hides a visible popup menu.
255   void HideSelectPopupMenu();
256 
257   // All sizes and offsets are in CSS pixels as cached by the renderer.
258   void UpdateFrameInfo(const gfx::Vector2dF& scroll_offset,
259                        float page_scale_factor,
260                        const gfx::Vector2dF& page_scale_factor_limits,
261                        const gfx::SizeF& content_size,
262                        const gfx::SizeF& viewport_size,
263                        const gfx::Vector2dF& controls_offset,
264                        const gfx::Vector2dF& content_offset,
265                        float overdraw_bottom_height);
266 
267   void UpdateImeAdapter(long native_ime_adapter, int text_input_type,
268                         const std::string& text,
269                         int selection_start, int selection_end,
270                         int composition_start, int composition_end,
271                         bool show_ime_if_needed, bool is_non_ime_change);
272   void SetTitle(const base::string16& title);
273   void OnBackgroundColorChanged(SkColor color);
274 
275   bool HasFocus();
276   void OnGestureEventAck(const blink::WebGestureEvent& event,
277                          InputEventAckState ack_result);
278   bool FilterInputEvent(const blink::WebInputEvent& event);
279   void OnSelectionChanged(const std::string& text);
280   void OnSelectionBoundsChanged(
281       const ViewHostMsg_SelectionBounds_Params& params);
282 
283   void StartContentIntent(const GURL& content_url);
284 
285   // Shows the disambiguation popup
286   // |target_rect|   --> window coordinates which |zoomed_bitmap| represents
287   // |zoomed_bitmap| --> magnified image of potential touch targets
288   void ShowDisambiguationPopup(
289       const gfx::Rect& target_rect, const SkBitmap& zoomed_bitmap);
290 
291   // Creates a java-side touch event, used for injecting touch event for
292   // testing/benchmarking purposes
293   base::android::ScopedJavaLocalRef<jobject> CreateTouchEventSynthesizer();
294 
295   base::android::ScopedJavaLocalRef<jobject> GetContentVideoViewClient();
296 
297   // Returns the context that the ContentViewCore was created with, it would
298   // typically be an Activity context for an on screen view.
299   base::android::ScopedJavaLocalRef<jobject> GetContext();
300 
301   // Returns True if the given media should be blocked to load.
302   bool ShouldBlockMediaRequest(const GURL& url);
303 
304   void DidStopFlinging();
305 
306   // Returns the viewport size after accounting for the viewport offset.
307   gfx::Size GetViewSize() const;
308 
309   void SetAccessibilityEnabledInternal(bool enabled);
310 
311   void ShowSelectionHandlesAutomatically() const;
312 
313   // --------------------------------------------------------------------------
314   // Methods called from native code
315   // --------------------------------------------------------------------------
316 
317   gfx::Size GetPhysicalBackingSize() const;
318   gfx::Size GetViewportSizeDip() const;
319   gfx::Size GetViewportSizeOffsetDip() const;
320   float GetOverdrawBottomHeightDip() const;
321 
322   void AttachLayer(scoped_refptr<cc::Layer> layer);
323   void RemoveLayer(scoped_refptr<cc::Layer> layer);
324 
325  private:
326   class ContentViewUserData;
327 
328   friend class ContentViewUserData;
329   virtual ~ContentViewCoreImpl();
330 
331   // WebContentsObserver implementation.
332   virtual void RenderViewReady() OVERRIDE;
333   virtual void RenderViewHostChanged(RenderViewHost* old_host,
334                                      RenderViewHost* new_host) OVERRIDE;
335   virtual void WebContentsDestroyed() OVERRIDE;
336 
337   // --------------------------------------------------------------------------
338   // Other private methods and data
339   // --------------------------------------------------------------------------
340 
341   void InitWebContents();
342 
343   RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
344 
345   blink::WebGestureEvent MakeGestureEvent(
346       blink::WebInputEvent::Type type, int64 time_ms, float x, float y) const;
347 
348   gfx::Size GetViewportSizePix() const;
349   gfx::Size GetViewportSizeOffsetPix() const;
350 
351   void DeleteScaledSnapshotTexture();
352 
353   bool OnMotionEvent(const ui::MotionEvent& event);
354   void SendGestureEvent(const blink::WebGestureEvent& event);
355 
356   // Update focus state of the RenderWidgetHostView.
357   void SetFocusInternal(bool focused);
358 
359   // Send device_orientation_ to renderer.
360   void SendOrientationChangeEventInternal();
361 
dpi_scale()362   float dpi_scale() const { return dpi_scale_; }
363 
364   // A weak reference to the Java ContentViewCore object.
365   JavaObjectWeakGlobalRef java_ref_;
366 
367   // Reference to the current WebContents used to determine how and what to
368   // display in the ContentViewCore.
369   WebContentsImpl* web_contents_;
370 
371   // A compositor layer containing any layer that should be shown.
372   scoped_refptr<cc::Layer> root_layer_;
373 
374   // Device scale factor.
375   float dpi_scale_;
376 
377   // The Android view that can be used to add and remove decoration layers
378   // like AutofillPopup.
379   ui::ViewAndroid* view_android_;
380 
381   // The owning window that has a hold of main application activity.
382   ui::WindowAndroid* window_android_;
383 
384   // The cache of device's current orientation set from Java side, this value
385   // will be sent to Renderer once it is ready.
386   int device_orientation_;
387 
388   bool accessibility_enabled_;
389 
390   // Manages injecting Java objects.
391   scoped_ptr<GinJavaBridgeDispatcherHost>
392       java_bridge_dispatcher_host_;
393 
394   DISALLOW_COPY_AND_ASSIGN(ContentViewCoreImpl);
395 };
396 
397 bool RegisterContentViewCore(JNIEnv* env);
398 
399 }  // namespace content
400 
401 #endif  // CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_
402