blob: 07a2cd8bfa25334239bb45431899fd853d46548e [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"
13#include "content/renderer/gpu/render_widget_compositor.h"
14#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"
22#include "third_party/blink/public/web/web_local_frame.h"
Dave Tapuska9db80842017-07-24 17:24:2623
24namespace content {
25
26namespace {
27
Dave Tapuska65bb6ee82017-09-07 21:23:4128void RunClosureIfNotSwappedOut(base::WeakPtr<RenderWidget> render_widget,
29 base::OnceClosure closure) {
30 // Input messages must not be processed if the RenderWidget is in swapped out
Dave Tapuskae3db81da372017-12-08 00:20:3431 // or closing state.
32 if (!render_widget || render_widget->is_swapped_out() ||
33 render_widget->IsClosing()) {
Dave Tapuska65bb6ee82017-09-07 21:23:4134 return;
Dave Tapuskae3db81da372017-12-08 00:20:3435 }
Dave Tapuska65bb6ee82017-09-07 21:23:4136 std::move(closure).Run();
37}
38
Dave Tapuska9db80842017-07-24 17:24:2639} // namespace
40
41WidgetInputHandlerImpl::WidgetInputHandlerImpl(
42 scoped_refptr<WidgetInputHandlerManager> manager,
43 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
44 scoped_refptr<MainThreadEventQueue> input_event_queue,
45 base::WeakPtr<RenderWidget> render_widget)
46 : main_thread_task_runner_(main_thread_task_runner),
47 input_handler_manager_(manager),
48 input_event_queue_(input_event_queue),
49 render_widget_(render_widget),
50 binding_(this),
51 associated_binding_(this) {}
52
53WidgetInputHandlerImpl::~WidgetInputHandlerImpl() {}
54
55void WidgetInputHandlerImpl::SetAssociatedBinding(
56 mojom::WidgetInputHandlerAssociatedRequest request) {
57 associated_binding_.Bind(std::move(request));
58 associated_binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5759 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2660}
61
62void WidgetInputHandlerImpl::SetBinding(
63 mojom::WidgetInputHandlerRequest request) {
64 binding_.Bind(std::move(request));
65 binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5766 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2667}
68
69void WidgetInputHandlerImpl::SetFocus(bool focused) {
70 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5771 base::BindOnce(&RenderWidget::OnSetFocus, render_widget_, focused));
Dave Tapuska9db80842017-07-24 17:24:2672}
73
74void WidgetInputHandlerImpl::MouseCaptureLost() {
75 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5776 base::BindOnce(&RenderWidget::OnMouseCaptureLost, render_widget_));
Dave Tapuska9db80842017-07-24 17:24:2677}
78
79void WidgetInputHandlerImpl::SetEditCommandsForNextKeyEvent(
80 const std::vector<EditCommand>& commands) {
tzik1076ee22017-08-25 04:03:5781 RunOnMainThread(
82 base::BindOnce(&RenderWidget::OnSetEditCommandsForNextKeyEvent,
83 render_widget_, commands));
Dave Tapuska9db80842017-07-24 17:24:2684}
85
86void WidgetInputHandlerImpl::CursorVisibilityChanged(bool visible) {
tzik1076ee22017-08-25 04:03:5787 RunOnMainThread(base::BindOnce(&RenderWidget::OnCursorVisibilityChange,
88 render_widget_, visible));
Dave Tapuska9db80842017-07-24 17:24:2689}
90
91void WidgetInputHandlerImpl::ImeSetComposition(
92 const base::string16& text,
Ryan Landay9e42fd742017-08-12 01:59:1193 const std::vector<ui::ImeTextSpan>& ime_text_spans,
Dave Tapuska9db80842017-07-24 17:24:2694 const gfx::Range& range,
95 int32_t start,
96 int32_t end) {
Ryan Landay9e42fd742017-08-12 01:59:1197 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5798 base::BindOnce(&RenderWidget::OnImeSetComposition, render_widget_, text,
Manuel Rego Casasnovas6743b452018-03-22 20:42:3999 ConvertUiImeTextSpansToBlinkImeTextSpans(ime_text_spans),
tzik1076ee22017-08-25 04:03:57100 range, start, end));
Dave Tapuska9db80842017-07-24 17:24:26101}
102
103void WidgetInputHandlerImpl::ImeCommitText(
104 const base::string16& text,
Ryan Landay9e42fd742017-08-12 01:59:11105 const std::vector<ui::ImeTextSpan>& ime_text_spans,
Dave Tapuska9db80842017-07-24 17:24:26106 const gfx::Range& range,
107 int32_t relative_cursor_position) {
Ryan Landay9e42fd742017-08-12 01:59:11108 RunOnMainThread(
tzik1076ee22017-08-25 04:03:57109 base::BindOnce(&RenderWidget::OnImeCommitText, render_widget_, text,
Manuel Rego Casasnovas6743b452018-03-22 20:42:39110 ConvertUiImeTextSpansToBlinkImeTextSpans(ime_text_spans),
tzik1076ee22017-08-25 04:03:57111 range, relative_cursor_position));
Dave Tapuska9db80842017-07-24 17:24:26112}
113
114void WidgetInputHandlerImpl::ImeFinishComposingText(bool keep_selection) {
tzik1076ee22017-08-25 04:03:57115 RunOnMainThread(base::BindOnce(&RenderWidget::OnImeFinishComposingText,
116 render_widget_, keep_selection));
Dave Tapuska9db80842017-07-24 17:24:26117}
118
119void WidgetInputHandlerImpl::RequestTextInputStateUpdate() {
tzik1076ee22017-08-25 04:03:57120 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestTextInputStateUpdate,
121 render_widget_));
Dave Tapuska9db80842017-07-24 17:24:26122}
123
124void WidgetInputHandlerImpl::RequestCompositionUpdates(bool immediate_request,
125 bool monitor_request) {
tzik1076ee22017-08-25 04:03:57126 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestCompositionUpdates,
127 render_widget_, immediate_request,
128 monitor_request));
Dave Tapuska9db80842017-07-24 17:24:26129}
130
131void WidgetInputHandlerImpl::DispatchEvent(
132 std::unique_ptr<content::InputEvent> event,
133 DispatchEventCallback callback) {
Dave Tapuska921546892018-04-09 17:43:39134 TRACE_EVENT0("input", "WidgetInputHandlerImpl::DispatchEvent");
Dave Tapuska9db80842017-07-24 17:24:26135 input_handler_manager_->DispatchEvent(std::move(event), std::move(callback));
136}
137
138void WidgetInputHandlerImpl::DispatchNonBlockingEvent(
139 std::unique_ptr<content::InputEvent> event) {
Dave Tapuska921546892018-04-09 17:43:39140 TRACE_EVENT0("input", "WidgetInputHandlerImpl::DispatchNonBlockingEvent");
141 input_handler_manager_->DispatchEvent(std::move(event),
142 DispatchEventCallback());
Dave Tapuska9db80842017-07-24 17:24:26143}
144
Dave Tapuska63aa4622018-02-25 21:42:56145void WidgetInputHandlerImpl::AttachSynchronousCompositor(
146 mojom::SynchronousCompositorControlHostPtr control_host,
147 mojom::SynchronousCompositorHostAssociatedPtrInfo host,
148 mojom::SynchronousCompositorAssociatedRequest compositor_request) {
149 input_handler_manager_->AttachSynchronousCompositor(
150 std::move(control_host), std::move(host), std::move(compositor_request));
151}
152
Dave Tapuska9db80842017-07-24 17:24:26153void WidgetInputHandlerImpl::RunOnMainThread(base::OnceClosure closure) {
154 if (input_event_queue_) {
Dave Tapuska65bb6ee82017-09-07 21:23:41155 input_event_queue_->QueueClosure(base::BindOnce(
156 &RunClosureIfNotSwappedOut, render_widget_, std::move(closure)));
Dave Tapuska9db80842017-07-24 17:24:26157 } else {
Dave Tapuska65bb6ee82017-09-07 21:23:41158 RunClosureIfNotSwappedOut(render_widget_, std::move(closure));
Dave Tapuska9db80842017-07-24 17:24:26159 }
160}
161
162void WidgetInputHandlerImpl::Release() {
163 if (!main_thread_task_runner_->BelongsToCurrentThread()) {
164 // Close the binding on the compositor thread first before telling the main
165 // thread to delete this object.
166 associated_binding_.Close();
167 binding_.Close();
168 main_thread_task_runner_->PostTask(
tzik1076ee22017-08-25 04:03:57169 FROM_HERE, base::BindOnce(&WidgetInputHandlerImpl::Release,
170 base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:26171 return;
172 }
173 delete this;
174}
175
176} // namespace content