| 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/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/i18n/rtl.h" | 11 #include "base/i18n/rtl.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 15 #include "content/browser/accessibility/browser_accessibility_state.h" | 15 #include "content/browser/accessibility/browser_accessibility_state.h" |
| 16 #include "content/browser/gpu/gpu_process_host.h" | 16 #include "content/browser/gpu/gpu_process_host.h" |
| 17 #include "content/browser/renderer_host/backing_store.h" | 17 #include "content/browser/renderer_host/backing_store.h" |
| 18 #include "content/browser/renderer_host/backing_store_manager.h" | 18 #include "content/browser/renderer_host/backing_store_manager.h" |
| 19 #include "content/browser/renderer_host/render_process_host.h" | 19 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 20 #include "content/browser/renderer_host/render_widget_helper.h" | 20 #include "content/browser/renderer_host/render_widget_helper.h" |
| 21 #include "content/browser/renderer_host/render_widget_host_view.h" | 21 #include "content/browser/renderer_host/render_widget_host_view.h" |
| 22 #include "content/browser/user_metrics.h" | 22 #include "content/browser/user_metrics.h" |
| 23 #include "content/common/gpu/gpu_messages.h" | 23 #include "content/common/gpu/gpu_messages.h" |
| 24 #include "content/public/browser/notification_service.h" | 24 #include "content/public/browser/notification_service.h" |
| 25 #include "content/common/view_messages.h" | 25 #include "content/common/view_messages.h" |
| 26 #include "content/public/browser/native_web_keyboard_event.h" | 26 #include "content/public/browser/native_web_keyboard_event.h" |
| 27 #include "content/public/browser/notification_types.h" | 27 #include "content/public/browser/notification_types.h" |
| 28 #include "content/public/common/content_switches.h" | 28 #include "content/public/common/content_switches.h" |
| 29 #include "content/public/common/result_codes.h" | 29 #include "content/public/common/result_codes.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 == new_event.hasPreciseScrollingDeltas && | 69 == new_event.hasPreciseScrollingDeltas && |
| 70 last_event.phase == new_event.phase && | 70 last_event.phase == new_event.phase && |
| 71 last_event.momentumPhase == new_event.momentumPhase; | 71 last_event.momentumPhase == new_event.momentumPhase; |
| 72 } | 72 } |
| 73 | 73 |
| 74 } // namespace | 74 } // namespace |
| 75 | 75 |
| 76 /////////////////////////////////////////////////////////////////////////////// | 76 /////////////////////////////////////////////////////////////////////////////// |
| 77 // RenderWidgetHost | 77 // RenderWidgetHost |
| 78 | 78 |
| 79 RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, | 79 RenderWidgetHost::RenderWidgetHost(content::RenderProcessHost* process, |
| 80 int routing_id) | 80 int routing_id) |
| 81 : renderer_initialized_(false), | 81 : renderer_initialized_(false), |
| 82 renderer_accessible_(false), | 82 renderer_accessible_(false), |
| 83 view_(NULL), | 83 view_(NULL), |
| 84 process_(process), | 84 process_(process), |
| 85 routing_id_(routing_id), | 85 routing_id_(routing_id), |
| 86 is_loading_(false), | 86 is_loading_(false), |
| 87 is_hidden_(false), | 87 is_hidden_(false), |
| 88 is_accelerated_compositing_active_(false), | 88 is_accelerated_compositing_active_(false), |
| 89 repaint_ack_pending_(false), | 89 repaint_ack_pending_(false), |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 // Don't bother reporting hung state when we aren't the active tab. | 257 // Don't bother reporting hung state when we aren't the active tab. |
| 258 StopHangMonitorTimeout(); | 258 StopHangMonitorTimeout(); |
| 259 | 259 |
| 260 // If we have a renderer, then inform it that we are being hidden so it can | 260 // If we have a renderer, then inform it that we are being hidden so it can |
| 261 // reduce its resource utilization. | 261 // reduce its resource utilization. |
| 262 Send(new ViewMsg_WasHidden(routing_id_)); | 262 Send(new ViewMsg_WasHidden(routing_id_)); |
| 263 | 263 |
| 264 GpuProcessHost::SendOnIO( | 264 GpuProcessHost::SendOnIO( |
| 265 0, | 265 0, |
| 266 content::CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH, | 266 content::CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH, |
| 267 new GpuMsg_VisibilityChanged(routing_id_, process()->id(), false)); | 267 new GpuMsg_VisibilityChanged(routing_id_, process()->GetID(), false)); |
| 268 | 268 |
| 269 // Tell the RenderProcessHost we were hidden. | 269 // Tell the RenderProcessHost we were hidden. |
| 270 process_->WidgetHidden(); | 270 process_->WidgetHidden(); |
| 271 | 271 |
| 272 bool is_visible = false; | 272 bool is_visible = false; |
| 273 content::NotificationService::current()->Notify( | 273 content::NotificationService::current()->Notify( |
| 274 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 274 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
| 275 content::Source<RenderWidgetHost>(this), | 275 content::Source<RenderWidgetHost>(this), |
| 276 content::Details<bool>(&is_visible)); | 276 content::Details<bool>(&is_visible)); |
| 277 } | 277 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 293 needs_repainting = true; | 293 needs_repainting = true; |
| 294 needs_repainting_on_restore_ = false; | 294 needs_repainting_on_restore_ = false; |
| 295 } else { | 295 } else { |
| 296 needs_repainting = false; | 296 needs_repainting = false; |
| 297 } | 297 } |
| 298 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting)); | 298 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting)); |
| 299 | 299 |
| 300 GpuProcessHost::SendOnIO( | 300 GpuProcessHost::SendOnIO( |
| 301 0, | 301 0, |
| 302 content::CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH, | 302 content::CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH, |
| 303 new GpuMsg_VisibilityChanged(routing_id_, process()->id(), true)); | 303 new GpuMsg_VisibilityChanged(routing_id_, process()->GetID(), true)); |
| 304 | 304 |
| 305 process_->WidgetRestored(); | 305 process_->WidgetRestored(); |
| 306 | 306 |
| 307 bool is_visible = true; | 307 bool is_visible = true; |
| 308 content::NotificationService::current()->Notify( | 308 content::NotificationService::current()->Notify( |
| 309 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 309 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
| 310 content::Source<RenderWidgetHost>(this), | 310 content::Source<RenderWidgetHost>(this), |
| 311 content::Details<bool>(&is_visible)); | 311 content::Details<bool>(&is_visible)); |
| 312 | 312 |
| 313 // It's possible for our size to be out of sync with the renderer. The | 313 // It's possible for our size to be out of sync with the renderer. The |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 void RenderWidgetHost::StopHangMonitorTimeout() { | 540 void RenderWidgetHost::StopHangMonitorTimeout() { |
| 541 time_when_considered_hung_ = Time(); | 541 time_when_considered_hung_ = Time(); |
| 542 RendererIsResponsive(); | 542 RendererIsResponsive(); |
| 543 | 543 |
| 544 // We do not bother to stop the hung_renderer_timer_ here in case it will be | 544 // We do not bother to stop the hung_renderer_timer_ here in case it will be |
| 545 // started again shortly, which happens to be the common use case. | 545 // started again shortly, which happens to be the common use case. |
| 546 } | 546 } |
| 547 | 547 |
| 548 void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { | 548 void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { |
| 549 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardMouseEvent"); | 549 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardMouseEvent"); |
| 550 if (ignore_input_events_ || process_->ignore_input_events()) | 550 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 551 return; | 551 return; |
| 552 | 552 |
| 553 // Avoid spamming the renderer with mouse move events. It is important | 553 // Avoid spamming the renderer with mouse move events. It is important |
| 554 // to note that WM_MOUSEMOVE events are anyways synthetic, but since our | 554 // to note that WM_MOUSEMOVE events are anyways synthetic, but since our |
| 555 // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way | 555 // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way |
| 556 // more WM_MOUSEMOVE events than we wish to send to the renderer. | 556 // more WM_MOUSEMOVE events than we wish to send to the renderer. |
| 557 if (mouse_event.type == WebInputEvent::MouseMove) { | 557 if (mouse_event.type == WebInputEvent::MouseMove) { |
| 558 if (mouse_move_pending_) { | 558 if (mouse_move_pending_) { |
| 559 if (!next_mouse_move_.get()) { | 559 if (!next_mouse_move_.get()) { |
| 560 next_mouse_move_.reset(new WebMouseEvent(mouse_event)); | 560 next_mouse_move_.reset(new WebMouseEvent(mouse_event)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 575 | 575 |
| 576 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); | 576 ForwardInputEvent(mouse_event, sizeof(WebMouseEvent), false); |
| 577 } | 577 } |
| 578 | 578 |
| 579 void RenderWidgetHost::OnMouseActivate() { | 579 void RenderWidgetHost::OnMouseActivate() { |
| 580 } | 580 } |
| 581 | 581 |
| 582 void RenderWidgetHost::ForwardWheelEvent( | 582 void RenderWidgetHost::ForwardWheelEvent( |
| 583 const WebMouseWheelEvent& wheel_event) { | 583 const WebMouseWheelEvent& wheel_event) { |
| 584 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardWheelEvent"); | 584 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardWheelEvent"); |
| 585 if (ignore_input_events_ || process_->ignore_input_events()) | 585 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 586 return; | 586 return; |
| 587 | 587 |
| 588 // If there's already a mouse wheel event waiting to be sent to the renderer, | 588 // If there's already a mouse wheel event waiting to be sent to the renderer, |
| 589 // add the new deltas to that event. Not doing so (e.g., by dropping the old | 589 // add the new deltas to that event. Not doing so (e.g., by dropping the old |
| 590 // event, as for mouse moves) results in very slow scrolling on the Mac (on | 590 // event, as for mouse moves) results in very slow scrolling on the Mac (on |
| 591 // which many, very small wheel events are sent). | 591 // which many, very small wheel events are sent). |
| 592 if (mouse_wheel_pending_) { | 592 if (mouse_wheel_pending_) { |
| 593 if (coalesced_mouse_wheel_events_.empty() || | 593 if (coalesced_mouse_wheel_events_.empty() || |
| 594 !ShouldCoalesceMouseWheelEvents(coalesced_mouse_wheel_events_.back(), | 594 !ShouldCoalesceMouseWheelEvents(coalesced_mouse_wheel_events_.back(), |
| 595 wheel_event)) { | 595 wheel_event)) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 610 | 610 |
| 611 HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize", | 611 HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize", |
| 612 coalesced_mouse_wheel_events_.size()); | 612 coalesced_mouse_wheel_events_.size()); |
| 613 | 613 |
| 614 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false); | 614 ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), false); |
| 615 } | 615 } |
| 616 | 616 |
| 617 void RenderWidgetHost::ForwardGestureEvent( | 617 void RenderWidgetHost::ForwardGestureEvent( |
| 618 const WebKit::WebGestureEvent& gesture_event) { | 618 const WebKit::WebGestureEvent& gesture_event) { |
| 619 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardWheelEvent"); | 619 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardWheelEvent"); |
| 620 if (ignore_input_events_ || process_->ignore_input_events()) | 620 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 621 return; | 621 return; |
| 622 | 622 |
| 623 ForwardInputEvent(gesture_event, sizeof(WebGestureEvent), false); | 623 ForwardInputEvent(gesture_event, sizeof(WebGestureEvent), false); |
| 624 } | 624 } |
| 625 | 625 |
| 626 void RenderWidgetHost::ForwardKeyboardEvent( | 626 void RenderWidgetHost::ForwardKeyboardEvent( |
| 627 const NativeWebKeyboardEvent& key_event) { | 627 const NativeWebKeyboardEvent& key_event) { |
| 628 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardKeyboardEvent"); | 628 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardKeyboardEvent"); |
| 629 if (ignore_input_events_ || process_->ignore_input_events()) | 629 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 630 return; | 630 return; |
| 631 | 631 |
| 632 if (key_event.type == WebKeyboardEvent::Char && | 632 if (key_event.type == WebKeyboardEvent::Char && |
| 633 (key_event.windowsKeyCode == ui::VKEY_RETURN || | 633 (key_event.windowsKeyCode == ui::VKEY_RETURN || |
| 634 key_event.windowsKeyCode == ui::VKEY_SPACE)) { | 634 key_event.windowsKeyCode == ui::VKEY_SPACE)) { |
| 635 OnUserGesture(); | 635 OnUserGesture(); |
| 636 } | 636 } |
| 637 | 637 |
| 638 // Double check the type to make sure caller hasn't sent us nonsense that | 638 // Double check the type to make sure caller hasn't sent us nonsense that |
| 639 // will mess up our key queue. | 639 // will mess up our key queue. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 } | 685 } |
| 686 | 686 |
| 687 void RenderWidgetHost::ForwardInputEvent(const WebInputEvent& input_event, | 687 void RenderWidgetHost::ForwardInputEvent(const WebInputEvent& input_event, |
| 688 int event_size, | 688 int event_size, |
| 689 bool is_keyboard_shortcut) { | 689 bool is_keyboard_shortcut) { |
| 690 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardInputEvent"); | 690 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardInputEvent"); |
| 691 | 691 |
| 692 if (!process_->HasConnection()) | 692 if (!process_->HasConnection()) |
| 693 return; | 693 return; |
| 694 | 694 |
| 695 DCHECK(!process_->ignore_input_events()); | 695 DCHECK(!process_->IgnoreInputEvents()); |
| 696 | 696 |
| 697 IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); | 697 IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); |
| 698 message->WriteData( | 698 message->WriteData( |
| 699 reinterpret_cast<const char*>(&input_event), event_size); | 699 reinterpret_cast<const char*>(&input_event), event_size); |
| 700 // |is_keyboard_shortcut| only makes sense for RawKeyDown events. | 700 // |is_keyboard_shortcut| only makes sense for RawKeyDown events. |
| 701 if (input_event.type == WebInputEvent::RawKeyDown) | 701 if (input_event.type == WebInputEvent::RawKeyDown) |
| 702 message->WriteBool(is_keyboard_shortcut); | 702 message->WriteBool(is_keyboard_shortcut); |
| 703 input_event_start_time_ = TimeTicks::Now(); | 703 input_event_start_time_ = TimeTicks::Now(); |
| 704 Send(message); | 704 Send(message); |
| 705 | 705 |
| 706 // Any non-wheel input event cancels pending wheel events. | 706 // Any non-wheel input event cancels pending wheel events. |
| 707 if (input_event.type != WebInputEvent::MouseWheel) | 707 if (input_event.type != WebInputEvent::MouseWheel) |
| 708 coalesced_mouse_wheel_events_.clear(); | 708 coalesced_mouse_wheel_events_.clear(); |
| 709 | 709 |
| 710 // Any input event cancels a pending mouse move event. Note that | 710 // Any input event cancels a pending mouse move event. Note that |
| 711 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| | 711 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| |
| 712 // after this line. | 712 // after this line. |
| 713 next_mouse_move_.reset(); | 713 next_mouse_move_.reset(); |
| 714 | 714 |
| 715 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); | 715 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); |
| 716 } | 716 } |
| 717 | 717 |
| 718 void RenderWidgetHost::ForwardTouchEvent( | 718 void RenderWidgetHost::ForwardTouchEvent( |
| 719 const WebKit::WebTouchEvent& touch_event) { | 719 const WebKit::WebTouchEvent& touch_event) { |
| 720 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardTouchEvent"); | 720 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardTouchEvent"); |
| 721 if (ignore_input_events_ || process_->ignore_input_events()) | 721 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 722 return; | 722 return; |
| 723 | 723 |
| 724 if (touch_event.type == WebInputEvent::TouchMove && | 724 if (touch_event.type == WebInputEvent::TouchMove && |
| 725 touch_move_pending_) { | 725 touch_move_pending_) { |
| 726 touch_event_is_queued_ = true; | 726 touch_event_is_queued_ = true; |
| 727 queued_touch_event_ = touch_event; | 727 queued_touch_event_ = touch_event; |
| 728 return; | 728 return; |
| 729 } | 729 } |
| 730 | 730 |
| 731 if (touch_event.type == WebInputEvent::TouchMove) | 731 if (touch_event.type == WebInputEvent::TouchMove) |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 pending_mouse_lock_request_ = false; | 1469 pending_mouse_lock_request_ = false; |
| 1470 if (!view_ || !view_->HasFocus()|| !view_->LockMouse()) { | 1470 if (!view_ || !view_->HasFocus()|| !view_->LockMouse()) { |
| 1471 Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); | 1471 Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); |
| 1472 return false; | 1472 return false; |
| 1473 } else { | 1473 } else { |
| 1474 Send(new ViewMsg_LockMouse_ACK(routing_id_, true)); | 1474 Send(new ViewMsg_LockMouse_ACK(routing_id_, true)); |
| 1475 return true; | 1475 return true; |
| 1476 } | 1476 } |
| 1477 } | 1477 } |
| 1478 } | 1478 } |
| OLD | NEW |