summaryrefslogtreecommitdiffstats
path: root/chrome/browser/spellchecker/spelling_service_client.cc
diff options
context:
space:
mode:
authorrouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:27:03 +0000
committerrouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:27:03 +0000
commit427276eeddc29f2b9d30ed171c5d272c20e3ae69 (patch)
tree5e350df22370b750b33b9aaefb29ef473fb3f218 /chrome/browser/spellchecker/spelling_service_client.cc
parente1af3b6b9332143040769bbeb5d12465853be176 (diff)
downloadchromium_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.cc86
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);
+}