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

Side by Side Diff: components/autofill/core/browser/payments/payments_client.cc

Issue 2894333002: Pass active_chrome_experiments in payments RPC. (Closed)
Patch Set: Adds feature to active_chrome_experiments only if feature was triggered. Created 3 years, 7 months 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
« no previous file with comments | « components/autofill/core/browser/payments/payments_client.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/autofill/core/browser/payments/payments_client.h" 5 #include "components/autofill/core/browser/payments/payments_client.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 address->Set("postal_address", std::move(postal_address)); 154 address->Set("postal_address", std::move(postal_address));
155 155
156 if (include_non_location_data) { 156 if (include_non_location_data) {
157 SetStringIfNotEmpty(profile, PHONE_HOME_WHOLE_NUMBER, app_locale, 157 SetStringIfNotEmpty(profile, PHONE_HOME_WHOLE_NUMBER, app_locale,
158 PaymentsClient::kPhoneNumber, address.get()); 158 PaymentsClient::kPhoneNumber, address.get());
159 } 159 }
160 160
161 return address; 161 return address;
162 } 162 }
163 163
164 // Populates the list of active experiments that affect either the data sent in
165 // payments RPCs or whether the RPCs are sent or not.
166 void SetActiveExperiments(const std::vector<const char*>& active_experiments,
167 base::DictionaryValue* request_dict) {
168 if (active_experiments.empty())
169 return;
170
171 std::unique_ptr<base::ListValue> active_chrome_experiments(
172 base::MakeUnique<base::ListValue>());
173 for (const char* it : active_experiments)
174 active_chrome_experiments->AppendString(it);
175
176 request_dict->Set("active_chrome_experiments",
177 std::move(active_chrome_experiments));
178 }
179
164 class UnmaskCardRequest : public PaymentsRequest { 180 class UnmaskCardRequest : public PaymentsRequest {
165 public: 181 public:
166 UnmaskCardRequest(const PaymentsClient::UnmaskRequestDetails& request_details) 182 UnmaskCardRequest(const PaymentsClient::UnmaskRequestDetails& request_details)
167 : request_details_(request_details) { 183 : request_details_(request_details) {
168 DCHECK( 184 DCHECK(
169 CreditCard::MASKED_SERVER_CARD == request_details.card.record_type() || 185 CreditCard::MASKED_SERVER_CARD == request_details.card.record_type() ||
170 CreditCard::FULL_SERVER_CARD == request_details.card.record_type()); 186 CreditCard::FULL_SERVER_CARD == request_details.card.record_type());
171 } 187 }
172 ~UnmaskCardRequest() override {} 188 ~UnmaskCardRequest() override {}
173 189
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 231 }
216 232
217 private: 233 private:
218 PaymentsClient::UnmaskRequestDetails request_details_; 234 PaymentsClient::UnmaskRequestDetails request_details_;
219 std::string real_pan_; 235 std::string real_pan_;
220 }; 236 };
221 237
222 class GetUploadDetailsRequest : public PaymentsRequest { 238 class GetUploadDetailsRequest : public PaymentsRequest {
223 public: 239 public:
224 GetUploadDetailsRequest(const std::vector<AutofillProfile>& addresses, 240 GetUploadDetailsRequest(const std::vector<AutofillProfile>& addresses,
241 const std::vector<const char*>& active_experiments,
225 const std::string& app_locale) 242 const std::string& app_locale)
226 : addresses_(addresses), app_locale_(app_locale) {} 243 : addresses_(addresses),
244 active_experiments_(active_experiments),
245 app_locale_(app_locale) {}
227 ~GetUploadDetailsRequest() override {} 246 ~GetUploadDetailsRequest() override {}
228 247
229 std::string GetRequestUrlPath() override { 248 std::string GetRequestUrlPath() override {
230 return kGetUploadDetailsRequestPath; 249 return kGetUploadDetailsRequestPath;
231 } 250 }
232 251
233 std::string GetRequestContentType() override { return "application/json"; } 252 std::string GetRequestContentType() override { return "application/json"; }
234 253
235 std::string GetRequestContent() override { 254 std::string GetRequestContent() override {
236 base::DictionaryValue request_dict; 255 base::DictionaryValue request_dict;
237 std::unique_ptr<base::DictionaryValue> context(new base::DictionaryValue()); 256 std::unique_ptr<base::DictionaryValue> context(new base::DictionaryValue());
238 context->SetString("language_code", app_locale_); 257 context->SetString("language_code", app_locale_);
239 request_dict.Set("context", std::move(context)); 258 request_dict.Set("context", std::move(context));
240 259
241 std::unique_ptr<base::ListValue> addresses(new base::ListValue()); 260 std::unique_ptr<base::ListValue> addresses(new base::ListValue());
242 for (const AutofillProfile& profile : addresses_) { 261 for (const AutofillProfile& profile : addresses_) {
243 // These addresses are used by Payments to (1) accurately determine the 262 // These addresses are used by Payments to (1) accurately determine the
244 // user's country in order to show the correct legal documents and (2) to 263 // user's country in order to show the correct legal documents and (2) to
245 // verify that the addresses are valid for their purposes so that we don't 264 // verify that the addresses are valid for their purposes so that we don't
246 // offer save in a case where it would definitely fail (e.g. P.O. boxes). 265 // offer save in a case where it would definitely fail (e.g. P.O. boxes).
247 // The final parameter directs BuildAddressDictionary to omit names and 266 // The final parameter directs BuildAddressDictionary to omit names and
248 // phone numbers, which aren't useful for these purposes. 267 // phone numbers, which aren't useful for these purposes.
249 addresses->Append(BuildAddressDictionary(profile, app_locale_, false)); 268 addresses->Append(BuildAddressDictionary(profile, app_locale_, false));
250 } 269 }
251 request_dict.Set("address", std::move(addresses)); 270 request_dict.Set("address", std::move(addresses));
252 271
272 SetActiveExperiments(active_experiments_, &request_dict);
273
253 std::string request_content; 274 std::string request_content;
254 base::JSONWriter::Write(request_dict, &request_content); 275 base::JSONWriter::Write(request_dict, &request_content);
255 VLOG(3) << "getdetailsforsavecard request body: " << request_content; 276 VLOG(3) << "getdetailsforsavecard request body: " << request_content;
256 return request_content; 277 return request_content;
257 } 278 }
258 279
259 void ParseResponse(std::unique_ptr<base::DictionaryValue> response) override { 280 void ParseResponse(std::unique_ptr<base::DictionaryValue> response) override {
260 response->GetString("context_token", &context_token_); 281 response->GetString("context_token", &context_token_);
261 base::DictionaryValue* unowned_legal_message; 282 base::DictionaryValue* unowned_legal_message;
262 if (response->GetDictionary("legal_message", &unowned_legal_message)) 283 if (response->GetDictionary("legal_message", &unowned_legal_message))
263 legal_message_ = unowned_legal_message->CreateDeepCopy(); 284 legal_message_ = unowned_legal_message->CreateDeepCopy();
264 } 285 }
265 286
266 bool IsResponseComplete() override { 287 bool IsResponseComplete() override {
267 return !context_token_.empty() && legal_message_; 288 return !context_token_.empty() && legal_message_;
268 } 289 }
269 290
270 void RespondToDelegate(PaymentsClientDelegate* delegate, 291 void RespondToDelegate(PaymentsClientDelegate* delegate,
271 AutofillClient::PaymentsRpcResult result) override { 292 AutofillClient::PaymentsRpcResult result) override {
272 delegate->OnDidGetUploadDetails(result, context_token_, 293 delegate->OnDidGetUploadDetails(result, context_token_,
273 std::move(legal_message_)); 294 std::move(legal_message_));
274 } 295 }
275 296
276 private: 297 private:
277 std::vector<AutofillProfile> addresses_; 298 const std::vector<AutofillProfile> addresses_;
299 const std::vector<const char*> active_experiments_;
278 std::string app_locale_; 300 std::string app_locale_;
279 base::string16 context_token_; 301 base::string16 context_token_;
280 std::unique_ptr<base::DictionaryValue> legal_message_; 302 std::unique_ptr<base::DictionaryValue> legal_message_;
281 }; 303 };
282 304
283 class UploadCardRequest : public PaymentsRequest { 305 class UploadCardRequest : public PaymentsRequest {
284 public: 306 public:
285 UploadCardRequest(const PaymentsClient::UploadRequestDetails& request_details) 307 UploadCardRequest(const PaymentsClient::UploadRequestDetails& request_details)
286 : request_details_(request_details) {} 308 : request_details_(request_details) {}
287 ~UploadCardRequest() override {} 309 ~UploadCardRequest() override {}
(...skipping 30 matching lines...) Expand all
318 int value = 0; 340 int value = 0;
319 const base::string16 exp_month = request_details_.card.GetInfo( 341 const base::string16 exp_month = request_details_.card.GetInfo(
320 AutofillType(CREDIT_CARD_EXP_MONTH), app_locale); 342 AutofillType(CREDIT_CARD_EXP_MONTH), app_locale);
321 const base::string16 exp_year = request_details_.card.GetInfo( 343 const base::string16 exp_year = request_details_.card.GetInfo(
322 AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), app_locale); 344 AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), app_locale);
323 if (base::StringToInt(exp_month, &value)) 345 if (base::StringToInt(exp_month, &value))
324 request_dict.SetInteger("expiration_month", value); 346 request_dict.SetInteger("expiration_month", value);
325 if (base::StringToInt(exp_year, &value)) 347 if (base::StringToInt(exp_year, &value))
326 request_dict.SetInteger("expiration_year", value); 348 request_dict.SetInteger("expiration_year", value);
327 349
350 SetActiveExperiments(request_details_.active_experiments, &request_dict);
351
328 const base::string16 pan = request_details_.card.GetInfo( 352 const base::string16 pan = request_details_.card.GetInfo(
329 AutofillType(CREDIT_CARD_NUMBER), app_locale); 353 AutofillType(CREDIT_CARD_NUMBER), app_locale);
330 std::string json_request; 354 std::string json_request;
331 base::JSONWriter::Write(request_dict, &json_request); 355 base::JSONWriter::Write(request_dict, &json_request);
332 std::string request_content = base::StringPrintf( 356 std::string request_content = base::StringPrintf(
333 kUploadCardRequestFormat, 357 kUploadCardRequestFormat,
334 net::EscapeUrlEncodedData(json_request, true).c_str(), 358 net::EscapeUrlEncodedData(json_request, true).c_str(),
335 net::EscapeUrlEncodedData(base::UTF16ToASCII(pan), true).c_str(), 359 net::EscapeUrlEncodedData(base::UTF16ToASCII(pan), true).c_str(),
336 net::EscapeUrlEncodedData(base::UTF16ToASCII(request_details_.cvc), 360 net::EscapeUrlEncodedData(base::UTF16ToASCII(request_details_.cvc),
337 true) 361 true)
338 .c_str()); 362 .c_str());
339 VLOG(3) << "savecard request body: " << request_content; 363 VLOG(3) << "savecard request body: " << request_content;
340 return request_content; 364 return request_content;
341 } 365 }
342 366
343 void ParseResponse(std::unique_ptr<base::DictionaryValue> response) override { 367 void ParseResponse(std::unique_ptr<base::DictionaryValue> response) override {
344 response->GetString("credit_card_id", &server_id_); 368 response->GetString("credit_card_id", &server_id_);
345 } 369 }
346 370
347 bool IsResponseComplete() override { return true; } 371 bool IsResponseComplete() override { return true; }
348 372
349 void RespondToDelegate(PaymentsClientDelegate* delegate, 373 void RespondToDelegate(PaymentsClientDelegate* delegate,
350 AutofillClient::PaymentsRpcResult result) override { 374 AutofillClient::PaymentsRpcResult result) override {
351 delegate->OnDidUploadCard(result, server_id_); 375 delegate->OnDidUploadCard(result, server_id_);
352 } 376 }
353 377
354 private: 378 private:
355 PaymentsClient::UploadRequestDetails request_details_; 379 const PaymentsClient::UploadRequestDetails request_details_;
356 std::string server_id_; 380 std::string server_id_;
357 }; 381 };
358 382
359 } // namespace 383 } // namespace
360 384
361 const char PaymentsClient::kRecipientName[] = "recipient_name"; 385 const char PaymentsClient::kRecipientName[] = "recipient_name";
362 const char PaymentsClient::kPhoneNumber[] = "phone_number"; 386 const char PaymentsClient::kPhoneNumber[] = "phone_number";
363 387
364 PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails() {} 388 PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails() {}
365 PaymentsClient::UnmaskRequestDetails::~UnmaskRequestDetails() {} 389 PaymentsClient::UnmaskRequestDetails::~UnmaskRequestDetails() {}
(...skipping 20 matching lines...) Expand all
386 StartTokenFetch(false); 410 StartTokenFetch(false);
387 } 411 }
388 412
389 void PaymentsClient::UnmaskCard( 413 void PaymentsClient::UnmaskCard(
390 const PaymentsClient::UnmaskRequestDetails& request_details) { 414 const PaymentsClient::UnmaskRequestDetails& request_details) {
391 IssueRequest(base::MakeUnique<UnmaskCardRequest>(request_details), true); 415 IssueRequest(base::MakeUnique<UnmaskCardRequest>(request_details), true);
392 } 416 }
393 417
394 void PaymentsClient::GetUploadDetails( 418 void PaymentsClient::GetUploadDetails(
395 const std::vector<AutofillProfile>& addresses, 419 const std::vector<AutofillProfile>& addresses,
420 const std::vector<const char*>& active_experiments,
396 const std::string& app_locale) { 421 const std::string& app_locale) {
397 IssueRequest(base::MakeUnique<GetUploadDetailsRequest>(addresses, app_locale), 422 IssueRequest(base::MakeUnique<GetUploadDetailsRequest>(
423 addresses, active_experiments, app_locale),
398 false); 424 false);
399 } 425 }
400 426
401 void PaymentsClient::UploadCard( 427 void PaymentsClient::UploadCard(
402 const PaymentsClient::UploadRequestDetails& request_details) { 428 const PaymentsClient::UploadRequestDetails& request_details) {
403 IssueRequest(base::MakeUnique<UploadCardRequest>(request_details), true); 429 IssueRequest(base::MakeUnique<UploadCardRequest>(request_details), true);
404 } 430 }
405 431
406 void PaymentsClient::IssueRequest(std::unique_ptr<PaymentsRequest> request, 432 void PaymentsClient::IssueRequest(std::unique_ptr<PaymentsRequest> request,
407 bool authenticate) { 433 bool authenticate) {
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 615
590 void PaymentsClient::SetOAuth2TokenAndStartRequest() { 616 void PaymentsClient::SetOAuth2TokenAndStartRequest() {
591 url_fetcher_->AddExtraRequestHeader(net::HttpRequestHeaders::kAuthorization + 617 url_fetcher_->AddExtraRequestHeader(net::HttpRequestHeaders::kAuthorization +
592 std::string(": Bearer ") + access_token_); 618 std::string(": Bearer ") + access_token_);
593 619
594 url_fetcher_->Start(); 620 url_fetcher_->Start();
595 } 621 }
596 622
597 } // namespace payments 623 } // namespace payments
598 } // namespace autofill 624 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/core/browser/payments/payments_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698