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

Unified 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: Changed Public Test API Methods to non-const Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: content/public/test/text_input_test_utils.cc
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc
new file mode 100644
index 0000000000000000000000000000000000000000..5a6dd516175b1d973f46ac0fa031840637166159
--- /dev/null
+++ b/content/public/test/text_input_test_utils.cc
@@ -0,0 +1,295 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/test/text_input_test_utils.h"
+
+#include "content/browser/renderer_host/render_widget_host_view_aura.h"
+#include "content/browser/renderer_host/render_widget_host_view_base.h"
+#include "content/browser/renderer_host/render_widget_host_view_base_observer.h"
+#include "content/browser/renderer_host/text_input_manager.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/common/text_input_state.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/test_utils.h"
+#include "ui/base/ime/input_method.h"
+#include "ui/base/ime/input_method_observer.h"
+
+namespace ui {
+class TextInputClient;
+}
+
+namespace content {
+
+namespace {
+
+// The implementation of the TestTextInputManagerObserver which is observing the
+// content::TextInputManager for the given WebContentsImpl.
+class TextInputManagerObserver : public TestTextInputManagerObserver,
+ public TextInputManager::Observer {
+ public:
+ TextInputManagerObserver(WebContents* web_contents)
+ : updated_view_(nullptr), text_input_state_changed_(false) {
+ text_input_manager_ =
+ static_cast<WebContentsImpl*>(web_contents)->GetTextInputManager();
+ DCHECK(!!text_input_manager_);
+ text_input_manager_->AddObserver(this);
+ }
+
+ ~TextInputManagerObserver() override {
+ text_input_manager_->RemoveObserver(this);
+ }
+
+ // TestTextInputManagerObserver implementations.
+ void SetUpdateTextInputStateCalledCallback(
+ const TestTextInputManagerObserver::Callback& callback) override {
+ callback_ = callback;
+ }
+
+ bool GetTextInputValue(std::string* value) override {
+ value->clear();
+ const TextInputState* state = text_input_manager_->GetTextInputState();
+ if (!state)
+ return false;
+ *value = state->value;
+ return true;
+ }
+
+ ui::TextInputType GetTextInputType() override {
+ const TextInputState* state = text_input_manager_->GetTextInputState();
+ return !!state ? state->type : ui::TEXT_INPUT_TYPE_NONE;
+ }
+
+ const RenderWidgetHostView* GetActiveView() override {
+ return text_input_manager_->GetActiveView();
+ }
+
+ const RenderWidgetHostView* GetUpdatedView() override {
+ return updated_view_;
+ }
+
+ bool IsTextInputStateChanged() override {
+ return text_input_state_changed_;
+ }
+
+ private:
+ // TextInputManager::Observer implementations.
+ void OnUpdateTextInputStateCalled(TextInputManager* text_input_manager,
+ RenderWidgetHostViewBase* updated_view,
+ bool did_change_state) override {
+ if (text_input_manager_ != text_input_manager)
+ return;
+ text_input_state_changed_ = did_change_state;
+ updated_view_ = updated_view;
+ callback_.Run(this);
+ }
+
+ content::TextInputManager* text_input_manager_;
+ content::RenderWidgetHostViewBase* updated_view_;
+ bool text_input_state_changed_;
+ TestTextInputManagerObserver::Callback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(TextInputManagerObserver);
+};
+
+class RenderWidgetHostViewBaseObserverImpl
+ : public RenderWidgetHostViewBaseObserver,
+ public RenderWidgetHostViewDestructionObserver {
+ public:
+ RenderWidgetHostViewBaseObserverImpl(RenderWidgetHostViewBase* view)
+ : view_(view), destroyed_(false) {
+ view->AddObserver(this);
+ }
+
+ void Wait() override {
+ if (destroyed_)
+ return;
+ message_loop_runner_ = new content::MessageLoopRunner();
+ message_loop_runner_->Run();
+ }
+
+ private:
+ void OnRenderWidgetHostViewBaseDestroyed(
+ RenderWidgetHostViewBase* view) override {
+ DCHECK_EQ(view_, view);
+ destroyed_ = true;
+ view->RemoveObserver(this);
+ if (message_loop_runner_)
+ message_loop_runner_->Quit();
+ }
+
+ RenderWidgetHostView* view_;
+ bool destroyed_;
+ scoped_refptr<MessageLoopRunner> message_loop_runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewBaseObserverImpl);
+};
+
+#ifdef USE_AURA
+class InputMethodObserverAura : public TestInputMethodObserver,
+ public ui::InputMethodObserver {
+ public:
+ explicit InputMethodObserverAura(ui::InputMethod* input_method)
+ : input_method_(input_method), text_input_client_(nullptr) {
+ input_method_->AddObserver(this);
+ }
+
+ ~InputMethodObserverAura() override {
+ if (input_method_)
+ input_method_->RemoveObserver(this);
+ }
+
+ // TestInputMethodObserver implementations.
+ ui::TextInputType GetTextInputTypeFromClient() const override {
+ if (text_input_client_)
+ return text_input_client_->GetTextInputType();
+
+ return ui::TEXT_INPUT_TYPE_NONE;
+ }
+
+ void SetOnTextInputTypeChangedCallback(
+ const base::Closure& callback) override {
+ on_text_input_type_changed_callback_ = callback;
+ }
+
+ void SetOnShowImeIfNeededCallback(const base::Closure& callback) override {
+ on_show_ime_if_needed_callback_ = callback;
+ }
+
+ private:
+ // ui::InputMethodObserver implementations.
+ void OnTextInputTypeChanged(const ui::TextInputClient* client) override {
+ text_input_client_ = client;
+ on_text_input_type_changed_callback_.Run();
+ }
+
+ void OnFocus() override {}
+ void OnBlur() override {}
+ void OnCaretBoundsChanged(const ui::TextInputClient* client) override {}
+ void OnTextInputStateChanged(const ui::TextInputClient* client) override {}
+ void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {}
+
+ void OnShowImeIfNeeded() override { on_show_ime_if_needed_callback_.Run(); }
+
+ ui::InputMethod* input_method_;
+ const ui::TextInputClient* text_input_client_;
+ base::Closure on_text_input_type_changed_callback_;
+ base::Closure on_show_ime_if_needed_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(InputMethodObserverAura);
+};
+#endif
+
+} // namespace
+
+ui::TextInputType GetTextInputTypeFromWebContents(WebContents* web_contents) {
+ const TextInputState* state = static_cast<WebContentsImpl*>(web_contents)
EhsanK 2016/05/30 15:06:09 I removed the namespace but forgot to move the raw
+ ->GetTextInputManager()
+ ->GetTextInputState();
+ return !!state ? state->type : ui::TEXT_INPUT_TYPE_NONE;
+}
+
+std::unordered_map<RenderWidgetHostView*, ui::TextInputType>
+GetTextInputTypeMapFromWebContents(WebContents* web_contents) {
+ TextInputManager* manager =
+ static_cast<WebContentsImpl*>(web_contents)->GetTextInputManager();
+ std::unordered_map<RenderWidgetHostView*, ui::TextInputType> result;
+ for (auto& pair : manager->text_input_state_map_)
+ result[pair.first] = pair.second.type;
+ return result;
+}
+
+// TestTextInputManagerObserver implementations.
Charlie Reis 2016/05/26 06:22:05 This comment isn't needed. (That's only needed fo
EhsanK 2016/05/30 15:06:09 Acknowledged.
+TestTextInputManagerObserver::TestTextInputManagerObserver() {}
+
+TestTextInputManagerObserver::~TestTextInputManagerObserver() {}
+
+// static
+std::unique_ptr<TestTextInputManagerObserver>
+TestTextInputManagerObserver::Create(WebContents* web_contents) {
+ return base::WrapUnique(new TextInputManagerObserver(web_contents));
+}
+
+// RenderWidgetHostViewDestructionObserver implementations.
+RenderWidgetHostViewDestructionObserver::
+ ~RenderWidgetHostViewDestructionObserver() {}
+
+// static
+std::unique_ptr<RenderWidgetHostViewDestructionObserver>
+RenderWidgetHostViewDestructionObserver::Create(RenderWidgetHostView* view) {
+ return base::WrapUnique(new RenderWidgetHostViewBaseObserverImpl(
+ static_cast<RenderWidgetHostViewBase*>(view)));
+}
+
+RenderWidgetHostView* GetActiveViewFromWebContents(WebContents* web_contents) {
+ return static_cast<WebContentsImpl*>(web_contents)
+ ->GetTextInputManager()
+ ->GetActiveView();
+}
+
+// TextInputStateSender implementations.
+TextInputStateSender::TextInputStateSender(RenderWidgetHostView* view)
+ : text_input_state_(new TextInputState()),
+ view_(static_cast<RenderWidgetHostViewBase*>(view)) {}
+
+TextInputStateSender::~TextInputStateSender() {}
+
+void TextInputStateSender::Send() {
+ if (view_)
+ view_->TextInputStateChanged(*text_input_state_);
+}
+
+void TextInputStateSender::SetFromCurrentState() {
+ if (view_) {
+ *text_input_state_ =
+ *RenderWidgetHostImpl::From(view_->GetRenderWidgetHost())
+ ->delegate()
+ ->GetTextInputManager()
+ ->GetTextInputState();
+ }
+}
+
+void TextInputStateSender::SetType(ui::TextInputType type) {
+ text_input_state_->type = type;
+}
+
+void TextInputStateSender::SetMode(ui::TextInputMode mode) {
+ text_input_state_->mode = mode;
+}
+
+void TextInputStateSender::SetFlags(int flags) {
+ text_input_state_->flags = flags;
+}
+
+void TextInputStateSender::SetCanComposeInline(bool can_compose_inline) {
+ text_input_state_->can_compose_inline = can_compose_inline;
+}
+
+void TextInputStateSender::SetShowImeIfNeeded(bool show_ime_if_needed) {
+ text_input_state_->show_ime_if_needed = show_ime_if_needed;
+}
+
+void TextInputStateSender::SetIsNonImeChange(bool is_non_ime_change) {
+ text_input_state_->is_non_ime_change = is_non_ime_change;
+}
+
+// TestInputMethodObserver implementations.
+TestInputMethodObserver::TestInputMethodObserver() {}
+
+TestInputMethodObserver::~TestInputMethodObserver() {}
+
+// static
+std::unique_ptr<TestInputMethodObserver> TestInputMethodObserver::Create(
+ WebContents* web_contents) {
+ std::unique_ptr<TestInputMethodObserver> observer;
+
+#ifdef USE_AURA
+ RenderWidgetHostViewAura* view = static_cast<RenderWidgetHostViewAura*>(
+ web_contents->GetRenderWidgetHostView());
+ observer.reset(new InputMethodObserverAura(view->GetInputMethod()));
+#endif
+ return observer;
+}
+
+} // namespace content
« 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