OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/render_widget_host_input_event_router.h" | 5 #include "content/browser/renderer_host/render_widget_host_input_event_router.h" |
6 | 6 |
7 #include "cc/quads/surface_draw_quad.h" | |
8 #include "cc/surfaces/surface_id_allocator.h" | |
9 #include "cc/surfaces/surface_manager.h" | 7 #include "cc/surfaces/surface_manager.h" |
10 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 8 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
11 #include "content/common/frame_messages.h" | |
12 #include "third_party/WebKit/public/web/WebInputEvent.h" | 9 #include "third_party/WebKit/public/web/WebInputEvent.h" |
13 | 10 |
14 namespace content { | 11 namespace content { |
15 | 12 |
16 RenderWidgetHostInputEventRouter::HittestDelegate::HittestDelegate( | |
17 const std::unordered_map<cc::SurfaceId, HittestData, cc::SurfaceIdHash>& | |
18 hittest_data) | |
19 : hittest_data_(hittest_data) {} | |
20 | |
21 bool RenderWidgetHostInputEventRouter::HittestDelegate::RejectHitTarget( | |
22 const cc::SurfaceDrawQuad* surface_quad, | |
23 const gfx::Point& point_in_quad_space) { | |
24 auto it = hittest_data_.find(surface_quad->surface_id); | |
25 if (it != hittest_data_.end() && it->second.ignored_for_hittest) | |
26 return true; | |
27 return false; | |
28 } | |
29 | |
30 RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter() | 13 RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter() |
31 : active_touches_(0) {} | 14 : active_touches_(0) {} |
32 | 15 |
33 RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() { | 16 RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() { |
34 owner_map_.clear(); | 17 owner_map_.clear(); |
35 } | 18 } |
36 | 19 |
37 RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( | 20 RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( |
38 RenderWidgetHostViewBase* root_view, | 21 RenderWidgetHostViewBase* root_view, |
39 const gfx::Point& point, | 22 const gfx::Point& point, |
40 gfx::Point* transformed_point) { | 23 gfx::Point* transformed_point) { |
41 // Short circuit if owner_map has only one RenderWidgetHostView, no need for | 24 // Short circuit if owner_map has only one RenderWidgetHostView, no need for |
42 // hit testing. | 25 // hit testing. |
43 if (owner_map_.size() <= 1) { | 26 if (owner_map_.size() <= 1) { |
44 *transformed_point = point; | 27 *transformed_point = point; |
45 return root_view; | 28 return root_view; |
46 } | 29 } |
47 | 30 |
48 // The hittest delegate is used to reject hittesting quads based on extra | |
49 // hittesting data send by the renderer. | |
50 HittestDelegate delegate(hittest_data_); | |
51 | |
52 // The conversion of point to transform_point is done over the course of the | 31 // The conversion of point to transform_point is done over the course of the |
53 // hit testing, and reflect transformations that would normally be applied in | 32 // hit testing, and reflect transformations that would normally be applied in |
54 // the renderer process if the event was being routed between frames within a | 33 // the renderer process if the event was being routed between frames within a |
55 // single process with only one RenderWidgetHost. | 34 // single process with only one RenderWidgetHost. |
56 uint32_t surface_id_namespace = | 35 uint32_t surface_id_namespace = |
57 root_view->SurfaceIdNamespaceAtPoint(&delegate, point, transformed_point); | 36 root_view->SurfaceIdNamespaceAtPoint(point, transformed_point); |
58 const SurfaceIdNamespaceOwnerMap::iterator iter = | 37 const SurfaceIdNamespaceOwnerMap::iterator iter = |
59 owner_map_.find(surface_id_namespace); | 38 owner_map_.find(surface_id_namespace); |
60 // If the point hit a Surface whose namspace is no longer in the map, then | 39 // If the point hit a Surface whose namspace is no longer in the map, then |
61 // it likely means the RenderWidgetHostView has been destroyed but its | 40 // it likely means the RenderWidgetHostView has been destroyed but its |
62 // parent frame has not sent a new compositor frame since that happened. | 41 // parent frame has not sent a new compositor frame since that happened. |
63 if (iter == owner_map_.end()) | 42 if (iter == owner_map_.end()) |
64 return root_view; | 43 return root_view; |
65 RenderWidgetHostViewBase* target = iter->second.get(); | 44 RenderWidgetHostViewBase* target = iter->second.get(); |
66 // If we find the weak pointer is now null, it means the map entry is stale | 45 // If we find the weak pointer is now null, it means the map entry is stale |
67 // and should be removed to free space. | 46 // and should be removed to free space. |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 void RenderWidgetHostInputEventRouter::AddSurfaceIdNamespaceOwner( | 127 void RenderWidgetHostInputEventRouter::AddSurfaceIdNamespaceOwner( |
149 uint32_t id, | 128 uint32_t id, |
150 RenderWidgetHostViewBase* owner) { | 129 RenderWidgetHostViewBase* owner) { |
151 DCHECK(owner_map_.find(id) == owner_map_.end()); | 130 DCHECK(owner_map_.find(id) == owner_map_.end()); |
152 owner_map_.insert(std::make_pair(id, owner->GetWeakPtr())); | 131 owner_map_.insert(std::make_pair(id, owner->GetWeakPtr())); |
153 } | 132 } |
154 | 133 |
155 void RenderWidgetHostInputEventRouter::RemoveSurfaceIdNamespaceOwner( | 134 void RenderWidgetHostInputEventRouter::RemoveSurfaceIdNamespaceOwner( |
156 uint32_t id) { | 135 uint32_t id) { |
157 owner_map_.erase(id); | 136 owner_map_.erase(id); |
158 | |
159 for (auto it = hittest_data_.begin(); it != hittest_data_.end();) { | |
160 if (cc::SurfaceIdAllocator::NamespaceForId(it->first) == id) | |
161 it = hittest_data_.erase(it); | |
162 else | |
163 ++it; | |
164 } | |
165 } | |
166 | |
167 void RenderWidgetHostInputEventRouter::OnHittestData( | |
168 const FrameHostMsg_HittestData_Params& params) { | |
169 if (owner_map_.find(cc::SurfaceIdAllocator::NamespaceForId( | |
170 params.surface_id)) == owner_map_.end()) { | |
171 return; | |
172 } | |
173 HittestData data; | |
174 data.ignored_for_hittest = params.ignored_for_hittest; | |
175 hittest_data_[params.surface_id] = data; | |
176 } | 137 } |
177 | 138 |
178 } // namespace content | 139 } // namespace content |
OLD | NEW |