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

Side by Side Diff: components/omnibox/search_suggestion_parser.cc

Issue 669573005: Add a class to parse answer json. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix case on "copyright" Created 6 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/omnibox/search_suggestion_parser.h" 5 #include "components/omnibox/search_suggestion_parser.h"
6 6
7 #include "base/i18n/icu_string_conversions.h" 7 #include "base/i18n/icu_string_conversions.h"
8 #include "base/json/json_string_value_serializer.h" 8 #include "base/json/json_string_value_serializer.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
12 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
13 #include "base/values.h" 14 #include "base/values.h"
14 #include "components/omnibox/autocomplete_input.h" 15 #include "components/omnibox/autocomplete_input.h"
15 #include "components/omnibox/url_prefix.h" 16 #include "components/omnibox/url_prefix.h"
16 #include "components/url_fixer/url_fixer.h" 17 #include "components/url_fixer/url_fixer.h"
17 #include "net/base/net_util.h" 18 #include "net/base/net_util.h"
18 #include "net/http/http_response_headers.h" 19 #include "net/http/http_response_headers.h"
19 #include "net/url_request/url_fetcher.h" 20 #include "net/url_request/url_fetcher.h"
20 #include "url/url_constants.h" 21 #include "url/url_constants.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 // SearchSuggestionParser::SuggestResult --------------------------------------- 59 // SearchSuggestionParser::SuggestResult ---------------------------------------
59 60
60 SearchSuggestionParser::SuggestResult::SuggestResult( 61 SearchSuggestionParser::SuggestResult::SuggestResult(
61 const base::string16& suggestion, 62 const base::string16& suggestion,
62 AutocompleteMatchType::Type type, 63 AutocompleteMatchType::Type type,
63 const base::string16& match_contents, 64 const base::string16& match_contents,
64 const base::string16& match_contents_prefix, 65 const base::string16& match_contents_prefix,
65 const base::string16& annotation, 66 const base::string16& annotation,
66 const base::string16& answer_contents, 67 const base::string16& answer_contents,
67 const base::string16& answer_type, 68 const base::string16& answer_type,
69 scoped_ptr<SuggestionAnswer> answer,
68 const std::string& suggest_query_params, 70 const std::string& suggest_query_params,
69 const std::string& deletion_url, 71 const std::string& deletion_url,
70 bool from_keyword_provider, 72 bool from_keyword_provider,
71 int relevance, 73 int relevance,
72 bool relevance_from_server, 74 bool relevance_from_server,
73 bool should_prefetch, 75 bool should_prefetch,
74 const base::string16& input_text) 76 const base::string16& input_text)
75 : Result(from_keyword_provider, 77 : Result(from_keyword_provider,
76 relevance, 78 relevance,
77 relevance_from_server, 79 relevance_from_server,
78 type, 80 type,
79 deletion_url), 81 deletion_url),
80 suggestion_(suggestion), 82 suggestion_(suggestion),
81 match_contents_prefix_(match_contents_prefix), 83 match_contents_prefix_(match_contents_prefix),
82 annotation_(annotation), 84 annotation_(annotation),
83 suggest_query_params_(suggest_query_params), 85 suggest_query_params_(suggest_query_params),
84 answer_contents_(answer_contents), 86 answer_contents_(answer_contents),
85 answer_type_(answer_type), 87 answer_type_(answer_type),
88 answer_(answer.Pass()),
86 should_prefetch_(should_prefetch) { 89 should_prefetch_(should_prefetch) {
87 match_contents_ = match_contents; 90 match_contents_ = match_contents;
88 DCHECK(!match_contents_.empty()); 91 DCHECK(!match_contents_.empty());
89 ClassifyMatchContents(true, input_text); 92 ClassifyMatchContents(true, input_text);
90 } 93 }
91 94
95 SearchSuggestionParser::SuggestResult::SuggestResult(
96 const SuggestResult& result)
97 : Result(result),
98 suggestion_(result.suggestion_),
99 match_contents_prefix_(result.match_contents_prefix_),
100 annotation_(result.annotation_),
101 suggest_query_params_(result.suggest_query_params_),
102 answer_contents_(result.answer_contents_),
103 answer_type_(result.answer_type_),
104 answer_(SuggestionAnswer::copy(result.answer_.get())),
105 should_prefetch_(result.should_prefetch_) {
106 }
107
92 SearchSuggestionParser::SuggestResult::~SuggestResult() {} 108 SearchSuggestionParser::SuggestResult::~SuggestResult() {}
93 109
110 SearchSuggestionParser::SuggestResult&
111 SearchSuggestionParser::SuggestResult::operator=(const SuggestResult& rhs) {
112 if (this == &rhs)
113 return *this;
114
115 // Assign via parent class first.
116 Result::operator=(rhs);
117
118 suggestion_ = rhs.suggestion_;
119 match_contents_prefix_ = rhs.match_contents_prefix_;
120 annotation_ = rhs.annotation_;
121 suggest_query_params_ = rhs.suggest_query_params_;
122 answer_contents_ = rhs.answer_contents_;
123 answer_type_ = rhs.answer_type_;
124 answer_ = SuggestionAnswer::copy(rhs.answer_.get());
125 should_prefetch_ = rhs.should_prefetch_;
126
127 return *this;
128 }
129
94 void SearchSuggestionParser::SuggestResult::ClassifyMatchContents( 130 void SearchSuggestionParser::SuggestResult::ClassifyMatchContents(
95 const bool allow_bolding_all, 131 const bool allow_bolding_all,
96 const base::string16& input_text) { 132 const base::string16& input_text) {
97 if (input_text.empty()) { 133 if (input_text.empty()) {
98 // In case of zero-suggest results, do not highlight matches. 134 // In case of zero-suggest results, do not highlight matches.
99 match_contents_class_.push_back( 135 match_contents_class_.push_back(
100 ACMatchClassification(0, ACMatchClassification::NONE)); 136 ACMatchClassification(0, ACMatchClassification::NONE));
101 return; 137 return;
102 } 138 }
103 139
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 results->navigation_results.push_back(NavigationResult( 468 results->navigation_results.push_back(NavigationResult(
433 scheme_classifier, url, match_type, title, deletion_url, 469 scheme_classifier, url, match_type, title, deletion_url,
434 is_keyword_result, relevance, relevances != NULL, input.text(), 470 is_keyword_result, relevance, relevances != NULL, input.text(),
435 languages)); 471 languages));
436 } 472 }
437 } else { 473 } else {
438 base::string16 match_contents = suggestion; 474 base::string16 match_contents = suggestion;
439 base::string16 match_contents_prefix; 475 base::string16 match_contents_prefix;
440 base::string16 annotation; 476 base::string16 annotation;
441 base::string16 answer_contents; 477 base::string16 answer_contents;
442 base::string16 answer_type; 478 base::string16 answer_type_str;
479 scoped_ptr<SuggestionAnswer> answer;
443 std::string suggest_query_params; 480 std::string suggest_query_params;
444 481
445 if (suggestion_details) { 482 if (suggestion_details) {
446 suggestion_details->GetDictionary(index, &suggestion_detail); 483 suggestion_details->GetDictionary(index, &suggestion_detail);
447 if (suggestion_detail) { 484 if (suggestion_detail) {
448 suggestion_detail->GetString("t", &match_contents); 485 suggestion_detail->GetString("t", &match_contents);
449 suggestion_detail->GetString("mp", &match_contents_prefix); 486 suggestion_detail->GetString("mp", &match_contents_prefix);
450 // Error correction for bad data from server. 487 // Error correction for bad data from server.
451 if (match_contents.empty()) 488 if (match_contents.empty())
452 match_contents = suggestion; 489 match_contents = suggestion;
453 suggestion_detail->GetString("a", &annotation); 490 suggestion_detail->GetString("a", &annotation);
454 suggestion_detail->GetString("q", &suggest_query_params); 491 suggestion_detail->GetString("q", &suggest_query_params);
455 492
456 // Extract Answers, if provided. 493 // Extract the Answer, if provided.
457 const base::DictionaryValue* answer_json = NULL; 494 const base::DictionaryValue* answer_json = NULL;
458 if (suggestion_detail->GetDictionary("ansa", &answer_json)) { 495 if (suggestion_detail->GetDictionary("ansa", &answer_json) &&
459 match_type = AutocompleteMatchType::SEARCH_SUGGEST_ANSWER; 496 suggestion_detail->GetString("ansb", &answer_type_str)) {
460 GetAnswersImageURLs(answer_json, &results->answers_image_urls); 497 answer = SuggestionAnswer::ParseAnswer(answer_json);
461 std::string contents; 498
462 base::JSONWriter::Write(answer_json, &contents); 499 int answer_type = 0;
463 answer_contents = base::UTF8ToUTF16(contents); 500 if (answer && base::StringToInt(answer_type_str, &answer_type)) {
464 suggestion_detail->GetString("ansb", &answer_type); 501 match_type = AutocompleteMatchType::SEARCH_SUGGEST_ANSWER;
502
503 answer->set_type(answer_type);
504 answer->AddImageURLsTo(&results->answers_image_urls);
505
506 std::string contents;
507 base::JSONWriter::Write(answer_json, &contents);
508 answer_contents = base::UTF8ToUTF16(contents);
509 } else {
510 answer_type_str = base::string16();
511 }
465 } 512 }
466 } 513 }
467 } 514 }
468 515
469 bool should_prefetch = static_cast<int>(index) == prefetch_index; 516 bool should_prefetch = static_cast<int>(index) == prefetch_index;
470 // TODO(kochi): Improve calculator suggestion presentation. 517 // TODO(kochi): Improve calculator suggestion presentation.
471 results->suggest_results.push_back(SuggestResult( 518 results->suggest_results.push_back(SuggestResult(
472 base::CollapseWhitespace(suggestion, false), match_type, 519 base::CollapseWhitespace(suggestion, false), match_type,
473 base::CollapseWhitespace(match_contents, false), 520 base::CollapseWhitespace(match_contents, false),
474 match_contents_prefix, annotation, answer_contents, answer_type, 521 match_contents_prefix, annotation, answer_contents, answer_type_str,
475 suggest_query_params, deletion_url, is_keyword_result, relevance, 522 answer.Pass(), suggest_query_params, deletion_url, is_keyword_result,
476 relevances != NULL, should_prefetch, trimmed_input)); 523 relevance, relevances != NULL, should_prefetch, trimmed_input));
477 } 524 }
478 } 525 }
479 results->relevances_from_server = relevances != NULL; 526 results->relevances_from_server = relevances != NULL;
480 return true; 527 return true;
481 } 528 }
482
483 // static
484 void SearchSuggestionParser::GetAnswersImageURLs(
485 const base::DictionaryValue* answer_json,
486 std::vector<GURL>* urls) {
487 DCHECK(answer_json);
488
489 const base::ListValue* lines = NULL;
490 if (!answer_json->GetList("l", &lines) || !lines || lines->GetSize() == 0)
491 return;
492
493 for (base::ListValue::const_iterator iter = lines->begin();
494 iter != lines->end();
495 ++iter) {
496 const base::DictionaryValue* line = NULL;
497 if (!(*iter)->GetAsDictionary(&line) || !line)
498 continue;
499
500 std::string image_host_and_path;
501 if (!line->GetString("il.i.d", &image_host_and_path) ||
502 image_host_and_path.empty())
503 continue;
504 // Concatenate scheme and host/path using only ':' as separator. This is
505 // due to the results delivering strings of the form '//host/path', which
506 // is web-speak for "use the enclosing page's scheme", but not a valid path
507 // of an URL.
508 GURL image_url(
509 GURL(std::string(url::kHttpsScheme) + ":" + image_host_and_path));
510 if (image_url.is_valid())
511 urls->push_back(image_url);
512 }
513 }
OLDNEW
« no previous file with comments | « components/omnibox/search_suggestion_parser.h ('k') | components/omnibox/search_suggestion_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698