| Index: chrome/browser/spellchecker/spellcheck_message_filter_platform_android.cc
|
| diff --git a/chrome/browser/spellchecker/spellcheck_message_filter_platform_android.cc b/chrome/browser/spellchecker/spellcheck_message_filter_platform_android.cc
|
| index 4c7a6c8c2239632cf080c976e6c18a63d524d54b..dd426976d63c4d4c6fa8d452916f80346a980d31 100644
|
| --- a/chrome/browser/spellchecker/spellcheck_message_filter_platform_android.cc
|
| +++ b/chrome/browser/spellchecker/spellcheck_message_filter_platform_android.cc
|
| @@ -4,11 +4,113 @@
|
|
|
| #include "chrome/browser/spellchecker/spellcheck_message_filter_platform.h"
|
|
|
| +#include <algorithm>
|
| +
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_array.h"
|
| +#include "base/android/jni_string.h"
|
| +#include "base/barrier_closure.h"
|
| +#include "base/bind.h"
|
| +#include "chrome/browser/spellchecker/spellcheck_platform.h"
|
| #include "chrome/common/spellcheck_messages.h"
|
| #include "chrome/common/spellcheck_result.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "jni/SpellCheckerSessionBridge_jni.h"
|
|
|
| using content::BrowserThread;
|
| +/*
|
| +namespace{
|
| +
|
| + bool CompareLocation(const SpellCheckResult& r1,
|
| + const SpellCheckResult& r2) {
|
| + return r1.location < r2.location;
|
| + }
|
| +
|
| +} // namespace
|
| +*/
|
| +
|
| +SpellingRequest::SpellingRequest(content::BrowserMessageFilter* destination,
|
| + int render_process_id)
|
| + : destination_(destination),
|
| + render_process_id_(render_process_id),
|
| + route_id_(-1),
|
| + identifier_(-1) {
|
| + destination_->AddRef();
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + java_object_.Reset(
|
| + Java_SpellCheckerSessionBridge_create(env, reinterpret_cast<intptr_t>(this)));
|
| +}
|
| +
|
| +//static
|
| +bool SpellingRequest::RegisterSpellingRequest(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
| +
|
| +void SpellingRequest::GetSpellcheckInfo(JNIEnv* env, jobject jobj, jobjectArray suggestionsArray,
|
| + jintArray offsetArray, jintArray lengthArray){
|
| +
|
| + LOG(ERROR) << "DYLANKING In Native GetSpellcheckInfo";
|
| + //std::vector<base::string16> optional_suggestions;
|
| + //base::android::AppendJavaStringArrayToStringVector(env, suggestionsArray, &optional_suggestions);
|
| +
|
| + /*for(unsigned int i = 0; i < optional_suggestions.size(); i++){
|
| + LOG(ERROR) << "DYLANKING " << optional_suggestions[i];
|
| + } */
|
| + std::vector<int> offsets;
|
| + std::vector<int> lengths;
|
| + base::android::JavaIntArrayToIntVector(env, offsetArray, &offsets);
|
| + base::android::JavaIntArrayToIntVector(env, lengthArray, &lengths);
|
| +
|
| + for(unsigned int j = 0; j < offsets.size(); j++){
|
| + //LOG(ERROR) << "DYLANKING offset: " << offsets[j] << " length: " << lengths[j];
|
| + local_results_.push_back(SpellCheckResult(SpellCheckResult::SPELLING,offsets[j],lengths[j]));
|
| + }
|
| +
|
| + completion_barrier_.Run();
|
| +}
|
| +
|
| +void SpellingRequest::RequestCheck(
|
| + const base::string16& text,
|
| + int route_id,
|
| + int identifier) {
|
| + DCHECK(!text.empty());
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + text_ = text;
|
| + route_id_ = route_id;
|
| + identifier_ = identifier;
|
| +
|
| + // The barrier owns |this|, ensuring it is deleted
|
| + // after completion.
|
| + completion_barrier_ =
|
| + BarrierClosure(1,
|
| + base::Bind(&SpellingRequest::OnCheckCompleted,
|
| + base::Owned(this)));
|
| + RequestLocalCheck();
|
| +}
|
| +
|
| +void SpellingRequest::RequestLocalCheck() {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + Java_SpellCheckerSessionBridge_checkSpelling(env, java_object_.obj(),
|
| + base::android::ConvertUTF16ToJavaString(env, text_).obj());
|
| +}
|
| +
|
| +void SpellingRequest::OnCheckCompleted() {
|
| + // Final completion can happen on any thread - don't DCHECK thread.
|
| + const std::vector<SpellCheckResult>* check_results = &local_results_;
|
| + //std::sort(local_results_.begin(), local_results_.end(), CompareLocation);
|
| +
|
| + destination_->Send(
|
| + new SpellCheckMsg_RespondTextCheck(
|
| + route_id_,
|
| + identifier_,
|
| + text_,
|
| + *check_results));
|
| + destination_->Release();
|
| +
|
| + // Object is self-managed - at this point, its life span is over.
|
| + // No need to delete, since the OnCheckCompleted callback owns |this|.
|
| +}
|
|
|
| SpellCheckMessageFilterPlatform::SpellCheckMessageFilterPlatform(
|
| int render_process_id)
|
| @@ -18,17 +120,34 @@ SpellCheckMessageFilterPlatform::SpellCheckMessageFilterPlatform(
|
|
|
| void SpellCheckMessageFilterPlatform::OverrideThreadForMessage(
|
| const IPC::Message& message, BrowserThread::ID* thread) {
|
| + if (message.type() == SpellCheckHostMsg_RequestTextCheck::ID)
|
| + *thread = BrowserThread::UI;
|
| }
|
|
|
| bool SpellCheckMessageFilterPlatform::OnMessageReceived(
|
| const IPC::Message& message) {
|
| - return true;
|
| + bool handled = true;
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived";
|
| + IPC_BEGIN_MESSAGE_MAP(SpellCheckMessageFilterPlatform, message)
|
| + IPC_MESSAGE_HANDLER(SpellCheckHostMsg_CheckSpelling,
|
| + OnCheckSpelling)
|
| + IPC_MESSAGE_HANDLER(SpellCheckHostMsg_FillSuggestionList,
|
| + OnFillSuggestionList)
|
| + IPC_MESSAGE_HANDLER(SpellCheckHostMsg_ShowSpellingPanel,
|
| + OnShowSpellingPanel)
|
| + IPC_MESSAGE_HANDLER(SpellCheckHostMsg_UpdateSpellingPanelWithMisspelledWord,
|
| + OnUpdateSpellingPanelWithMisspelledWord)
|
| + IPC_MESSAGE_HANDLER(SpellCheckHostMsg_RequestTextCheck,
|
| + OnRequestTextCheck)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| }
|
|
|
| -// static
|
| void SpellCheckMessageFilterPlatform::CombineResults(
|
| std::vector<SpellCheckResult>* remote_results,
|
| const std::vector<SpellCheckResult>& local_results) {
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived1";
|
| }
|
|
|
| SpellCheckMessageFilterPlatform::~SpellCheckMessageFilterPlatform() {}
|
| @@ -37,18 +156,24 @@ void SpellCheckMessageFilterPlatform::OnCheckSpelling(
|
| const base::string16& word,
|
| int route_id,
|
| bool* correct) {
|
| + *correct = spellcheck_platform::CheckSpelling(word, 0);
|
| + LOG(ERROR) << "DYLANKING OnCheckSpelling" << *correct;
|
| }
|
|
|
| void SpellCheckMessageFilterPlatform::OnFillSuggestionList(
|
| const base::string16& word,
|
| std::vector<base::string16>* suggestions) {
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived2";
|
| + spellcheck_platform::FillSuggestionList(word, suggestions);
|
| }
|
|
|
| void SpellCheckMessageFilterPlatform::OnShowSpellingPanel(bool show) {
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived3";
|
| }
|
|
|
| void SpellCheckMessageFilterPlatform::OnUpdateSpellingPanelWithMisspelledWord(
|
| const base::string16& word) {
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived4";
|
| }
|
|
|
| void SpellCheckMessageFilterPlatform::OnRequestTextCheck(
|
| @@ -56,13 +181,28 @@ void SpellCheckMessageFilterPlatform::OnRequestTextCheck(
|
| int identifier,
|
| const base::string16& text,
|
| std::vector<SpellCheckMarker> markers) {
|
| +
|
| + /*if(!spellcheck_platform::SpellCheckerAvailable()){
|
| + return;
|
| + }*/
|
| +
|
| + DCHECK(!text.empty());
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + SpellingRequest* request =
|
| + new SpellingRequest(this, render_process_id_);
|
| + request->RequestCheck(
|
| + text, route_id, identifier);
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived5 ";
|
| }
|
|
|
| int SpellCheckMessageFilterPlatform::ToDocumentTag(int route_id) {
|
| - NOTREACHED();
|
| - return -1;
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived6";
|
| + NOTREACHED();
|
| + return -1;
|
| }
|
|
|
| void SpellCheckMessageFilterPlatform::RetireDocumentTag(int route_id) {
|
| - NOTREACHED();
|
| + LOG(ERROR) << "DYLANKING OnMessageReceived7";
|
| + NOTREACHED();
|
| }
|
|
|