Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_input_event_router.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6772d649a88613e66fc1c780a354a3975576d984 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc |
| @@ -0,0 +1,80 @@ |
| +// Copyright 2015 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. |
| + |
| +#include "content/browser/renderer_host/render_widget_host_input_event_router.h" |
| + |
| +#include "cc/surfaces/surface_manager.h" |
| +#include "content/browser/renderer_host/render_widget_host_view_base.h" |
| +#include "third_party/WebKit/public/web/WebInputEvent.h" |
| + |
| +namespace content { |
| + |
| +RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter() {} |
| + |
| +RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() { |
| + owner_map_.clear(); |
| +} |
| + |
| +RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( |
| + RenderWidgetHostViewBase* root_view, |
| + const gfx::Point& point, |
| + gfx::Point* transformed_point) { |
| + // Short circuit if owner_map has only one RenderWidgetHostView, no need for |
| + // hit testing. |
| + if (owner_map_.size() <= 1) { |
| + *transformed_point = point; |
| + return root_view; |
| + } |
| + |
| + // The conversion of point to transform_point is done over the course of the |
| + // hit testing, and reflect transformations that would normally be applied in |
| + // the renderer process if the event was being routed between frames within a |
| + // single process with only one RenderWidgetHost. |
| + uint32_t surface_id_namespace = |
| + root_view->SurfaceIdNamespaceAtPoint(point, transformed_point); |
| + const SurfaceIdNamespaceOwnerMap::iterator iter = |
| + owner_map_.find(surface_id_namespace); |
| + DCHECK(iter != owner_map_.end()); |
| + return iter->second; |
| +} |
| + |
| +void RenderWidgetHostInputEventRouter::RouteMouseEvent( |
| + RenderWidgetHostViewBase* root_view, |
| + blink::WebMouseEvent* event) { |
| + gfx::Point transformed_point; |
| + RenderWidgetHostViewBase* target = FindEventTarget( |
| + root_view, gfx::Point(event->x, event->y), &transformed_point); |
| + event->x = transformed_point.x(); |
| + event->y = transformed_point.y(); |
| + |
| + target->ProcessMouseEvent(*event); |
| +} |
| + |
| +void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( |
| + RenderWidgetHostViewBase* root_view, |
| + blink::WebMouseWheelEvent* event) { |
| + gfx::Point transformed_point; |
| + RenderWidgetHostViewBase* target = FindEventTarget( |
| + root_view, gfx::Point(event->x, event->y), &transformed_point); |
| + event->x = transformed_point.x(); |
| + event->y = transformed_point.y(); |
| + |
| + target->ProcessMouseWheelEvent(*event); |
| +} |
| + |
| +void RenderWidgetHostInputEventRouter::AddSurfaceIdNamespaceOwner( |
| + uint32_t id, |
| + RenderWidgetHostViewBase* owner) { |
| + DCHECK(owner_map_.find(id) == owner_map_.end()); |
| + owner_map_.insert(std::make_pair(id, owner)); |
| +} |
| + |
| +void RenderWidgetHostInputEventRouter::RemoveSurfaceIdNamespaceOwner( |
| + uint32_t id) { |
| + const SurfaceIdNamespaceOwnerMap::iterator iter = owner_map_.find(id); |
|
dcheng
2015/08/31 23:45:54
owner_map_.erase(id) is a shorter way to write thi
kenrb
2015/09/01 15:56:16
Done.
|
| + if (iter != owner_map_.end()) |
| + owner_map_.erase(iter); |
| +} |
| + |
| +} // namespace content |