| Index: chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
|
| diff --git a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc b/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
|
| deleted file mode 100644
|
| index d9d7ec3780a1177ddf99f18e43093d1491bf0b90..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
|
| +++ /dev/null
|
| @@ -1,315 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h"
|
| -
|
| -#include <algorithm>
|
| -#include <functional>
|
| -
|
| -#include "base/barrier_closure.h"
|
| -#include "base/bind.h"
|
| -#include "chrome/browser/spellchecker/feedback_sender.h"
|
| -#include "chrome/browser/spellchecker/spellcheck_factory.h"
|
| -#include "chrome/browser/spellchecker/spellcheck_platform_mac.h"
|
| -#include "chrome/browser/spellchecker/spellcheck_service.h"
|
| -#include "chrome/browser/spellchecker/spelling_service_client.h"
|
| -#include "chrome/common/spellcheck_messages.h"
|
| -#include "chrome/common/spellcheck_result.h"
|
| -#include "content/public/browser/browser_context.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -
|
| -using content::BrowserThread;
|
| -using content::BrowserContext;
|
| -
|
| -namespace {
|
| -
|
| -bool CompareLocation(const SpellCheckResult& r1,
|
| - const SpellCheckResult& r2) {
|
| - return r1.location < r2.location;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class SpellingRequest {
|
| - public:
|
| - SpellingRequest(SpellingServiceClient* client,
|
| - content::BrowserMessageFilter* destination,
|
| - int render_process_id);
|
| -
|
| - void RequestCheck(const base::string16& text,
|
| - int route_id,
|
| - int identifier,
|
| - int document_tag,
|
| - const std::vector<SpellCheckMarker>& markers);
|
| - private:
|
| - // Request server-side checking for |text_|.
|
| - void RequestRemoteCheck();
|
| -
|
| - // Request a check for |text_| from local spell checker.
|
| - void RequestLocalCheck();
|
| -
|
| - // Check if all pending requests are done, send reply to render process if so.
|
| - void OnCheckCompleted();
|
| -
|
| - // Called when server-side checking is complete.
|
| - void OnRemoteCheckCompleted(bool success,
|
| - const base::string16& text,
|
| - const std::vector<SpellCheckResult>& results);
|
| -
|
| - // Called when local checking is complete.
|
| - void OnLocalCheckCompleted(const std::vector<SpellCheckResult>& results);
|
| -
|
| - std::vector<SpellCheckResult> local_results_;
|
| - std::vector<SpellCheckResult> remote_results_;
|
| -
|
| - // Barrier closure for completion of both remote and local check.
|
| - base::Closure completion_barrier_;
|
| - bool remote_success_;
|
| -
|
| - SpellingServiceClient* client_; // Owned by |destination|.
|
| - content::BrowserMessageFilter* destination_; // ref-counted.
|
| - int render_process_id_;
|
| -
|
| - base::string16 text_;
|
| - int route_id_;
|
| - int identifier_;
|
| - int document_tag_;
|
| - std::vector<SpellCheckMarker> markers_;
|
| -};
|
| -
|
| -SpellingRequest::SpellingRequest(SpellingServiceClient* client,
|
| - content::BrowserMessageFilter* destination,
|
| - int render_process_id)
|
| - : remote_success_(false),
|
| - client_(client),
|
| - destination_(destination),
|
| - render_process_id_(render_process_id),
|
| - route_id_(-1),
|
| - identifier_(-1),
|
| - document_tag_(-1) {
|
| - destination_->AddRef();
|
| -}
|
| -
|
| -void SpellingRequest::RequestCheck(
|
| - const base::string16& text,
|
| - int route_id,
|
| - int identifier,
|
| - int document_tag,
|
| - const std::vector<SpellCheckMarker>& markers) {
|
| - DCHECK(!text.empty());
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| -
|
| - text_ = text;
|
| - route_id_ = route_id;
|
| - identifier_ = identifier;
|
| - document_tag_ = document_tag;
|
| - markers_ = markers;
|
| -
|
| - // Send the remote query out. The barrier owns |this|, ensuring it is deleted
|
| - // after completion.
|
| - completion_barrier_ =
|
| - BarrierClosure(2,
|
| - base::Bind(&SpellingRequest::OnCheckCompleted,
|
| - base::Owned(this)));
|
| - RequestRemoteCheck();
|
| - RequestLocalCheck();
|
| -}
|
| -
|
| -void SpellingRequest::RequestRemoteCheck() {
|
| - BrowserContext* context = NULL;
|
| - content::RenderProcessHost* host =
|
| - content::RenderProcessHost::FromID(render_process_id_);
|
| - if (host)
|
| - context = host->GetBrowserContext();
|
| -
|
| - client_->RequestTextCheck(
|
| - context,
|
| - SpellingServiceClient::SPELLCHECK,
|
| - text_,
|
| - base::Bind(&SpellingRequest::OnRemoteCheckCompleted,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -void SpellingRequest::RequestLocalCheck() {
|
| - spellcheck_mac::RequestTextCheck(
|
| - document_tag_,
|
| - text_,
|
| - base::Bind(&SpellingRequest::OnLocalCheckCompleted,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -void SpellingRequest::OnCheckCompleted() {
|
| - // Final completion can happen on any thread - don't DCHECK thread.
|
| - const std::vector<SpellCheckResult>* check_results = &local_results_;
|
| - if (remote_success_) {
|
| - std::sort(remote_results_.begin(), remote_results_.end(), CompareLocation);
|
| - std::sort(local_results_.begin(), local_results_.end(), CompareLocation);
|
| - SpellCheckMessageFilterMac::CombineResults(&remote_results_,
|
| - local_results_);
|
| - check_results = &remote_results_;
|
| - }
|
| -
|
| - 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|.
|
| -}
|
| -
|
| -void SpellingRequest::OnRemoteCheckCompleted(
|
| - bool success,
|
| - const base::string16& text,
|
| - const std::vector<SpellCheckResult>& results) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - remote_success_ = success;
|
| - remote_results_ = results;
|
| -
|
| - SpellcheckService* spellcheck_service =
|
| - SpellcheckServiceFactory::GetForRenderProcessId(render_process_id_);
|
| - if (spellcheck_service) {
|
| - spellcheck_service->GetFeedbackSender()->OnSpellcheckResults(
|
| - render_process_id_,
|
| - text,
|
| - markers_,
|
| - &remote_results_);
|
| - }
|
| -
|
| - completion_barrier_.Run();
|
| -}
|
| -
|
| -void SpellingRequest::OnLocalCheckCompleted(
|
| - const std::vector<SpellCheckResult>& results) {
|
| - // Local checking can happen on any thread - don't DCHECK thread.
|
| - local_results_ = results;
|
| - completion_barrier_.Run();
|
| -}
|
| -
|
| -
|
| -SpellCheckMessageFilterMac::SpellCheckMessageFilterMac(int render_process_id)
|
| - : BrowserMessageFilter(SpellCheckMsgStart),
|
| - render_process_id_(render_process_id),
|
| - client_(new SpellingServiceClient) {
|
| -}
|
| -
|
| -void SpellCheckMessageFilterMac::OverrideThreadForMessage(
|
| - const IPC::Message& message, BrowserThread::ID* thread) {
|
| - if (message.type() == SpellCheckHostMsg_RequestTextCheck::ID)
|
| - *thread = BrowserThread::UI;
|
| -}
|
| -
|
| -bool SpellCheckMessageFilterMac::OnMessageReceived(
|
| - const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(SpellCheckMessageFilterMac, 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 SpellCheckMessageFilterMac::CombineResults(
|
| - std::vector<SpellCheckResult>* remote_results,
|
| - const std::vector<SpellCheckResult>& local_results) {
|
| - std::vector<SpellCheckResult>::const_iterator local_iter(
|
| - local_results.begin());
|
| - std::vector<SpellCheckResult>::iterator remote_iter;
|
| -
|
| - for (remote_iter = remote_results->begin();
|
| - remote_iter != remote_results->end();
|
| - ++remote_iter) {
|
| - // Discard all local results occurring before remote result.
|
| - while (local_iter != local_results.end() &&
|
| - local_iter->location < remote_iter->location) {
|
| - local_iter++;
|
| - }
|
| -
|
| - // Unless local and remote result coincide, result is GRAMMAR.
|
| - remote_iter->decoration = SpellCheckResult::GRAMMAR;
|
| - if (local_iter != local_results.end() &&
|
| - local_iter->location == remote_iter->location &&
|
| - local_iter->length == remote_iter->length) {
|
| - remote_iter->decoration = SpellCheckResult::SPELLING;
|
| - }
|
| - }
|
| -}
|
| -
|
| -SpellCheckMessageFilterMac::~SpellCheckMessageFilterMac() {}
|
| -
|
| -void SpellCheckMessageFilterMac::OnCheckSpelling(const base::string16& word,
|
| - int route_id,
|
| - bool* correct) {
|
| - *correct = spellcheck_mac::CheckSpelling(word, ToDocumentTag(route_id));
|
| -}
|
| -
|
| -void SpellCheckMessageFilterMac::OnFillSuggestionList(
|
| - const base::string16& word,
|
| - std::vector<base::string16>* suggestions) {
|
| - spellcheck_mac::FillSuggestionList(word, suggestions);
|
| -}
|
| -
|
| -void SpellCheckMessageFilterMac::OnShowSpellingPanel(bool show) {
|
| - spellcheck_mac::ShowSpellingPanel(show);
|
| -}
|
| -
|
| -void SpellCheckMessageFilterMac::OnUpdateSpellingPanelWithMisspelledWord(
|
| - const base::string16& word) {
|
| - spellcheck_mac::UpdateSpellingPanelWithMisspelledWord(word);
|
| -}
|
| -
|
| -void SpellCheckMessageFilterMac::OnRequestTextCheck(
|
| - int route_id,
|
| - int identifier,
|
| - const base::string16& text,
|
| - std::vector<SpellCheckMarker> markers) {
|
| - DCHECK(!text.empty());
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| -
|
| - // Initialize the spellcheck service if needed. The service will send the
|
| - // language code for text breaking to the renderer. (Text breaking is required
|
| - // for the context menu to show spelling suggestions.) Initialization must
|
| - // happen on UI thread.
|
| - SpellcheckServiceFactory::GetForRenderProcessId(render_process_id_);
|
| -
|
| - // Erase invalid markers (with offsets out of boundaries of text length).
|
| - markers.erase(
|
| - std::remove_if(
|
| - markers.begin(),
|
| - markers.end(),
|
| - std::not1(SpellCheckMarker::IsValidPredicate(text.length()))),
|
| - markers.end());
|
| - // SpellingRequest self-destructs.
|
| - SpellingRequest* request =
|
| - new SpellingRequest(client_.get(), this, render_process_id_);
|
| - request->RequestCheck(
|
| - text, route_id, identifier, ToDocumentTag(route_id), markers);
|
| -}
|
| -
|
| -int SpellCheckMessageFilterMac::ToDocumentTag(int route_id) {
|
| - if (!tag_map_.count(route_id))
|
| - tag_map_[route_id] = spellcheck_mac::GetDocumentTag();
|
| - return tag_map_[route_id];
|
| -}
|
| -
|
| -// TODO(groby): We are currently not notified of retired tags. We need
|
| -// to track destruction of RenderViewHosts on the browser process side
|
| -// to update our mappings when a document goes away.
|
| -void SpellCheckMessageFilterMac::RetireDocumentTag(int route_id) {
|
| - spellcheck_mac::CloseDocumentWithTag(ToDocumentTag(route_id));
|
| - tag_map_.erase(route_id);
|
| -}
|
|
|