Add spell checking support (issue #137).

This includes:
- Red underline of misspelled words in html text areas.
- Right-click context menu options to correct the misspelled word.
- New CefBrowser::ReplaceMisspelling method for accepting a word replacement.
- Methods added to CefContextMenuParams for retrieving spelling-related information.
- Uses the unified text checker when auto-correct is not enabled to match Google Chrome behavior.
- On Windows and Linux a hunspell dictionary file will be downloaded to the "<cache_path>/Dictionaries" directory as needed, or used from the <cache_path> directory if the file already exists there. The dictionary file will be downloaded from http://cache.pack.google.com/edgedl/chrome/dict/<LANG>-3-0.bdic where <LANG> is the language abbreviation.
- On OS X the spell checking implementation will use the system NSSpellChecker implementation.

The following command-line flags have been added:
--disable-spell-checking => Disable spell-checking support (no red underline, no dictionary file download, etc).
--enable-spelling-auto-correct => Automatically correct common misspellings while typing (like 'omre' to 'more' on Windows/Linux or 'ehlo' to 'helo' on OS X).
--enable-spelling-service => Enable use of the remote Google spelling service (this requires Google API keys).
--override-spell-check-lang=<LANG> => Use the specified dictionary language <LANG> instead of the language specified in the locales.pak file. To see the default/supported dictionary languages: https://code.google.com/p/chromium/codesearch#search/&q=IDS_SPELLCHECK_DICTIONARY%20xtb&sq=package:chromium


git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1859 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt
2014-10-07 20:44:33 +00:00
parent de3d28f9a1
commit 77aa0be191
36 changed files with 779 additions and 64 deletions

View File

@@ -411,6 +411,23 @@ int CEF_CALLBACK browser_host_is_mouse_cursor_change_disabled(
return _retval;
}
void CEF_CALLBACK browser_host_replace_misspelling(
struct _cef_browser_host_t* self, const cef_string_t* word) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return;
// Verify param: word; type: string_byref_const
DCHECK(word);
if (!word)
return;
// Execute
CefBrowserHostCppToC::Get(self)->ReplaceMisspelling(
CefString(word));
}
int CEF_CALLBACK browser_host_is_window_rendering_disabled(
struct _cef_browser_host_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
@@ -782,6 +799,7 @@ CefBrowserHostCppToC::CefBrowserHostCppToC(CefBrowserHost* cls)
browser_host_set_mouse_cursor_change_disabled;
struct_.struct_.is_mouse_cursor_change_disabled =
browser_host_is_mouse_cursor_change_disabled;
struct_.struct_.replace_misspelling = browser_host_replace_misspelling;
struct_.struct_.is_window_rendering_disabled =
browser_host_is_window_rendering_disabled;
struct_.struct_.was_resized = browser_host_was_resized;

View File

@@ -11,6 +11,7 @@
//
#include "libcef_dll/cpptoc/context_menu_params_cpptoc.h"
#include "libcef_dll/transfer_util.h"
// MEMBER FUNCTIONS - Body may be edited by hand.
@@ -214,6 +215,66 @@ cef_string_userfree_t CEF_CALLBACK context_menu_params_get_selection_text(
return _retval.DetachToUserFree();
}
cef_string_userfree_t CEF_CALLBACK context_menu_params_get_misspelled_word(
struct _cef_context_menu_params_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return NULL;
// Execute
CefString _retval = CefContextMenuParamsCppToC::Get(self)->GetMisspelledWord(
);
// Return type: string
return _retval.DetachToUserFree();
}
int CEF_CALLBACK context_menu_params_get_misspelling_hash(
struct _cef_context_menu_params_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return 0;
// Execute
int _retval = CefContextMenuParamsCppToC::Get(self)->GetMisspellingHash();
// Return type: simple
return _retval;
}
int CEF_CALLBACK context_menu_params_get_dictionary_suggestions(
struct _cef_context_menu_params_t* self, cef_string_list_t suggestions) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return 0;
// Verify param: suggestions; type: string_vec_byref
DCHECK(suggestions);
if (!suggestions)
return 0;
// Translate param: suggestions; type: string_vec_byref
std::vector<CefString> suggestionsList;
transfer_string_list_contents(suggestions, suggestionsList);
// Execute
bool _retval = CefContextMenuParamsCppToC::Get(
self)->GetDictionarySuggestions(
suggestionsList);
// Restore param: suggestions; type: string_vec_byref
cef_string_list_clear(suggestions);
transfer_string_list_contents(suggestionsList, suggestions);
// Return type: bool
return _retval;
}
int CEF_CALLBACK context_menu_params_is_editable(
struct _cef_context_menu_params_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
@@ -229,6 +290,21 @@ int CEF_CALLBACK context_menu_params_is_editable(
return _retval;
}
int CEF_CALLBACK context_menu_params_is_spell_check_enabled(
struct _cef_context_menu_params_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return 0;
// Execute
bool _retval = CefContextMenuParamsCppToC::Get(self)->IsSpellCheckEnabled();
// Return type: bool
return _retval;
}
cef_context_menu_edit_state_flags_t CEF_CALLBACK context_menu_params_get_edit_state_flags(
struct _cef_context_menu_params_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
@@ -267,7 +343,14 @@ CefContextMenuParamsCppToC::CefContextMenuParamsCppToC(
struct_.struct_.get_media_state_flags =
context_menu_params_get_media_state_flags;
struct_.struct_.get_selection_text = context_menu_params_get_selection_text;
struct_.struct_.get_misspelled_word = context_menu_params_get_misspelled_word;
struct_.struct_.get_misspelling_hash =
context_menu_params_get_misspelling_hash;
struct_.struct_.get_dictionary_suggestions =
context_menu_params_get_dictionary_suggestions;
struct_.struct_.is_editable = context_menu_params_is_editable;
struct_.struct_.is_spell_check_enabled =
context_menu_params_is_spell_check_enabled;
struct_.struct_.get_edit_state_flags =
context_menu_params_get_edit_state_flags;
}

View File

@@ -315,6 +315,23 @@ void CEF_CALLBACK render_handler_update_drag_cursor(
operation);
}
void CEF_CALLBACK render_handler_on_scroll_offset_changed(
struct _cef_render_handler_t* self, cef_browser_t* browser) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return;
// Verify param: browser; type: refptr_diff
DCHECK(browser);
if (!browser)
return;
// Execute
CefRenderHandlerCppToC::Get(self)->OnScrollOffsetChanged(
CefBrowserCToCpp::Wrap(browser));
}
// CONSTRUCTOR - Do not edit by hand.
@@ -331,6 +348,8 @@ CefRenderHandlerCppToC::CefRenderHandlerCppToC(CefRenderHandler* cls)
struct_.struct_.on_cursor_change = render_handler_on_cursor_change;
struct_.struct_.start_dragging = render_handler_start_dragging;
struct_.struct_.update_drag_cursor = render_handler_update_drag_cursor;
struct_.struct_.on_scroll_offset_changed =
render_handler_on_scroll_offset_changed;
}
#ifndef NDEBUG

View File

@@ -331,6 +331,22 @@ bool CefBrowserHostCToCpp::IsMouseCursorChangeDisabled() {
return _retval?true:false;
}
void CefBrowserHostCToCpp::ReplaceMisspelling(const CefString& word) {
if (CEF_MEMBER_MISSING(struct_, replace_misspelling))
return;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Verify param: word; type: string_byref_const
DCHECK(!word.empty());
if (word.empty())
return;
// Execute
struct_->replace_misspelling(struct_,
word.GetStruct());
}
bool CefBrowserHostCToCpp::IsWindowRenderingDisabled() {
if (CEF_MEMBER_MISSING(struct_, is_window_rendering_disabled))
return false;

View File

@@ -62,6 +62,7 @@ class CefBrowserHostCToCpp
virtual void CloseDevTools() OVERRIDE;
virtual void SetMouseCursorChangeDisabled(bool disabled) OVERRIDE;
virtual bool IsMouseCursorChangeDisabled() OVERRIDE;
virtual void ReplaceMisspelling(const CefString& word) OVERRIDE;
virtual bool IsWindowRenderingDisabled() OVERRIDE;
virtual void WasResized() OVERRIDE;
virtual void WasHidden(bool hidden) OVERRIDE;

View File

@@ -11,6 +11,7 @@
//
#include "libcef_dll/ctocpp/context_menu_params_ctocpp.h"
#include "libcef_dll/transfer_util.h"
// VIRTUAL METHODS - Body may be edited by hand.
@@ -200,6 +201,62 @@ CefString CefContextMenuParamsCToCpp::GetSelectionText() {
return _retvalStr;
}
CefString CefContextMenuParamsCToCpp::GetMisspelledWord() {
if (CEF_MEMBER_MISSING(struct_, get_misspelled_word))
return CefString();
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
cef_string_userfree_t _retval = struct_->get_misspelled_word(struct_);
// Return type: string
CefString _retvalStr;
_retvalStr.AttachToUserFree(_retval);
return _retvalStr;
}
int CefContextMenuParamsCToCpp::GetMisspellingHash() {
if (CEF_MEMBER_MISSING(struct_, get_misspelling_hash))
return 0;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
int _retval = struct_->get_misspelling_hash(struct_);
// Return type: simple
return _retval;
}
bool CefContextMenuParamsCToCpp::GetDictionarySuggestions(
std::vector<CefString>& suggestions) {
if (CEF_MEMBER_MISSING(struct_, get_dictionary_suggestions))
return false;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Translate param: suggestions; type: string_vec_byref
cef_string_list_t suggestionsList = cef_string_list_alloc();
DCHECK(suggestionsList);
if (suggestionsList)
transfer_string_list_contents(suggestions, suggestionsList);
// Execute
int _retval = struct_->get_dictionary_suggestions(struct_,
suggestionsList);
// Restore param:suggestions; type: string_vec_byref
if (suggestionsList) {
suggestions.clear();
transfer_string_list_contents(suggestionsList, suggestions);
cef_string_list_free(suggestionsList);
}
// Return type: bool
return _retval?true:false;
}
bool CefContextMenuParamsCToCpp::IsEditable() {
if (CEF_MEMBER_MISSING(struct_, is_editable))
return false;
@@ -213,6 +270,19 @@ bool CefContextMenuParamsCToCpp::IsEditable() {
return _retval?true:false;
}
bool CefContextMenuParamsCToCpp::IsSpellCheckEnabled() {
if (CEF_MEMBER_MISSING(struct_, is_spell_check_enabled))
return false;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
int _retval = struct_->is_spell_check_enabled(struct_);
// Return type: bool
return _retval?true:false;
}
CefContextMenuParams::EditStateFlags CefContextMenuParamsCToCpp::GetEditStateFlags(
) {
if (CEF_MEMBER_MISSING(struct_, get_edit_state_flags))

View File

@@ -18,6 +18,7 @@
#pragma message("Warning: "__FILE__" may be accessed wrapper-side only")
#else // USING_CEF_SHARED
#include <vector>
#include "include/cef_context_menu_handler.h"
#include "include/capi/cef_context_menu_handler_capi.h"
#include "libcef_dll/ctocpp/ctocpp.h"
@@ -47,7 +48,12 @@ class CefContextMenuParamsCToCpp
virtual MediaType GetMediaType() OVERRIDE;
virtual MediaStateFlags GetMediaStateFlags() OVERRIDE;
virtual CefString GetSelectionText() OVERRIDE;
virtual CefString GetMisspelledWord() OVERRIDE;
virtual int GetMisspellingHash() OVERRIDE;
virtual bool GetDictionarySuggestions(
std::vector<CefString>& suggestions) OVERRIDE;
virtual bool IsEditable() OVERRIDE;
virtual bool IsSpellCheckEnabled() OVERRIDE;
virtual EditStateFlags GetEditStateFlags() OVERRIDE;
};

View File

@@ -250,6 +250,23 @@ void CefRenderHandlerCToCpp::UpdateDragCursor(CefRefPtr<CefBrowser> browser,
operation);
}
void CefRenderHandlerCToCpp::OnScrollOffsetChanged(
CefRefPtr<CefBrowser> browser) {
if (CEF_MEMBER_MISSING(struct_, on_scroll_offset_changed))
return;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Verify param: browser; type: refptr_diff
DCHECK(browser.get());
if (!browser.get())
return;
// Execute
struct_->on_scroll_offset_changed(struct_,
CefBrowserCppToC::Wrap(browser));
}
#ifndef NDEBUG
template<> base::AtomicRefCount CefCToCpp<CefRenderHandlerCToCpp,

View File

@@ -55,6 +55,7 @@ class CefRenderHandlerCToCpp
int y) OVERRIDE;
virtual void UpdateDragCursor(CefRefPtr<CefBrowser> browser,
DragOperation operation) OVERRIDE;
virtual void OnScrollOffsetChanged(CefRefPtr<CefBrowser> browser) OVERRIDE;
};
#endif // BUILDING_CEF_SHARED