OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/content/browser/wallet/wallet_client.h" | 5 #include "components/autofill/content/browser/wallet/wallet_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.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" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 const size_t kOneTimePadLength = 6; | 45 const size_t kOneTimePadLength = 6; |
46 | 46 |
47 // The maximum number of bits in the one time pad that the server is willing to | 47 // The maximum number of bits in the one time pad that the server is willing to |
48 // accept. | 48 // accept. |
49 const size_t kMaxBits = 56; | 49 const size_t kMaxBits = 56; |
50 | 50 |
51 // The minimum number of bits in the one time pad that the server is willing to | 51 // The minimum number of bits in the one time pad that the server is willing to |
52 // accept. | 52 // accept. |
53 const size_t kMinBits = 40; | 53 const size_t kMinBits = 40; |
54 | 54 |
55 std::string AutocheckoutStatusToString(AutocheckoutStatus status) { | |
56 switch (status) { | |
57 case MISSING_FIELDMAPPING: | |
58 return "MISSING_FIELDMAPPING"; | |
59 case MISSING_ADVANCE: | |
60 return "MISSING_ADVANCE"; | |
61 case MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING: | |
62 return "MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING"; | |
63 case MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING: | |
64 return "MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING"; | |
65 case CANNOT_PROCEED: | |
66 return "CANNOT_PROCEED"; | |
67 case SUCCESS: | |
68 // SUCCESS cannot be sent to the server as it will result in a failure. | |
69 NOTREACHED(); | |
70 return "ERROR"; | |
71 case AUTOCHECKOUT_STATUS_NUM_STATUS: | |
72 NOTREACHED(); | |
73 } | |
74 NOTREACHED(); | |
75 return "NOT_POSSIBLE"; | |
76 } | |
77 | |
78 std::string DialogTypeToFeatureString(autofill::DialogType dialog_type) { | 55 std::string DialogTypeToFeatureString(autofill::DialogType dialog_type) { |
79 switch (dialog_type) { | 56 switch (dialog_type) { |
80 case DIALOG_TYPE_REQUEST_AUTOCOMPLETE: | 57 case DIALOG_TYPE_REQUEST_AUTOCOMPLETE: |
81 return "REQUEST_AUTOCOMPLETE"; | 58 return "REQUEST_AUTOCOMPLETE"; |
82 case DIALOG_TYPE_AUTOCHECKOUT: | 59 case DIALOG_TYPE_AUTOCHECKOUT: |
83 return "AUTOCHECKOUT"; | 60 return "AUTOCHECKOUT"; |
84 } | 61 } |
85 NOTREACHED(); | 62 NOTREACHED(); |
86 return "NOT_POSSIBLE"; | 63 return "NOT_POSSIBLE"; |
87 } | 64 } |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 const char kPhoneNumberRequired[] = "phone_number_required"; | 238 const char kPhoneNumberRequired[] = "phone_number_required"; |
262 const char kReasonKey[] = "reason"; | 239 const char kReasonKey[] = "reason"; |
263 const char kRiskCapabilitiesKey[] = "supported_risk_challenge"; | 240 const char kRiskCapabilitiesKey[] = "supported_risk_challenge"; |
264 const char kRiskParamsKey[] = "risk_params"; | 241 const char kRiskParamsKey[] = "risk_params"; |
265 const char kSelectedAddressIdKey[] = "selected_address_id"; | 242 const char kSelectedAddressIdKey[] = "selected_address_id"; |
266 const char kSelectedInstrumentIdKey[] = "selected_instrument_id"; | 243 const char kSelectedInstrumentIdKey[] = "selected_instrument_id"; |
267 const char kSessionMaterialKey[] = "session_material"; | 244 const char kSessionMaterialKey[] = "session_material"; |
268 const char kShippingAddressIdKey[] = "shipping_address_id"; | 245 const char kShippingAddressIdKey[] = "shipping_address_id"; |
269 const char kShippingAddressKey[] = "shipping_address"; | 246 const char kShippingAddressKey[] = "shipping_address"; |
270 const char kShippingAddressRequired[] = "shipping_address_required"; | 247 const char kShippingAddressRequired[] = "shipping_address_required"; |
271 const char kAutocheckoutStepsKey[] = "steps"; | |
272 const char kSuccessKey[] = "success"; | 248 const char kSuccessKey[] = "success"; |
273 const char kUpgradedBillingAddressKey[] = "upgraded_billing_address"; | 249 const char kUpgradedBillingAddressKey[] = "upgraded_billing_address"; |
274 const char kUpgradedInstrumentIdKey[] = "upgraded_instrument_id"; | 250 const char kUpgradedInstrumentIdKey[] = "upgraded_instrument_id"; |
275 const char kUseMinimalAddresses[] = "use_minimal_addresses"; | 251 const char kUseMinimalAddresses[] = "use_minimal_addresses"; |
276 | 252 |
277 } // namespace | 253 } // namespace |
278 | 254 |
279 WalletClient::FullWalletRequest::FullWalletRequest( | 255 WalletClient::FullWalletRequest::FullWalletRequest( |
280 const std::string& instrument_id, | 256 const std::string& instrument_id, |
281 const std::string& address_id, | 257 const std::string& address_id, |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 delegate_->IsShippingAddressRequired()); | 497 delegate_->IsShippingAddressRequired()); |
522 request_dict.SetBoolean(kUseMinimalAddresses, false); | 498 request_dict.SetBoolean(kUseMinimalAddresses, false); |
523 request_dict.SetBoolean(kPhoneNumberRequired, true); | 499 request_dict.SetBoolean(kPhoneNumberRequired, true); |
524 | 500 |
525 std::string post_body; | 501 std::string post_body; |
526 base::JSONWriter::Write(&request_dict, &post_body); | 502 base::JSONWriter::Write(&request_dict, &post_body); |
527 | 503 |
528 MakeWalletRequest(GetGetWalletItemsUrl(), post_body, kJsonMimeType); | 504 MakeWalletRequest(GetGetWalletItemsUrl(), post_body, kJsonMimeType); |
529 } | 505 } |
530 | 506 |
531 void WalletClient::SendAutocheckoutStatus( | |
532 AutocheckoutStatus status, | |
533 const GURL& source_url, | |
534 const std::vector<AutocheckoutStatistic>& latency_statistics, | |
535 const std::string& google_transaction_id) { | |
536 DVLOG(1) << "Sending Autocheckout Status: " << status | |
537 << " for: " << source_url; | |
538 if (HasRequestInProgress()) { | |
539 pending_requests_.push(base::Bind(&WalletClient::SendAutocheckoutStatus, | |
540 base::Unretained(this), | |
541 status, | |
542 source_url, | |
543 latency_statistics, | |
544 google_transaction_id)); | |
545 return; | |
546 } | |
547 | |
548 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
549 request_type_ = SEND_STATUS; | |
550 | |
551 base::DictionaryValue request_dict; | |
552 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | |
553 bool success = status == SUCCESS; | |
554 request_dict.SetBoolean(kSuccessKey, success); | |
555 request_dict.SetString(kMerchantDomainKey, | |
556 source_url.GetWithEmptyPath().spec()); | |
557 if (!success) | |
558 request_dict.SetString(kReasonKey, AutocheckoutStatusToString(status)); | |
559 if (!latency_statistics.empty()) { | |
560 scoped_ptr<base::ListValue> latency_statistics_json( | |
561 new base::ListValue()); | |
562 for (size_t i = 0; i < latency_statistics.size(); ++i) { | |
563 latency_statistics_json->Append( | |
564 latency_statistics[i].ToDictionary().release()); | |
565 } | |
566 request_dict.Set(kAutocheckoutStepsKey, | |
567 latency_statistics_json.release()); | |
568 } | |
569 request_dict.SetString(kGoogleTransactionIdKey, google_transaction_id); | |
570 | |
571 std::string post_body; | |
572 base::JSONWriter::Write(&request_dict, &post_body); | |
573 | |
574 MakeWalletRequest(GetSendStatusUrl(), post_body, kJsonMimeType); | |
575 } | |
576 | |
577 bool WalletClient::HasRequestInProgress() const { | 507 bool WalletClient::HasRequestInProgress() const { |
578 return request_; | 508 return request_; |
579 } | 509 } |
580 | 510 |
581 void WalletClient::CancelRequests() { | 511 void WalletClient::CancelRequests() { |
582 request_.reset(); | 512 request_.reset(); |
583 request_type_ = NO_PENDING_REQUEST; | 513 request_type_ = NO_PENDING_REQUEST; |
584 while (!pending_requests_.empty()) { | 514 while (!pending_requests_.empty()) { |
585 pending_requests_.pop(); | 515 pending_requests_.pop(); |
586 } | 516 } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 // Anything else is an error. | 651 // Anything else is an error. |
722 default: | 652 default: |
723 request_type_ = NO_PENDING_REQUEST; | 653 request_type_ = NO_PENDING_REQUEST; |
724 HandleWalletError(NETWORK_ERROR); | 654 HandleWalletError(NETWORK_ERROR); |
725 return; | 655 return; |
726 } | 656 } |
727 | 657 |
728 RequestType type = request_type_; | 658 RequestType type = request_type_; |
729 request_type_ = NO_PENDING_REQUEST; | 659 request_type_ = NO_PENDING_REQUEST; |
730 | 660 |
731 if (!(type == ACCEPT_LEGAL_DOCUMENTS || type == SEND_STATUS) && | 661 if (type != ACCEPT_LEGAL_DOCUMENTS && !response_dict) { |
732 !response_dict) { | |
733 HandleMalformedResponse(scoped_request.get()); | 662 HandleMalformedResponse(scoped_request.get()); |
734 return; | 663 return; |
735 } | 664 } |
736 | 665 |
737 switch (type) { | 666 switch (type) { |
738 case ACCEPT_LEGAL_DOCUMENTS: | 667 case ACCEPT_LEGAL_DOCUMENTS: |
739 delegate_->OnDidAcceptLegalDocuments(); | 668 delegate_->OnDidAcceptLegalDocuments(); |
740 break; | 669 break; |
741 | 670 |
742 case AUTHENTICATE_INSTRUMENT: { | 671 case AUTHENTICATE_INSTRUMENT: { |
743 std::string auth_result; | 672 std::string auth_result; |
744 if (response_dict->GetString(kAuthResultKey, &auth_result)) { | 673 if (response_dict->GetString(kAuthResultKey, &auth_result)) { |
745 std::string trimmed; | 674 std::string trimmed; |
746 TrimWhitespaceASCII(auth_result, | 675 TrimWhitespaceASCII(auth_result, |
747 TRIM_ALL, | 676 TRIM_ALL, |
748 &trimmed); | 677 &trimmed); |
749 delegate_->OnDidAuthenticateInstrument( | 678 delegate_->OnDidAuthenticateInstrument( |
750 LowerCaseEqualsASCII(trimmed, "success")); | 679 LowerCaseEqualsASCII(trimmed, "success")); |
751 } else { | 680 } else { |
752 HandleMalformedResponse(scoped_request.get()); | 681 HandleMalformedResponse(scoped_request.get()); |
753 } | 682 } |
754 break; | 683 break; |
755 } | 684 } |
756 | 685 |
757 case SEND_STATUS: | |
758 break; | |
759 | |
760 case GET_FULL_WALLET: { | 686 case GET_FULL_WALLET: { |
761 scoped_ptr<FullWallet> full_wallet( | 687 scoped_ptr<FullWallet> full_wallet( |
762 FullWallet::CreateFullWallet(*response_dict)); | 688 FullWallet::CreateFullWallet(*response_dict)); |
763 if (full_wallet) { | 689 if (full_wallet) { |
764 full_wallet->set_one_time_pad(one_time_pad_); | 690 full_wallet->set_one_time_pad(one_time_pad_); |
765 LogRequiredActions(full_wallet->required_actions()); | 691 LogRequiredActions(full_wallet->required_actions()); |
766 delegate_->OnDidGetFullWallet(full_wallet.Pass()); | 692 delegate_->OnDidGetFullWallet(full_wallet.Pass()); |
767 } else { | 693 } else { |
768 HandleMalformedResponse(scoped_request.get()); | 694 HandleMalformedResponse(scoped_request.get()); |
769 } | 695 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 case ACCEPT_LEGAL_DOCUMENTS: | 815 case ACCEPT_LEGAL_DOCUMENTS: |
890 return AutofillMetrics::ACCEPT_LEGAL_DOCUMENTS; | 816 return AutofillMetrics::ACCEPT_LEGAL_DOCUMENTS; |
891 case AUTHENTICATE_INSTRUMENT: | 817 case AUTHENTICATE_INSTRUMENT: |
892 return AutofillMetrics::AUTHENTICATE_INSTRUMENT; | 818 return AutofillMetrics::AUTHENTICATE_INSTRUMENT; |
893 case GET_FULL_WALLET: | 819 case GET_FULL_WALLET: |
894 return AutofillMetrics::GET_FULL_WALLET; | 820 return AutofillMetrics::GET_FULL_WALLET; |
895 case GET_WALLET_ITEMS: | 821 case GET_WALLET_ITEMS: |
896 return AutofillMetrics::GET_WALLET_ITEMS; | 822 return AutofillMetrics::GET_WALLET_ITEMS; |
897 case SAVE_TO_WALLET: | 823 case SAVE_TO_WALLET: |
898 return AutofillMetrics::SAVE_TO_WALLET; | 824 return AutofillMetrics::SAVE_TO_WALLET; |
899 case SEND_STATUS: | |
900 return AutofillMetrics::SEND_STATUS; | |
901 case NO_PENDING_REQUEST: | 825 case NO_PENDING_REQUEST: |
902 NOTREACHED(); | 826 NOTREACHED(); |
903 return AutofillMetrics::UNKNOWN_API_CALL; | 827 return AutofillMetrics::UNKNOWN_API_CALL; |
904 } | 828 } |
905 | 829 |
906 NOTREACHED(); | 830 NOTREACHED(); |
907 return AutofillMetrics::UNKNOWN_API_CALL; | 831 return AutofillMetrics::UNKNOWN_API_CALL; |
908 } | 832 } |
909 | 833 |
910 } // namespace wallet | 834 } // namespace wallet |
911 } // namespace autofill | 835 } // namespace autofill |
OLD | NEW |