blob: 49053b9718b363351b8693fdc6ff4cc597e17f9a [file] [log] [blame]
// 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);
// If the point hit a Surface whose namspace is no longer in the map, then
// it likely means the RenderWidgetHostView has been destroyed but its
// parent frame has not sent a new compositor frame since that happened.
if (iter == owner_map_.end())
return root_view;
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) {
owner_map_.erase(id);
}
} // namespace content