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_helper.h" 12 #include "base/basictypes.h" 13 #include "base/compiler_specific.h" 14 #include "base/i18n/rtl.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "base/process/process.h" 17 #include "content/browser/renderer_host/render_widget_host_view_android.h" 18 #include "content/browser/web_contents/web_contents_impl.h" 19 #include "content/public/browser/android/content_view_core.h" 20 #include "content/public/browser/notification_observer.h" 21 #include "content/public/browser/notification_registrar.h" 22 #include "content/public/browser/web_contents_observer.h" 23 #include "third_party/WebKit/public/web/WebInputEvent.h" 24 #include "ui/gfx/rect.h" 25 #include "ui/gfx/rect_f.h" 26 #include "url/gurl.h" 27 28 namespace ui { 29 class ViewAndroid; 30 class WindowAndroid; 31 } 32 33 namespace content { 34 class RenderWidgetHostViewAndroid; 35 struct MenuItem; 36 37 // TODO(jrg): this is a shell. Upstream the rest. 38 class ContentViewCoreImpl : public ContentViewCore, 39 public NotificationObserver, 40 public WebContentsObserver { 41 public: 42 static ContentViewCoreImpl* FromWebContents(WebContents* web_contents); 43 ContentViewCoreImpl(JNIEnv* env, 44 jobject obj, 45 bool hardware_accelerated, 46 WebContents* web_contents, 47 ui::ViewAndroid* view_android, 48 ui::WindowAndroid* window_android); 49 50 // ContentViewCore implementation. 51 virtual base::android::ScopedJavaLocalRef<jobject> GetJavaObject() OVERRIDE; 52 virtual WebContents* GetWebContents() const OVERRIDE; 53 virtual ui::ViewAndroid* GetViewAndroid() const OVERRIDE; 54 virtual ui::WindowAndroid* GetWindowAndroid() const OVERRIDE; 55 virtual scoped_refptr<cc::Layer> GetLayer() const OVERRIDE; 56 virtual void LoadUrl(NavigationController::LoadURLParams& params) OVERRIDE; 57 virtual jint GetCurrentRenderProcessId(JNIEnv* env, jobject obj) OVERRIDE; 58 virtual void ShowPastePopup(int x, int y) OVERRIDE; 59 virtual unsigned int GetScaledContentTexture( 60 float scale, 61 gfx::Size* out_size) OVERRIDE; 62 virtual float GetDpiScale() const OVERRIDE; 63 virtual void RequestContentClipping(const gfx::Rect& clipping, 64 const gfx::Size& content_size) OVERRIDE; 65 virtual void PauseVideo() OVERRIDE; 66 virtual void PauseOrResumeGeolocation(bool should_pause) OVERRIDE; 67 68 // -------------------------------------------------------------------------- 69 // Methods called from Java via JNI 70 // -------------------------------------------------------------------------- 71 72 base::android::ScopedJavaLocalRef<jobject> GetWebContentsAndroid(JNIEnv* env, 73 jobject obj); 74 75 void OnJavaContentViewCoreDestroyed(JNIEnv* env, jobject obj); 76 77 // Notifies the ContentViewCore that items were selected in the currently 78 // showing select popup. 79 void SelectPopupMenuItems(JNIEnv* env, jobject obj, jintArray indices); 80 81 void LoadUrl( 82 JNIEnv* env, jobject obj, 83 jstring url, 84 jint load_url_type, 85 jint transition_type, 86 jint ua_override_option, 87 jstring extra_headers, 88 jbyteArray post_data, 89 jstring base_url_for_data_url, 90 jstring virtual_url_for_data_url, 91 jboolean can_load_local_resources); 92 base::android::ScopedJavaLocalRef<jstring> GetURL(JNIEnv* env, jobject) const; 93 base::android::ScopedJavaLocalRef<jstring> GetTitle( 94 JNIEnv* env, jobject obj) const; 95 jboolean IsIncognito(JNIEnv* env, jobject obj); 96 void SendOrientationChangeEvent(JNIEnv* env, jobject obj, jint orientation); 97 jboolean SendTouchEvent(JNIEnv* env, 98 jobject obj, 99 jlong time_ms, 100 jint type, 101 jobjectArray pts); 102 jboolean SendMouseMoveEvent(JNIEnv* env, 103 jobject obj, 104 jlong time_ms, 105 jfloat x, 106 jfloat y); 107 jboolean SendMouseWheelEvent(JNIEnv* env, 108 jobject obj, 109 jlong time_ms, 110 jfloat x, 111 jfloat y, 112 jfloat vertical_axis); 113 void ScrollBegin(JNIEnv* env, jobject obj, jlong time_ms, jfloat x, jfloat y); 114 void ScrollEnd(JNIEnv* env, jobject obj, jlong time_ms); 115 void ScrollBy(JNIEnv* env, jobject obj, jlong time_ms, 116 jfloat x, jfloat y, jfloat dx, jfloat dy); 117 void FlingStart(JNIEnv* env, jobject obj, jlong time_ms, 118 jfloat x, jfloat y, jfloat vx, jfloat vy); 119 void FlingCancel(JNIEnv* env, jobject obj, jlong time_ms); 120 void SingleTap(JNIEnv* env, jobject obj, jlong time_ms, 121 jfloat x, jfloat y, 122 jboolean disambiguation_popup_tap); 123 void SingleTapUnconfirmed(JNIEnv* env, jobject obj, jlong time_ms, 124 jfloat x, jfloat y); 125 void ShowPressState(JNIEnv* env, jobject obj, jlong time_ms, 126 jfloat x, jfloat y); 127 void TapCancel(JNIEnv* env, jobject obj, jlong time_ms, 128 jfloat x, jfloat y); 129 void TapDown(JNIEnv* env, jobject obj, jlong time_ms, 130 jfloat x, jfloat y); 131 void DoubleTap(JNIEnv* env, jobject obj, jlong time_ms, 132 jfloat x, jfloat y) ; 133 void LongPress(JNIEnv* env, jobject obj, jlong time_ms, 134 jfloat x, jfloat y, 135 jboolean disambiguation_popup_tap); 136 void LongTap(JNIEnv* env, jobject obj, jlong time_ms, 137 jfloat x, jfloat y, 138 jboolean disambiguation_popup_tap); 139 void PinchBegin(JNIEnv* env, jobject obj, jlong time_ms, jfloat x, jfloat y); 140 void PinchEnd(JNIEnv* env, jobject obj, jlong time_ms); 141 void PinchBy(JNIEnv* env, jobject obj, jlong time_ms, 142 jfloat x, jfloat y, jfloat delta); 143 void SelectBetweenCoordinates(JNIEnv* env, jobject obj, 144 jfloat x1, jfloat y1, 145 jfloat x2, jfloat y2); 146 void MoveCaret(JNIEnv* env, jobject obj, jfloat x, jfloat y); 147 148 void LoadIfNecessary(JNIEnv* env, jobject obj); 149 void RequestRestoreLoad(JNIEnv* env, jobject obj); 150 void StopLoading(JNIEnv* env, jobject obj); 151 void Reload(JNIEnv* env, jobject obj, jboolean check_for_repost); 152 void ReloadIgnoringCache(JNIEnv* env, jobject obj, jboolean check_for_repost); 153 void CancelPendingReload(JNIEnv* env, jobject obj); 154 void ContinuePendingReload(JNIEnv* env, jobject obj); 155 void ClearHistory(JNIEnv* env, jobject obj); 156 void EvaluateJavaScript(JNIEnv* env, 157 jobject obj, 158 jstring script, 159 jobject callback, 160 jboolean start_renderer); 161 int GetNativeImeAdapter(JNIEnv* env, jobject obj); 162 void SetFocus(JNIEnv* env, jobject obj, jboolean focused); 163 void ScrollFocusedEditableNodeIntoView(JNIEnv* env, jobject obj); 164 void UndoScrollFocusedEditableNodeIntoView(JNIEnv* env, jobject obj); 165 166 jint GetBackgroundColor(JNIEnv* env, jobject obj); 167 void SetBackgroundColor(JNIEnv* env, jobject obj, jint color); 168 void OnShow(JNIEnv* env, jobject obj); 169 void OnHide(JNIEnv* env, jobject obj); 170 void ClearSslPreferences(JNIEnv* env, jobject /* obj */); 171 void SetUseDesktopUserAgent(JNIEnv* env, 172 jobject /* obj */, 173 jboolean state, 174 jboolean reload_on_state_change); 175 bool GetUseDesktopUserAgent(JNIEnv* env, jobject /* obj */); 176 void Show(); 177 void Hide(); 178 void AddJavascriptInterface(JNIEnv* env, 179 jobject obj, 180 jobject object, 181 jstring name, 182 jclass safe_annotation_clazz, 183 jobject retained_object_set); 184 void RemoveJavascriptInterface(JNIEnv* env, jobject obj, jstring name); 185 int GetNavigationHistory(JNIEnv* env, jobject obj, jobject history); 186 void GetDirectedNavigationHistory(JNIEnv* env, 187 jobject obj, 188 jobject history, 189 jboolean is_forward, 190 jint max_entries); 191 base::android::ScopedJavaLocalRef<jstring> 192 GetOriginalUrlForActiveNavigationEntry(JNIEnv* env, jobject obj); 193 void UpdateVSyncParameters(JNIEnv* env, jobject obj, jlong timebase_micros, 194 jlong interval_micros); 195 void OnVSync(JNIEnv* env, jobject /* obj */, jlong frame_time_micros); 196 jboolean OnAnimate(JNIEnv* env, jobject /* obj */, jlong frame_time_micros); 197 jboolean PopulateBitmapFromCompositor(JNIEnv* env, 198 jobject obj, 199 jobject jbitmap); 200 void WasResized(JNIEnv* env, jobject obj); 201 jboolean IsRenderWidgetHostViewReady(JNIEnv* env, jobject obj); 202 void ExitFullscreen(JNIEnv* env, jobject obj); 203 void UpdateTopControlsState(JNIEnv* env, 204 jobject obj, 205 bool enable_hiding, 206 bool enable_showing, 207 bool animate); 208 void ShowImeIfNeeded(JNIEnv* env, jobject obj); 209 210 void ShowInterstitialPage(JNIEnv* env, 211 jobject obj, 212 jstring jurl, 213 jint delegate); 214 jboolean IsShowingInterstitialPage(JNIEnv* env, jobject obj); 215 216 void AttachExternalVideoSurface(JNIEnv* env, 217 jobject obj, 218 jint player_id, 219 jobject jsurface); 220 void DetachExternalVideoSurface(JNIEnv* env, jobject obj, jint player_id); 221 void SetAccessibilityEnabled(JNIEnv* env, jobject obj, bool enabled); 222 void SendActionAfterDoubleTapUma(JNIEnv* env, 223 jobject obj, 224 jint type, 225 jboolean has_delay, 226 jint count); 227 void SendSingleTapUma(JNIEnv* env, jobject obj, jint type, jint count); 228 229 void ExtractSmartClipData(JNIEnv* env, 230 jobject obj, 231 jint x, 232 jint y, 233 jint width, 234 jint height); 235 // -------------------------------------------------------------------------- 236 // Public methods that call to Java via JNI 237 // -------------------------------------------------------------------------- 238 239 void OnSmartClipDataExtracted(const string16& result); 240 241 // Creates a popup menu with |items|. 242 // |multiple| defines if it should support multi-select. 243 // If not |multiple|, |selected_item| sets the initially selected item. 244 // Otherwise, item's "checked" flag selects it. 245 void ShowSelectPopupMenu(const std::vector<MenuItem>& items, 246 int selected_item, 247 bool multiple); 248 249 void OnTabCrashed(); 250 251 // All sizes and offsets are in CSS pixels as cached by the renderer. 252 void UpdateFrameInfo(const gfx::Vector2dF& scroll_offset, 253 float page_scale_factor, 254 const gfx::Vector2dF& page_scale_factor_limits, 255 const gfx::SizeF& content_size, 256 const gfx::SizeF& viewport_size, 257 const gfx::Vector2dF& controls_offset, 258 const gfx::Vector2dF& content_offset, 259 float overdraw_bottom_height); 260 261 void UpdateImeAdapter(int native_ime_adapter, int text_input_type, 262 const std::string& text, 263 int selection_start, int selection_end, 264 int composition_start, int composition_end, 265 bool show_ime_if_needed, bool require_ack); 266 void SetTitle(const base::string16& title); 267 void OnBackgroundColorChanged(SkColor color); 268 269 bool HasFocus(); 270 void ConfirmTouchEvent(InputEventAckState ack_result); 271 void UnhandledFlingStartEvent(); 272 void OnScrollUpdateGestureConsumed(); 273 void HasTouchEventHandlers(bool need_touch_events); 274 void OnSelectionChanged(const std::string& text); 275 void OnSelectionBoundsChanged( 276 const ViewHostMsg_SelectionBounds_Params& params); 277 278 void StartContentIntent(const GURL& content_url); 279 280 // Shows the disambiguation popup 281 // |target_rect| --> window coordinates which |zoomed_bitmap| represents 282 // |zoomed_bitmap| --> magnified image of potential touch targets 283 void ShowDisambiguationPopup( 284 const gfx::Rect& target_rect, const SkBitmap& zoomed_bitmap); 285 286 // Creates a java-side touch event, used for injecting touch event for 287 // testing/benchmarking purposes 288 base::android::ScopedJavaLocalRef<jobject> CreateTouchEventSynthesizer(); 289 290 // Notifies the java object about the external surface, requesting for one if 291 // necessary. 292 void NotifyExternalSurface( 293 int player_id, bool is_request, const gfx::RectF& rect); 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 // -------------------------------------------------------------------------- 305 // Methods called from native code 306 // -------------------------------------------------------------------------- 307 308 gfx::Size GetPhysicalBackingSize() const; 309 gfx::Size GetViewportSizeDip() const; 310 gfx::Size GetViewportSizeOffsetDip() const; 311 float GetOverdrawBottomHeightDip() const; 312 313 void AttachLayer(scoped_refptr<cc::Layer> layer); 314 void RemoveLayer(scoped_refptr<cc::Layer> layer); 315 void AddBeginFrameSubscriber(); 316 void RemoveBeginFrameSubscriber(); 317 void SetNeedsAnimate(); 318 319 private: 320 class ContentViewUserData; 321 322 friend class ContentViewUserData; 323 virtual ~ContentViewCoreImpl(); 324 325 // NotificationObserver implementation. 326 virtual void Observe(int type, 327 const NotificationSource& source, 328 const NotificationDetails& details) OVERRIDE; 329 330 // WebContentsObserver implementation. 331 virtual void RenderViewReady() OVERRIDE; 332 virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE; 333 334 // -------------------------------------------------------------------------- 335 // Other private methods and data 336 // -------------------------------------------------------------------------- 337 338 void InitWebContents(); 339 340 RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid(); 341 342 float GetTouchPaddingDip(); 343 344 blink::WebGestureEvent MakeGestureEvent( 345 blink::WebInputEvent::Type type, int64 time_ms, float x, float y) const; 346 347 void SendBeginFrame(base::TimeTicks frame_time); 348 349 gfx::Size GetViewportSizePix() const; 350 gfx::Size GetViewportSizeOffsetPix() const; 351 352 void DeleteScaledSnapshotTexture(); 353 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 362 // A weak reference to the Java ContentViewCore object. 363 JavaObjectWeakGlobalRef java_ref_; 364 365 NotificationRegistrar notification_registrar_; 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 // Variables used to keep track of frame timestamps and deadlines. 378 base::TimeDelta vsync_interval_; 379 base::TimeDelta expected_browser_composite_time_; 380 381 // The Android view that can be used to add and remove decoration layers 382 // like AutofillPopup. 383 ui::ViewAndroid* view_android_; 384 385 // The owning window that has a hold of main application activity. 386 ui::WindowAndroid* window_android_; 387 388 // The cache of device's current orientation set from Java side, this value 389 // will be sent to Renderer once it is ready. 390 int device_orientation_; 391 392 bool geolocation_needs_pause_; 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