Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: chrome/browser/renderer_host/render_widget_host.cc

Issue 536059: Mac: Coalesce scroll events. (Closed)
Patch Set: test Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/histogram.h" 8 #include "base/histogram.h"
9 #include "base/keyboard_codes.h" 9 #include "base/keyboard_codes.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 : renderer_initialized_(false), 59 : renderer_initialized_(false),
60 view_(NULL), 60 view_(NULL),
61 process_(process), 61 process_(process),
62 painting_observer_(NULL), 62 painting_observer_(NULL),
63 routing_id_(routing_id), 63 routing_id_(routing_id),
64 is_loading_(false), 64 is_loading_(false),
65 is_hidden_(false), 65 is_hidden_(false),
66 repaint_ack_pending_(false), 66 repaint_ack_pending_(false),
67 resize_ack_pending_(false), 67 resize_ack_pending_(false),
68 mouse_move_pending_(false), 68 mouse_move_pending_(false),
69 mouse_wheel_pending_(false),
69 needs_repainting_on_restore_(false), 70 needs_repainting_on_restore_(false),
70 is_unresponsive_(false), 71 is_unresponsive_(false),
71 in_get_backing_store_(false), 72 in_get_backing_store_(false),
72 view_being_painted_(false), 73 view_being_painted_(false),
73 text_direction_updated_(false), 74 text_direction_updated_(false),
74 text_direction_(WebKit::WebTextDirectionLeftToRight), 75 text_direction_(WebKit::WebTextDirectionLeftToRight),
75 text_direction_canceled_(false), 76 text_direction_canceled_(false),
76 suppress_next_char_events_(false) { 77 suppress_next_char_events_(false) {
77 if (routing_id_ == MSG_ROUTING_NONE) 78 if (routing_id_ == MSG_ROUTING_NONE)
78 routing_id_ = process_->GetNextRoutingID(); 79 routing_id_ = process_->GetNextRoutingID();
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 } 370 }
370 371
371 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); 372 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false);
372 } 373 }
373 374
374 void RenderWidgetHost::ForwardWheelEvent( 375 void RenderWidgetHost::ForwardWheelEvent(
375 const WebMouseWheelEvent& wheel_event) { 376 const WebMouseWheelEvent& wheel_event) {
376 if (process_->ignore_input_events()) 377 if (process_->ignore_input_events())
377 return; 378 return;
378 379
380 // If there's already a mouse wheel event waiting to be sent to the renderer,
381 // add the new deltas to that event. Not doing so (e.g., by dropping the old
382 // event, as for mouse moves) results in very slow scrolling on the Mac (on
383 // which many, very small wheel events are sent).
384 if (mouse_wheel_pending_) {
385 if (coalesced_mouse_wheel_events_.empty() ||
386 coalesced_mouse_wheel_events_.back().modifiers
387 != wheel_event.modifiers ||
388 coalesced_mouse_wheel_events_.back().scrollByPage
389 != wheel_event.scrollByPage) {
390 coalesced_mouse_wheel_events_.push_back(wheel_event);
391 } else {
392 coalesced_mouse_wheel_events_.back().deltaX += wheel_event.deltaX;
393 coalesced_mouse_wheel_events_.back().deltaY += wheel_event.deltaY;
394 DCHECK_GE(wheel_event.timeStampSeconds,
395 coalesced_mouse_wheel_events_.back().timeStampSeconds);
396 coalesced_mouse_wheel_events_.back().timeStampSeconds =
397 wheel_event.timeStampSeconds;
398 }
399 return;
400 }
401 mouse_wheel_pending_ = true;
402
403 HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize",
404 coalesced_mouse_wheel_events_.size());
379 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false); 405 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false);
380 } 406 }
381 407
382 void RenderWidgetHost::ForwardKeyboardEvent( 408 void RenderWidgetHost::ForwardKeyboardEvent(
383 const NativeWebKeyboardEvent& key_event) { 409 const NativeWebKeyboardEvent& key_event) {
384 if (process_->ignore_input_events()) 410 if (process_->ignore_input_events())
385 return; 411 return;
386 412
387 if (key_event.type == WebKeyboardEvent::Char && 413 if (key_event.type == WebKeyboardEvent::Char &&
388 (key_event.windowsKeyCode == base::VKEY_RETURN || 414 (key_event.windowsKeyCode == base::VKEY_RETURN ||
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 reinterpret_cast<const char*>(&input_event), event_size); 475 reinterpret_cast<const char*>(&input_event), event_size);
450 // |is_keyboard_shortcut| only makes sense for RawKeyDown events. 476 // |is_keyboard_shortcut| only makes sense for RawKeyDown events.
451 if (input_event.type == WebInputEvent::RawKeyDown) 477 if (input_event.type == WebInputEvent::RawKeyDown)
452 message->WriteBool(is_keyboard_shortcut); 478 message->WriteBool(is_keyboard_shortcut);
453 input_event_start_time_ = TimeTicks::Now(); 479 input_event_start_time_ = TimeTicks::Now();
454 Send(message); 480 Send(message);
455 481
456 // Any input event cancels a pending mouse move event. 482 // Any input event cancels a pending mouse move event.
457 next_mouse_move_.reset(); 483 next_mouse_move_.reset();
458 484
485 // Any non-wheel input event cancels pending wheel events.
486 if (input_event.type != WebInputEvent::MouseWheel)
487 coalesced_mouse_wheel_events_.clear();
488
459 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); 489 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs));
460 } 490 }
461 491
462 void RenderWidgetHost::ForwardEditCommand(const std::string& name, 492 void RenderWidgetHost::ForwardEditCommand(const std::string& name,
463 const std::string& value) { 493 const std::string& value) {
464 // We don't need an implementation of this function here since the 494 // We don't need an implementation of this function here since the
465 // only place we use this is for the case of dropdown menus and other 495 // only place we use this is for the case of dropdown menus and other
466 // edge cases for which edit commands don't make sense. 496 // edge cases for which edit commands don't make sense.
467 } 497 }
468 498
469 void RenderWidgetHost::ForwardEditCommandsForNextKeyEvent( 499 void RenderWidgetHost::ForwardEditCommandsForNextKeyEvent(
470 const EditCommands& edit_commands) { 500 const EditCommands& edit_commands) {
471 // We don't need an implementation of this function here since this message is 501 // We don't need an implementation of this function here since this message is
472 // only handled by RenderView. 502 // only handled by RenderView.
473 } 503 }
474 504
475 void RenderWidgetHost::RendererExited() { 505 void RenderWidgetHost::RendererExited() {
476 // Clearing this flag causes us to re-create the renderer when recovering 506 // Clearing this flag causes us to re-create the renderer when recovering
477 // from a crashed renderer. 507 // from a crashed renderer.
478 renderer_initialized_ = false; 508 renderer_initialized_ = false;
479 509
480 // Must reset these to ensure that mouse move events work with a new renderer. 510 // Must reset these to ensure that mouse move/wheel events work with a new
511 // renderer.
481 mouse_move_pending_ = false; 512 mouse_move_pending_ = false;
482 next_mouse_move_.reset(); 513 next_mouse_move_.reset();
514 mouse_wheel_pending_ = false;
515 coalesced_mouse_wheel_events_.clear();
483 516
484 // Must reset these to ensure that keyboard events work with a new renderer. 517 // Must reset these to ensure that keyboard events work with a new renderer.
485 key_queue_.clear(); 518 key_queue_.clear();
486 suppress_next_char_events_ = false; 519 suppress_next_char_events_ = false;
487 520
488 // Reset some fields in preparation for recovering from a crash. 521 // Reset some fields in preparation for recovering from a crash.
489 resize_ack_pending_ = false; 522 resize_ack_pending_ = false;
490 repaint_ack_pending_ = false; 523 repaint_ack_pending_ = false;
491 524
492 in_flight_size_.SetSize(0, 0); 525 in_flight_size_.SetSize(0, 0);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 if (!message.ReadInt(&iter, &type) || (type < WebInputEvent::Undefined)) { 768 if (!message.ReadInt(&iter, &type) || (type < WebInputEvent::Undefined)) {
736 process()->ReceivedBadMessage(message.type()); 769 process()->ReceivedBadMessage(message.type());
737 } else if (type == WebInputEvent::MouseMove) { 770 } else if (type == WebInputEvent::MouseMove) {
738 mouse_move_pending_ = false; 771 mouse_move_pending_ = false;
739 772
740 // now, we can send the next mouse move event 773 // now, we can send the next mouse move event
741 if (next_mouse_move_.get()) { 774 if (next_mouse_move_.get()) {
742 DCHECK(next_mouse_move_->type == WebInputEvent::MouseMove); 775 DCHECK(next_mouse_move_->type == WebInputEvent::MouseMove);
743 ForwardMouseEvent(*next_mouse_move_); 776 ForwardMouseEvent(*next_mouse_move_);
744 } 777 }
778 } else if (type == WebInputEvent::MouseWheel) {
779 mouse_wheel_pending_ = false;
780
781 // Now send the next (coalesced) mouse wheel event.
782 if (!coalesced_mouse_wheel_events_.empty()) {
783 WebMouseWheelEvent next_wheel_event =
784 coalesced_mouse_wheel_events_.front();
785 coalesced_mouse_wheel_events_.pop_front();
786 ForwardWheelEvent(next_wheel_event);
787 }
745 } else if (WebInputEvent::isKeyboardEventType(type)) { 788 } else if (WebInputEvent::isKeyboardEventType(type)) {
746 bool processed = false; 789 bool processed = false;
747 if (!message.ReadBool(&iter, &processed)) 790 if (!message.ReadBool(&iter, &processed))
748 process()->ReceivedBadMessage(message.type()); 791 process()->ReceivedBadMessage(message.type());
749 792
750 ProcessKeyboardEventAck(type, processed); 793 ProcessKeyboardEventAck(type, processed);
751 } 794 }
752 } 795 }
753 796
754 void RenderWidgetHost::OnMsgFocus() { 797 void RenderWidgetHost::OnMsgFocus() {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 959
917 if (!processed) { 960 if (!processed) {
918 UnhandledKeyboardEvent(front_item); 961 UnhandledKeyboardEvent(front_item);
919 962
920 // WARNING: This RenderWidgetHost can be deallocated at this point 963 // WARNING: This RenderWidgetHost can be deallocated at this point
921 // (i.e. in the case of Ctrl+W, where the call to 964 // (i.e. in the case of Ctrl+W, where the call to
922 // UnhandledKeyboardEvent destroys this RenderWidgetHost). 965 // UnhandledKeyboardEvent destroys this RenderWidgetHost).
923 } 966 }
924 } 967 }
925 } 968 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_widget_host.h ('k') | chrome/browser/renderer_host/render_widget_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698