OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/search_engines/template_url_data_util.h" |
| 6 |
| 7 #include <string> |
| 8 |
| 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "base/values.h" |
| 13 #include "components/search_engines/default_search_manager.h" |
| 14 #include "components/search_engines/prepopulated_engines.h" |
| 15 #include "components/search_engines/template_url_data.h" |
| 16 #include "url/gurl.h" |
| 17 |
| 18 std::unique_ptr<TemplateURLData> TemplateURLDataFromDictionary( |
| 19 const base::DictionaryValue& dict) { |
| 20 std::string search_url; |
| 21 base::string16 keyword; |
| 22 base::string16 short_name; |
| 23 dict.GetString(DefaultSearchManager::kURL, &search_url); |
| 24 dict.GetString(DefaultSearchManager::kKeyword, &keyword); |
| 25 dict.GetString(DefaultSearchManager::kShortName, &short_name); |
| 26 // Check required TemplateURLData fields first. |
| 27 if (search_url.empty() || keyword.empty() || short_name.empty()) |
| 28 return std::unique_ptr<TemplateURLData>(); |
| 29 |
| 30 auto result = base::MakeUnique<TemplateURLData>(); |
| 31 result->SetKeyword(keyword); |
| 32 result->SetURL(search_url); |
| 33 |
| 34 std::string id; |
| 35 dict.GetString(DefaultSearchManager::kID, &id); |
| 36 base::StringToInt64(id, &result->id); |
| 37 |
| 38 result->SetShortName(short_name); |
| 39 dict.GetInteger(DefaultSearchManager::kPrepopulateID, |
| 40 &result->prepopulate_id); |
| 41 dict.GetString(DefaultSearchManager::kSyncGUID, &result->sync_guid); |
| 42 dict.GetString(DefaultSearchManager::kSuggestionsURL, |
| 43 &result->suggestions_url); |
| 44 |
| 45 dict.GetString(DefaultSearchManager::kInstantURL, &result->instant_url); |
| 46 dict.GetString(DefaultSearchManager::kImageURL, &result->image_url); |
| 47 dict.GetString(DefaultSearchManager::kNewTabURL, &result->new_tab_url); |
| 48 dict.GetString(DefaultSearchManager::kContextualSearchURL, |
| 49 &result->contextual_search_url); |
| 50 std::string favicon_url; |
| 51 std::string originating_url; |
| 52 dict.GetString(DefaultSearchManager::kFaviconURL, &favicon_url); |
| 53 dict.GetString(DefaultSearchManager::kOriginatingURL, &originating_url); |
| 54 result->favicon_url = GURL(favicon_url); |
| 55 result->originating_url = GURL(originating_url); |
| 56 |
| 57 dict.GetString(DefaultSearchManager::kSearchURLPostParams, |
| 58 &result->search_url_post_params); |
| 59 dict.GetString(DefaultSearchManager::kSuggestionsURLPostParams, |
| 60 &result->suggestions_url_post_params); |
| 61 dict.GetString(DefaultSearchManager::kInstantURLPostParams, |
| 62 &result->instant_url_post_params); |
| 63 dict.GetString(DefaultSearchManager::kImageURLPostParams, |
| 64 &result->image_url_post_params); |
| 65 dict.GetBoolean(DefaultSearchManager::kSafeForAutoReplace, |
| 66 &result->safe_for_autoreplace); |
| 67 |
| 68 std::string date_created_str; |
| 69 std::string last_modified_str; |
| 70 dict.GetString(DefaultSearchManager::kDateCreated, &date_created_str); |
| 71 dict.GetString(DefaultSearchManager::kLastModified, &last_modified_str); |
| 72 |
| 73 int64_t date_created = 0; |
| 74 if (base::StringToInt64(date_created_str, &date_created)) { |
| 75 result->date_created = base::Time::FromInternalValue(date_created); |
| 76 } |
| 77 |
| 78 int64_t last_modified = 0; |
| 79 if (base::StringToInt64(date_created_str, &last_modified)) { |
| 80 result->last_modified = base::Time::FromInternalValue(last_modified); |
| 81 } |
| 82 |
| 83 dict.GetInteger(DefaultSearchManager::kUsageCount, &result->usage_count); |
| 84 |
| 85 const base::ListValue* alternate_urls = nullptr; |
| 86 if (dict.GetList(DefaultSearchManager::kAlternateURLs, &alternate_urls)) { |
| 87 for (const auto& it : *alternate_urls) { |
| 88 std::string alternate_url; |
| 89 if (it->GetAsString(&alternate_url)) |
| 90 result->alternate_urls.push_back(std::move(alternate_url)); |
| 91 } |
| 92 } |
| 93 |
| 94 const base::ListValue* encodings = nullptr; |
| 95 if (dict.GetList(DefaultSearchManager::kInputEncodings, &encodings)) { |
| 96 for (const auto& it : *encodings) { |
| 97 std::string encoding; |
| 98 if (it->GetAsString(&encoding)) |
| 99 result->input_encodings.push_back(std::move(encoding)); |
| 100 } |
| 101 } |
| 102 |
| 103 dict.GetString(DefaultSearchManager::kSearchTermsReplacementKey, |
| 104 &result->search_terms_replacement_key); |
| 105 dict.GetBoolean(DefaultSearchManager::kCreatedByPolicy, |
| 106 &result->created_by_policy); |
| 107 return result; |
| 108 } |
| 109 |
| 110 std::unique_ptr<base::DictionaryValue> TemplateURLDataToDictionary( |
| 111 const TemplateURLData& data) { |
| 112 auto url_dict = base::MakeUnique<base::DictionaryValue>(); |
| 113 url_dict->SetString(DefaultSearchManager::kID, base::Int64ToString(data.id)); |
| 114 url_dict->SetString(DefaultSearchManager::kShortName, data.short_name()); |
| 115 url_dict->SetString(DefaultSearchManager::kKeyword, data.keyword()); |
| 116 url_dict->SetInteger(DefaultSearchManager::kPrepopulateID, |
| 117 data.prepopulate_id); |
| 118 url_dict->SetString(DefaultSearchManager::kSyncGUID, data.sync_guid); |
| 119 |
| 120 url_dict->SetString(DefaultSearchManager::kURL, data.url()); |
| 121 url_dict->SetString(DefaultSearchManager::kSuggestionsURL, |
| 122 data.suggestions_url); |
| 123 url_dict->SetString(DefaultSearchManager::kInstantURL, data.instant_url); |
| 124 url_dict->SetString(DefaultSearchManager::kImageURL, data.image_url); |
| 125 url_dict->SetString(DefaultSearchManager::kNewTabURL, data.new_tab_url); |
| 126 url_dict->SetString(DefaultSearchManager::kContextualSearchURL, |
| 127 data.contextual_search_url); |
| 128 url_dict->SetString(DefaultSearchManager::kFaviconURL, |
| 129 data.favicon_url.spec()); |
| 130 url_dict->SetString(DefaultSearchManager::kOriginatingURL, |
| 131 data.originating_url.spec()); |
| 132 |
| 133 url_dict->SetString(DefaultSearchManager::kSearchURLPostParams, |
| 134 data.search_url_post_params); |
| 135 url_dict->SetString(DefaultSearchManager::kSuggestionsURLPostParams, |
| 136 data.suggestions_url_post_params); |
| 137 url_dict->SetString(DefaultSearchManager::kInstantURLPostParams, |
| 138 data.instant_url_post_params); |
| 139 url_dict->SetString(DefaultSearchManager::kImageURLPostParams, |
| 140 data.image_url_post_params); |
| 141 |
| 142 url_dict->SetBoolean(DefaultSearchManager::kSafeForAutoReplace, |
| 143 data.safe_for_autoreplace); |
| 144 |
| 145 url_dict->SetString(DefaultSearchManager::kDateCreated, |
| 146 base::Int64ToString(data.date_created.ToInternalValue())); |
| 147 url_dict->SetString( |
| 148 DefaultSearchManager::kLastModified, |
| 149 base::Int64ToString(data.last_modified.ToInternalValue())); |
| 150 url_dict->SetInteger(DefaultSearchManager::kUsageCount, data.usage_count); |
| 151 |
| 152 auto alternate_urls = base::MakeUnique<base::ListValue>(); |
| 153 for (const auto& alternate_url : data.alternate_urls) |
| 154 alternate_urls->AppendString(alternate_url); |
| 155 |
| 156 url_dict->Set(DefaultSearchManager::kAlternateURLs, |
| 157 std::move(alternate_urls)); |
| 158 |
| 159 auto encodings = base::MakeUnique<base::ListValue>(); |
| 160 for (const auto& input_encoding : data.input_encodings) |
| 161 encodings->AppendString(input_encoding); |
| 162 url_dict->Set(DefaultSearchManager::kInputEncodings, std::move(encodings)); |
| 163 |
| 164 url_dict->SetString(DefaultSearchManager::kSearchTermsReplacementKey, |
| 165 data.search_terms_replacement_key); |
| 166 url_dict->SetBoolean(DefaultSearchManager::kCreatedByPolicy, |
| 167 data.created_by_policy); |
| 168 return url_dict; |
| 169 } |
| 170 |
| 171 std::unique_ptr<TemplateURLData> TemplateURLDataFromPrepopulatedEngine( |
| 172 const TemplateURLPrepopulateData::PrepopulatedEngine& engine) { |
| 173 base::ListValue alternate_urls; |
| 174 if (engine.alternate_urls) { |
| 175 for (size_t i = 0; i < engine.alternate_urls_size; ++i) |
| 176 alternate_urls.AppendString(std::string(engine.alternate_urls[i])); |
| 177 } |
| 178 |
| 179 return base::MakeUnique<TemplateURLData>( |
| 180 base::WideToUTF16(engine.name), base::WideToUTF16(engine.keyword), |
| 181 engine.search_url, engine.suggest_url, engine.instant_url, |
| 182 engine.image_url, engine.new_tab_url, engine.contextual_search_url, |
| 183 engine.search_url_post_params, engine.suggest_url_post_params, |
| 184 engine.instant_url_post_params, engine.image_url_post_params, |
| 185 engine.favicon_url, engine.encoding, alternate_urls, |
| 186 engine.search_terms_replacement_key, engine.id); |
| 187 } |
| 188 |
| 189 std::unique_ptr<TemplateURLData> TemplateURLDataFromOverrideDictionary( |
| 190 const base::DictionaryValue& engine) { |
| 191 base::string16 name; |
| 192 base::string16 keyword; |
| 193 std::string search_url; |
| 194 std::string favicon_url; |
| 195 std::string encoding; |
| 196 int id = -1; |
| 197 // The following fields are required for each search engine configuration. |
| 198 if (engine.GetString("name", &name) && !name.empty() && |
| 199 engine.GetString("keyword", &keyword) && !keyword.empty() && |
| 200 engine.GetString("search_url", &search_url) && !search_url.empty() && |
| 201 engine.GetString("favicon_url", &favicon_url) && !favicon_url.empty() && |
| 202 engine.GetString("encoding", &encoding) && !encoding.empty() && |
| 203 engine.GetInteger("id", &id)) { |
| 204 // These fields are optional. |
| 205 std::string suggest_url; |
| 206 std::string instant_url; |
| 207 std::string image_url; |
| 208 std::string new_tab_url; |
| 209 std::string contextual_search_url; |
| 210 std::string search_url_post_params; |
| 211 std::string suggest_url_post_params; |
| 212 std::string instant_url_post_params; |
| 213 std::string image_url_post_params; |
| 214 base::ListValue empty_list; |
| 215 const base::ListValue* alternate_urls = &empty_list; |
| 216 std::string search_terms_replacement_key; |
| 217 engine.GetString("suggest_url", &suggest_url); |
| 218 engine.GetString("instant_url", &instant_url); |
| 219 engine.GetString("image_url", &image_url); |
| 220 engine.GetString("new_tab_url", &new_tab_url); |
| 221 engine.GetString("contextual_search_url", &contextual_search_url); |
| 222 engine.GetString("search_url_post_params", &search_url_post_params); |
| 223 engine.GetString("suggest_url_post_params", &suggest_url_post_params); |
| 224 engine.GetString("instant_url_post_params", &instant_url_post_params); |
| 225 engine.GetString("image_url_post_params", &image_url_post_params); |
| 226 engine.GetList("alternate_urls", &alternate_urls); |
| 227 engine.GetString("search_terms_replacement_key", |
| 228 &search_terms_replacement_key); |
| 229 return base::MakeUnique<TemplateURLData>( |
| 230 name, keyword, search_url, suggest_url, instant_url, image_url, |
| 231 new_tab_url, contextual_search_url, search_url_post_params, |
| 232 suggest_url_post_params, instant_url_post_params, image_url_post_params, |
| 233 favicon_url, encoding, *alternate_urls, search_terms_replacement_key, |
| 234 id); |
| 235 } |
| 236 return std::unique_ptr<TemplateURLData>(); |
| 237 } |
OLD | NEW |