Chromium Code Reviews| Index: chrome/browser/android/contextualsearch/contextual_search_delegate.cc |
| diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc |
| index ed8c9f70227b1b5134d783bc938f0b1247449987..e06cf8e975f86eae05df989cfeb3ccb3215d162a 100644 |
| --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc |
| +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc |
| @@ -9,8 +9,10 @@ |
| #include "base/base64.h" |
| #include "base/command_line.h" |
| #include "base/json/json_string_value_serializer.h" |
| +#include "base/json/string_escape.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_util.h" |
| +#include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/android/contextualsearch/contextual_search_field_trial.h" |
| #include "chrome/browser/android/contextualsearch/resolved_search_term.h" |
| @@ -55,6 +57,12 @@ const char kDoPreventPreloadValue[] = "1"; |
| // The number of characters that should be shown after the selected expression. |
| const int kSurroundingSizeForUI = 60; |
| +// Contextual Cards (aka Now on Tap) integration. |
| +const char kContextualSearchContextualCards[] = "contextual_cards"; |
| +const char kContextualSearchCards[] = "cards"; |
| +const char kContextualSearchSingleCard[] = "singleCard"; |
| +const char kContextualSearchSubTitle[] = "subtitle"; |
| +const char kContextualSearchThumbnailUri[] = "thumbnail.uri"; |
| // The version of the Now on Tap API that we want to invoke. |
| const int kNowOnTapVersion = 1; |
| @@ -71,14 +79,14 @@ ContextualSearchDelegate::ContextualSearchDelegate( |
| search_term_callback, |
| const ContextualSearchDelegate::SurroundingTextCallback& |
| surrounding_callback, |
| - const ContextualSearchDelegate::IcingCallback& icing_callback) |
| + const ContextualSearchDelegate::IcingCallback& icing_callback, |
| + std::unique_ptr<ContextualSearchFieldTrial> field_trial) |
| : url_request_context_(url_request_context), |
| template_url_service_(template_url_service), |
| search_term_callback_(search_term_callback), |
| surrounding_callback_(surrounding_callback), |
| - icing_callback_(icing_callback) { |
| - field_trial_.reset(new ContextualSearchFieldTrial()); |
| -} |
| + icing_callback_(icing_callback), |
| + field_trial_(std::move(field_trial)) {} |
| ContextualSearchDelegate::~ContextualSearchDelegate() { |
| } |
| @@ -457,7 +465,7 @@ void ContextualSearchDelegate::DecodeSearchTermFromJsonResponse( |
| JSONStringValueDeserializer deserializer(proper_json); |
| std::unique_ptr<base::Value> root = |
| deserializer.Deserialize(nullptr, nullptr); |
| - std::unique_ptr<base::DictionaryValue> dict = |
| + const std::unique_ptr<base::DictionaryValue> dict = |
| base::DictionaryValue::From(std::move(root)); |
| if (!dict) |
| return; |
| @@ -496,7 +504,7 @@ void ContextualSearchDelegate::DecodeSearchTermFromJsonResponse( |
| } |
| if (field_trial_->IsNowOnTapBarIntegrationEnabled()) { |
| - // TODO(donnd): extract thumbnail_url and caption. |
| + DecodeNowOnTapResponse(*dict.get(), caption, thumbnail_url); |
|
Theresa
2016/09/20 19:51:39
nit: I think it makes sense to change "caption" to
Donn Denman
2016/09/20 21:16:36
Mostly done.
The ContextualSearchContext knows of
|
| } |
| } |
| @@ -540,3 +548,35 @@ base::string16 ContextualSearchDelegate::SurroundingTextForIcing( |
| *end = end_offset; |
| return result_text; |
| } |
| + |
| +void ContextualSearchDelegate::DecodeNowOnTapResponse( |
| + const base::DictionaryValue& dict, |
| + std::string* subtitle, |
| + std::string* thumbnail) { |
| + const base::DictionaryValue* contextual_cards_dict = nullptr; |
| + if (!dict.GetDictionary(kContextualSearchContextualCards, |
| + &contextual_cards_dict)) |
| + return; |
| + |
| + DCHECK(contextual_cards_dict); |
|
Theresa
2016/09/20 19:51:40
I don't think this DCHECK is necessary since we re
Donn Denman
2016/09/20 21:16:37
In that case we should remove all of these DCHECKS
|
| + const base::ListValue* card_list = nullptr; |
| + if (!contextual_cards_dict->GetList(kContextualSearchCards, &card_list)) |
| + return; |
| + |
| + DCHECK(card_list); |
| + for (const auto& card : *card_list) { |
| + const base::DictionaryValue* card_dict = nullptr; |
| + if (!card->GetAsDictionary(&card_dict)) |
| + continue; |
| + |
| + DCHECK(card_dict); |
| + const base::DictionaryValue* single_card = nullptr; |
| + if (!card_dict->GetDictionary(kContextualSearchSingleCard, &single_card)) |
| + continue; |
| + |
| + DCHECK(single_card); |
| + single_card->GetString(kContextualSearchSubTitle, subtitle); |
| + single_card->GetString(kContextualSearchThumbnailUri, thumbnail); |
| + return; |
| + } |
| +} |