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

Side by Side Diff: chrome/browser/autocomplete/search_provider.cc

Issue 96753004: Ensure zero suggest can handle XSSI-escaped output. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing the return value in failure case Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/autocomplete/search_provider.h" 5 #include "chrome/browser/autocomplete/search_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 if (response_headers->GetCharset(&charset)) { 646 if (response_headers->GetCharset(&charset)) {
647 string16 data_16; 647 string16 data_16;
648 // TODO(jungshik): Switch to CodePageToUTF8 after it's added. 648 // TODO(jungshik): Switch to CodePageToUTF8 after it's added.
649 if (base::CodepageToUTF16(json_data, charset.c_str(), 649 if (base::CodepageToUTF16(json_data, charset.c_str(),
650 base::OnStringConversionError::FAIL, 650 base::OnStringConversionError::FAIL,
651 &data_16)) 651 &data_16))
652 json_data = UTF16ToUTF8(data_16); 652 json_data = UTF16ToUTF8(data_16);
653 } 653 }
654 } 654 }
655 655
656 // The JSON response should be an array. 656 scoped_ptr<Value> data(DeserializeJsonData(json_data));
657 for (size_t response_start_index = json_data.find("["), i = 0; 657 results_updated = data.get() && ParseSuggestResults(data.get(), is_keyword);
658 response_start_index != std::string::npos && i < 5;
659 response_start_index = json_data.find("[", 1), i++) {
660 // Remove any XSSI guards to allow for JSON parsing.
661 if (response_start_index > 0)
662 json_data.erase(0, response_start_index);
663
664 JSONStringValueSerializer deserializer(json_data);
665 deserializer.set_allow_trailing_comma(true);
666 int error_code = 0;
667 scoped_ptr<Value> data(deserializer.Deserialize(&error_code, NULL));
668 if (error_code == 0) {
669 results_updated = data.get() &&
670 ParseSuggestResults(data.get(), is_keyword);
671 break;
672 }
673 }
674 } 658 }
675 659
676 UpdateMatches(); 660 UpdateMatches();
677 if (done_ || results_updated) 661 if (done_ || results_updated)
678 listener_->OnProviderUpdate(results_updated); 662 listener_->OnProviderUpdate(results_updated);
679 } 663 }
680 664
681 void SearchProvider::Run() { 665 void SearchProvider::Run() {
682 // Start a new request with the current input. 666 // Start a new request with the current input.
683 suggest_results_pending_ = 0; 667 suggest_results_pending_ = 0;
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); 1017 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES);
1034 // Add Chrome experiment state to the request headers. 1018 // Add Chrome experiment state to the request headers.
1035 net::HttpRequestHeaders headers; 1019 net::HttpRequestHeaders headers;
1036 chrome_variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( 1020 chrome_variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders(
1037 fetcher->GetOriginalURL(), profile_->IsOffTheRecord(), false, &headers); 1021 fetcher->GetOriginalURL(), profile_->IsOffTheRecord(), false, &headers);
1038 fetcher->SetExtraRequestHeaders(headers.ToString()); 1022 fetcher->SetExtraRequestHeaders(headers.ToString());
1039 fetcher->Start(); 1023 fetcher->Start();
1040 return fetcher; 1024 return fetcher;
1041 } 1025 }
1042 1026
1027 scoped_ptr<Value> SearchProvider::DeserializeJsonData(std::string json_data) {
1028 // The JSON response should be an array.
1029 for (size_t response_start_index = json_data.find("["), i = 0;
1030 response_start_index != std::string::npos && i < 5;
1031 response_start_index = json_data.find("[", 1), i++) {
1032 // Remove any XSSI guards to allow for JSON parsing.
1033 if (response_start_index > 0)
1034 json_data.erase(0, response_start_index);
1035
1036 JSONStringValueSerializer deserializer(json_data);
1037 deserializer.set_allow_trailing_comma(true);
1038 int error_code = 0;
1039 scoped_ptr<Value> data(deserializer.Deserialize(&error_code, NULL));
1040 if (error_code == 0) {
H Fung 2013/12/02 23:43:45 No curly braces since I think that's the conventio
Maria 2013/12/03 00:48:02 Done.
1041 return data.Pass();
1042 }
1043 }
1044 return scoped_ptr<Value>();
1045 }
1046
1043 bool SearchProvider::ParseSuggestResults(Value* root_val, bool is_keyword) { 1047 bool SearchProvider::ParseSuggestResults(Value* root_val, bool is_keyword) {
1044 string16 query; 1048 string16 query;
1045 ListValue* root_list = NULL; 1049 ListValue* root_list = NULL;
1046 ListValue* results_list = NULL; 1050 ListValue* results_list = NULL;
1047 const string16& input_text = 1051 const string16& input_text =
1048 is_keyword ? keyword_input_.text() : input_.text(); 1052 is_keyword ? keyword_input_.text() : input_.text();
1049 if (!root_val->GetAsList(&root_list) || !root_list->GetString(0, &query) || 1053 if (!root_val->GetAsList(&root_list) || !root_list->GetString(0, &query) ||
1050 (query != input_text) || !root_list->GetList(1, &results_list)) 1054 (query != input_text) || !root_list->GetList(1, &results_list))
1051 return false; 1055 return false;
1052 1056
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
1945 it->set_relevance(max_query_relevance); 1949 it->set_relevance(max_query_relevance);
1946 it->set_relevance_from_server(relevance_from_server); 1950 it->set_relevance_from_server(relevance_from_server);
1947 } 1951 }
1948 } 1952 }
1949 1953
1950 void SearchProvider::UpdateDone() { 1954 void SearchProvider::UpdateDone() {
1951 // We're done when the timer isn't running, there are no suggest queries 1955 // We're done when the timer isn't running, there are no suggest queries
1952 // pending, and we're not waiting on Instant. 1956 // pending, and we're not waiting on Instant.
1953 done_ = !timer_.IsRunning() && (suggest_results_pending_ == 0); 1957 done_ = !timer_.IsRunning() && (suggest_results_pending_ == 0);
1954 } 1958 }
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/search_provider.h ('k') | chrome/browser/autocomplete/zero_suggest_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698