OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/renderer_host/render_widget_host.h" | 5 #include "chrome/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/histogram.h" | 9 #include "base/histogram.h" |
10 #include "base/keyboard_codes.h" | 10 #include "base/keyboard_codes.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 mouse_move_pending_(false), | 81 mouse_move_pending_(false), |
82 mouse_wheel_pending_(false), | 82 mouse_wheel_pending_(false), |
83 needs_repainting_on_restore_(false), | 83 needs_repainting_on_restore_(false), |
84 is_unresponsive_(false), | 84 is_unresponsive_(false), |
85 in_get_backing_store_(false), | 85 in_get_backing_store_(false), |
86 view_being_painted_(false), | 86 view_being_painted_(false), |
87 ignore_input_events_(false), | 87 ignore_input_events_(false), |
88 text_direction_updated_(false), | 88 text_direction_updated_(false), |
89 text_direction_(WebKit::WebTextDirectionLeftToRight), | 89 text_direction_(WebKit::WebTextDirectionLeftToRight), |
90 text_direction_canceled_(false), | 90 text_direction_canceled_(false), |
91 suppress_next_char_events_(false), | 91 suppress_next_char_events_(false) { |
92 spin_runloop_before_sending_wheel_event_(false), | |
93 ALLOW_THIS_IN_INITIALIZER_LIST(method_runner_(this)) { | |
94 if (routing_id_ == MSG_ROUTING_NONE) | 92 if (routing_id_ == MSG_ROUTING_NONE) |
95 routing_id_ = process_->GetNextRoutingID(); | 93 routing_id_ = process_->GetNextRoutingID(); |
96 | 94 |
97 process_->Attach(this, routing_id_); | 95 process_->Attach(this, routing_id_); |
98 // Because the widget initializes as is_hidden_ == false, | 96 // Because the widget initializes as is_hidden_ == false, |
99 // tell the process host that we're alive. | 97 // tell the process host that we're alive. |
100 process_->WidgetRestored(); | 98 process_->WidgetRestored(); |
101 } | 99 } |
102 | 100 |
103 RenderWidgetHost::~RenderWidgetHost() { | 101 RenderWidgetHost::~RenderWidgetHost() { |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 } | 414 } |
417 | 415 |
418 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); | 416 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); |
419 } | 417 } |
420 | 418 |
421 void RenderWidgetHost::ForwardWheelEvent( | 419 void RenderWidgetHost::ForwardWheelEvent( |
422 const WebMouseWheelEvent& wheel_event) { | 420 const WebMouseWheelEvent& wheel_event) { |
423 if (ignore_input_events_ || process_->ignore_input_events()) | 421 if (ignore_input_events_ || process_->ignore_input_events()) |
424 return; | 422 return; |
425 | 423 |
426 spin_runloop_before_sending_wheel_event_ = true; | |
427 | |
428 // If there's already a mouse wheel event waiting to be sent to the renderer, | 424 // If there's already a mouse wheel event waiting to be sent to the renderer, |
429 // add the new deltas to that event. Not doing so (e.g., by dropping the old | 425 // add the new deltas to that event. Not doing so (e.g., by dropping the old |
430 // event, as for mouse moves) results in very slow scrolling on the Mac (on | 426 // event, as for mouse moves) results in very slow scrolling on the Mac (on |
431 // which many, very small wheel events are sent). | 427 // which many, very small wheel events are sent). |
432 if (mouse_wheel_pending_) { | 428 if (mouse_wheel_pending_) { |
433 if (coalesced_mouse_wheel_events_.empty() || | 429 if (coalesced_mouse_wheel_events_.empty() || |
434 coalesced_mouse_wheel_events_.back().modifiers | 430 coalesced_mouse_wheel_events_.back().modifiers |
435 != wheel_event.modifiers || | 431 != wheel_event.modifiers || |
436 coalesced_mouse_wheel_events_.back().scrollByPage | 432 coalesced_mouse_wheel_events_.back().scrollByPage |
437 != wheel_event.scrollByPage) { | 433 != wheel_event.scrollByPage) { |
438 coalesced_mouse_wheel_events_.push_back(wheel_event); | 434 coalesced_mouse_wheel_events_.push_back(wheel_event); |
439 } else { | 435 } else { |
440 WebMouseWheelEvent* last_wheel_event = | 436 WebMouseWheelEvent* last_wheel_event = |
441 &coalesced_mouse_wheel_events_.back(); | 437 &coalesced_mouse_wheel_events_.back(); |
442 last_wheel_event->deltaX += wheel_event.deltaX; | 438 last_wheel_event->deltaX += wheel_event.deltaX; |
443 last_wheel_event->deltaY += wheel_event.deltaY; | 439 last_wheel_event->deltaY += wheel_event.deltaY; |
444 DCHECK_GE(wheel_event.timeStampSeconds, | 440 DCHECK_GE(wheel_event.timeStampSeconds, |
445 last_wheel_event->timeStampSeconds); | 441 last_wheel_event->timeStampSeconds); |
446 last_wheel_event->timeStampSeconds = wheel_event.timeStampSeconds; | 442 last_wheel_event->timeStampSeconds = wheel_event.timeStampSeconds; |
447 } | 443 } |
448 return; | 444 return; |
449 } | 445 } |
450 mouse_wheel_pending_ = true; | 446 mouse_wheel_pending_ = true; |
451 | 447 |
452 HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize", | 448 HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize", |
453 coalesced_mouse_wheel_events_.size()); | 449 coalesced_mouse_wheel_events_.size()); |
454 | 450 |
455 last_wheel_message_time_ = TimeTicks::Now(); | |
456 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false); | 451 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false); |
457 } | 452 } |
458 | 453 |
459 void RenderWidgetHost::ForwardKeyboardEvent( | 454 void RenderWidgetHost::ForwardKeyboardEvent( |
460 const NativeWebKeyboardEvent& key_event) { | 455 const NativeWebKeyboardEvent& key_event) { |
461 if (ignore_input_events_ || process_->ignore_input_events()) | 456 if (ignore_input_events_ || process_->ignore_input_events()) |
462 return; | 457 return; |
463 | 458 |
464 if (key_event.type == WebKeyboardEvent::Char && | 459 if (key_event.type == WebKeyboardEvent::Char && |
465 (key_event.windowsKeyCode == base::VKEY_RETURN || | 460 (key_event.windowsKeyCode == base::VKEY_RETURN || |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 void RenderWidgetHost::RendererExited() { | 553 void RenderWidgetHost::RendererExited() { |
559 // Clearing this flag causes us to re-create the renderer when recovering | 554 // Clearing this flag causes us to re-create the renderer when recovering |
560 // from a crashed renderer. | 555 // from a crashed renderer. |
561 renderer_initialized_ = false; | 556 renderer_initialized_ = false; |
562 | 557 |
563 // Must reset these to ensure that mouse move/wheel events work with a new | 558 // Must reset these to ensure that mouse move/wheel events work with a new |
564 // renderer. | 559 // renderer. |
565 mouse_move_pending_ = false; | 560 mouse_move_pending_ = false; |
566 next_mouse_move_.reset(); | 561 next_mouse_move_.reset(); |
567 mouse_wheel_pending_ = false; | 562 mouse_wheel_pending_ = false; |
568 spin_runloop_before_sending_wheel_event_ = false; | |
569 coalesced_mouse_wheel_events_.clear(); | 563 coalesced_mouse_wheel_events_.clear(); |
570 | 564 |
571 // Must reset these to ensure that keyboard events work with a new renderer. | 565 // Must reset these to ensure that keyboard events work with a new renderer. |
572 key_queue_.clear(); | 566 key_queue_.clear(); |
573 suppress_next_char_events_ = false; | 567 suppress_next_char_events_ = false; |
574 | 568 |
575 // Reset some fields in preparation for recovering from a crash. | 569 // Reset some fields in preparation for recovering from a crash. |
576 resize_ack_pending_ = false; | 570 resize_ack_pending_ = false; |
577 repaint_ack_pending_ = false; | 571 repaint_ack_pending_ = false; |
578 | 572 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 } else if (WebInputEvent::isKeyboardEventType(type)) { | 856 } else if (WebInputEvent::isKeyboardEventType(type)) { |
863 bool processed = false; | 857 bool processed = false; |
864 if (!message.ReadBool(&iter, &processed)) | 858 if (!message.ReadBool(&iter, &processed)) |
865 process()->ReceivedBadMessage(message.type()); | 859 process()->ReceivedBadMessage(message.type()); |
866 | 860 |
867 ProcessKeyboardEventAck(type, processed); | 861 ProcessKeyboardEventAck(type, processed); |
868 } | 862 } |
869 } | 863 } |
870 | 864 |
871 void RenderWidgetHost::ProcessWheelAck() { | 865 void RenderWidgetHost::ProcessWheelAck() { |
872 static const base::TimeDelta kMaxTimeBetweenWheelMessages = | |
873 base::TimeDelta::FromMilliseconds(kMaxTimeBetweenWheelMessagesMs); | |
874 | |
875 // Allow additional wheel events pending in the message queue to be coalesced. | |
876 if (spin_runloop_before_sending_wheel_event_) { | |
877 base::TimeDelta time_since_last_wheel_message_ = | |
878 TimeTicks::Now() - last_wheel_message_time_; | |
879 if (time_since_last_wheel_message_ < kMaxTimeBetweenWheelMessages) { | |
880 spin_runloop_before_sending_wheel_event_ = false; | |
881 MessageLoop::current()->PostTask(FROM_HERE, | |
882 method_runner_.NewRunnableMethod(&RenderWidgetHost::ProcessWheelAck)); | |
883 return; | |
884 } | |
885 } | |
886 | |
887 mouse_wheel_pending_ = false; | 866 mouse_wheel_pending_ = false; |
888 | 867 |
889 // Now send the next (coalesced) mouse wheel event. | 868 // Now send the next (coalesced) mouse wheel event. |
890 if (!coalesced_mouse_wheel_events_.empty()) { | 869 if (!coalesced_mouse_wheel_events_.empty()) { |
891 WebMouseWheelEvent next_wheel_event = | 870 WebMouseWheelEvent next_wheel_event = |
892 coalesced_mouse_wheel_events_.front(); | 871 coalesced_mouse_wheel_events_.front(); |
893 coalesced_mouse_wheel_events_.pop_front(); | 872 coalesced_mouse_wheel_events_.pop_front(); |
894 ForwardWheelEvent(next_wheel_event); | 873 ForwardWheelEvent(next_wheel_event); |
895 } | 874 } |
896 } | 875 } |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1175 // of this key event. | 1154 // of this key event. |
1176 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { | 1155 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { |
1177 UnhandledKeyboardEvent(front_item); | 1156 UnhandledKeyboardEvent(front_item); |
1178 | 1157 |
1179 // WARNING: This RenderWidgetHost can be deallocated at this point | 1158 // WARNING: This RenderWidgetHost can be deallocated at this point |
1180 // (i.e. in the case of Ctrl+W, where the call to | 1159 // (i.e. in the case of Ctrl+W, where the call to |
1181 // UnhandledKeyboardEvent destroys this RenderWidgetHost). | 1160 // UnhandledKeyboardEvent destroys this RenderWidgetHost). |
1182 } | 1161 } |
1183 } | 1162 } |
1184 } | 1163 } |
OLD | NEW |