blob: b731df445665da4496bf1637a7b983e8d30b449a [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"
11#include "content/common/input_messages.h"
12#include "content/renderer/gpu/render_widget_compositor.h"
13#include "content/renderer/ime_event_guard.h"
14#include "content/renderer/input/widget_input_handler_manager.h"
15#include "content/renderer/render_thread_impl.h"
16#include "content/renderer/render_widget.h"
17#include "third_party/WebKit/public/platform/Platform.h"
18#include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h"
19#include "third_party/WebKit/public/platform/WebKeyboardEvent.h"
20#include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h"
21#include "third_party/WebKit/public/web/WebLocalFrame.h"
22
23namespace content {
24
25namespace {
26
Ryan Landay9387aa92017-08-16 23:16:5227blink::WebImeTextSpan::Type ConvertUiImeTextSpanTypeToBlinkType(
28 ui::ImeTextSpan::Type type) {
29 switch (type) {
30 case ui::ImeTextSpan::Type::kComposition:
31 return blink::WebImeTextSpan::Type::kComposition;
32 case ui::ImeTextSpan::Type::kSuggestion:
33 return blink::WebImeTextSpan::Type::kSuggestion;
34 }
35
36 NOTREACHED();
37 return blink::WebImeTextSpan::Type::kComposition;
38}
39
Ryan Landay9e42fd742017-08-12 01:59:1140std::vector<blink::WebImeTextSpan> ConvertUIImeTextSpansToBlinkImeTextSpans(
41 const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
42 std::vector<blink::WebImeTextSpan> ime_text_spans;
43 for (const auto& ime_text_span : ui_ime_text_spans) {
44 blink::WebImeTextSpan blink_ime_text_span(
Ryan Landay9387aa92017-08-16 23:16:5245 ConvertUiImeTextSpanTypeToBlinkType(ime_text_span.type),
Ryan Landay9e42fd742017-08-12 01:59:1146 ime_text_span.start_offset, ime_text_span.end_offset,
Ryan Landayaf7a6022017-08-15 00:31:0147 ime_text_span.underline_color, ime_text_span.thick,
Ryan Landay9387aa92017-08-16 23:16:5248 ime_text_span.background_color,
49 ime_text_span.suggestion_highlight_color, ime_text_span.suggestions);
Ryan Landay9e42fd742017-08-12 01:59:1150 ime_text_spans.push_back(blink_ime_text_span);
Dave Tapuska9db80842017-07-24 17:24:2651 }
Ryan Landay9e42fd742017-08-12 01:59:1152 return ime_text_spans;
Dave Tapuska9db80842017-07-24 17:24:2653}
Ryan Landay9387aa92017-08-16 23:16:5254
Dave Tapuska9db80842017-07-24 17:24:2655} // namespace
56
57WidgetInputHandlerImpl::WidgetInputHandlerImpl(
58 scoped_refptr<WidgetInputHandlerManager> manager,
59 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
60 scoped_refptr<MainThreadEventQueue> input_event_queue,
61 base::WeakPtr<RenderWidget> render_widget)
62 : main_thread_task_runner_(main_thread_task_runner),
63 input_handler_manager_(manager),
64 input_event_queue_(input_event_queue),
65 render_widget_(render_widget),
66 binding_(this),
67 associated_binding_(this) {}
68
69WidgetInputHandlerImpl::~WidgetInputHandlerImpl() {}
70
71void WidgetInputHandlerImpl::SetAssociatedBinding(
72 mojom::WidgetInputHandlerAssociatedRequest request) {
73 associated_binding_.Bind(std::move(request));
74 associated_binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5775 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2676}
77
78void WidgetInputHandlerImpl::SetBinding(
79 mojom::WidgetInputHandlerRequest request) {
80 binding_.Bind(std::move(request));
81 binding_.set_connection_error_handler(
tzik1076ee22017-08-25 04:03:5782 base::BindOnce(&WidgetInputHandlerImpl::Release, base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:2683}
84
85void WidgetInputHandlerImpl::SetFocus(bool focused) {
86 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5787 base::BindOnce(&RenderWidget::OnSetFocus, render_widget_, focused));
Dave Tapuska9db80842017-07-24 17:24:2688}
89
90void WidgetInputHandlerImpl::MouseCaptureLost() {
91 RunOnMainThread(
tzik1076ee22017-08-25 04:03:5792 base::BindOnce(&RenderWidget::OnMouseCaptureLost, render_widget_));
Dave Tapuska9db80842017-07-24 17:24:2693}
94
95void WidgetInputHandlerImpl::SetEditCommandsForNextKeyEvent(
96 const std::vector<EditCommand>& commands) {
tzik1076ee22017-08-25 04:03:5797 RunOnMainThread(
98 base::BindOnce(&RenderWidget::OnSetEditCommandsForNextKeyEvent,
99 render_widget_, commands));
Dave Tapuska9db80842017-07-24 17:24:26100}
101
102void WidgetInputHandlerImpl::CursorVisibilityChanged(bool visible) {
tzik1076ee22017-08-25 04:03:57103 RunOnMainThread(base::BindOnce(&RenderWidget::OnCursorVisibilityChange,
104 render_widget_, visible));
Dave Tapuska9db80842017-07-24 17:24:26105}
106
107void WidgetInputHandlerImpl::ImeSetComposition(
108 const base::string16& text,
Ryan Landay9e42fd742017-08-12 01:59:11109 const std::vector<ui::ImeTextSpan>& ime_text_spans,
Dave Tapuska9db80842017-07-24 17:24:26110 const gfx::Range& range,
111 int32_t start,
112 int32_t end) {
Ryan Landay9e42fd742017-08-12 01:59:11113 RunOnMainThread(
tzik1076ee22017-08-25 04:03:57114 base::BindOnce(&RenderWidget::OnImeSetComposition, render_widget_, text,
115 ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans),
116 range, start, end));
Dave Tapuska9db80842017-07-24 17:24:26117}
118
119void 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,
123 int32_t relative_cursor_position) {
Ryan Landay9e42fd742017-08-12 01:59:11124 RunOnMainThread(
tzik1076ee22017-08-25 04:03:57125 base::BindOnce(&RenderWidget::OnImeCommitText, render_widget_, text,
126 ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans),
127 range, relative_cursor_position));
Dave Tapuska9db80842017-07-24 17:24:26128}
129
130void WidgetInputHandlerImpl::ImeFinishComposingText(bool keep_selection) {
tzik1076ee22017-08-25 04:03:57131 RunOnMainThread(base::BindOnce(&RenderWidget::OnImeFinishComposingText,
132 render_widget_, keep_selection));
Dave Tapuska9db80842017-07-24 17:24:26133}
134
135void WidgetInputHandlerImpl::RequestTextInputStateUpdate() {
tzik1076ee22017-08-25 04:03:57136 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestTextInputStateUpdate,
137 render_widget_));
Dave Tapuska9db80842017-07-24 17:24:26138}
139
140void WidgetInputHandlerImpl::RequestCompositionUpdates(bool immediate_request,
141 bool monitor_request) {
tzik1076ee22017-08-25 04:03:57142 RunOnMainThread(base::BindOnce(&RenderWidget::OnRequestCompositionUpdates,
143 render_widget_, immediate_request,
144 monitor_request));
Dave Tapuska9db80842017-07-24 17:24:26145}
146
147void WidgetInputHandlerImpl::DispatchEvent(
148 std::unique_ptr<content::InputEvent> event,
149 DispatchEventCallback callback) {
150 if (!event || !event->web_event) {
151 return;
152 }
153 input_handler_manager_->DispatchEvent(std::move(event), std::move(callback));
154}
155
156void WidgetInputHandlerImpl::DispatchNonBlockingEvent(
157 std::unique_ptr<content::InputEvent> event) {
158 DispatchEvent(std::move(event), DispatchEventCallback());
159}
160
161void WidgetInputHandlerImpl::RunOnMainThread(base::OnceClosure closure) {
162 if (input_event_queue_) {
163 input_event_queue_->QueueClosure(std::move(closure));
164 } else {
165 std::move(closure).Run();
166 }
167}
168
169void WidgetInputHandlerImpl::Release() {
170 if (!main_thread_task_runner_->BelongsToCurrentThread()) {
171 // Close the binding on the compositor thread first before telling the main
172 // thread to delete this object.
173 associated_binding_.Close();
174 binding_.Close();
175 main_thread_task_runner_->PostTask(
tzik1076ee22017-08-25 04:03:57176 FROM_HERE, base::BindOnce(&WidgetInputHandlerImpl::Release,
177 base::Unretained(this)));
Dave Tapuska9db80842017-07-24 17:24:26178 return;
179 }
180 delete this;
181}
182
183} // namespace content