OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_impl.h" | 5 #include "content/browser/renderer_host/render_widget_host_impl.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); | 1049 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); |
1050 | 1050 |
1051 gesture_event_filter_->FlingHasBeenHalted(); | 1051 gesture_event_filter_->FlingHasBeenHalted(); |
1052 | 1052 |
1053 // Only forward the non-native portions of our event. | 1053 // Only forward the non-native portions of our event. |
1054 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), | 1054 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), |
1055 is_keyboard_shortcut); | 1055 is_keyboard_shortcut); |
1056 } | 1056 } |
1057 } | 1057 } |
1058 | 1058 |
| 1059 void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, |
| 1060 int event_size, |
| 1061 bool is_keyboard_shortcut) { |
| 1062 IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); |
| 1063 message->WriteData( |
| 1064 reinterpret_cast<const char*>(&input_event), event_size); |
| 1065 // |is_keyboard_shortcut| only makes sense for RawKeyDown events. |
| 1066 if (input_event.type == WebInputEvent::RawKeyDown) |
| 1067 message->WriteBool(is_keyboard_shortcut); |
| 1068 input_event_start_time_ = TimeTicks::Now(); |
| 1069 Send(message); |
| 1070 increment_in_flight_event_count(); |
| 1071 } |
| 1072 |
1059 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, | 1073 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, |
1060 int event_size, | 1074 int event_size, |
1061 bool is_keyboard_shortcut) { | 1075 bool is_keyboard_shortcut) { |
1062 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent"); | 1076 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent"); |
1063 | 1077 |
1064 if (!process_->HasConnection()) | 1078 if (!process_->HasConnection()) |
1065 return; | 1079 return; |
1066 | 1080 |
1067 DCHECK(!process_->IgnoreInputEvents()); | 1081 DCHECK(!process_->IgnoreInputEvents()); |
1068 | 1082 |
1069 in_process_event_types_.push(input_event.type); | 1083 in_process_event_types_.push(input_event.type); |
1070 | 1084 |
1071 IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); | 1085 // Transmit any pending wheel events on a non-wheel event. This ensures that |
1072 message->WriteData( | 1086 // the renderer receives the final PhaseEnded wheel event, which is necessary |
1073 reinterpret_cast<const char*>(&input_event), event_size); | 1087 // to terminate rubber-banding, for example. |
1074 // |is_keyboard_shortcut| only makes sense for RawKeyDown events. | 1088 if (input_event.type != WebInputEvent::MouseWheel) { |
1075 if (input_event.type == WebInputEvent::RawKeyDown) | 1089 for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { |
1076 message->WriteBool(is_keyboard_shortcut); | 1090 SendInputEvent(coalesced_mouse_wheel_events_[i], |
1077 input_event_start_time_ = TimeTicks::Now(); | 1091 sizeof(WebMouseWheelEvent), false); |
1078 Send(message); | 1092 } |
| 1093 coalesced_mouse_wheel_events_.clear(); |
| 1094 } |
1079 | 1095 |
1080 // Any non-wheel input event cancels pending wheel events. | 1096 SendInputEvent(input_event, event_size, is_keyboard_shortcut); |
1081 if (input_event.type != WebInputEvent::MouseWheel) | |
1082 coalesced_mouse_wheel_events_.clear(); | |
1083 | 1097 |
1084 // Any input event cancels a pending mouse move event. Note that | 1098 // Any input event cancels a pending mouse move event. Note that |
1085 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| | 1099 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| |
1086 // after this line. | 1100 // after this line. |
1087 next_mouse_move_.reset(); | 1101 next_mouse_move_.reset(); |
1088 | 1102 |
1089 increment_in_flight_event_count(); | |
1090 StartHangMonitorTimeout( | 1103 StartHangMonitorTimeout( |
1091 TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); | 1104 TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
1092 } | 1105 } |
1093 | 1106 |
1094 void RenderWidgetHostImpl::ForwardTouchEvent( | 1107 void RenderWidgetHostImpl::ForwardTouchEvent( |
1095 const WebKit::WebTouchEvent& touch_event) { | 1108 const WebKit::WebTouchEvent& touch_event) { |
1096 touch_event_queue_->QueueEvent(touch_event); | 1109 touch_event_queue_->QueueEvent(touch_event); |
1097 } | 1110 } |
1098 | 1111 |
1099 #if defined(TOOLKIT_GTK) | 1112 #if defined(TOOLKIT_GTK) |
(...skipping 1161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2261 return; | 2274 return; |
2262 | 2275 |
2263 OnRenderAutoResized(new_size); | 2276 OnRenderAutoResized(new_size); |
2264 } | 2277 } |
2265 | 2278 |
2266 void RenderWidgetHostImpl::DetachDelegate() { | 2279 void RenderWidgetHostImpl::DetachDelegate() { |
2267 delegate_ = NULL; | 2280 delegate_ = NULL; |
2268 } | 2281 } |
2269 | 2282 |
2270 } // namespace content | 2283 } // namespace content |
OLD | NEW |