diff options
author | yukawa <yukawa@chromium.org> | 2014-10-27 10:09:30 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-27 17:10:02 +0000 |
commit | 5f21c6afc5ae1a50834dc4b228807a266b2ee81f (patch) | |
tree | be926d7d695fcf5cc5d45b10846922cc085badf8 | |
parent | 91f348a439e746aca1ac8e377ad3b7b5472e1ba6 (diff) | |
download | chromium_src-5f21c6afc5ae1a50834dc4b228807a266b2ee81f.zip chromium_src-5f21c6afc5ae1a50834dc4b228807a266b2ee81f.tar.gz chromium_src-5f21c6afc5ae1a50834dc4b228807a266b2ee81f.tar.bz2 |
Plumb composition character bounds for Android 5.0
This is a groundwork to support CursorAnchorInfo API for Android 5.0. No user visible change is intended with this CL.
With this CL, ImeCompositionRangeChanged event will be routed from the renderer to the browser in Android 5.0 and above. The underlying functionality has been widely used in desktop OSes for years. There should be no performance impact for existing in Android 4.4 and prior version. Performance impact on Android 5.0 devices will be tracked as Issue 427090. Actual plumbing from native to Java layer will be handled in subsequent CLs.
BUG=424866, 427090
TEST=Manually done on Nexus 7 Build/LPX13D
Review URL: https://codereview.chromium.org/671503005
Cr-Commit-Position: refs/heads/master@{#301384}
13 files changed, 37 insertions, 18 deletions
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc index 0dc1ba8..ab1bff8 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.cc +++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc @@ -116,7 +116,7 @@ void RenderWidgetHostViewChildFrame::ImeCancelComposition() { NOTREACHED(); } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void RenderWidgetHostViewChildFrame::ImeCompositionRangeChanged( const gfx::Range& range, const std::vector<gfx::Rect>& character_bounds) { diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h index 1834c38..a10c78e 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.h +++ b/content/browser/frame_host/render_widget_host_view_child_frame.h @@ -69,7 +69,7 @@ class CONTENT_EXPORT RenderWidgetHostViewChildFrame bool can_compose_inline, int flags) override; void ImeCancelComposition() override; -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void ImeCompositionRangeChanged( const gfx::Range& range, const std::vector<gfx::Rect>& character_bounds) override; diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 06c1163..7e9dc75 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -473,7 +473,7 @@ bool RenderWidgetHostImpl::OnMessageReceived(const IPC::Message &msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowDestroyed, OnWindowlessPluginDummyWindowDestroyed) #endif -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) IPC_MESSAGE_HANDLER(InputHostMsg_ImeCompositionRangeChanged, OnImeCompositionRangeChanged) #endif @@ -1688,7 +1688,7 @@ void RenderWidgetHostImpl::OnTextInputTypeChanged( view_->TextInputTypeChanged(type, input_mode, can_compose_inline, flags); } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void RenderWidgetHostImpl::OnImeCompositionRangeChanged( const gfx::Range& range, const std::vector<gfx::Rect>& character_bounds) { diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 8423beb..41df865 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -601,7 +601,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl bool can_compose_inline, int flags); -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void OnImeCompositionRangeChanged( const gfx::Range& range, const std::vector<gfx::Rect>& character_bounds); diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index af88a1b..31a4b2d 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -760,6 +760,12 @@ void RenderWidgetHostViewAndroid::ImeCancelComposition() { ime_adapter_android_.CancelComposition(); } +void RenderWidgetHostViewAndroid::ImeCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) { + // TODO(yukawa): Implement this. +} + void RenderWidgetHostViewAndroid::FocusedNodeChanged(bool is_editable_node) { ime_adapter_android_.FocusedNodeChanged(is_editable_node); if (selection_controller_) diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 8433a96..48d6536 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -130,6 +130,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid bool can_compose_inline, int flags) override; virtual void ImeCancelComposition() override; + virtual void ImeCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) override; virtual void FocusedNodeChanged(bool is_editable_node) override; virtual void RenderProcessGone(base::TerminationStatus status, int error_code) override; diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index b7e24b5..e6e3ec6 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -338,7 +338,7 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, const NativeWebKeyboardEvent& event) = 0; #endif -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) // Updates the range of the marked text in an IME composition. virtual void ImeCompositionRangeChanged( const gfx::Range& range, diff --git a/content/common/input_messages.h b/content/common/input_messages.h index 1827212..9953035 100644 --- a/content/common/input_messages.h +++ b/content/common/input_messages.h @@ -240,10 +240,11 @@ IPC_MESSAGE_ROUTED1(InputHostMsg_DidOverscroll, // Required for cancelling an ongoing input method composition. IPC_MESSAGE_ROUTED0(InputHostMsg_ImeCancelComposition) -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) // On Mac and Aura IME can request composition character bounds // synchronously (see crbug.com/120597). This IPC message sends the character // bounds after every composition change to always have correct bound info. +// This IPC message is also used on Android 5.0 and above. IPC_MESSAGE_ROUTED2(InputHostMsg_ImeCompositionRangeChanged, gfx::Range /* composition range */, std::vector<gfx::Rect> /* character bounds */) diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 4ce5772..9f52327 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -3739,7 +3739,7 @@ void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) { RenderWidget::GetSelectionBounds(start, end); } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void RenderViewImpl::GetCompositionCharacterBounds( std::vector<gfx::Rect>* bounds) { DCHECK(bounds); diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 530210d..67adc19 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -523,7 +523,7 @@ class CONTENT_EXPORT RenderViewImpl void OnOrientationChange() override; ui::TextInputType GetTextInputType() override; void GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) override; -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void GetCompositionCharacterBounds( std::vector<gfx::Rect>* character_bounds) override; void GetCompositionRange(gfx::Range* range) override; diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 6644306..242f5a2 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -77,6 +77,7 @@ #if defined(OS_ANDROID) #include <android/keycodes.h> +#include "base/android/build_info.h" #include "content/renderer/android/synchronous_compositor_factory.h" #endif @@ -1538,7 +1539,7 @@ void RenderWidget::OnImeSetComposition( // sure we are in a consistent state. Send(new InputHostMsg_ImeCancelComposition(routing_id())); } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) UpdateCompositionInfo(true); #endif } @@ -1557,7 +1558,7 @@ void RenderWidget::OnImeConfirmComposition(const base::string16& text, else webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); handling_input_event_ = false; -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) UpdateCompositionInfo(true); #endif } @@ -1889,7 +1890,7 @@ void RenderWidget::UpdateSelectionBounds() { } } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) UpdateCompositionInfo(false); #endif } @@ -1944,8 +1945,15 @@ ui::TextInputType RenderWidget::GetTextInputType() { return ui::TEXT_INPUT_TYPE_NONE; } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void RenderWidget::UpdateCompositionInfo(bool should_update_range) { +#if defined(OS_ANDROID) + // Sending composition info makes sense only in Lollipop (API level 21) + // and above due to the API availability. + if (base::android::BuildInfo::GetInstance()->sdk_int() < 21) + return; +#endif + gfx::Range range = gfx::Range(); if (should_update_range) { GetCompositionRange(&range); @@ -2037,7 +2045,7 @@ void RenderWidget::resetInputMethod() { Send(new InputHostMsg_ImeCancelComposition(routing_id())); } -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) UpdateCompositionInfo(true); #endif } diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 6b17db7..1ee18a4 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h @@ -292,10 +292,11 @@ class CONTENT_EXPORT RenderWidget void UpdateTextInputState(ShowIme show_ime, ChangeSource change_source); #endif -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) // Checks if the composition range or composition character bounds have been // changed. If they are changed, the new value will be sent to the browser - // process. + // process. This method does nothing when the browser process is not able to + // handle composition range and composition character bounds. void UpdateCompositionInfo(bool should_update_range); #endif @@ -471,7 +472,7 @@ class CONTENT_EXPORT RenderWidget virtual ui::TextInputType WebKitToUiTextInputType( blink::WebTextInputType type); -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) // Override point to obtain that the current composition character bounds. // In the case of surrogate pairs, the character is treated as two characters: // the bounds for first character is actual one, and the bounds for second diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h index 3007276..4df7036 100644 --- a/content/test/test_render_view_host.h +++ b/content/test/test_render_view_host.h @@ -100,7 +100,7 @@ class TestRenderWidgetHostView : public RenderWidgetHostViewBase { bool can_compose_inline, int flags) override {} void ImeCancelComposition() override {} -#if defined(OS_MACOSX) || defined(USE_AURA) +#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) void ImeCompositionRangeChanged( const gfx::Range& range, const std::vector<gfx::Rect>& character_bounds) override {} |