diff options
author | rouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-31 20:27:03 +0000 |
---|---|---|
committer | rouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-31 20:27:03 +0000 |
commit | 427276eeddc29f2b9d30ed171c5d272c20e3ae69 (patch) | |
tree | 5e350df22370b750b33b9aaefb29ef473fb3f218 /chrome/browser/spellchecker/spelling_service_client.cc | |
parent | e1af3b6b9332143040769bbeb5d12465853be176 (diff) | |
download | chromium_src-427276eeddc29f2b9d30ed171c5d272c20e3ae69.zip chromium_src-427276eeddc29f2b9d30ed171c5d272c20e3ae69.tar.gz chromium_src-427276eeddc29f2b9d30ed171c5d272c20e3ae69.tar.bz2 |
Check for error message from spelling service
When spelling service is not available, it returns HTTP status code 200, but the
JSON response data indicates an error. This CL checks for errors in the JSON
response data to correctly fallback on local spellcheck if needed.
BUG=230245
Review URL: https://chromiumcodereview.appspot.com/16050011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203466 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/spellchecker/spelling_service_client.cc')
-rw-r--r-- | chrome/browser/spellchecker/spelling_service_client.cc | 86 |
1 files changed, 53 insertions, 33 deletions
diff --git a/chrome/browser/spellchecker/spelling_service_client.cc b/chrome/browser/spellchecker/spelling_service_client.cc index 9eeeb1b..b4fc16f 100644 --- a/chrome/browser/spellchecker/spelling_service_client.cc +++ b/chrome/browser/spellchecker/spelling_service_client.cc @@ -28,6 +28,13 @@ namespace { // The URL for requesting spell checking and sending user feedback. const char kSpellingServiceURL[] = "https://www.googleapis.com/rpc"; +// The location of spellcheck suggestions in JSON response from spelling +// service. +const char kMisspellingsPath[] = "result.spellingCheckResponse.misspellings"; + +// The location of error messages in JSON response from spelling service. +const char kErrorPath[] = "error"; + } // namespace SpellingServiceClient::SpellingServiceClient() { @@ -126,37 +133,6 @@ bool SpellingServiceClient::IsAvailable(Profile* profile, ServiceType type) { } } -SpellingServiceClient::TextCheckCallbackData::TextCheckCallbackData( - TextCheckCompleteCallback callback, - string16 text) - : callback(callback), - text(text) { -} - -SpellingServiceClient::TextCheckCallbackData::~TextCheckCallbackData() { -} - -void SpellingServiceClient::OnURLFetchComplete( - const net::URLFetcher* source) { - DCHECK(spellcheck_fetchers_[source]); - scoped_ptr<const net::URLFetcher> fetcher(source); - scoped_ptr<TextCheckCallbackData> - callback_data(spellcheck_fetchers_[fetcher.get()]); - bool success = false; - std::vector<SpellCheckResult> results; - if (fetcher->GetResponseCode() / 100 == 2) { - std::string data; - fetcher->GetResponseAsString(&data); - success = ParseResponse(data, &results); - } - callback_data->callback.Run(success, callback_data->text, results); - spellcheck_fetchers_.erase(fetcher.get()); -} - -net::URLFetcher* SpellingServiceClient::CreateURLFetcher(const GURL& url) { - return net::URLFetcher::Create(url, net::URLFetcher::POST, this); -} - bool SpellingServiceClient::ParseResponse( const std::string& data, std::vector<SpellCheckResult>* results) { @@ -191,18 +167,31 @@ bool SpellingServiceClient::ParseResponse( // } // } // } + // If the service is not available, the Spelling service returns JSON with an + // error. + // { + // "error": { + // "code": 400, + // "message": "Bad Request", + // "data": [...] + // } + // } scoped_ptr<DictionaryValue> value( static_cast<DictionaryValue*>( base::JSONReader::Read(data, base::JSON_ALLOW_TRAILING_COMMAS))); if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) return false; + // Check for errors from spelling service. + DictionaryValue* error = NULL; + if (value->GetDictionary(kErrorPath, &error)) + return false; + // Retrieve the array of Misspelling objects. When the input text does not // have misspelled words, it returns an empty JSON. (In this case, its HTTP // status is 200.) We just return true for this case. ListValue* misspellings = NULL; - const char kMisspellings[] = "result.spellingCheckResponse.misspellings"; - if (!value->GetList(kMisspellings, &misspellings)) + if (!value->GetList(kMisspellingsPath, &misspellings)) return true; for (size_t i = 0; i < misspellings->GetSize(); ++i) { @@ -234,3 +223,34 @@ bool SpellingServiceClient::ParseResponse( } return true; } + +SpellingServiceClient::TextCheckCallbackData::TextCheckCallbackData( + TextCheckCompleteCallback callback, + string16 text) + : callback(callback), + text(text) { +} + +SpellingServiceClient::TextCheckCallbackData::~TextCheckCallbackData() { +} + +void SpellingServiceClient::OnURLFetchComplete( + const net::URLFetcher* source) { + DCHECK(spellcheck_fetchers_[source]); + scoped_ptr<const net::URLFetcher> fetcher(source); + scoped_ptr<TextCheckCallbackData> + callback_data(spellcheck_fetchers_[fetcher.get()]); + bool success = false; + std::vector<SpellCheckResult> results; + if (fetcher->GetResponseCode() / 100 == 2) { + std::string data; + fetcher->GetResponseAsString(&data); + success = ParseResponse(data, &results); + } + callback_data->callback.Run(success, callback_data->text, results); + spellcheck_fetchers_.erase(fetcher.get()); +} + +net::URLFetcher* SpellingServiceClient::CreateURLFetcher(const GURL& url) { + return net::URLFetcher::Create(url, net::URLFetcher::POST, this); +} |