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

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

Issue 183923030: Almost finish moving context_menu_node_ from RenderViewImpl to RenderFrameImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer_host/ime_adapter_android.h" 5 #include "content/browser/renderer_host/ime_adapter_android.h"
6 6
7 #include <android/input.h> 7 #include <android/input.h>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "base/android/scoped_java_ref.h" 11 #include "base/android/scoped_java_ref.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "content/browser/frame_host/frame_tree.h"
15 #include "content/browser/frame_host/frame_tree_node.h"
16 #include "content/browser/frame_host/render_frame_host_impl.h"
17 #include "content/browser/renderer_host/render_view_host_impl.h"
14 #include "content/browser/renderer_host/render_widget_host_impl.h" 18 #include "content/browser/renderer_host/render_widget_host_impl.h"
15 #include "content/browser/renderer_host/render_widget_host_view_android.h" 19 #include "content/browser/renderer_host/render_widget_host_view_android.h"
16 #include "content/common/view_messages.h" 20 #include "content/common/view_messages.h"
21 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/native_web_keyboard_event.h" 22 #include "content/public/browser/native_web_keyboard_event.h"
18 #include "jni/ImeAdapter_jni.h" 23 #include "jni/ImeAdapter_jni.h"
19 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" 24 #include "third_party/WebKit/public/web/WebCompositionUnderline.h"
20 #include "third_party/WebKit/public/web/WebInputEvent.h" 25 #include "third_party/WebKit/public/web/WebInputEvent.h"
21 26
22 using base::android::AttachCurrentThread; 27 using base::android::AttachCurrentThread;
23 using base::android::ConvertJavaStringToUTF16; 28 using base::android::ConvertJavaStringToUTF16;
24 29
25 namespace content { 30 namespace content {
26 namespace { 31 namespace {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 97
93 bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*, 98 bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*,
94 jobject, 99 jobject,
95 int type, 100 int type,
96 long time_ms, 101 long time_ms,
97 int key_code, 102 int key_code,
98 int text) { 103 int text) {
99 NativeWebKeyboardEvent event(static_cast<blink::WebInputEvent::Type>(type), 104 NativeWebKeyboardEvent event(static_cast<blink::WebInputEvent::Type>(type),
100 0 /* modifiers */, time_ms / 1000.0, key_code, 105 0 /* modifiers */, time_ms / 1000.0, key_code,
101 text, false /* is_system_key */); 106 text, false /* is_system_key */);
102 rwhva_->SendKeyEvent(event); 107 BrowserThread::PostTask(
108 BrowserThread::UI, FROM_HERE,
109 base::Bind(&ImeAdapterAndroid::SendSyntheticKeyEventOnUI, this, event));
aurimas (slooooooooow) 2014/03/07 18:04:40 I was under impression that most of these calls in
jam 2014/03/07 18:15:45 sure that works too. i didn't know how they're cal
103 return true; 110 return true;
104 } 111 }
105 112
106 bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject, 113 bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject,
107 jobject original_key_event, 114 jobject original_key_event,
108 int action, int modifiers, 115 int action, int modifiers,
109 long time_ms, int key_code, 116 long time_ms, int key_code,
110 bool is_system_key, int unicode_char) { 117 bool is_system_key, int unicode_char) {
111 NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent( 118 NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent(
112 env, original_key_event, action, modifiers, 119 env, original_key_event, action, modifiers,
113 time_ms, key_code, is_system_key, unicode_char); 120 time_ms, key_code, is_system_key, unicode_char);
114 bool key_down_text_insertion = 121 bool key_down_text_insertion =
115 event.type == blink::WebInputEvent::RawKeyDown && event.text[0]; 122 event.type == blink::WebInputEvent::RawKeyDown && event.text[0];
116 // If we are going to follow up with a synthetic Char event, then that's the 123 // If we are going to follow up with a synthetic Char event, then that's the
117 // one we expect to test if it's handled or unhandled, so skip handling the 124 // one we expect to test if it's handled or unhandled, so skip handling the
118 // "real" event in the browser. 125 // "real" event in the browser.
119 event.skip_in_browser = key_down_text_insertion; 126 event.skip_in_browser = key_down_text_insertion;
120 rwhva_->SendKeyEvent(event); 127
121 if (key_down_text_insertion) { 128 // Send a Char event, but without an os_event since we don't want to
122 // Send a Char event, but without an os_event since we don't want to 129 // roundtrip back to java such synthetic event.
123 // roundtrip back to java such synthetic event. 130 NativeWebKeyboardEvent char_event(blink::WebInputEvent::Char, modifiers,
124 NativeWebKeyboardEvent char_event(blink::WebInputEvent::Char, modifiers, 131 time_ms, key_code, unicode_char,
125 time_ms, key_code, unicode_char, 132 is_system_key);
126 is_system_key); 133 char_event.skip_in_browser = key_down_text_insertion;
127 char_event.skip_in_browser = key_down_text_insertion; 134
128 rwhva_->SendKeyEvent(char_event); 135 BrowserThread::PostTask(
129 } 136 BrowserThread::UI, FROM_HERE,
137 base::Bind(&ImeAdapterAndroid::SendKeyEventOnUI, this, event,
138 char_event, key_down_text_insertion));
139
130 return true; 140 return true;
131 } 141 }
132 142
133 void ImeAdapterAndroid::SetComposingText(JNIEnv* env, jobject, jstring text, 143 void ImeAdapterAndroid::SetComposingText(JNIEnv* env, jobject, jstring text,
134 int new_cursor_pos) { 144 int new_cursor_pos) {
135 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
136 if (!rwhi)
137 return;
138
139 base::string16 text16 = ConvertJavaStringToUTF16(env, text); 145 base::string16 text16 = ConvertJavaStringToUTF16(env, text);
140 std::vector<blink::WebCompositionUnderline> underlines; 146 BrowserThread::PostTask(
141 underlines.push_back( 147 BrowserThread::UI, FROM_HERE,
142 blink::WebCompositionUnderline(0, text16.length(), SK_ColorBLACK, 148 base::Bind(&ImeAdapterAndroid::SetComposingTextOnUI, this, text16,
143 false)); 149 new_cursor_pos));
144 // new_cursor_position is as described in the Android API for
145 // InputConnection#setComposingText, whereas the parameters for
146 // ImeSetComposition are relative to the start of the composition.
147 if (new_cursor_pos > 0)
148 new_cursor_pos = text16.length() + new_cursor_pos - 1;
149
150 rwhi->ImeSetComposition(text16, underlines, new_cursor_pos, new_cursor_pos);
151 } 150 }
152 151
153 void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) { 152 void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) {
154 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
155 if (!rwhi)
156 return;
157
158 base::string16 text16 = ConvertJavaStringToUTF16(env, text); 153 base::string16 text16 = ConvertJavaStringToUTF16(env, text);
159 rwhi->ImeConfirmComposition(text16, gfx::Range::InvalidRange(), false); 154 BrowserThread::PostTask(
155 BrowserThread::UI, FROM_HERE,
156 base::Bind(&ImeAdapterAndroid::CommitTextOnUI, this, text16));
160 } 157 }
161 158
162 void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, jobject) { 159 void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, jobject) {
163 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 160 BrowserThread::PostTask(
164 if (!rwhi) 161 BrowserThread::UI, FROM_HERE,
165 return; 162 base::Bind(&ImeAdapterAndroid::FinishComposingTextsOnUI, this));
166
167 rwhi->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
168 true);
169 } 163 }
170 164
171 void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) { 165 void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) {
172 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object); 166 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object);
173 } 167 }
174 168
175 void ImeAdapterAndroid::CancelComposition() { 169 void ImeAdapterAndroid::CancelComposition() {
176 base::android::ScopedJavaLocalRef<jobject> obj = 170 base::android::ScopedJavaLocalRef<jobject> obj =
177 java_ime_adapter_.get(AttachCurrentThread()); 171 java_ime_adapter_.get(AttachCurrentThread());
178 if (!obj.is_null()) 172 if (!obj.is_null())
179 Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj()); 173 Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj());
180 } 174 }
181 175
182 void ImeAdapterAndroid::FocusedNodeChanged(bool is_editable_node) { 176 void ImeAdapterAndroid::FocusedNodeChanged(bool is_editable_node) {
183 base::android::ScopedJavaLocalRef<jobject> obj = 177 base::android::ScopedJavaLocalRef<jobject> obj =
184 java_ime_adapter_.get(AttachCurrentThread()); 178 java_ime_adapter_.get(AttachCurrentThread());
185 if (!obj.is_null()) { 179 if (!obj.is_null()) {
186 Java_ImeAdapter_focusedNodeChanged(AttachCurrentThread(), 180 Java_ImeAdapter_focusedNodeChanged(AttachCurrentThread(),
187 obj.obj(), 181 obj.obj(),
188 is_editable_node); 182 is_editable_node);
189 } 183 }
190 } 184 }
191 185
186 void ImeAdapterAndroid::RenderWidgetGone() {
187 rwhva_ = NULL;
188 }
189
192 void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject, 190 void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject,
193 int start, int end) { 191 int start, int end) {
192 BrowserThread::PostTask(
193 BrowserThread::UI, FROM_HERE,
194 base::Bind(&ImeAdapterAndroid::SetEditableSelectionOffsetsOnUI, this,
195 start, end));
196 }
197
198 void ImeAdapterAndroid::SetComposingRegion(JNIEnv*, jobject,
199 int start, int end) {
200 BrowserThread::PostTask(
201 BrowserThread::UI, FROM_HERE,
202 base::Bind(&ImeAdapterAndroid::SetComposingRegiontOnUI, this,
203 start, end));
204 }
205
206 void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, jobject,
207 int before, int after) {
208 BrowserThread::PostTask(
209 BrowserThread::UI, FROM_HERE,
210 base::Bind(&ImeAdapterAndroid::DeleteSurroundingTextOnUI, this,
211 before, after));
212 }
213
214 void ImeAdapterAndroid::Unselect(JNIEnv* env, jobject) {
215 BrowserThread::PostTask(
216 BrowserThread::UI, FROM_HERE,
217 base::Bind(&ImeAdapterAndroid::UnselectOnUI, this));
218 }
219
220 void ImeAdapterAndroid::SelectAll(JNIEnv* env, jobject) {
221 BrowserThread::PostTask(
222 BrowserThread::UI, FROM_HERE,
223 base::Bind(&ImeAdapterAndroid::SelectAllOnUI, this));
224 }
225
226 void ImeAdapterAndroid::Cut(JNIEnv* env, jobject) {
227 BrowserThread::PostTask(
228 BrowserThread::UI, FROM_HERE,
229 base::Bind(&ImeAdapterAndroid::CutOnUI, this));
230 }
231
232 void ImeAdapterAndroid::Copy(JNIEnv* env, jobject) {
233 BrowserThread::PostTask(
234 BrowserThread::UI, FROM_HERE,
235 base::Bind(&ImeAdapterAndroid::CopyOnUI, this));
236 }
237
238 void ImeAdapterAndroid::Paste(JNIEnv* env, jobject) {
239 BrowserThread::PostTask(
240 BrowserThread::UI, FROM_HERE,
241 base::Bind(&ImeAdapterAndroid::PasteOnUI, this));
242 }
243
244 void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, jobject) {
245 java_ime_adapter_.reset();
246 }
247
248 void ImeAdapterAndroid::SendSyntheticKeyEventOnUI(
249 const NativeWebKeyboardEvent& event) {
250 rwhva_->SendKeyEvent(event);
251 }
252
253 void ImeAdapterAndroid::SendKeyEventOnUI(
254 const NativeWebKeyboardEvent& event,
255 const NativeWebKeyboardEvent& char_event,
256 bool key_down_text_insertion) {
257 rwhva_->SendKeyEvent(event);
258 if (key_down_text_insertion)
259 rwhva_->SendKeyEvent(char_event);
260 }
261
262 void ImeAdapterAndroid::SetComposingTextOnUI(const base::string16& text16,
263 int new_cursor_pos) {
264 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
265 if (!rwhi)
266 return;
267
268 std::vector<blink::WebCompositionUnderline> underlines;
269 underlines.push_back(
270 blink::WebCompositionUnderline(0, text16.length(), SK_ColorBLACK,
271 false));
272 // new_cursor_position is as described in the Android API for
273 // InputConnection#setComposingText, whereas the parameters for
274 // ImeSetComposition are relative to the start of the composition.
275 if (new_cursor_pos > 0)
276 new_cursor_pos = text16.length() + new_cursor_pos - 1;
277
278 rwhi->ImeSetComposition(text16, underlines, new_cursor_pos, new_cursor_pos);
279 }
280
281 void ImeAdapterAndroid::CommitTextOnUI(const base::string16& text16) {
282 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
283 if (!rwhi)
284 return;
285
286 rwhi->ImeConfirmComposition(text16, gfx::Range::InvalidRange(), false);
287 }
288
289 void ImeAdapterAndroid::FinishComposingTextsOnUI() {
290 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
291 if (!rwhi)
292 return;
293
294 rwhi->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
295 true);
296 }
297
298 void ImeAdapterAndroid::SetEditableSelectionOffsetsOnUI(int start, int end) {
194 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 299 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
195 if (!rwhi) 300 if (!rwhi)
196 return; 301 return;
197 302
198 rwhi->Send(new ViewMsg_SetEditableSelectionOffsets(rwhi->GetRoutingID(), 303 rwhi->Send(new ViewMsg_SetEditableSelectionOffsets(rwhi->GetRoutingID(),
199 start, end)); 304 start, end));
200 } 305 }
201 306
202 void ImeAdapterAndroid::SetComposingRegion(JNIEnv*, jobject, 307 void ImeAdapterAndroid::SetComposingRegiontOnUI(int start, int end) {
203 int start, int end) {
204 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 308 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
205 if (!rwhi) 309 if (!rwhi)
206 return; 310 return;
207 311
208 std::vector<blink::WebCompositionUnderline> underlines; 312 std::vector<blink::WebCompositionUnderline> underlines;
209 underlines.push_back( 313 underlines.push_back(
210 blink::WebCompositionUnderline(0, end - start, SK_ColorBLACK, false)); 314 blink::WebCompositionUnderline(0, end - start, SK_ColorBLACK, false));
211 315
212 rwhi->Send(new ViewMsg_SetCompositionFromExistingText( 316 rwhi->Send(new ViewMsg_SetCompositionFromExistingText(
213 rwhi->GetRoutingID(), start, end, underlines)); 317 rwhi->GetRoutingID(), start, end, underlines));
214 } 318 }
215 319
216 void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, jobject, 320 void ImeAdapterAndroid::DeleteSurroundingTextOnUI(int before, int after) {
217 int before, int after) {
218 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 321 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
219 if (!rwhi) 322 if (!rwhi)
220 return; 323 return;
221 324
222 rwhi->Send(new ViewMsg_ExtendSelectionAndDelete(rwhi->GetRoutingID(), 325 rwhi->Send(new ViewMsg_ExtendSelectionAndDelete(rwhi->GetRoutingID(),
223 before, after)); 326 before, after));
224 } 327 }
225 328
226 void ImeAdapterAndroid::Unselect(JNIEnv* env, jobject) { 329 void ImeAdapterAndroid::UnselectOnUI() {
227 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 330 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
228 if (!rwhi) 331 if (rwhi)
229 return; 332 rwhi->Unselect();
230
231 rwhi->Unselect();
232 } 333 }
233 334
234 void ImeAdapterAndroid::SelectAll(JNIEnv* env, jobject) { 335 void ImeAdapterAndroid::SelectAllOnUI() {
235 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 336 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
236 if (!rwhi) 337 if (rwhi)
237 return; 338 rwhi->SelectAll();
238
239 rwhi->SelectAll();
240 } 339 }
241 340
242 void ImeAdapterAndroid::Cut(JNIEnv* env, jobject) { 341 void ImeAdapterAndroid::CutOnUI() {
243 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 342 RenderFrameHost* rfh = GetFocusedFrame();
244 if (!rwhi) 343 if (rfh)
245 return; 344 rfh->Cut();
246
247 rwhi->Cut();
248 } 345 }
249 346
250 void ImeAdapterAndroid::Copy(JNIEnv* env, jobject) { 347 void ImeAdapterAndroid::CopyOnUI() {
251 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 348 RenderFrameHost* rfh = GetFocusedFrame();
252 if (!rwhi) 349 if (rfh)
253 return; 350 rfh->Copy();
254
255 rwhi->Copy();
256 } 351 }
257 352
258 void ImeAdapterAndroid::Paste(JNIEnv* env, jobject) { 353 void ImeAdapterAndroid::PasteOnUI() {
259 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 354 RenderFrameHost* rfh = GetFocusedFrame();
260 if (!rwhi) 355 if (rfh)
261 return; 356 rfh->Paste();
262
263 rwhi->Paste();
264 }
265
266 void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, jobject) {
267 java_ime_adapter_.reset();
268 } 357 }
269 358
270 RenderWidgetHostImpl* ImeAdapterAndroid::GetRenderWidgetHostImpl() { 359 RenderWidgetHostImpl* ImeAdapterAndroid::GetRenderWidgetHostImpl() {
271 DCHECK(rwhva_); 360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
361 if (!rwhva_)
362 return NULL;
363
272 RenderWidgetHost* rwh = rwhva_->GetRenderWidgetHost(); 364 RenderWidgetHost* rwh = rwhva_->GetRenderWidgetHost();
273 if (!rwh) 365 if (!rwh)
274 return NULL; 366 return NULL;
275 367
276 return RenderWidgetHostImpl::From(rwh); 368 return RenderWidgetHostImpl::From(rwh);
277 } 369 }
278 370
371 RenderFrameHost* ImeAdapterAndroid::GetFocusedFrame() {
372 RenderWidgetHostImpl* rwh = GetRenderWidgetHostImpl();
373 if (!rwh)
374 return NULL;
375 if (!rwh->IsRenderView())
376 return NULL;
377 RenderViewHost* rvh = RenderViewHost::From(rwh);
378 RenderFrameHostImpl* rfh =
379 static_cast<RenderFrameHostImpl*>(rvh->GetMainFrame());
380 FrameTreeNode* focused_frame =
381 rfh->frame_tree_node()->frame_tree()->GetFocusedFrame();
382 if (!focused_frame)
383 return NULL;
384
385 return focused_frame->current_frame_host();
386 }
387
279 } // namespace content 388 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/ime_adapter_android.h ('k') | content/browser/renderer_host/render_widget_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698