Chromium Code Reviews| 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 53c758f11f2760db6d1ec2218b6fdc475ba4ecbb..247cdd6d6948d030549ee9f298738c6e59d03262 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" |
| @@ -458,6 +462,14 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| if (GetTextInputManager()) |
| GetTextInputManager()->AddObserver(this); |
| + |
| + // Let the page-level input event router know about our frame sink ID |
| + // for surface-based hit testing. |
| + if (host_->delegate() && host_->delegate()->GetInputEventRouter() && |
| + SiteIsolationPolicy::AreCrossProcessFramesPossible()) { |
|
alexmos
2017/03/06 07:22:03
Is the AreCrossProcessFramesPossible necessary her
kenrb
2017/03/07 19:20:19
Done.
|
| + host_->delegate()->GetInputEventRouter()->AddFrameSinkIdOwner( |
| + GetFrameSinkId(), this); |
| + } |
| } |
| RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| @@ -796,6 +808,108 @@ void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { |
| ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
| } |
| +cc::SurfaceId RenderWidgetHostViewAndroid::SurfaceIdForTesting() const { |
| + return delegated_frame_host_->SurfaceId(); |
|
alexmos
2017/03/06 07:22:03
Does this need to worry about delegated_frame_host
kenrb
2017/03/07 19:20:19
Good point. I have added guards to account for tha
|
| +} |
| + |
| +cc::FrameSinkId RenderWidgetHostViewAndroid::FrameSinkIdAtPoint( |
| + cc::SurfaceHittestDelegate* delegate, |
| + const gfx::Point& point, |
| + gfx::Point* transformed_point) { |
| + 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. |
|
aelias_OOO_until_Jul13
2017/03/03 03:27:37
Input events originate in device pixels, so this i
kenrb
2017/03/03 18:38:44
This sounds like a good suggestion, but would real
|
| + 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(); |
|
alexmos
2017/03/06 07:22:03
nit: you could move this if and return up before t
kenrb
2017/03/07 19:20:19
Having it here guards against the case of it becom
alexmos
2017/03/08 19:50:03
Acknowledged.
|
| + 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) { |
| + 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) { |
|
alexmos
2017/03/06 07:22:03
In the equivalent RenderWidgetHostViewAura functio
kenrb
2017/03/07 19:20:19
Oh yeah, that should be here. I think I added that
alexmos
2017/03/08 19:50:03
Do you still need to add it? I don't see it in th
kenrb
2017/03/08 21:15:28
That's weird, but thanks for catching it. I am sur
|
| + // 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); |
| @@ -803,7 +917,7 @@ void RenderWidgetHostViewAndroid::OnStartContentIntent( |
| bool RenderWidgetHostViewAndroid::OnTouchEvent( |
| const ui::MotionEvent& event) { |
| - if (!host_) |
| + if (!host_ || !host_->delegate()) |
| return false; |
| ComputeEventLatencyOSTouchHistograms(event); |
| @@ -831,7 +945,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()) { |
|
alexmos
2017/03/06 07:22:03
There's a comment on RenderWidgetHostViewEventHand
kenrb
2017/03/07 19:20:19
I don't think that is strictly necessary because t
alexmos
2017/03/08 19:50:03
Ah, I see. I think it's ok to keep this for now t
|
| + 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 |
| @@ -1627,15 +1747,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); |
| } |
| } |
| @@ -1646,9 +1782,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); |
| } |
| } |