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/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #include "content/public/renderer/content_renderer_client.h" | 46 #include "content/public/renderer/content_renderer_client.h" |
47 #include "content/renderer/cursor_utils.h" | 47 #include "content/renderer/cursor_utils.h" |
48 #include "content/renderer/devtools/render_widget_screen_metrics_emulator.h" | 48 #include "content/renderer/devtools/render_widget_screen_metrics_emulator.h" |
49 #include "content/renderer/drop_data_builder.h" | 49 #include "content/renderer/drop_data_builder.h" |
50 #include "content/renderer/external_popup_menu.h" | 50 #include "content/renderer/external_popup_menu.h" |
51 #include "content/renderer/gpu/frame_swap_message_queue.h" | 51 #include "content/renderer/gpu/frame_swap_message_queue.h" |
52 #include "content/renderer/gpu/queue_message_swap_promise.h" | 52 #include "content/renderer/gpu/queue_message_swap_promise.h" |
53 #include "content/renderer/gpu/render_widget_compositor.h" | 53 #include "content/renderer/gpu/render_widget_compositor.h" |
54 #include "content/renderer/ime_event_guard.h" | 54 #include "content/renderer/ime_event_guard.h" |
55 #include "content/renderer/input/input_handler_manager.h" | 55 #include "content/renderer/input/input_handler_manager.h" |
| 56 #include "content/renderer/input/main_thread_event_queue.h" |
56 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" | 57 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
57 #include "content/renderer/render_frame_impl.h" | 58 #include "content/renderer/render_frame_impl.h" |
58 #include "content/renderer/render_frame_proxy.h" | 59 #include "content/renderer/render_frame_proxy.h" |
59 #include "content/renderer/render_process.h" | 60 #include "content/renderer/render_process.h" |
60 #include "content/renderer/render_thread_impl.h" | 61 #include "content/renderer/render_thread_impl.h" |
61 #include "content/renderer/render_view_impl.h" | 62 #include "content/renderer/render_view_impl.h" |
62 #include "content/renderer/render_widget_owner_delegate.h" | 63 #include "content/renderer/render_widget_owner_delegate.h" |
63 #include "content/renderer/renderer_blink_platform_impl.h" | 64 #include "content/renderer/renderer_blink_platform_impl.h" |
64 #include "content/renderer/resizing_mode_selector.h" | 65 #include "content/renderer/resizing_mode_selector.h" |
65 #include "ipc/ipc_message_start.h" | 66 #include "ipc/ipc_message_start.h" |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 render_widget_scheduling_state_->SetHidden(is_hidden_); | 394 render_widget_scheduling_state_->SetHidden(is_hidden_); |
394 } | 395 } |
395 #if defined(USE_AURA) | 396 #if defined(USE_AURA) |
396 RendererWindowTreeClient::CreateIfNecessary(routing_id_); | 397 RendererWindowTreeClient::CreateIfNecessary(routing_id_); |
397 #endif | 398 #endif |
398 } | 399 } |
399 | 400 |
400 RenderWidget::~RenderWidget() { | 401 RenderWidget::~RenderWidget() { |
401 DCHECK(!webwidget_internal_) << "Leaking our WebWidget!"; | 402 DCHECK(!webwidget_internal_) << "Leaking our WebWidget!"; |
402 | 403 |
| 404 if (input_event_queue_) |
| 405 input_event_queue_->ClearClient(); |
| 406 |
403 // If we are swapped out, we have released already. | 407 // If we are swapped out, we have released already. |
404 if (!is_swapped_out_ && RenderProcess::current()) | 408 if (!is_swapped_out_ && RenderProcess::current()) |
405 RenderProcess::current()->ReleaseProcess(); | 409 RenderProcess::current()->ReleaseProcess(); |
406 #if defined(USE_AURA) | 410 #if defined(USE_AURA) |
407 // It is possible for a RenderWidget to be destroyed before it was embedded | 411 // It is possible for a RenderWidget to be destroyed before it was embedded |
408 // in a mus window. The RendererWindowTreeClient will leak in such cases. So | 412 // in a mus window. The RendererWindowTreeClient will leak in such cases. So |
409 // explicitly delete it here. | 413 // explicitly delete it here. |
410 RendererWindowTreeClient::Destroy(routing_id_); | 414 RendererWindowTreeClient::Destroy(routing_id_); |
411 #endif | 415 #endif |
412 } | 416 } |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 const ui::LatencyInfo& latency_info, | 814 const ui::LatencyInfo& latency_info, |
811 InputEventDispatchType dispatch_type) { | 815 InputEventDispatchType dispatch_type) { |
812 if (!input_event) | 816 if (!input_event) |
813 return; | 817 return; |
814 | 818 |
815 input_handler_->HandleInputEvent( | 819 input_handler_->HandleInputEvent( |
816 blink::WebCoalescedInputEvent(*input_event, coalesced_events), | 820 blink::WebCoalescedInputEvent(*input_event, coalesced_events), |
817 latency_info, dispatch_type); | 821 latency_info, dispatch_type); |
818 } | 822 } |
819 | 823 |
| 824 InputEventAckState RenderWidget::HandleInputEvent( |
| 825 const blink::WebCoalescedInputEvent& input_event, |
| 826 const ui::LatencyInfo& latency_info, |
| 827 InputEventDispatchType dispatch_type) { |
| 828 return input_handler_->HandleInputEvent(input_event, latency_info, |
| 829 dispatch_type); |
| 830 } |
| 831 |
| 832 void RenderWidget::SendInputEventAck(blink::WebInputEvent::Type type, |
| 833 InputEventAckState ack_result, |
| 834 uint32_t touch_event_id) { |
| 835 InputEventAck ack(InputEventAckSource::MAIN_THREAD, type, ack_result, |
| 836 touch_event_id); |
| 837 Send(new InputHostMsg_HandleInputEvent_ACK(routing_id_, ack)); |
| 838 } |
| 839 |
820 void RenderWidget::OnCursorVisibilityChange(bool is_visible) { | 840 void RenderWidget::OnCursorVisibilityChange(bool is_visible) { |
821 if (GetWebWidget()) | 841 if (GetWebWidget()) |
822 GetWebWidget()->SetCursorVisibilityState(is_visible); | 842 GetWebWidget()->SetCursorVisibilityState(is_visible); |
823 } | 843 } |
824 | 844 |
825 void RenderWidget::OnMouseCaptureLost() { | 845 void RenderWidget::OnMouseCaptureLost() { |
826 if (GetWebWidget()) | 846 if (GetWebWidget()) |
827 GetWebWidget()->MouseCaptureLost(); | 847 GetWebWidget()->MouseCaptureLost(); |
828 } | 848 } |
829 | 849 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 } | 884 } |
865 | 885 |
866 void RenderWidget::RecordWheelAndTouchScrollingCount( | 886 void RenderWidget::RecordWheelAndTouchScrollingCount( |
867 bool has_scrolled_by_wheel, | 887 bool has_scrolled_by_wheel, |
868 bool has_scrolled_by_touch) { | 888 bool has_scrolled_by_touch) { |
869 GetWebWidget()->RecordWheelAndTouchScrollingCount(has_scrolled_by_wheel, | 889 GetWebWidget()->RecordWheelAndTouchScrollingCount(has_scrolled_by_wheel, |
870 has_scrolled_by_touch); | 890 has_scrolled_by_touch); |
871 } | 891 } |
872 | 892 |
873 void RenderWidget::BeginMainFrame(double frame_time_sec) { | 893 void RenderWidget::BeginMainFrame(double frame_time_sec) { |
874 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 894 if (input_event_queue_) { |
875 // render_thread may be NULL in tests. | 895 input_event_queue_->DispatchRafAlignedInput( |
876 InputHandlerManager* input_handler_manager = | 896 ui::EventTimeStampFromSeconds(frame_time_sec)); |
877 render_thread ? render_thread->input_handler_manager() : NULL; | 897 } |
878 if (input_handler_manager) | |
879 input_handler_manager->ProcessRafAlignedInputOnMainThread( | |
880 routing_id_, ui::EventTimeStampFromSeconds(frame_time_sec)); | |
881 | 898 |
882 GetWebWidget()->BeginFrame(frame_time_sec); | 899 GetWebWidget()->BeginFrame(frame_time_sec); |
883 } | 900 } |
884 | 901 |
885 void RenderWidget::RequestNewCompositorFrameSink( | 902 void RenderWidget::RequestNewCompositorFrameSink( |
886 bool fallback, | 903 bool fallback, |
887 const CompositorFrameSinkCallback& callback) { | 904 const CompositorFrameSinkCallback& callback) { |
888 DCHECK(GetWebWidget()); | 905 DCHECK(GetWebWidget()); |
889 // For widgets that are never visible, we don't start the compositor, so we | 906 // For widgets that are never visible, we don't start the compositor, so we |
890 // never get a request for a cc::CompositorFrameSink. | 907 // never get a request for a cc::CompositorFrameSink. |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 void RenderWidget::OnDidOverscroll(const ui::DidOverscrollParams& params) { | 1047 void RenderWidget::OnDidOverscroll(const ui::DidOverscrollParams& params) { |
1031 Send(new InputHostMsg_DidOverscroll(routing_id_, params)); | 1048 Send(new InputHostMsg_DidOverscroll(routing_id_, params)); |
1032 } | 1049 } |
1033 | 1050 |
1034 void RenderWidget::OnInputEventAck( | 1051 void RenderWidget::OnInputEventAck( |
1035 std::unique_ptr<InputEventAck> input_event_ack) { | 1052 std::unique_ptr<InputEventAck> input_event_ack) { |
1036 SendOrCrash( | 1053 SendOrCrash( |
1037 new InputHostMsg_HandleInputEvent_ACK(routing_id_, *input_event_ack)); | 1054 new InputHostMsg_HandleInputEvent_ACK(routing_id_, *input_event_ack)); |
1038 } | 1055 } |
1039 | 1056 |
1040 void RenderWidget::NotifyInputEventHandled( | |
1041 blink::WebInputEvent::Type handled_type, | |
1042 blink::WebInputEventResult result, | |
1043 InputEventAckState ack_result) { | |
1044 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | |
1045 InputHandlerManager* input_handler_manager = | |
1046 render_thread ? render_thread->input_handler_manager() : NULL; | |
1047 if (input_handler_manager) { | |
1048 input_handler_manager->NotifyInputEventHandledOnMainThread( | |
1049 routing_id_, handled_type, result, ack_result); | |
1050 } | |
1051 } | |
1052 | |
1053 void RenderWidget::SetInputHandler(RenderWidgetInputHandler* input_handler) { | 1057 void RenderWidget::SetInputHandler(RenderWidgetInputHandler* input_handler) { |
1054 // Nothing to do here. RenderWidget created the |input_handler| and will take | 1058 // Nothing to do here. RenderWidget created the |input_handler| and will take |
1055 // ownership of it. We just verify here that we don't already have an input | 1059 // ownership of it. We just verify here that we don't already have an input |
1056 // handler. | 1060 // handler. |
1057 DCHECK(!input_handler_); | 1061 DCHECK(!input_handler_); |
1058 } | 1062 } |
1059 | 1063 |
1060 void RenderWidget::ShowVirtualKeyboard() { | 1064 void RenderWidget::ShowVirtualKeyboard() { |
1061 UpdateTextInputStateInternal(true, false); | 1065 UpdateTextInputStateInternal(true, false); |
1062 } | 1066 } |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 StartCompositor(); | 1309 StartCompositor(); |
1306 DCHECK_NE(MSG_ROUTING_NONE, routing_id_); | 1310 DCHECK_NE(MSG_ROUTING_NONE, routing_id_); |
1307 compositor_->SetFrameSinkId( | 1311 compositor_->SetFrameSinkId( |
1308 cc::FrameSinkId(RenderThread::Get()->GetClientId(), routing_id_)); | 1312 cc::FrameSinkId(RenderThread::Get()->GetClientId(), routing_id_)); |
1309 | 1313 |
1310 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 1314 RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
1311 // render_thread may be NULL in tests. | 1315 // render_thread may be NULL in tests. |
1312 InputHandlerManager* input_handler_manager = | 1316 InputHandlerManager* input_handler_manager = |
1313 render_thread ? render_thread->input_handler_manager() : NULL; | 1317 render_thread ? render_thread->input_handler_manager() : NULL; |
1314 if (input_handler_manager) { | 1318 if (input_handler_manager) { |
| 1319 input_event_queue_ = new MainThreadEventQueue( |
| 1320 this, render_thread->GetRendererScheduler()->CompositorTaskRunner(), |
| 1321 render_thread->GetRendererScheduler()); |
1315 input_handler_manager->AddInputHandler( | 1322 input_handler_manager->AddInputHandler( |
1316 routing_id_, compositor()->GetInputHandler(), | 1323 routing_id_, compositor()->GetInputHandler(), input_event_queue_, |
1317 weak_ptr_factory_.GetWeakPtr(), | 1324 weak_ptr_factory_.GetWeakPtr(), |
1318 compositor_deps_->IsScrollAnimatorEnabled()); | 1325 compositor_deps_->IsScrollAnimatorEnabled()); |
1319 has_added_input_handler_ = true; | 1326 has_added_input_handler_ = true; |
1320 } | 1327 } |
1321 | 1328 |
1322 return compositor_.get(); | 1329 return compositor_.get(); |
1323 } | 1330 } |
1324 | 1331 |
1325 void RenderWidget::WillCloseLayerTreeView() { | 1332 void RenderWidget::WillCloseLayerTreeView() { |
1326 if (host_closing_) | 1333 if (host_closing_) |
(...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2314 // browser side (https://crbug.com/669219). | 2321 // browser side (https://crbug.com/669219). |
2315 // If there is no WebFrameWidget, then there will be no | 2322 // If there is no WebFrameWidget, then there will be no |
2316 // InputMethodControllers for a WebLocalFrame. | 2323 // InputMethodControllers for a WebLocalFrame. |
2317 return nullptr; | 2324 return nullptr; |
2318 } | 2325 } |
2319 return static_cast<blink::WebFrameWidget*>(GetWebWidget()) | 2326 return static_cast<blink::WebFrameWidget*>(GetWebWidget()) |
2320 ->GetActiveWebInputMethodController(); | 2327 ->GetActiveWebInputMethodController(); |
2321 } | 2328 } |
2322 | 2329 |
2323 } // namespace content | 2330 } // namespace content |
OLD | NEW |