blob: 2eede4b8d27047944e42810ea03a39bba7bf826b [file] [log] [blame]
Dave Tapuska9db80842017-07-24 17:24:261// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/input/widget_input_handler_impl.h"
6
7#include <utility>
8
9#include "base/bind.h"
10#include "base/logging.h"
Ryan Landay69ac1e42017-09-14 02:17:3811#include "content/common/input/ime_text_span_conversions.h"
Dave Tapuska9db80842017-07-24 17:24:2612#include "content/common/input_messages.h"
danakja6c10012018-07-06 14:25:3613#include "content/renderer/gpu/layer_tree_view.h"
Dave Tapuska9db80842017-07-24 17:24:2614#include "content/renderer/ime_event_guard.h"
15#include "content/renderer/input/widget_input_handler_manager.h"
16#include "content/renderer/render_thread_impl.h"
17#include "content/renderer/render_widget.h"
Blink Reformata30d4232018-04-07 15:31:0618#include "third_party/blink/public/platform/platform.h"
Yuta Kitamuradeb91bb2018-05-29 05:53:2019#include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
Blink Reformata30d4232018-04-07 15:31:0620#include "third_party/blink/public/platform/web_coalesced_input_event.h"
21#include "third_party/blink/public/platform/web_keyboard_event.h"
Joel Einbinder7a680362018-07-28 19:44:5322#include "third_party/blink/public/web/web_ime_text_span.h"
Blink Reformata30d4232018-04-07 15:31:0623#include "third_party/blink/public/web/web_local_frame.h"
Dave Tapuska9db80842017-07-24 17:24:2624
25namespace content {
26
27namespace {
28
Dave Tapuska65bb6ee82017-09-07 21:23:4129void RunClosureIfNotSwappedOut(base::WeakPtr<RenderWidget> render_widget,
30 base::OnceClosure closure) {
31 // Input messages must not be processed if the RenderWidget is in swapped out
Dave Tapuskae3db81da372017-12-08 00:20:3432 // or closing state.
33 if (!render_widget || render_widget->is_swapped_out() ||
danakj678f0252018-11-09 21:46:3434 render_widget->is_closing()) {
Dave Tapuska65bb6ee82017-09-07 21:23:4135 return;
Dave Tapuskae3db81da372017-12-08 00:20:3436 }
Dave Tapuska65bb6ee82017-09-07 21:23:4137 std::move(closure).Run();
38}
39
Dave Tapuska9db80842017-07-24 17:24:2640} // namespace
41
42WidgetInputHandlerImpl::WidgetInputHandlerImpl(
43 scoped_refptr<WidgetInputHandlerManager> manager,
44 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
45 scoped_refptr<MainThreadEventQueue> input_event_queue,
46 base::WeakPtr<RenderWidget> render_widget)
47 : main_thread_task_runner_(main_thread_task_runner),
48 input_handler_manager_(manager),
49 input_event_queue_(input_event_queue),
50 render_widget_(render_widget),
51 binding_(this),
52 associated_binding_(this) {}
53
54WidgetInputHandlerImpl::~WidgetInputHandlerImpl() {}
55
56void WidgetInputHandlerImpl::SetAssociatedBinding(
57 mojom::WidgetInputHandlerAssociatedRequest request) {
58 associated_binding_.Bind(std::move(request));
59 associated_binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5760 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2661}
62
63void WidgetInputHandlerImpl::SetBinding(
64 mojom::WidgetInputHandlerRequest request) {
65 binding_.Bind(std::move(request));
66 binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5767 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2668}
69
70void WidgetInputHandlerImpl::SetFocus(bool focused) {
71 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5772 base::BindOnce(&RenderWidget::OnSetFocus, render_widget_, focused));
Dave Tapuska9db80842017-07-24 17:24:2673}
74
75void WidgetInputHandlerImpl::MouseCaptureLost() {
76 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5777 base::BindOnce(&RenderWidget::OnMouseCaptureLost, render_widget_));
Dave Tapuska9db80842017-07-24 17:24:2678}
79
80void WidgetInputHandlerImpl::SetEditCommandsForNextKeyEvent(
81 const std::vector<EditCommand>& commands) {
tzik1076ee22017-08-25 04:03:5782 RunOnMainThread(
83 base::BindOnce(&RenderWidget::OnSetEditCommandsForNextKeyEvent,
84 render_widget_, commands));
Dave Tapuska9db80842017-07-24 17:24:2685}
86
87void WidgetInputHandlerImpl::CursorVisibilityChanged(bool visible) {
tzik1076ee22017-08-25 04:03:5788 RunOnMainThread(base::BindOnce(&RenderWidget::OnCursorVisibilityChange,
89 render_widget_, visible));
Dave Tapuska9db80842017-07-24 17:24:2690}
91
92void WidgetInputHandlerImpl::ImeSetComposition(
93 const base::string16& text,
Ryan Landay9e42fd742017-08-12 01:59:1194 const std::vector<ui::ImeTextSpan>& ime_text_spans,
Dave Tapuska9db80842017-07-24 17:24:2695 const gfx::Range& range,
96 int32_t start,
97 int32_t end) {
Ryan Landay9e42fd742017-08-12 01:59:1198 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5799 base::BindOnce(&RenderWidget::OnImeSetComposition, render_widget_, text,
Manuel Rego Casasnovas6743b452018-03-22 20:42:39100 ConvertUiImeTextSpansToBlinkImeTextSpans(ime_text_spans),
tzik1076ee22017-08-25 04:03:57101 range, start, end));
Dave Tapuska9db80842017-07-24 17:24:26102}
103
Joel Einbinder7a680362018-07-28 19:44:53104static void ImeCommitTextOnMainThread(
105 base::WeakPtr<RenderWidget> render_widget,
106 scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner,
107 const base::string16& text,
108 const std::vector<blink::WebImeTextSpan>& ime_text_spans,
109 const gfx::Range& range,
110 int32_t relative_cursor_position,
111 WidgetInputHandlerImpl::ImeCommitTextCallback callback) {
112 if (render_widget) {
113 render_widget->OnImeCommitText(text, ime_text_spans, range,
114 relative_cursor_position);
115 }
116 callback_task_runner->PostTask(FROM_HERE, std::move(callback));
117}
118
Dave Tapuska9db80842017-07-24 17:24:26119void WidgetInputHandlerImpl::ImeCommitText(
120 const base::string16& text,
Ryan Landay9e42fd742017-08-12 01:59:11121 const std::vector<ui::ImeTextSpan>& ime_text_spans,
Dave Tapuska9db80842017-07-24 17:24:26122 const gfx::Range& range,
Joel Einbinder7a680362018-07-28 19:44:53123 int32_t relative_cursor_position,
124 ImeCommitTextCallback callback) {
Ryan Landay9e42fd742017-08-12 01:59:11125 RunOnMainThread(
Joel Einbinder7a680362018-07-28 19:44:53126 base::BindOnce(&ImeCommitTextOnMainThread, render_widget_,
127 base::ThreadTaskRunnerHandle::Get(), text,
Manuel Rego Casasnovas6743b452018-03-22 20:42:39128 ConvertUiImeTextSpansToBlinkImeTextSpans(ime_text_spans),
Joel Einbinder7a680362018-07-28 19:44:53129 range, relative_cursor_position, std::move(callback)));
Dave Tapuska9db80842017-07-24 17:24:26130}
131
132void WidgetInputHandlerImpl::ImeFinishComposingText(bool keep_selection) {
tzik1076ee22017-08-25 04:03:57133 RunOnMainThread(base::BindOnce(&RenderWidget::OnImeFinishComposingText,
134 render_widget_, keep_selection));
Dave Tapuska9db80842017-07-24 17:24:26135}
136
137void WidgetInputHandlerImpl::RequestTextInputStateUpdate() {
tzik1076ee22017-08-25 04:03:57138 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestTextInputStateUpdate,
139 render_widget_));
Dave Tapuska9db80842017-07-24 17:24:26140}
141
142void WidgetInputHandlerImpl::RequestCompositionUpdates(bool immediate_request,
143 bool monitor_request) {
tzik1076ee22017-08-25 04:03:57144 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestCompositionUpdates,
145 render_widget_, immediate_request,
146 monitor_request));
Dave Tapuska9db80842017-07-24 17:24:26147}
148
149void WidgetInputHandlerImpl::DispatchEvent(
150 std::unique_ptr<content::InputEvent> event,
151 DispatchEventCallback callback) {
Dave Tapuska921546892018-04-09 17:43:39152 TRACE_EVENT0("input", "WidgetInputHandlerImpl::DispatchEvent");
Dave Tapuska9db80842017-07-24 17:24:26153 input_handler_manager_->DispatchEvent(std::move(event), std::move(callback));
154}
155
156void WidgetInputHandlerImpl::DispatchNonBlockingEvent(
157 std::unique_ptr<content::InputEvent> event) {
Dave Tapuska921546892018-04-09 17:43:39158 TRACE_EVENT0("input", "WidgetInputHandlerImpl::DispatchNonBlockingEvent");
159 input_handler_manager_->DispatchEvent(std::move(event),
160 DispatchEventCallback());
Dave Tapuska9db80842017-07-24 17:24:26161}
162
Dave Tapuska63aa4622018-02-25 21:42:56163void WidgetInputHandlerImpl::AttachSynchronousCompositor(
164 mojom::SynchronousCompositorControlHostPtr control_host,
165 mojom::SynchronousCompositorHostAssociatedPtrInfo host,
166 mojom::SynchronousCompositorAssociatedRequest compositor_request) {
167 input_handler_manager_->AttachSynchronousCompositor(
168 std::move(control_host), std::move(host), std::move(compositor_request));
169}
170
Dave Tapuska9db80842017-07-24 17:24:26171void WidgetInputHandlerImpl::RunOnMainThread(base::OnceClosure closure) {
172 if (input_event_queue_) {
Dave Tapuska65bb6ee82017-09-07 21:23:41173 input_event_queue_->QueueClosure(base::BindOnce(
174 &RunClosureIfNotSwappedOut, render_widget_, std::move(closure)));
Dave Tapuska9db80842017-07-24 17:24:26175 } else {
Dave Tapuska65bb6ee82017-09-07 21:23:41176 RunClosureIfNotSwappedOut(render_widget_, std::move(closure));
Dave Tapuska9db80842017-07-24 17:24:26177 }
178}
179
180void WidgetInputHandlerImpl::Release() {
181 if (!main_thread_task_runner_->BelongsToCurrentThread()) {
182 // Close the binding on the compositor thread first before telling the main
183 // thread to delete this object.
184 associated_binding_.Close();
185 binding_.Close();
186 main_thread_task_runner_->PostTask(
tzik1076ee22017-08-25 04:03:57187 FROM_HERE, base::BindOnce(&WidgetInputHandlerImpl::Release,
188 base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:26189 return;
190 }
191 delete this;
192}
193
194} // namespace content