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

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

Issue 22764006: [Android] Fix ime NPE after RWH is destroyed (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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
« no previous file with comments | « content/browser/renderer_host/ime_adapter_android.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 time_ms, key_code, unicode_char, 133 time_ms, key_code, unicode_char,
134 is_system_key); 134 is_system_key);
135 char_event.skip_in_browser = key_down_text_insertion; 135 char_event.skip_in_browser = key_down_text_insertion;
136 rwhva_->SendKeyEvent(char_event); 136 rwhva_->SendKeyEvent(char_event);
137 } 137 }
138 return true; 138 return true;
139 } 139 }
140 140
141 void ImeAdapterAndroid::SetComposingText(JNIEnv* env, jobject, jstring text, 141 void ImeAdapterAndroid::SetComposingText(JNIEnv* env, jobject, jstring text,
142 int new_cursor_pos) { 142 int new_cursor_pos) {
143 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 143 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
144 rwhva_->GetRenderWidgetHost());
145 if (!rwhi) 144 if (!rwhi)
146 return; 145 return;
147 146
148 string16 text16 = ConvertJavaStringToUTF16(env, text); 147 string16 text16 = ConvertJavaStringToUTF16(env, text);
149 std::vector<WebKit::WebCompositionUnderline> underlines; 148 std::vector<WebKit::WebCompositionUnderline> underlines;
150 underlines.push_back( 149 underlines.push_back(
151 WebKit::WebCompositionUnderline(0, text16.length(), SK_ColorBLACK, 150 WebKit::WebCompositionUnderline(0, text16.length(), SK_ColorBLACK,
152 false)); 151 false));
153 // new_cursor_position is as described in the Android API for 152 // new_cursor_position is as described in the Android API for
154 // InputConnection#setComposingText, whereas the parameters for 153 // InputConnection#setComposingText, whereas the parameters for
155 // ImeSetComposition are relative to the start of the composition. 154 // ImeSetComposition are relative to the start of the composition.
156 if (new_cursor_pos > 0) 155 if (new_cursor_pos > 0)
157 new_cursor_pos = text16.length() + new_cursor_pos - 1; 156 new_cursor_pos = text16.length() + new_cursor_pos - 1;
158 157
159 rwhi->ImeSetComposition(text16, underlines, new_cursor_pos, new_cursor_pos); 158 rwhi->ImeSetComposition(text16, underlines, new_cursor_pos, new_cursor_pos);
160 } 159 }
161 160
162 void ImeAdapterAndroid::ImeBatchStateChanged(JNIEnv* env, 161 void ImeAdapterAndroid::ImeBatchStateChanged(JNIEnv* env,
163 jobject, 162 jobject,
164 jboolean is_begin) { 163 jboolean is_begin) {
165 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 164 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
166 rwhva_->GetRenderWidgetHost());
167 if (!rwhi) 165 if (!rwhi)
168 return; 166 return;
169 167
170 rwhi->Send(new ViewMsg_ImeBatchStateChanged(rwhi->GetRoutingID(), is_begin)); 168 rwhi->Send(new ViewMsg_ImeBatchStateChanged(rwhi->GetRoutingID(), is_begin));
171 } 169 }
172 170
173 void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) { 171 void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) {
174 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 172 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
175 rwhva_->GetRenderWidgetHost());
176 if (!rwhi) 173 if (!rwhi)
177 return; 174 return;
178 175
179 string16 text16 = ConvertJavaStringToUTF16(env, text); 176 string16 text16 = ConvertJavaStringToUTF16(env, text);
180 rwhi->ImeConfirmComposition(text16, ui::Range::InvalidRange(), false); 177 rwhi->ImeConfirmComposition(text16, ui::Range::InvalidRange(), false);
181 } 178 }
182 179
183 void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, jobject) { 180 void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, jobject) {
184 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 181 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
185 rwhva_->GetRenderWidgetHost());
186 if (!rwhi) 182 if (!rwhi)
187 return; 183 return;
188 184
189 rwhi->ImeConfirmComposition(string16(), ui::Range::InvalidRange(), true); 185 rwhi->ImeConfirmComposition(string16(), ui::Range::InvalidRange(), true);
190 } 186 }
191 187
192 void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) { 188 void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) {
193 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object); 189 java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object);
194 } 190 }
195 191
196 void ImeAdapterAndroid::CancelComposition() { 192 void ImeAdapterAndroid::CancelComposition() {
197 base::android::ScopedJavaLocalRef<jobject> obj = 193 base::android::ScopedJavaLocalRef<jobject> obj =
198 java_ime_adapter_.get(AttachCurrentThread()); 194 java_ime_adapter_.get(AttachCurrentThread());
199 if (!obj.is_null()) 195 if (!obj.is_null())
200 Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj()); 196 Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj());
201 } 197 }
202 198
203 void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject, 199 void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject,
204 int start, int end) { 200 int start, int end) {
205 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 201 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
206 rwhva_->GetRenderWidgetHost());
207 if (!rwhi) 202 if (!rwhi)
208 return; 203 return;
209 204
210 rwhi->Send(new ViewMsg_SetEditableSelectionOffsets(rwhi->GetRoutingID(), 205 rwhi->Send(new ViewMsg_SetEditableSelectionOffsets(rwhi->GetRoutingID(),
211 start, end)); 206 start, end));
212 } 207 }
213 208
214 void ImeAdapterAndroid::SetComposingRegion(JNIEnv*, jobject, 209 void ImeAdapterAndroid::SetComposingRegion(JNIEnv*, jobject,
215 int start, int end) { 210 int start, int end) {
216 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 211 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
217 rwhva_->GetRenderWidgetHost());
218 if (!rwhi) 212 if (!rwhi)
219 return; 213 return;
220 214
221 std::vector<WebKit::WebCompositionUnderline> underlines; 215 std::vector<WebKit::WebCompositionUnderline> underlines;
222 underlines.push_back( 216 underlines.push_back(
223 WebKit::WebCompositionUnderline(0, end - start, SK_ColorBLACK, false)); 217 WebKit::WebCompositionUnderline(0, end - start, SK_ColorBLACK, false));
224 218
225 rwhi->Send(new ViewMsg_SetCompositionFromExistingText( 219 rwhi->Send(new ViewMsg_SetCompositionFromExistingText(
226 rwhi->GetRoutingID(), start, end, underlines)); 220 rwhi->GetRoutingID(), start, end, underlines));
227 } 221 }
228 222
229 void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, jobject, 223 void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, jobject,
230 int before, int after) { 224 int before, int after) {
231 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 225 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
232 rwhva_->GetRenderWidgetHost());
233 if (!rwhi) 226 if (!rwhi)
234 return; 227 return;
235 228
236 rwhi->Send(new ViewMsg_ExtendSelectionAndDelete(rwhi->GetRoutingID(), 229 rwhi->Send(new ViewMsg_ExtendSelectionAndDelete(rwhi->GetRoutingID(),
237 before, after)); 230 before, after));
238 } 231 }
239 232
240 void ImeAdapterAndroid::Unselect(JNIEnv* env, jobject) { 233 void ImeAdapterAndroid::Unselect(JNIEnv* env, jobject) {
241 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 234 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
242 rwhva_->GetRenderWidgetHost());
243 if (!rwhi) 235 if (!rwhi)
244 return; 236 return;
245 237
246 rwhi->Unselect(); 238 rwhi->Unselect();
247 } 239 }
248 240
249 void ImeAdapterAndroid::SelectAll(JNIEnv* env, jobject) { 241 void ImeAdapterAndroid::SelectAll(JNIEnv* env, jobject) {
250 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 242 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
251 rwhva_->GetRenderWidgetHost());
252 if (!rwhi) 243 if (!rwhi)
253 return; 244 return;
254 245
255 rwhi->SelectAll(); 246 rwhi->SelectAll();
256 } 247 }
257 248
258 void ImeAdapterAndroid::Cut(JNIEnv* env, jobject) { 249 void ImeAdapterAndroid::Cut(JNIEnv* env, jobject) {
259 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 250 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
260 rwhva_->GetRenderWidgetHost());
261 if (!rwhi) 251 if (!rwhi)
262 return; 252 return;
263 253
264 rwhi->Cut(); 254 rwhi->Cut();
265 } 255 }
266 256
267 void ImeAdapterAndroid::Copy(JNIEnv* env, jobject) { 257 void ImeAdapterAndroid::Copy(JNIEnv* env, jobject) {
268 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 258 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
269 rwhva_->GetRenderWidgetHost());
270 if (!rwhi) 259 if (!rwhi)
271 return; 260 return;
272 261
273 rwhi->Copy(); 262 rwhi->Copy();
274 } 263 }
275 264
276 void ImeAdapterAndroid::Paste(JNIEnv* env, jobject) { 265 void ImeAdapterAndroid::Paste(JNIEnv* env, jobject) {
277 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From( 266 RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl();
278 rwhva_->GetRenderWidgetHost());
279 if (!rwhi) 267 if (!rwhi)
280 return; 268 return;
281 269
282 rwhi->Paste(); 270 rwhi->Paste();
283 } 271 }
284 272
285 void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, jobject) { 273 void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, jobject) {
286 java_ime_adapter_.reset(); 274 java_ime_adapter_.reset();
287 } 275 }
288 276
277 RenderWidgetHostImpl* ImeAdapterAndroid::GetRenderWidgetHostImpl() {
278 DCHECK(rwhva_);
279 if (!rwhva_->GetRenderWidgetHost())
Ben Murdoch 2013/08/12 10:38:08 nit: make a local
280 return NULL;
281
282 return RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost());
283 }
284
289 } // namespace content 285 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/ime_adapter_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698