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

Side by Side Diff: content/browser/android/ime_adapter_android.cc

Issue 2792063003: Factor out RenderWidgetHostConnector (Closed)
Patch Set: format Created 3 years, 8 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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/ime_adapter_android.h" 5 #include "content/browser/android/ime_adapter_android.h"
6 6
7 #include <android/input.h> 7 #include <android/input.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/android/jni_android.h" 11 #include "base/android/jni_android.h"
12 #include "base/android/jni_array.h" 12 #include "base/android/jni_array.h"
13 #include "base/android/jni_string.h" 13 #include "base/android/jni_string.h"
14 #include "base/android/scoped_java_ref.h" 14 #include "base/android/scoped_java_ref.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "content/browser/frame_host/interstitial_page_impl.h"
18 #include "content/browser/frame_host/render_frame_host_impl.h" 17 #include "content/browser/frame_host/render_frame_host_impl.h"
19 #include "content/browser/renderer_host/render_view_host_delegate.h" 18 #include "content/browser/renderer_host/render_view_host_delegate.h"
20 #include "content/browser/renderer_host/render_widget_host_impl.h" 19 #include "content/browser/renderer_host/render_widget_host_impl.h"
21 #include "content/browser/renderer_host/render_widget_host_view_android.h" 20 #include "content/browser/renderer_host/render_widget_host_view_android.h"
22 #include "content/browser/web_contents/web_contents_impl.h"
23 #include "content/common/input_messages.h" 21 #include "content/common/input_messages.h"
24 #include "content/common/view_messages.h" 22 #include "content/common/view_messages.h"
25 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/native_web_keyboard_event.h" 24 #include "content/public/browser/native_web_keyboard_event.h"
27 #include "content/public/browser/web_contents.h" 25 #include "content/public/browser/web_contents.h"
28 #include "jni/ImeAdapter_jni.h" 26 #include "jni/ImeAdapter_jni.h"
29 #include "third_party/WebKit/public/platform/WebInputEvent.h" 27 #include "third_party/WebKit/public/platform/WebInputEvent.h"
30 #include "third_party/WebKit/public/platform/WebTextInputType.h" 28 #include "third_party/WebKit/public/platform/WebTextInputType.h"
31 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" 29 #include "third_party/WebKit/public/web/WebCompositionUnderline.h"
32 30
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 reinterpret_cast<std::vector<blink::WebCompositionUnderline>*>( 106 reinterpret_cast<std::vector<blink::WebCompositionUnderline>*>(
109 underlines_ptr); 107 underlines_ptr);
110 underlines->push_back(blink::WebCompositionUnderline( 108 underlines->push_back(blink::WebCompositionUnderline(
111 static_cast<unsigned>(start), static_cast<unsigned>(end), SK_ColorBLACK, 109 static_cast<unsigned>(start), static_cast<unsigned>(end), SK_ColorBLACK,
112 false, SK_ColorTRANSPARENT)); 110 false, SK_ColorTRANSPARENT));
113 } 111 }
114 112
115 ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env, 113 ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env,
116 const JavaParamRef<jobject>& obj, 114 const JavaParamRef<jobject>& obj,
117 WebContents* web_contents) 115 WebContents* web_contents)
118 : WebContentsObserver(web_contents), rwhva_(nullptr) { 116 : RenderProcessConnector(web_contents) {
119 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, obj); 117 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, obj);
120 } 118 }
121 119
122 ImeAdapterAndroid::~ImeAdapterAndroid() { 120 ImeAdapterAndroid::~ImeAdapterAndroid() {
123 JNIEnv* env = AttachCurrentThread(); 121 JNIEnv* env = AttachCurrentThread();
124 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); 122 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env);
125 if (!obj.is_null()) 123 if (!obj.is_null())
126 Java_ImeAdapter_destroy(env, obj); 124 Java_ImeAdapter_destroy(env, obj);
127 125 UpdateRenderProcessConnection(rwhva(), nullptr);
boliu 2017/04/07 18:47:10 I think RenderProcessConnector can do this part as
Jinsuk Kim 2017/04/10 05:11:47 Good catch.. done.
128 UpdateRenderProcessConnection(nullptr);
129 }
130
131 RenderWidgetHostViewAndroid* ImeAdapterAndroid::GetRenderWidgetHostViewAndroid()
132 const {
133 RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
134 WebContentsImpl* web_contents_impl =
135 static_cast<WebContentsImpl*>(web_contents());
136 if (web_contents_impl->ShowingInterstitialPage()) {
137 rwhv = web_contents_impl->GetInterstitialPage()
138 ->GetMainFrame()
139 ->GetRenderViewHost()
140 ->GetWidget()
141 ->GetView();
142 }
143 return static_cast<RenderWidgetHostViewAndroid*>(rwhv);
144 } 126 }
145 127
146 void ImeAdapterAndroid::RenderViewReady() { 128 void ImeAdapterAndroid::RenderViewReady() {
147 UpdateRenderProcessConnection(GetRenderWidgetHostViewAndroid()); 129 RenderProcessConnector::RenderViewReady();
boliu 2017/04/07 18:47:10 shouldn't this just be the first call of UpdateRen
Jinsuk Kim 2017/04/10 05:11:47 In the new patch it is not necessary to override |
148
149 JNIEnv* env = AttachCurrentThread(); 130 JNIEnv* env = AttachCurrentThread();
150 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); 131 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env);
151 if (!obj.is_null()) 132 if (!obj.is_null())
152 Java_ImeAdapter_onConnectedToRenderProcess(env, obj); 133 Java_ImeAdapter_onConnectedToRenderProcess(env, obj);
153 } 134 }
154 135
155 void ImeAdapterAndroid::RenderViewHostChanged(RenderViewHost* old_host,
156 RenderViewHost* new_host) {
157 if (new_host) {
158 UpdateRenderProcessConnection(static_cast<RenderWidgetHostViewAndroid*>(
159 new_host->GetWidget()->GetView()));
160 } else {
161 UpdateRenderProcessConnection(nullptr);
162 }
163 }
164
165 void ImeAdapterAndroid::DidAttachInterstitialPage() {
166 UpdateRenderProcessConnection(GetRenderWidgetHostViewAndroid());
167 }
168
169 void ImeAdapterAndroid::DidDetachInterstitialPage() {
170 UpdateRenderProcessConnection(GetRenderWidgetHostViewAndroid());
171 }
172
173 void ImeAdapterAndroid::WebContentsDestroyed() {
174 delete this;
175 }
176
177 void ImeAdapterAndroid::UpdateRenderProcessConnection( 136 void ImeAdapterAndroid::UpdateRenderProcessConnection(
137 RenderWidgetHostViewAndroid* old_rwhva,
178 RenderWidgetHostViewAndroid* new_rwhva) { 138 RenderWidgetHostViewAndroid* new_rwhva) {
179 if (rwhva_.get() == new_rwhva) 139 if (old_rwhva)
180 return; 140 old_rwhva->set_ime_adapter(nullptr);
181 if (rwhva_) 141 if (new_rwhva)
182 rwhva_->set_ime_adapter(nullptr);
183 if (new_rwhva) {
184 new_rwhva->set_ime_adapter(this); 142 new_rwhva->set_ime_adapter(this);
185 rwhva_ = new_rwhva->GetWeakPtrAndroid();
186 } else {
187 rwhva_.reset();
188 }
189 } 143 }
190 144
191 void ImeAdapterAndroid::UpdateState(const TextInputState& state) { 145 void ImeAdapterAndroid::UpdateState(const TextInputState& state) {
192 JNIEnv* env = AttachCurrentThread(); 146 JNIEnv* env = AttachCurrentThread();
193 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); 147 ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env);
194 if (obj.is_null()) 148 if (obj.is_null())
195 return; 149 return;
196 150
197 ScopedJavaLocalRef<jstring> jstring_text = 151 ScopedJavaLocalRef<jstring> jstring_text =
198 ConvertUTF8ToJavaString(env, state.value); 152 ConvertUTF8ToJavaString(env, state.value);
199 Java_ImeAdapter_updateState(env, obj, static_cast<int>(state.type), 153 Java_ImeAdapter_updateState(env, obj, static_cast<int>(state.type),
200 state.flags, state.mode, state.show_ime_if_needed, 154 state.flags, state.mode, state.show_ime_if_needed,
201 jstring_text, state.selection_start, 155 jstring_text, state.selection_start,
202 state.selection_end, state.composition_start, 156 state.selection_end, state.composition_start,
203 state.composition_end, state.reply_to_request); 157 state.composition_end, state.reply_to_request);
204 } 158 }
205 159
206 bool ImeAdapterAndroid::SendKeyEvent( 160 bool ImeAdapterAndroid::SendKeyEvent(
207 JNIEnv* env, 161 JNIEnv* env,
208 const JavaParamRef<jobject>&, 162 const JavaParamRef<jobject>&,
209 const JavaParamRef<jobject>& original_key_event, 163 const JavaParamRef<jobject>& original_key_event,
210 int type, 164 int type,
211 int modifiers, 165 int modifiers,
212 jlong time_ms, 166 jlong time_ms,
213 int key_code, 167 int key_code,
214 int scan_code, 168 int scan_code,
215 bool is_system_key, 169 bool is_system_key,
216 int unicode_char) { 170 int unicode_char) {
217 if (!rwhva_) 171 if (!rwhva())
218 return false; 172 return false;
219 NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent( 173 NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent(
220 env, original_key_event, type, modifiers, time_ms, key_code, scan_code, 174 env, original_key_event, type, modifiers, time_ms, key_code, scan_code,
221 is_system_key, unicode_char); 175 is_system_key, unicode_char);
222 rwhva_->SendKeyEvent(event); 176 rwhva()->SendKeyEvent(event);
223 return true; 177 return true;
224 } 178 }
225 179
226 void ImeAdapterAndroid::SetComposingText(JNIEnv* env, 180 void ImeAdapterAndroid::SetComposingText(JNIEnv* env,
227 const JavaParamRef<jobject>& obj, 181 const JavaParamRef<jobject>& obj,
228 const JavaParamRef<jobject>& text, 182 const JavaParamRef<jobject>& text,
229 const JavaParamRef<jstring>& text_str, 183 const JavaParamRef<jstring>& text_str,
230 int relative_cursor_pos) { 184 int relative_cursor_pos) {
231 RenderWidgetHostImpl* rwhi = GetFocusedWidget(); 185 RenderWidgetHostImpl* rwhi = GetFocusedWidget();
232 if (!rwhi) 186 if (!rwhi)
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 bool monitor_request) { 347 bool monitor_request) {
394 RenderWidgetHostImpl* rwhi = GetFocusedWidget(); 348 RenderWidgetHostImpl* rwhi = GetFocusedWidget();
395 if (!rwhi) 349 if (!rwhi)
396 return; 350 return;
397 rwhi->Send(new InputMsg_RequestCompositionUpdates( 351 rwhi->Send(new InputMsg_RequestCompositionUpdates(
398 rwhi->GetRoutingID(), immediate_request, monitor_request)); 352 rwhi->GetRoutingID(), immediate_request, monitor_request));
399 } 353 }
400 354
401 RenderWidgetHostImpl* ImeAdapterAndroid::GetFocusedWidget() { 355 RenderWidgetHostImpl* ImeAdapterAndroid::GetFocusedWidget() {
402 DCHECK_CURRENTLY_ON(BrowserThread::UI); 356 DCHECK_CURRENTLY_ON(BrowserThread::UI);
403 return rwhva_ ? rwhva_->GetFocusedWidget() : nullptr; 357 return rwhva() ? rwhva()->GetFocusedWidget() : nullptr;
404 } 358 }
405 359
406 RenderFrameHost* ImeAdapterAndroid::GetFocusedFrame() { 360 RenderFrameHost* ImeAdapterAndroid::GetFocusedFrame() {
407 DCHECK_CURRENTLY_ON(BrowserThread::UI); 361 DCHECK_CURRENTLY_ON(BrowserThread::UI);
408 // We get the focused frame from the WebContents of the page. Although 362 // We get the focused frame from the WebContents of the page. Although
409 // |rwhva_->GetFocusedWidget()| does a similar thing, there is no direct way 363 // |rwhva()->GetFocusedWidget()| does a similar thing, there is no direct way
410 // to get a RenderFrameHost from its RWH. 364 // to get a RenderFrameHost from its RWH.
411 if (!rwhva_) 365 if (!rwhva())
412 return nullptr; 366 return nullptr;
413 RenderWidgetHostImpl* rwh = 367 RenderWidgetHostImpl* rwh =
414 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost()); 368 RenderWidgetHostImpl::From(rwhva()->GetRenderWidgetHost());
415 if (!rwh || !rwh->delegate()) 369 if (!rwh || !rwh->delegate())
416 return nullptr; 370 return nullptr;
417 371
418 if (auto* contents = rwh->delegate()->GetAsWebContents()) 372 if (auto* contents = rwh->delegate()->GetAsWebContents())
419 return contents->GetFocusedFrame(); 373 return contents->GetFocusedFrame();
420 374
421 return nullptr; 375 return nullptr;
422 } 376 }
423 377
424 std::vector<blink::WebCompositionUnderline> 378 std::vector<blink::WebCompositionUnderline>
425 ImeAdapterAndroid::GetUnderlinesFromSpans( 379 ImeAdapterAndroid::GetUnderlinesFromSpans(
426 JNIEnv* env, 380 JNIEnv* env,
427 const base::android::JavaParamRef<jobject>& obj, 381 const base::android::JavaParamRef<jobject>& obj,
428 const base::android::JavaParamRef<jobject>& text, 382 const base::android::JavaParamRef<jobject>& text,
429 const base::string16& text16) { 383 const base::string16& text16) {
430 std::vector<blink::WebCompositionUnderline> underlines; 384 std::vector<blink::WebCompositionUnderline> underlines;
431 // Iterate over spans in |text|, dispatch those that we care about (e.g., 385 // Iterate over spans in |text|, dispatch those that we care about (e.g.,
432 // BackgroundColorSpan) to a matching callback (e.g., 386 // BackgroundColorSpan) to a matching callback (e.g.,
433 // AppendBackgroundColorSpan()), and populate |underlines|. 387 // AppendBackgroundColorSpan()), and populate |underlines|.
434 Java_ImeAdapter_populateUnderlinesFromSpans( 388 Java_ImeAdapter_populateUnderlinesFromSpans(
435 env, obj, text, reinterpret_cast<jlong>(&underlines)); 389 env, obj, text, reinterpret_cast<jlong>(&underlines));
436 390
437 // Sort spans by |.startOffset|. 391 // Sort spans by |.startOffset|.
438 std::sort(underlines.begin(), underlines.end()); 392 std::sort(underlines.begin(), underlines.end());
439 393
440 return underlines; 394 return underlines;
441 } 395 }
442 396
443 } // namespace content 397 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698