OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "content/browser/renderer_host/render_widget_host.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/i18n/rtl.h" | 10 #include "base/i18n/rtl.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur) | 176 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur) |
177 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor) | 177 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor) |
178 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState, | 178 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState, |
179 OnMsgImeUpdateTextInputState) | 179 OnMsgImeUpdateTextInputState) |
180 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCompositionRangeChanged, | 180 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCompositionRangeChanged, |
181 OnMsgImeCompositionRangeChanged) | 181 OnMsgImeCompositionRangeChanged) |
182 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, | 182 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, |
183 OnMsgImeCancelComposition) | 183 OnMsgImeCancelComposition) |
184 IPC_MESSAGE_HANDLER(ViewHostMsg_DidActivateAcceleratedCompositing, | 184 IPC_MESSAGE_HANDLER(ViewHostMsg_DidActivateAcceleratedCompositing, |
185 OnMsgDidActivateAcceleratedCompositing) | 185 OnMsgDidActivateAcceleratedCompositing) |
| 186 IPC_MESSAGE_HANDLER(ViewHostMsg_LockMouse, OnMsgLockMouse) |
| 187 IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnMsgUnlockMouse) |
186 #if defined(OS_POSIX) | 188 #if defined(OS_POSIX) |
187 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo) | 189 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo) |
188 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect) | 190 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect) |
189 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect) | 191 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect) |
190 #endif | 192 #endif |
191 #if defined(OS_MACOSX) | 193 #if defined(OS_MACOSX) |
192 IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, | 194 IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, |
193 OnMsgPluginFocusChanged) | 195 OnMsgPluginFocusChanged) |
194 IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, | 196 IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, |
195 OnMsgStartPluginIme) | 197 OnMsgStartPluginIme) |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 360 |
359 void RenderWidgetHost::GotFocus() { | 361 void RenderWidgetHost::GotFocus() { |
360 Focus(); | 362 Focus(); |
361 } | 363 } |
362 | 364 |
363 void RenderWidgetHost::Focus() { | 365 void RenderWidgetHost::Focus() { |
364 Send(new ViewMsg_SetFocus(routing_id_, true)); | 366 Send(new ViewMsg_SetFocus(routing_id_, true)); |
365 } | 367 } |
366 | 368 |
367 void RenderWidgetHost::Blur() { | 369 void RenderWidgetHost::Blur() { |
| 370 if (IsMouseLocked()) |
| 371 view_->UnlockMouse(); |
| 372 |
368 Send(new ViewMsg_SetFocus(routing_id_, false)); | 373 Send(new ViewMsg_SetFocus(routing_id_, false)); |
369 } | 374 } |
370 | 375 |
371 void RenderWidgetHost::LostCapture() { | 376 void RenderWidgetHost::LostCapture() { |
372 Send(new ViewMsg_MouseCaptureLost(routing_id_)); | 377 Send(new ViewMsg_MouseCaptureLost(routing_id_)); |
373 } | 378 } |
374 | 379 |
| 380 void RenderWidgetHost::LostMouseLock() { |
| 381 Send(new ViewMsg_MouseLockLost(routing_id_)); |
| 382 } |
| 383 |
375 void RenderWidgetHost::ViewDestroyed() { | 384 void RenderWidgetHost::ViewDestroyed() { |
| 385 if (IsMouseLocked()) |
| 386 view_->UnlockMouse(); |
| 387 |
376 // TODO(evanm): tracking this may no longer be necessary; | 388 // TODO(evanm): tracking this may no longer be necessary; |
377 // eliminate this function if so. | 389 // eliminate this function if so. |
378 SetView(NULL); | 390 SetView(NULL); |
379 } | 391 } |
380 | 392 |
381 void RenderWidgetHost::SetIsLoading(bool is_loading) { | 393 void RenderWidgetHost::SetIsLoading(bool is_loading) { |
382 is_loading_ = is_loading; | 394 is_loading_ = is_loading; |
383 if (!view_) | 395 if (!view_) |
384 return; | 396 return; |
385 view_->SetIsLoading(is_loading); | 397 view_->SetIsLoading(is_loading); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardMouseEvent"); | 516 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardMouseEvent"); |
505 if (ignore_input_events_ || process_->ignore_input_events()) | 517 if (ignore_input_events_ || process_->ignore_input_events()) |
506 return; | 518 return; |
507 | 519 |
508 // Avoid spamming the renderer with mouse move events. It is important | 520 // Avoid spamming the renderer with mouse move events. It is important |
509 // to note that WM_MOUSEMOVE events are anyways synthetic, but since our | 521 // to note that WM_MOUSEMOVE events are anyways synthetic, but since our |
510 // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way | 522 // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way |
511 // more WM_MOUSEMOVE events than we wish to send to the renderer. | 523 // more WM_MOUSEMOVE events than we wish to send to the renderer. |
512 if (mouse_event.type == WebInputEvent::MouseMove) { | 524 if (mouse_event.type == WebInputEvent::MouseMove) { |
513 if (mouse_move_pending_) { | 525 if (mouse_move_pending_) { |
514 next_mouse_move_.reset(new WebMouseEvent(mouse_event)); | 526 if (!next_mouse_move_.get()) { |
| 527 next_mouse_move_.reset(new WebMouseEvent(mouse_event)); |
| 528 } else { |
| 529 // Accumulate movement deltas. |
| 530 int x = next_mouse_move_->movementX; |
| 531 int y = next_mouse_move_->movementY; |
| 532 *next_mouse_move_ = mouse_event; |
| 533 next_mouse_move_->movementX += x; |
| 534 next_mouse_move_->movementY += y; |
| 535 } |
515 return; | 536 return; |
516 } | 537 } |
517 mouse_move_pending_ = true; | 538 mouse_move_pending_ = true; |
518 } else if (mouse_event.type == WebInputEvent::MouseDown) { | 539 } else if (mouse_event.type == WebInputEvent::MouseDown) { |
519 OnUserGesture(); | 540 OnUserGesture(); |
520 } | 541 } |
521 | 542 |
522 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); | 543 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); |
523 } | 544 } |
524 | 545 |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 | 780 |
760 void RenderWidgetHost::ImeConfirmComposition() { | 781 void RenderWidgetHost::ImeConfirmComposition() { |
761 Send(new ViewMsg_ImeConfirmComposition(routing_id(), string16())); | 782 Send(new ViewMsg_ImeConfirmComposition(routing_id(), string16())); |
762 } | 783 } |
763 | 784 |
764 void RenderWidgetHost::ImeCancelComposition() { | 785 void RenderWidgetHost::ImeCancelComposition() { |
765 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(), | 786 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(), |
766 std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); | 787 std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); |
767 } | 788 } |
768 | 789 |
| 790 bool RenderWidgetHost::IsMouseLocked() const { |
| 791 return view_ ? view_->mouse_locked() : false; |
| 792 } |
| 793 |
769 void RenderWidgetHost::Destroy() { | 794 void RenderWidgetHost::Destroy() { |
770 NotificationService::current()->Notify( | 795 NotificationService::current()->Notify( |
771 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, | 796 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
772 Source<RenderWidgetHost>(this), | 797 Source<RenderWidgetHost>(this), |
773 NotificationService::NoDetails()); | 798 NotificationService::NoDetails()); |
774 | 799 |
775 // Tell the view to die. | 800 // Tell the view to die. |
776 // Note that in the process of the view shutting down, it can call a ton | 801 // Note that in the process of the view shutting down, it can call a ton |
777 // of other messages on us. So if you do any other deinitialization here, | 802 // of other messages on us. So if you do any other deinitialization here, |
778 // do it after this call to view_->Destroy(). | 803 // do it after this call to view_->Destroy(). |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 view_->GpuRenderingStateDidChange(); | 1129 view_->GpuRenderingStateDidChange(); |
1105 #elif defined(OS_WIN) | 1130 #elif defined(OS_WIN) |
1106 if (view_) | 1131 if (view_) |
1107 view_->ShowCompositorHostWindow(is_accelerated_compositing_active_); | 1132 view_->ShowCompositorHostWindow(is_accelerated_compositing_active_); |
1108 #elif defined(TOOLKIT_USES_GTK) && !defined(USE_AURA) | 1133 #elif defined(TOOLKIT_USES_GTK) && !defined(USE_AURA) |
1109 if (view_) | 1134 if (view_) |
1110 view_->AcceleratedCompositingActivated(activated); | 1135 view_->AcceleratedCompositingActivated(activated); |
1111 #endif | 1136 #endif |
1112 } | 1137 } |
1113 | 1138 |
| 1139 void RenderWidgetHost::OnMsgLockMouse() { |
| 1140 // TODO(yzshen): Only allow to lock the mouse when in fullscreen mode, and |
| 1141 // make sure that the mouse is unlocked when leaving fullscreen mode. |
| 1142 if (!view_ || !view_->HasFocus() || !view_->LockMouse()) { |
| 1143 Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); |
| 1144 } else { |
| 1145 Send(new ViewMsg_LockMouse_ACK(routing_id_, true)); |
| 1146 } |
| 1147 } |
| 1148 |
| 1149 void RenderWidgetHost::OnMsgUnlockMouse() { |
| 1150 if (IsMouseLocked()) |
| 1151 view_->UnlockMouse(); |
| 1152 } |
| 1153 |
1114 #if defined(OS_POSIX) | 1154 #if defined(OS_POSIX) |
1115 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId window_id, | 1155 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId window_id, |
1116 WebKit::WebScreenInfo* results) { | 1156 WebKit::WebScreenInfo* results) { |
1117 if (view_) | 1157 if (view_) |
1118 view_->GetScreenInfo(results); | 1158 view_->GetScreenInfo(results); |
1119 else | 1159 else |
1120 RenderWidgetHostView::GetDefaultScreenInfo(results); | 1160 RenderWidgetHostView::GetDefaultScreenInfo(results); |
1121 } | 1161 } |
1122 | 1162 |
1123 void RenderWidgetHost::OnMsgGetWindowRect(gfx::NativeViewId window_id, | 1163 void RenderWidgetHost::OnMsgGetWindowRect(gfx::NativeViewId window_id, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 #endif | 1287 #endif |
1248 } | 1288 } |
1249 | 1289 |
1250 deferred_plugin_handles_.clear(); | 1290 deferred_plugin_handles_.clear(); |
1251 #endif | 1291 #endif |
1252 } | 1292 } |
1253 | 1293 |
1254 void RenderWidgetHost::StartUserGesture() { | 1294 void RenderWidgetHost::StartUserGesture() { |
1255 OnUserGesture(); | 1295 OnUserGesture(); |
1256 } | 1296 } |
OLD | NEW |