15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer_tracker.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSpellCheckClient.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderView; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpellCheck; 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SpellCheckMarker; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SpellCheckResult; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebString; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebTextCheckingCompletion; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebTextCheckingResult; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class deals with invoking browser-side spellcheck mechanism 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which is done asynchronously. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpellCheckProvider 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::RenderViewObserver, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::RenderViewObserverTracker<SpellCheckProvider>, 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public blink::WebSpellCheckClient { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef IDMap<blink::WebTextCheckingCompletion> WebTextCheckCompletions; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellCheckProvider(content::RenderView* render_view, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellCheck* spellcheck); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SpellCheckProvider(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests async spell and grammar checker to the platform text 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checker, which is available on the browser process. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestTextChecking( 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextCheckingCompletion* completion, 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<SpellCheckMarker>& markers); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of ongoing IPC requests. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t pending_text_request_size() const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return text_check_completions_.size(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace shared spellcheck data. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_spellcheck(SpellCheck* spellcheck) { spellcheck_ = spellcheck; } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enables document-wide spellchecking. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EnableSpellcheck(bool enabled); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewObserver implementation. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class TestingSpellCheckProvider; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tries to satisfy a spell check request from the cache in |last_request_|. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true (and cancels/finishes the completion) if it can, false 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the provider should forward the query on. 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool SatisfyRequestFromCache(const base::string16& text, 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextCheckingCompletion* completion); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebSpellCheckClient implementation. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void spellCheck( 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& text, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int& offset, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int& length, 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebString>* optional_suggestions) OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void checkTextOfParagraph( 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& text, 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextCheckingTypeMask mask, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebTextCheckingResult>* results) OVERRIDE; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void requestCheckingOfText( 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& text, 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<uint32>& markers, 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<unsigned>& marker_offsets, 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextCheckingCompletion* completion) OVERRIDE; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebString autoCorrectWord( 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& misspelled_word) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void showSpellingUI(bool show) OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isShowingSpellingUI() OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateSpellingUIWithMisspelledWord( 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& word) OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRespondSpellingService( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int identifier, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded, 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SpellCheckResult>& results); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether |text| has word characters, i.e. whether a spellchecker 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs to check this text. 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool HasWordCharacters(const base::string16& text, int index) const; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnAdvanceToNextMisspelling(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRespondTextCheck( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int identifier, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SpellCheckResult>& results); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnToggleSpellPanel(bool is_currently_visible); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Holds ongoing spellchecking operations, assigns IDs for the IPC routing. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextCheckCompletions text_check_completions_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last text sent to the browser process to spellcheck it and its 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spellchecking results. 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 last_request_; 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebTextCheckingResult> last_results_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the browser is showing the spelling panel for us. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool spelling_panel_visible_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak pointer to shared (per RenderView) spellcheck data. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellCheck* spellcheck_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SpellCheckProvider); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 132