Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1752)

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 2509103002: Enable browser process hit testing on Android (Closed)
Patch Set: Added missing check Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 5af7d031e7f5cf1d6e7f42a2fd9e8156f2c03a4d..3ee59bdadeb338e0e1cc20c9cd9480712abbba7e 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -34,6 +34,7 @@
#include "cc/resources/single_release_callback.h"
#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_factory.h"
+#include "cc/surfaces/surface_hittest.h"
#include "cc/surfaces/surface_manager.h"
#include "cc/trees/layer_tree_host.h"
#include "components/display_compositor/gl_helper.h"
@@ -42,6 +43,7 @@
#include "content/browser/android/content_view_core_impl.h"
#include "content/browser/android/overscroll_controller_android.h"
#include "content/browser/android/synchronous_compositor_host.h"
+#include "content/browser/compositor/surface_utils.h"
#include "content/browser/devtools/render_frame_devtools_agent_host.h"
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
#include "content/browser/gpu/compositor_util.h"
@@ -58,8 +60,10 @@
#include "content/browser/renderer_host/render_view_host_delegate_view.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_input_event_router.h"
#include "content/common/gpu_host_messages.h"
#include "content/common/input_messages.h"
+#include "content/common/site_isolation_policy.h"
#include "content/common/view_messages.h"
#include "content/public/browser/android/compositor.h"
#include "content/public/browser/android/synchronous_compositor_client.h"
@@ -457,6 +461,13 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
host_->AllocateFrameSinkId(false /* is_guest_view_hack */);
delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid(
&view_, CompositorImpl::GetSurfaceManager(), this, frame_sink_id));
+
+ // Let the page-level input event router know about our frame sink ID
+ // for surface-based hit testing.
+ if (host_->delegate() && host_->delegate()->GetInputEventRouter()) {
+ host_->delegate()->GetInputEventRouter()->AddFrameSinkIdOwner(
+ GetFrameSinkId(), this);
+ }
}
host_->SetView(this);
@@ -798,6 +809,120 @@ void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) {
ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME);
}
+cc::SurfaceId RenderWidgetHostViewAndroid::SurfaceIdForTesting() const {
+ return delegated_frame_host_ ? delegated_frame_host_->SurfaceId()
+ : cc::SurfaceId();
+}
+
+cc::FrameSinkId RenderWidgetHostViewAndroid::FrameSinkIdAtPoint(
+ cc::SurfaceHittestDelegate* delegate,
+ const gfx::Point& point,
+ gfx::Point* transformed_point) {
+ if (!delegated_frame_host_)
+ return cc::FrameSinkId();
+
+ float scale_factor =
+ display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
+ DCHECK_GT(scale_factor, 0);
+ // The surface hittest happens in device pixels, so we need to convert the
+ // |point| from DIPs to pixels before hittesting.
+ gfx::Point point_in_pixels = gfx::ConvertPointToPixel(scale_factor, point);
+
+ cc::SurfaceId surface_id = delegated_frame_host_->SurfaceId();
+ if (surface_id.is_valid()) {
+ cc::SurfaceHittest hittest(delegate, GetSurfaceManager());
+ gfx::Transform target_transform;
+ surface_id = hittest.GetTargetSurfaceAtPoint(surface_id, point_in_pixels,
+ &target_transform);
+ *transformed_point = point_in_pixels;
+ if (surface_id.is_valid())
+ target_transform.TransformPoint(transformed_point);
+ *transformed_point =
+ gfx::ConvertPointToDIP(scale_factor, *transformed_point);
+ }
+
+ // It is possible that the renderer has not yet produced a surface, in which
+ // case we return our current namespace.
+ if (!surface_id.is_valid())
+ return GetFrameSinkId();
+ return surface_id.frame_sink_id();
+}
+
+void RenderWidgetHostViewAndroid::ProcessMouseEvent(
+ const blink::WebMouseEvent& event,
+ const ui::LatencyInfo& latency) {
+ host_->ForwardMouseEventWithLatencyInfo(event, latency);
+}
+
+void RenderWidgetHostViewAndroid::ProcessMouseWheelEvent(
+ const blink::WebMouseWheelEvent& event,
+ const ui::LatencyInfo& latency) {
+ host_->ForwardWheelEventWithLatencyInfo(event, latency);
+}
+
+void RenderWidgetHostViewAndroid::ProcessTouchEvent(
+ const blink::WebTouchEvent& event,
+ const ui::LatencyInfo& latency) {
+ host_->ForwardTouchEventWithLatencyInfo(event, latency);
+}
+
+void RenderWidgetHostViewAndroid::ProcessGestureEvent(
+ const blink::WebGestureEvent& event,
+ const ui::LatencyInfo& latency) {
+ host_->ForwardGestureEventWithLatencyInfo(event, latency);
+}
+
+bool RenderWidgetHostViewAndroid::TransformPointToLocalCoordSpace(
+ const gfx::Point& point,
+ const cc::SurfaceId& original_surface,
+ gfx::Point* transformed_point) {
+ if (!delegated_frame_host_)
+ return false;
+
+ float scale_factor =
+ display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
+ DCHECK_GT(scale_factor, 0);
+ // Transformations use physical pixels rather than DIP, so conversion
+ // is necessary.
+ gfx::Point point_in_pixels = gfx::ConvertPointToPixel(scale_factor, point);
+
+ cc::SurfaceId surface_id = delegated_frame_host_->SurfaceId();
+ if (!surface_id.is_valid())
+ return false;
+
+ if (original_surface == surface_id)
+ return true;
+
+ *transformed_point = point_in_pixels;
+ cc::SurfaceHittest hittest(nullptr, GetSurfaceManager());
+ if (!hittest.TransformPointToTargetSurface(original_surface, surface_id,
+ transformed_point))
+ return false;
+
+ *transformed_point = gfx::ConvertPointToDIP(scale_factor, *transformed_point);
+ return true;
+}
+
+bool RenderWidgetHostViewAndroid::TransformPointToCoordSpaceForView(
+ const gfx::Point& point,
+ RenderWidgetHostViewBase* target_view,
+ gfx::Point* transformed_point) {
+ if (target_view == this || !delegated_frame_host_) {
+ *transformed_point = point;
+ return true;
+ }
+
+ // In TransformPointToLocalCoordSpace() there is a Point-to-Pixel conversion,
+ // but it is not necessary here because the final target view is responsible
+ // for converting before computing the final transform.
+ cc::SurfaceId surface_id = delegated_frame_host_->SurfaceId();
+ if (!surface_id.is_valid())
+ return false;
+
+ return target_view->TransformPointToLocalCoordSpace(point, surface_id,
+ transformed_point);
+}
+
void RenderWidgetHostViewAndroid::OnStartContentIntent(
const GURL& content_url, bool is_main_frame) {
view_.StartContentIntent(content_url, is_main_frame);
@@ -805,7 +930,7 @@ void RenderWidgetHostViewAndroid::OnStartContentIntent(
bool RenderWidgetHostViewAndroid::OnTouchEvent(
const ui::MotionEvent& event) {
- if (!host_)
+ if (!host_ || !host_->delegate())
return false;
ComputeEventLatencyOSTouchHistograms(event);
@@ -833,7 +958,13 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent(
event, result.moved_beyond_slop_region);
ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH);
latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
- host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info);
+ if (host_->delegate()->GetInputEventRouter() &&
+ SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
+ host_->delegate()->GetInputEventRouter()->RouteTouchEvent(this, &web_event,
+ latency_info);
+ } else {
+ host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info);
+ }
// Send a proactive BeginFrame for this vsync to reduce scroll latency for
// scroll-inducing touch events. Note that Android's Choreographer ensures
@@ -1614,15 +1745,31 @@ void RenderWidgetHostViewAndroid::SendMouseEvent(
action_button,
motion_event.GetToolType(0));
- if (host_)
+ if (!host_ || !host_->delegate())
+ return;
+
+ if (SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
+ host_->delegate()->GetInputEventRouter()) {
+ host_->delegate()->GetInputEventRouter()->RouteMouseEvent(
+ this, &mouse_event, ui::LatencyInfo());
+ } else {
host_->ForwardMouseEvent(mouse_event);
+ }
}
void RenderWidgetHostViewAndroid::SendMouseWheelEvent(
const blink::WebMouseWheelEvent& event) {
- if (host_) {
- ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL);
- latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
+ if (!host_ || !host_->delegate())
+ return;
+
+ ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL);
+ latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
+ if (SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
+ host_->delegate()->GetInputEventRouter()) {
+ blink::WebMouseWheelEvent wheel_event(event);
+ host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
+ this, &wheel_event, latency_info);
+ } else {
host_->ForwardWheelEventWithLatencyInfo(event, latency_info);
}
}
@@ -1633,9 +1780,17 @@ void RenderWidgetHostViewAndroid::SendGestureEvent(
if (overscroll_controller_)
overscroll_controller_->Enable();
- if (host_) {
- ui::LatencyInfo latency_info =
- ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
+ if (!host_ || !host_->delegate())
+ return;
+
+ ui::LatencyInfo latency_info =
+ ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
+ if (SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
+ host_->delegate()->GetInputEventRouter()) {
+ blink::WebGestureEvent gesture_event(event);
+ host_->delegate()->GetInputEventRouter()->RouteGestureEvent(
+ this, &gesture_event, latency_info);
+ } else {
host_->ForwardGestureEventWithLatencyInfo(event, latency_info);
}
}
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/browser/site_per_process_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698