Index: chrome/browser/autocomplete/search_provider.cc |
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc |
index e4f35813feb91cacb699c4ff33e352afe0dd1845..9228751c8a799a16a1dfbe3d54d54a6c5a33a1ce 100644 |
--- a/chrome/browser/autocomplete/search_provider.cc |
+++ b/chrome/browser/autocomplete/search_provider.cc |
@@ -653,24 +653,8 @@ void SearchProvider::OnURLFetchComplete(const net::URLFetcher* source) { |
} |
} |
- // The JSON response should be an array. |
- for (size_t response_start_index = json_data.find("["), i = 0; |
- response_start_index != std::string::npos && i < 5; |
- response_start_index = json_data.find("[", 1), i++) { |
- // Remove any XSSI guards to allow for JSON parsing. |
- if (response_start_index > 0) |
- json_data.erase(0, response_start_index); |
- |
- JSONStringValueSerializer deserializer(json_data); |
- deserializer.set_allow_trailing_comma(true); |
- int error_code = 0; |
- scoped_ptr<Value> data(deserializer.Deserialize(&error_code, NULL)); |
- if (error_code == 0) { |
- results_updated = data.get() && |
- ParseSuggestResults(data.get(), is_keyword); |
- break; |
- } |
- } |
+ scoped_ptr<Value> data(DeserializeJsonData(json_data)); |
+ results_updated = data.get() && ParseSuggestResults(data.get(), is_keyword); |
} |
UpdateMatches(); |
@@ -1040,6 +1024,26 @@ net::URLFetcher* SearchProvider::CreateSuggestFetcher( |
return fetcher; |
} |
+scoped_ptr<Value> SearchProvider::DeserializeJsonData(std::string json_data) { |
+ // The JSON response should be an array. |
+ for (size_t response_start_index = json_data.find("["), i = 0; |
+ response_start_index != std::string::npos && i < 5; |
+ response_start_index = json_data.find("[", 1), i++) { |
+ // Remove any XSSI guards to allow for JSON parsing. |
+ if (response_start_index > 0) |
+ json_data.erase(0, response_start_index); |
+ |
+ JSONStringValueSerializer deserializer(json_data); |
+ deserializer.set_allow_trailing_comma(true); |
+ int error_code = 0; |
+ scoped_ptr<Value> data(deserializer.Deserialize(&error_code, NULL)); |
+ if (error_code == 0) { |
+ return data.Pass(); |
+ } |
+ } |
+ return scoped_ptr<Value>(Value::CreateNullValue()); |
H Fung
2013/12/02 23:04:52
Are you depending on ParseSuggestResults to fail f
Maria
2013/12/02 23:24:29
I was actually expecting data.get() to return null
H Fung
2013/12/02 23:43:44
Thanks, it seems like Chrome's scoped_ptr is copya
|
+} |
+ |
bool SearchProvider::ParseSuggestResults(Value* root_val, bool is_keyword) { |
string16 query; |
ListValue* root_list = NULL; |