| 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 |