blob: 1c22899acb48d3f3ce42967f2aa222b943244f10 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_
#define CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/compiler_specific.h"
#include "base/i18n/rtl.h"
#include "base/macros.h"
#include "base/process/process.h"
#include "content/browser/android/content_view_core_impl_observer.h"
#include "content/browser/renderer_host/render_widget_host_view_android.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/android/content_view_core.h"
#include "content/public/browser/web_contents_observer.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
#include "ui/android/view_android.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/selection_bound.h"
#include "url/gurl.h"
namespace ui {
class WindowAndroid;
}
namespace content {
class GinJavaBridgeDispatcherHost;
class RenderFrameHost;
class RenderWidgetHostViewAndroid;
struct ContextMenuParams;
struct MenuItem;
class ContentViewCoreImpl : public ContentViewCore,
public WebContentsObserver {
public:
static ContentViewCoreImpl* FromWebContents(WebContents* web_contents);
ContentViewCoreImpl(
JNIEnv* env,
const base::android::JavaRef<jobject>& obj,
WebContents* web_contents,
float dpi_scale,
const base::android::JavaRef<jobject>& java_bridge_retained_object_set);
// ContentViewCore implementation.
base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override;
WebContents* GetWebContents() const override;
ui::WindowAndroid* GetWindowAndroid() const override;
bool ShowSelectionMenu(const ContextMenuParams& params) override;
void AddObserver(ContentViewCoreImplObserver* observer);
void RemoveObserver(ContentViewCoreImplObserver* observer);
// --------------------------------------------------------------------------
// Methods called from Java via JNI
// --------------------------------------------------------------------------
base::android::ScopedJavaLocalRef<jobject> GetWebContentsAndroid(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
base::android::ScopedJavaLocalRef<jobject> GetJavaWindowAndroid(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void UpdateWindowAndroid(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong window_android);
void OnJavaContentViewCoreDestroyed(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Notifies the ContentViewCore that items were selected in the currently
// showing select popup.
void SelectPopupMenuItems(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong selectPopupSourceFrame,
const base::android::JavaParamRef<jintArray>& indices);
void SendOrientationChangeEvent(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint orientation);
jboolean SendMouseWheelEvent(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jfloat ticks_x,
jfloat ticks_y,
jfloat pixels_per_tick);
void ScrollBegin(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jfloat hintx,
jfloat hinty,
jboolean target_viewport,
jboolean from_gamepad);
void ScrollEnd(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms);
void ScrollBy(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jfloat dx,
jfloat dy);
void FlingStart(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jfloat vx,
jfloat vy,
jboolean target_viewport,
jboolean from_gamepad);
void FlingCancel(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jboolean from_gamepad);
void DoubleTap(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y);
void ResolveTapDisambiguation(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jboolean is_long_press);
void PinchBegin(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y);
void PinchEnd(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms);
void PinchBy(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong time_ms,
jfloat x,
jfloat y,
jfloat delta);
void SetTextHandlesTemporarilyHidden(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean hidden);
void ResetGestureDetection(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void SetDoubleTapSupportEnabled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean enabled);
void SetMultiTouchZoomSupportEnabled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean enabled);
void SetFocus(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean focused);
void SetDIPScale(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jfloat dipScale);
jint GetBackgroundColor(JNIEnv* env, jobject obj);
void SetAllowJavascriptInterfacesInspection(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean allow);
void AddJavascriptInterface(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& object,
const base::android::JavaParamRef<jstring>& name,
const base::android::JavaParamRef<jclass>& safe_annotation_clazz);
void RemoveJavascriptInterface(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& name);
void WasResized(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void SetAccessibilityEnabled(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool enabled);
void SetTextTrackSettings(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean textTracksEnabled,
const base::android::JavaParamRef<jstring>& textTrackBackgroundColor,
const base::android::JavaParamRef<jstring>& textTrackFontFamily,
const base::android::JavaParamRef<jstring>& textTrackFontStyle,
const base::android::JavaParamRef<jstring>& textTrackFontVariant,
const base::android::JavaParamRef<jstring>& textTrackTextColor,
const base::android::JavaParamRef<jstring>& textTrackTextShadow,
const base::android::JavaParamRef<jstring>& textTrackTextSize);
void SetBackgroundOpaque(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jobj,
jboolean opaque);
jint GetCurrentRenderProcessId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// --------------------------------------------------------------------------
// Public methods that call to Java via JNI
// --------------------------------------------------------------------------
void HidePopupsAndPreserveSelection();
// Creates a popup menu with |items|.
// |multiple| defines if it should support multi-select.
// If not |multiple|, |selected_item| sets the initially selected item.
// Otherwise, item's "checked" flag selects it.
void ShowSelectPopupMenu(RenderFrameHost* frame,
const gfx::Rect& bounds,
const std::vector<MenuItem>& items,
int selected_item,
bool multiple,
bool right_aligned);
// Hides a visible popup menu.
void HideSelectPopupMenu();
// All sizes and offsets are in CSS pixels (except |top_show_pix|)
// as cached by the renderer.
void UpdateFrameInfo(const gfx::Vector2dF& scroll_offset,
float page_scale_factor,
const gfx::Vector2dF& page_scale_factor_limits,
const gfx::SizeF& content_size,
const gfx::SizeF& viewport_size,
const float content_offset,
const float top_shown_pix,
bool top_changed,
bool is_mobile_optimized_hint);
bool HasFocus();
void RequestDisallowInterceptTouchEvent();
void OnGestureEventAck(const blink::WebGestureEvent& event,
InputEventAckState ack_result);
bool FilterInputEvent(const blink::WebInputEvent& event);
// Shows the disambiguation popup
// |rect_pixels| --> window coordinates which |zoomed_bitmap| represents
// |zoomed_bitmap| --> magnified image of potential touch targets
void ShowDisambiguationPopup(
const gfx::Rect& rect_pixels, const SkBitmap& zoomed_bitmap);
// Creates a java-side touch event, used for injecting motion events for
// testing/benchmarking purposes.
base::android::ScopedJavaLocalRef<jobject> CreateMotionEventSynthesizer();
void DidStopFlinging();
// Returns the context with which the ContentViewCore was created, typically
// the Activity context.
base::android::ScopedJavaLocalRef<jobject> GetContext() const;
// Returns the viewport size after accounting for the viewport offset.
gfx::Size GetViewSize() const;
void SetAccessibilityEnabledInternal(bool enabled);
bool IsFullscreenRequiredForOrientationLock() const;
// --------------------------------------------------------------------------
// Methods called from native code
// --------------------------------------------------------------------------
gfx::Size GetViewportSizeDip() const;
bool DoBrowserControlsShrinkBlinkSize() const;
float GetTopControlsHeightDip() const;
float GetBottomControlsHeightDip() const;
void MoveRangeSelectionExtent(const gfx::PointF& extent);
void SelectBetweenCoordinates(const gfx::PointF& base,
const gfx::PointF& extent);
void OnShowUnhandledTapUIIfNeeded(int x_dip, int y_dip);
void OnSelectWordAroundCaretAck(bool did_select,
int start_adjust,
int end_adjust);
void OnTouchDown(const base::android::ScopedJavaLocalRef<jobject>& event);
ui::ViewAndroid* GetViewAndroid() const;
private:
class ContentViewUserData;
friend class ContentViewUserData;
~ContentViewCoreImpl() override;
// WebContentsObserver implementation.
void RenderViewReady() override;
void RenderViewHostChanged(RenderViewHost* old_host,
RenderViewHost* new_host) override;
void WebContentsDestroyed() override;
// --------------------------------------------------------------------------
// Other private methods and data
// --------------------------------------------------------------------------
void InitWebContents();
void SendScreenRectsAndResizeWidget();
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() const;
blink::WebGestureEvent MakeGestureEvent(blink::WebInputEvent::Type type,
int64_t time_ms,
float x,
float y) const;
gfx::Size GetViewportSizePix() const;
int GetTopControlsHeightPix() const;
int GetBottomControlsHeightPix() const;
void SendGestureEvent(const blink::WebGestureEvent& event);
// Update focus state of the RenderWidgetHostView.
void SetFocusInternal(bool focused);
// Send device_orientation_ to renderer.
void SendOrientationChangeEventInternal();
float dpi_scale() const { return dpi_scale_; }
// A weak reference to the Java ContentViewCore object.
JavaObjectWeakGlobalRef java_ref_;
// Select popup view
ui::ViewAndroid::ScopedAnchorView select_popup_;
// Reference to the current WebContents used to determine how and what to
// display in the ContentViewCore.
WebContentsImpl* web_contents_;
// Page scale factor.
float page_scale_;
// Device scale factor.
float dpi_scale_;
// Observer to notify of lifecyle changes.
base::ObserverList<ContentViewCoreImplObserver> observer_list_;
// The cache of device's current orientation set from Java side, this value
// will be sent to Renderer once it is ready.
int device_orientation_;
bool accessibility_enabled_;
// Manages injecting Java objects.
scoped_refptr<GinJavaBridgeDispatcherHost> java_bridge_dispatcher_host_;
DISALLOW_COPY_AND_ASSIGN(ContentViewCoreImpl);
};
bool RegisterContentViewCore(JNIEnv* env);
} // namespace content
#endif // CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_IMPL_H_