Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5369)

Unified Diff: chrome/browser/spellchecker/spellchecker_mac.mm

Issue 8883040: [Mac] Ignore spell-checker exceptions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: s/Calls/Executes/. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/mac/scoped_nsexception_enabler.mm ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/spellchecker/spellchecker_mac.mm
diff --git a/chrome/browser/spellchecker/spellchecker_mac.mm b/chrome/browser/spellchecker/spellchecker_mac.mm
index 2f4f57abdf782c0054f23a3484324ddf5fc50e68..4c8484e1e8d47fd95bc4761d4cc4f22b976882f1 100644
--- a/chrome/browser/spellchecker/spellchecker_mac.mm
+++ b/chrome/browser/spellchecker/spellchecker_mac.mm
@@ -10,6 +10,8 @@
#import <Cocoa/Cocoa.h>
#include "base/logging.h"
+#include "base/mac/foundation_util.h"
+#include "base/mac/scoped_nsexception_enabler.h"
#include "base/metrics/histogram.h"
#include "base/sys_string_conversions.h"
#include "base/task.h"
@@ -27,6 +29,19 @@ namespace {
// The number of characters in the first part of the language code.
const unsigned int kShortLanguageCodeSize = 2;
+// +[NSSpellChecker sharedSpellChecker] can throw exceptions depending
+// on the state of the pasteboard, or possibly as a result of
+// third-party code (when setting up services entries). The following
+// receives nil if an exception is thrown, in which case
+// spell-checking will not work, but it also will not crash the
+// browser.
+NSSpellChecker* SharedSpellChecker() {
+ return base::mac::ObjCCastStrict<NSSpellChecker>(
+ base::mac::PerformSelectorIgnoringExceptions(
+ [NSSpellChecker class],
+ @selector(sharedSpellChecker)));
+}
+
// TextCheckingTask is reserved for spell checking against large size
// of text, which possible contains multiple paragrpahs. Checking
// that size of text might take time, and should be done as a task on
@@ -55,7 +70,7 @@ class TextCheckingTask : public Task {
NSString* text_to_check = base::SysUTF16ToNSString(text_);
size_t starting_at = 0;
while (starting_at < text_.size()) {
- NSRange range = [[NSSpellChecker sharedSpellChecker]
+ NSRange range = [SharedSpellChecker()
checkSpellingOfString:text_to_check
startingAt:starting_at
language:nil
@@ -152,8 +167,7 @@ std::string ConvertLanguageCodeFromMac(NSString* lang_code) {
namespace SpellCheckerPlatform {
void GetAvailableLanguages(std::vector<std::string>* spellcheck_languages) {
- NSArray* availableLanguages = [[NSSpellChecker sharedSpellChecker]
- availableLanguages];
+ NSArray* availableLanguages = [SharedSpellChecker() availableLanguages];
for (NSString* lang_code in availableLanguages) {
spellcheck_languages->push_back(
ConvertLanguageCodeFromMac(lang_code));
@@ -174,17 +188,17 @@ bool SpellCheckerProvidesPanel() {
bool SpellingPanelVisible() {
// This should only be called from the main thread.
DCHECK([NSThread currentThread] == [NSThread mainThread]);
- return [[[NSSpellChecker sharedSpellChecker] spellingPanel] isVisible];
+ return [[SharedSpellChecker() spellingPanel] isVisible];
}
void ShowSpellingPanel(bool show) {
if (show) {
- [[[NSSpellChecker sharedSpellChecker] spellingPanel]
+ [[SharedSpellChecker() spellingPanel]
performSelectorOnMainThread:@selector(makeKeyAndOrderFront:)
withObject:nil
waitUntilDone:YES];
} else {
- [[[NSSpellChecker sharedSpellChecker] spellingPanel]
+ [[SharedSpellChecker() spellingPanel]
performSelectorOnMainThread:@selector(close)
withObject:nil
waitUntilDone:YES];
@@ -193,7 +207,7 @@ void ShowSpellingPanel(bool show) {
void UpdateSpellingPanelWithMisspelledWord(const string16& word) {
NSString * word_to_display = base::SysUTF16ToNSString(word);
- [[NSSpellChecker sharedSpellChecker]
+ [SharedSpellChecker()
performSelectorOnMainThread:
@selector(updateSpellingPanelWithMisspelledWord:)
withObject:word_to_display
@@ -208,9 +222,7 @@ bool PlatformSupportsLanguage(const std::string& current_language) {
NSString* mac_lang_code = ConvertLanguageCodeToMac(current_language);
// Then grab the languages available.
- NSArray* availableLanguages;
- availableLanguages = [[NSSpellChecker sharedSpellChecker]
- availableLanguages];
+ NSArray* availableLanguages = [SharedSpellChecker() availableLanguages];
// Return true if the given language is supported by OS X.
return [availableLanguages containsObject:mac_lang_code];
@@ -218,7 +230,7 @@ bool PlatformSupportsLanguage(const std::string& current_language) {
void SetLanguage(const std::string& lang_to_set) {
NSString* NS_lang_to_set = ConvertLanguageCodeToMac(lang_to_set);
- [[NSSpellChecker sharedSpellChecker] setLanguage:NS_lang_to_set];
+ [SharedSpellChecker() setLanguage:NS_lang_to_set];
}
static int last_seen_tag_;
@@ -226,14 +238,14 @@ static int last_seen_tag_;
bool CheckSpelling(const string16& word_to_check, int tag) {
last_seen_tag_ = tag;
- // [[NSSpellChecker sharedSpellChecker] checkSpellingOfString] returns an
- // NSRange that we can look at to determine if a word is misspelled.
+ // -[NSSpellChecker checkSpellingOfString] returns an NSRange that
+ // we can look at to determine if a word is misspelled.
NSRange spell_range = {0,0};
// Convert the word to an NSString.
NSString* NS_word_to_check = base::SysUTF16ToNSString(word_to_check);
// Check the spelling, starting at the beginning of the word.
- spell_range = [[NSSpellChecker sharedSpellChecker]
+ spell_range = [SharedSpellChecker()
checkSpellingOfString:NS_word_to_check startingAt:0
language:nil wrap:NO inSpellDocumentWithTag:tag
wordCount:NULL];
@@ -249,8 +261,7 @@ void FillSuggestionList(const string16& wrong_word,
NSString* NS_wrong_word = base::SysUTF16ToNSString(wrong_word);
TimeTicks debug_begin_time = base::Histogram::DebugNow();
// The suggested words for |wrong_word|.
- NSArray* guesses =
- [[NSSpellChecker sharedSpellChecker] guessesForWord:NS_wrong_word];
+ NSArray* guesses = [SharedSpellChecker() guessesForWord:NS_wrong_word];
DHISTOGRAM_TIMES("Spellcheck.SuggestTime",
base::Histogram::DebugNow() - debug_begin_time);
@@ -264,12 +275,12 @@ void FillSuggestionList(const string16& wrong_word,
void AddWord(const string16& word) {
NSString* word_to_add = base::SysUTF16ToNSString(word);
- [[NSSpellChecker sharedSpellChecker] learnWord:word_to_add];
+ [SharedSpellChecker() learnWord:word_to_add];
}
void RemoveWord(const string16& word) {
NSString *word_to_remove = base::SysUTF16ToNSString(word);
- [[NSSpellChecker sharedSpellChecker] unlearnWord:word_to_remove];
+ [SharedSpellChecker() unlearnWord:word_to_remove];
}
int GetDocumentTag() {
@@ -278,13 +289,12 @@ int GetDocumentTag() {
}
void IgnoreWord(const string16& word) {
- [[NSSpellChecker sharedSpellChecker] ignoreWord:base::SysUTF16ToNSString(word)
- inSpellDocumentWithTag:last_seen_tag_];
+ [SharedSpellChecker() ignoreWord:base::SysUTF16ToNSString(word)
+ inSpellDocumentWithTag:last_seen_tag_];
}
void CloseDocumentWithTag(int tag) {
- [[NSSpellChecker sharedSpellChecker]
- closeSpellDocumentWithTag:static_cast<NSInteger>(tag)];
+ [SharedSpellChecker() closeSpellDocumentWithTag:static_cast<NSInteger>(tag)];
}
void RequestTextCheck(int route_id,
« no previous file with comments | « base/mac/scoped_nsexception_enabler.mm ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698