Commit 43585930 authored by Xinghui Lu's avatar Xinghui Lu Committed by Commit Bot

Observe text composing events on Android

Password Reuse Detection is not fully functional on Android because it
doesn't capture SetComposingText events and FinishComposingText events.

In this CL, add SetComposingText and FinishComposingText events to
ime_input_event_observers_. Changes on password manager which uses new
APIs is in crrev.com/c/1873144.

Bug: 1006430
Change-Id: Icb0e378d71bc0d1a2b42e70972ee4fd7cd97035c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1824360
Commit-Queue: Xinghui Lu <xinghuilu@chromium.org>
Reviewed-by: default avatarChangwan Ryu <changwan@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarVarun Khaneja <vakh@chromium.org>
Reviewed-by: default avatarVadym Doroshenko <dvadym@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708683}
parent 5063fc08
...@@ -155,8 +155,8 @@ void AddToWidgetInputEventObservers( ...@@ -155,8 +155,8 @@ void AddToWidgetInputEventObservers(
// added, the observer is removed and added again, to ensure that it is added // added, the observer is removed and added again, to ensure that it is added
// only once. // only once.
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
widget_host->RemoveImeTextCommittedEventObserver(observer); widget_host->RemoveImeInputEventObserver(observer);
widget_host->AddImeTextCommittedEventObserver(observer); widget_host->AddImeInputEventObserver(observer);
#endif #endif
widget_host->RemoveInputEventObserver(observer); widget_host->RemoveInputEventObserver(observer);
widget_host->AddInputEventObserver(observer); widget_host->AddInputEventObserver(observer);
......
...@@ -319,7 +319,6 @@ void ImeAdapterAndroid::CommitText(JNIEnv* env, ...@@ -319,7 +319,6 @@ void ImeAdapterAndroid::CommitText(JNIEnv* env,
rwhi->ImeCommitText(text16, ime_text_spans, gfx::Range::InvalidRange(), rwhi->ImeCommitText(text16, ime_text_spans, gfx::Range::InvalidRange(),
relative_cursor_pos); relative_cursor_pos);
rwhi->OnImeTextCommittedEvent(text16);
} }
void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, void ImeAdapterAndroid::FinishComposingText(JNIEnv* env,
......
...@@ -762,23 +762,16 @@ void RenderWidgetHostImpl::SetImportance(ChildProcessImportance importance) { ...@@ -762,23 +762,16 @@ void RenderWidgetHostImpl::SetImportance(ChildProcessImportance importance) {
process_->UpdateClientPriority(this); process_->UpdateClientPriority(this);
} }
void RenderWidgetHostImpl::OnImeTextCommittedEvent( void RenderWidgetHostImpl::AddImeInputEventObserver(
const base::string16& text_str) {
for (auto& observer : ime_text_committed_observers_) {
observer.OnImeTextCommittedEvent(text_str);
}
}
void RenderWidgetHostImpl::AddImeTextCommittedEventObserver(
RenderWidgetHost::InputEventObserver* observer) { RenderWidgetHost::InputEventObserver* observer) {
if (!ime_text_committed_observers_.HasObserver(observer)) { if (!ime_input_event_observers_.HasObserver(observer)) {
ime_text_committed_observers_.AddObserver(observer); ime_input_event_observers_.AddObserver(observer);
} }
} }
void RenderWidgetHostImpl::RemoveImeTextCommittedEventObserver( void RenderWidgetHostImpl::RemoveImeInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) { RenderWidgetHost::InputEventObserver* observer) {
ime_text_committed_observers_.RemoveObserver(observer); ime_input_event_observers_.RemoveObserver(observer);
} }
#endif #endif
...@@ -1955,6 +1948,11 @@ void RenderWidgetHostImpl::ImeSetComposition( ...@@ -1955,6 +1948,11 @@ void RenderWidgetHostImpl::ImeSetComposition(
int selection_end) { int selection_end) {
GetWidgetInputHandler()->ImeSetComposition( GetWidgetInputHandler()->ImeSetComposition(
text, ime_text_spans, replacement_range, selection_start, selection_end); text, ime_text_spans, replacement_range, selection_start, selection_end);
#if defined(OS_ANDROID)
for (auto& observer : ime_input_event_observers_) {
observer.OnImeSetComposingTextEvent(text);
}
#endif
} }
void RenderWidgetHostImpl::ImeCommitText( void RenderWidgetHostImpl::ImeCommitText(
...@@ -1965,10 +1963,20 @@ void RenderWidgetHostImpl::ImeCommitText( ...@@ -1965,10 +1963,20 @@ void RenderWidgetHostImpl::ImeCommitText(
GetWidgetInputHandler()->ImeCommitText(text, ime_text_spans, GetWidgetInputHandler()->ImeCommitText(text, ime_text_spans,
replacement_range, relative_cursor_pos, replacement_range, relative_cursor_pos,
base::OnceClosure()); base::OnceClosure());
#if defined(OS_ANDROID)
for (auto& observer : ime_input_event_observers_) {
observer.OnImeTextCommittedEvent(text);
}
#endif
} }
void RenderWidgetHostImpl::ImeFinishComposingText(bool keep_selection) { void RenderWidgetHostImpl::ImeFinishComposingText(bool keep_selection) {
GetWidgetInputHandler()->ImeFinishComposingText(keep_selection); GetWidgetInputHandler()->ImeFinishComposingText(keep_selection);
#if defined(OS_ANDROID)
for (auto& observer : ime_input_event_observers_) {
observer.OnImeFinishComposingTextEvent();
}
#endif
} }
void RenderWidgetHostImpl::ImeCancelComposition() { void RenderWidgetHostImpl::ImeCancelComposition() {
......
...@@ -349,10 +349,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl ...@@ -349,10 +349,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl
void SetImportance(ChildProcessImportance importance); void SetImportance(ChildProcessImportance importance);
ChildProcessImportance importance() const { return importance_; } ChildProcessImportance importance() const { return importance_; }
void OnImeTextCommittedEvent(const base::string16& text_str); void AddImeInputEventObserver(
void AddImeTextCommittedEventObserver(
RenderWidgetHost::InputEventObserver* observer) override; RenderWidgetHost::InputEventObserver* observer) override;
void RemoveImeTextCommittedEventObserver( void RemoveImeInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) override; RenderWidgetHost::InputEventObserver* observer) override;
#endif #endif
...@@ -832,6 +831,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl ...@@ -832,6 +831,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
ShorterDelayInputEventAckTimeout); ShorterDelayInputEventAckTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, SynchronizeVisualProperties); FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, SynchronizeVisualProperties);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveImeInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, AutoResizeWithScale); FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, AutoResizeWithScale);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest,
AutoResizeWithBrowserInitiatedResize); AutoResizeWithBrowserInitiatedResize);
...@@ -1125,11 +1128,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl ...@@ -1125,11 +1128,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl
input_event_observers_; input_event_observers_;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Ime Text Committed callbacks. This is separated from // Ime input event callbacks. This is separated from input_event_observers_,
// input_event_observers_, because text events are not triggered by input // because not all text events are triggered by input events on Android.
// events on Android.
base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked
ime_text_committed_observers_; ime_input_event_observers_;
#endif #endif
// The observers watching us. // The observers watching us.
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "base/strings/utf_string_conversions.h"
#include "content/browser/renderer_host/render_widget_host_view_android.h" #include "content/browser/renderer_host/render_widget_host_view_android.h"
#include "ui/android/screen_android.h" #include "ui/android/screen_android.h"
#endif #endif
...@@ -296,6 +297,18 @@ FakeRenderFrameMetadataObserver::FakeRenderFrameMetadataObserver( ...@@ -296,6 +297,18 @@ FakeRenderFrameMetadataObserver::FakeRenderFrameMetadataObserver(
: receiver_(std::move(receiver)), : receiver_(std::move(receiver)),
client_remote_(std::move(client_remote)) {} client_remote_(std::move(client_remote)) {}
// MockInputEventObserver -------------------------------------------------
class MockInputEventObserver : public RenderWidgetHost::InputEventObserver {
public:
MOCK_METHOD1(OnInputEvent, void(const blink::WebInputEvent&));
#if defined(OS_ANDROID)
MOCK_METHOD1(OnImeTextCommittedEvent, void(const base::string16& text_str));
MOCK_METHOD1(OnImeSetComposingTextEvent,
void(const base::string16& text_str));
MOCK_METHOD0(OnImeFinishComposingTextEvent, void());
#endif
};
// MockRenderWidgetHostDelegate -------------------------------------------- // MockRenderWidgetHostDelegate --------------------------------------------
class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate { class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
...@@ -2125,4 +2138,46 @@ TEST_F(RenderWidgetHostTest, FlingEventsWhenSomeScrollEventsConsumed) { ...@@ -2125,4 +2138,46 @@ TEST_F(RenderWidgetHostTest, FlingEventsWhenSomeScrollEventsConsumed) {
EXPECT_NE(0u, dispatched_events.size()); EXPECT_NE(0u, dispatched_events.size());
} }
TEST_F(RenderWidgetHostTest, AddAndRemoveInputEventObserver) {
MockInputEventObserver observer;
// Add InputEventObserver.
host_->AddInputEventObserver(&observer);
// Confirm OnInputEvent is triggered.
NativeWebKeyboardEvent native_event(WebInputEvent::Type::kChar, 0,
GetNextSimulatedEventTime());
ui::LatencyInfo latency_info = ui::LatencyInfo();
EXPECT_CALL(observer, OnInputEvent(_)).Times(1);
host_->DispatchInputEventWithLatencyInfo(native_event, &latency_info);
// Remove InputEventObserver.
host_->RemoveInputEventObserver(&observer);
// Confirm InputEventObserver is removed.
EXPECT_CALL(observer, OnInputEvent(_)).Times(0);
latency_info = ui::LatencyInfo();
host_->DispatchInputEventWithLatencyInfo(native_event, &latency_info);
}
#if defined(OS_ANDROID)
TEST_F(RenderWidgetHostTest, AddAndRemoveImeInputEventObserver) {
MockInputEventObserver observer;
// Add ImeInputEventObserver.
host_->AddImeInputEventObserver(&observer);
// Confirm ImeFinishComposingTextEvent is triggered.
EXPECT_CALL(observer, OnImeFinishComposingTextEvent()).Times(1);
host_->ImeFinishComposingText(true);
// Remove ImeInputEventObserver.
host_->RemoveImeInputEventObserver(&observer);
// Confirm ImeInputEventObserver is removed.
EXPECT_CALL(observer, OnImeFinishComposingTextEvent()).Times(0);
host_->ImeFinishComposingText(true);
}
#endif
} // namespace content } // namespace content
...@@ -241,10 +241,20 @@ class CONTENT_EXPORT RenderWidgetHost : public IPC::Sender { ...@@ -241,10 +241,20 @@ class CONTENT_EXPORT RenderWidgetHost : public IPC::Sender {
virtual void OnInputEventAck(InputEventAckSource source, virtual void OnInputEventAck(InputEventAckSource source,
InputEventAckState state, InputEventAckState state,
const blink::WebInputEvent&) {} const blink::WebInputEvent&) {}
// Key events are not triggered through InputEvent on Android.
// This function is triggered by IME commitText.
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Not all key events are triggered through InputEvent on Android.
// InputEvents are only triggered when user typed in through number bar on
// Android keyboard. This function is triggered when text is committed in
// input form.
virtual void OnImeTextCommittedEvent(const base::string16& text_str) {} virtual void OnImeTextCommittedEvent(const base::string16& text_str) {}
// This function is triggered when composing text is updated. Note that
// text_str contains all text that is currently under composition rather
// than updated text only.
virtual void OnImeSetComposingTextEvent(const base::string16& text_str) {}
// This function is triggered when composing text is filled into the input
// form.
virtual void OnImeFinishComposingTextEvent() {}
#endif #endif
}; };
...@@ -253,11 +263,9 @@ class CONTENT_EXPORT RenderWidgetHost : public IPC::Sender { ...@@ -253,11 +263,9 @@ class CONTENT_EXPORT RenderWidgetHost : public IPC::Sender {
virtual void RemoveInputEventObserver(InputEventObserver* observer) = 0; virtual void RemoveInputEventObserver(InputEventObserver* observer) = 0;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Add/remove an Ime text committed event observer. // Add/remove an Ime input event observer.
virtual void AddImeTextCommittedEventObserver( virtual void AddImeInputEventObserver(InputEventObserver* observer) = 0;
RenderWidgetHost::InputEventObserver* observer) = 0; virtual void RemoveImeInputEventObserver(InputEventObserver* observer) = 0;
virtual void RemoveImeTextCommittedEventObserver(
InputEventObserver* observer) = 0;
#endif #endif
// Add and remove observers for widget host events. The order in which // Add and remove observers for widget host events. The order in which
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment