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); |
} |
} |