Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(562)

Side by Side Diff: content/public/test/text_input_test_utils.cc

Issue 1948343002: [reland] Browser Side Text Input State Tracking for OOPIF (Aura Only) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/public/test/text_input_test_utils.h"
6
7 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
8 #include "content/browser/renderer_host/render_widget_host_view_base.h"
9 #include "content/browser/renderer_host/render_widget_host_view_base_observer.h"
10 #include "content/browser/renderer_host/text_input_manager.h"
11 #include "content/browser/web_contents/web_contents_impl.h"
12 #include "content/common/text_input_state.h"
13 #include "content/public/browser/render_widget_host_view.h"
14 #include "content/public/browser/web_contents.h"
15 #include "content/public/browser/web_contents_observer.h"
16 #include "content/public/test/test_utils.h"
17 #include "ui/base/ime/input_method.h"
18 #include "ui/base/ime/input_method_observer.h"
19
20 namespace ui {
21 class TextInputClient;
22 }
23
24 namespace content {
25
26 // This class is an observer of TextInputManager associated with the provided
27 // WebContents. An instance of this class is used in TextInputManagerTester to
28 // expose the required API for testing outside of content/.
29 class TextInputManagerTester::InternalObserver
30 : public TextInputManager::Observer,
31 public WebContentsObserver {
32 public:
33 InternalObserver(WebContents* web_contents, TextInputManagerTester* tester)
34 : WebContentsObserver(web_contents),
35 tester_(tester),
36 updated_view_(nullptr),
37 text_input_state_changed_(false) {
38 text_input_manager_ =
39 static_cast<WebContentsImpl*>(web_contents)->GetTextInputManager();
40 DCHECK(!!text_input_manager_);
41 text_input_manager_->AddObserver(this);
42 }
43
44 ~InternalObserver() override {
45 if (text_input_manager_)
46 text_input_manager_->RemoveObserver(this);
47 }
48
49 void set_update_text_input_state_called_callback(
50 const TextInputManagerTester::Callback& callback) {
51 update_text_input_state_callback_ = callback;
52 }
53
54 const RenderWidgetHostView* GetUpdatedView() const { return updated_view_; }
55
56 bool text_input_state_changed() const { return text_input_state_changed_; }
57
58 TextInputManager* text_input_manager() const { return text_input_manager_; }
59
60 // TextInputManager::Observer implementations.
61 void OnUpdateTextInputStateCalled(TextInputManager* text_input_manager,
62 RenderWidgetHostViewBase* updated_view,
63 bool did_change_state) override {
64 if (text_input_manager_ != text_input_manager)
65 return;
66 text_input_state_changed_ = did_change_state;
67 updated_view_ = updated_view;
68 update_text_input_state_callback_.Run(tester_);
69 }
70
71 // WebContentsObserver implementation.
72 void WebContentsDestroyed() override { text_input_manager_ = nullptr; }
73
74 private:
75 TextInputManagerTester* tester_;
76 TextInputManager* text_input_manager_;
77 RenderWidgetHostViewBase* updated_view_;
78 bool text_input_state_changed_;
79 TextInputManagerTester::Callback update_text_input_state_callback_;
80
81 DISALLOW_COPY_AND_ASSIGN(InternalObserver);
82 };
83
84 // This class observers the lifetime of a RenderWidgetHostView. An instance of
Charlie Reis 2016/06/02 22:03:30 nit: observes
EhsanK 2016/06/03 17:00:34 Thanks. This is now officially my signature typo.
85 // this class is used in TestRenderWidgetHostViewDestructionObserver to expose
86 // the required observer API for testing outside of content/.
87 class TestRenderWidgetHostViewDestructionObserver::InternalObserver
88 : public RenderWidgetHostViewBaseObserver {
89 public:
90 InternalObserver(RenderWidgetHostViewBase* view)
91 : view_(view), destroyed_(false) {
92 view->AddObserver(this);
93 }
94
95 ~InternalObserver() override {
96 if (view_)
97 view_->RemoveObserver(this);
98 }
99
100 void Wait() {
101 if (destroyed_)
102 return;
103 message_loop_runner_ = new content::MessageLoopRunner();
104 message_loop_runner_->Run();
105 }
106
107 private:
108 void OnRenderWidgetHostViewBaseDestroyed(
109 RenderWidgetHostViewBase* view) override {
110 DCHECK_EQ(view_, view);
111 destroyed_ = true;
112 view->RemoveObserver(this);
113 view_ = nullptr;
114 if (message_loop_runner_)
115 message_loop_runner_->Quit();
116 }
117
118 RenderWidgetHostViewBase* view_;
119 bool destroyed_;
120 scoped_refptr<MessageLoopRunner> message_loop_runner_;
121
122 DISALLOW_COPY_AND_ASSIGN(InternalObserver);
123 };
124
125 #ifdef USE_AURA
126 class InputMethodObserverAura : public TestInputMethodObserver,
127 public ui::InputMethodObserver {
128 public:
129 explicit InputMethodObserverAura(ui::InputMethod* input_method)
130 : input_method_(input_method), text_input_client_(nullptr) {
131 input_method_->AddObserver(this);
132 }
133
134 ~InputMethodObserverAura() override {
135 if (input_method_)
136 input_method_->RemoveObserver(this);
137 }
138
139 // TestInputMethodObserver implementations.
140 ui::TextInputType GetTextInputTypeFromClient() override {
141 if (text_input_client_)
142 return text_input_client_->GetTextInputType();
143
144 return ui::TEXT_INPUT_TYPE_NONE;
145 }
146
147 void SetOnTextInputTypeChangedCallback(
148 const base::Closure& callback) override {
149 on_text_input_type_changed_callback_ = callback;
150 }
151
152 void SetOnShowImeIfNeededCallback(const base::Closure& callback) override {
153 on_show_ime_if_needed_callback_ = callback;
154 }
155
156 private:
157 // ui::InputMethodObserver implementations.
158 void OnTextInputTypeChanged(const ui::TextInputClient* client) override {
159 text_input_client_ = client;
160 on_text_input_type_changed_callback_.Run();
161 }
162
163 void OnFocus() override {}
164 void OnBlur() override {}
165 void OnCaretBoundsChanged(const ui::TextInputClient* client) override {}
166 void OnTextInputStateChanged(const ui::TextInputClient* client) override {}
167 void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {}
168
169 void OnShowImeIfNeeded() override { on_show_ime_if_needed_callback_.Run(); }
170
171 ui::InputMethod* input_method_;
172 const ui::TextInputClient* text_input_client_;
173 base::Closure on_text_input_type_changed_callback_;
174 base::Closure on_show_ime_if_needed_callback_;
175
176 DISALLOW_COPY_AND_ASSIGN(InputMethodObserverAura);
177 };
178 #endif
179
180 ui::TextInputType GetTextInputTypeFromWebContents(WebContents* web_contents) {
181 const TextInputState* state = static_cast<WebContentsImpl*>(web_contents)
182 ->GetTextInputManager()
183 ->GetTextInputState();
184 return !!state ? state->type : ui::TEXT_INPUT_TYPE_NONE;
185 }
186
187 bool GetTextInputTypeForView(WebContents* web_contents,
188 RenderWidgetHostView* view,
189 ui::TextInputType* type) {
190 TextInputManager* manager =
191 static_cast<WebContentsImpl*>(web_contents)->GetTextInputManager();
192
193 RenderWidgetHostViewBase* view_base =
194 static_cast<RenderWidgetHostViewBase*>(view);
195 if (!manager || !manager->IsRegistered(view_base))
196 return false;
197
198 *type = manager->text_input_state_map_[view_base].type;
199 return true;
200 }
201
202 RenderWidgetHostView* GetActiveViewFromWebContents(WebContents* web_contents) {
203 return static_cast<WebContentsImpl*>(web_contents)
204 ->GetTextInputManager()
205 ->GetActiveView();
206 }
207
208 TextInputManagerTester::TextInputManagerTester(WebContents* web_contents)
209 : observer_(new InternalObserver(web_contents, this)) {}
210
211 TextInputManagerTester::~TextInputManagerTester() {}
212
213 void TextInputManagerTester::SetUpdateTextInputStateCalledCallback(
214 const Callback& callback) {
215 observer_->set_update_text_input_state_called_callback(callback);
216 }
217
218 bool TextInputManagerTester::GetTextInputType(ui::TextInputType* type) {
219 DCHECK(observer_->text_input_manager());
220 const TextInputState* state =
221 observer_->text_input_manager()->GetTextInputState();
222 if (!state)
223 return false;
224 *type = state->type;
225 return true;
226 }
227
228 bool TextInputManagerTester::GetTextInputValue(std::string* value) {
229 DCHECK(observer_->text_input_manager());
230 const TextInputState* state =
231 observer_->text_input_manager()->GetTextInputState();
232 if (!state)
233 return false;
234 *value = state->value;
235 return true;
236 }
237
238 const RenderWidgetHostView* TextInputManagerTester::GetActiveView() {
239 DCHECK(observer_->text_input_manager());
240 return observer_->text_input_manager()->GetActiveView();
241 }
242
243 const RenderWidgetHostView* TextInputManagerTester::GetUpdatedView() {
244 return observer_->GetUpdatedView();
245 }
246
247 bool TextInputManagerTester::IsTextInputStateChanged() {
248 return observer_->text_input_state_changed();
249 }
250
251 TestRenderWidgetHostViewDestructionObserver::
252 TestRenderWidgetHostViewDestructionObserver(RenderWidgetHostView* view)
253 : observer_(
254 new InternalObserver(static_cast<RenderWidgetHostViewBase*>(view))) {}
255
256 TestRenderWidgetHostViewDestructionObserver::
257 ~TestRenderWidgetHostViewDestructionObserver() {}
258
259 void TestRenderWidgetHostViewDestructionObserver::Wait() {
260 observer_->Wait();
261 }
262
263 // TextInputStateSender implementations.
Charlie Reis 2016/06/02 22:03:30 nit: This comment isn't needed.
EhsanK 2016/06/03 17:00:34 Acknowledged.
264 TextInputStateSender::TextInputStateSender(RenderWidgetHostView* view)
265 : text_input_state_(new TextInputState()),
266 view_(static_cast<RenderWidgetHostViewBase*>(view)) {}
267
268 TextInputStateSender::~TextInputStateSender() {}
269
270 void TextInputStateSender::Send() {
271 if (view_)
272 view_->TextInputStateChanged(*text_input_state_);
273 }
274
275 void TextInputStateSender::SetFromCurrentState() {
276 if (view_) {
277 *text_input_state_ =
278 *RenderWidgetHostImpl::From(view_->GetRenderWidgetHost())
279 ->delegate()
280 ->GetTextInputManager()
281 ->GetTextInputState();
282 }
283 }
284
285 void TextInputStateSender::SetType(ui::TextInputType type) {
286 text_input_state_->type = type;
287 }
288
289 void TextInputStateSender::SetMode(ui::TextInputMode mode) {
290 text_input_state_->mode = mode;
291 }
292
293 void TextInputStateSender::SetFlags(int flags) {
294 text_input_state_->flags = flags;
295 }
296
297 void TextInputStateSender::SetCanComposeInline(bool can_compose_inline) {
298 text_input_state_->can_compose_inline = can_compose_inline;
299 }
300
301 void TextInputStateSender::SetShowImeIfNeeded(bool show_ime_if_needed) {
302 text_input_state_->show_ime_if_needed = show_ime_if_needed;
303 }
304
305 void TextInputStateSender::SetIsNonImeChange(bool is_non_ime_change) {
306 text_input_state_->is_non_ime_change = is_non_ime_change;
307 }
308
309 TestInputMethodObserver::TestInputMethodObserver() {}
310
311 TestInputMethodObserver::~TestInputMethodObserver() {}
312
313 // static
314 std::unique_ptr<TestInputMethodObserver> TestInputMethodObserver::Create(
315 WebContents* web_contents) {
316 std::unique_ptr<TestInputMethodObserver> observer;
317
318 #ifdef USE_AURA
319 RenderWidgetHostViewAura* view = static_cast<RenderWidgetHostViewAura*>(
320 web_contents->GetRenderWidgetHostView());
321 observer.reset(new InputMethodObserverAura(view->GetInputMethod()));
322 #endif
323 return observer;
324 }
325
326 } // namespace content
OLDNEW
« content/public/test/text_input_test_utils.h ('K') | « content/public/test/text_input_test_utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698