Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/spellchecker/spellchecker_session_bridge_android.h" | |
| 6 | |
| 7 #include "chrome/common/spellcheck_messages.h" | |
| 8 #include "chrome/common/spellcheck_result.h" | |
| 9 #include "content/public/browser/render_process_host.h" | |
| 10 #include "jni/SpellCheckerSessionBridge_jni.h" | |
| 11 | |
| 12 SpellCheckerSessionBridge::SpellingRequest::SpellingRequest( | |
| 13 int new_route_id, | |
| 14 int new_identifier, | |
| 15 const base::string16& new_text) | |
| 16 : route_id(new_route_id), identifier(new_identifier), text(new_text) {} | |
| 17 | |
| 18 SpellCheckerSessionBridge::SpellCheckerSessionBridge(int render_process_id) | |
| 19 : render_process_id_(render_process_id), | |
| 20 is_active_request_(false), | |
| 21 is_pending_request_(false), | |
| 22 java_object_(Java_SpellCheckerSessionBridge_create( | |
| 23 base::android::AttachCurrentThread(), | |
| 24 reinterpret_cast<intptr_t>(this))) {} | |
| 25 | |
| 26 // static | |
| 27 bool SpellCheckerSessionBridge::RegisterJNI(JNIEnv* env) { | |
| 28 return RegisterNativesImpl(env); | |
| 29 } | |
| 30 | |
| 31 void SpellCheckerSessionBridge::RequestTextCheck(int route_id, | |
| 32 int identifier, | |
| 33 const base::string16& text) { | |
| 34 // Save incoming requests to run at the end of the currently active request. | |
| 35 // If multiple requests arrive during one active request, only the most | |
| 36 // recent request will run (the others get overwritten). | |
| 37 if (is_active_request_) { | |
| 38 pending_spelling_request_ = SpellingRequest(route_id, identifier, text); | |
| 39 is_pending_request_ = true; | |
| 40 return; | |
| 41 } | |
| 42 | |
| 43 active_spelling_request_ = SpellingRequest(route_id, identifier, text); | |
| 44 is_active_request_ = true; | |
| 45 | |
| 46 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 47 Java_SpellCheckerSessionBridge_requestTextCheck( | |
| 48 env, java_object_.obj(), | |
| 49 base::android::ConvertUTF16ToJavaString(env, text).obj()); | |
| 50 } | |
| 51 | |
| 52 void SpellCheckerSessionBridge::ProcessSpellCheckResults( | |
| 53 JNIEnv* env, | |
| 54 jobject jobj, | |
| 55 jintArray offset_array, | |
| 56 jintArray length_array) { | |
| 57 std::vector<int> offsets; | |
| 58 std::vector<int> lengths; | |
| 59 | |
| 60 base::android::JavaIntArrayToIntVector(env, offset_array, &offsets); | |
| 61 base::android::JavaIntArrayToIntVector(env, length_array, &lengths); | |
| 62 | |
| 63 // Convert specific offset/length pairs into SpellCheckResults, which can be | |
| 64 // sent to the renderer to be drawn as red underlines. | |
| 65 std::vector<SpellCheckResult> results; | |
| 66 for (size_t i = 0; i < offsets.size(); i++) { | |
| 67 results.push_back( | |
| 68 SpellCheckResult(SpellCheckResult::SPELLING, offsets[i], lengths[i])); | |
| 69 } | |
| 70 | |
| 71 content::RenderProcessHost* sender = | |
| 72 content::RenderProcessHost::FromID(render_process_id_); | |
| 73 | |
| 74 if (sender != nullptr) { | |
| 75 sender->Send(new SpellCheckMsg_RespondTextCheck( | |
| 76 active_spelling_request_.route_id, active_spelling_request_.identifier, | |
| 77 active_spelling_request_.text, results)); | |
| 78 } | |
| 79 | |
| 80 // If any pending requests arrived during the execution of this active | |
| 81 // request, the most recently arrived pending request will become the active | |
| 82 // request and be run. | |
| 83 if (is_pending_request_) { | |
|
newt (away)
2015/08/13 20:40:31
slightly simpler way to write this:
active_requ
dylanking
2015/08/14 02:57:03
Will definitely change to this if I end up using s
| |
| 84 active_spelling_request_ = pending_spelling_request_; | |
| 85 is_pending_request_ = false; | |
| 86 | |
| 87 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 88 Java_SpellCheckerSessionBridge_requestTextCheck( | |
| 89 env, java_object_.obj(), base::android::ConvertUTF16ToJavaString( | |
|
newt (away)
2015/08/13 20:40:31
weird indentation
dylanking
2015/08/14 02:57:03
Fixed, but I have a feeling this was git cl format
| |
| 90 env, active_spelling_request_.text) | |
| 91 .obj()); | |
| 92 } else { | |
| 93 is_active_request_ = false; | |
| 94 } | |
| 95 } | |
| OLD | NEW |