| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/payments/core/web_payment_request.h" |
| |
| #include "base/values.h" |
| |
| namespace payments { |
| |
| namespace { |
| |
| // These are defined as part of the spec at: |
| // https://w3c.github.io/payment-request/#paymentrequest-interface |
| static const char kPaymentRequestDetails[] = "details"; |
| static const char kPaymentRequestId[] = "id"; |
| static const char kPaymentRequestMethodData[] = "methodData"; |
| static const char kPaymentRequestOptions[] = "options"; |
| |
| } // namespace |
| |
| WebPaymentRequest::WebPaymentRequest() {} |
| WebPaymentRequest::~WebPaymentRequest() = default; |
| |
| bool WebPaymentRequest::operator==(const WebPaymentRequest& other) const { |
| return payment_request_id == other.payment_request_id && |
| shipping_address.Equals(other.shipping_address) && |
| shipping_option == other.shipping_option && |
| method_data == other.method_data && details == other.details && |
| options == other.options; |
| } |
| |
| bool WebPaymentRequest::operator!=(const WebPaymentRequest& other) const { |
| return !(*this == other); |
| } |
| |
| WebPaymentRequest::WebPaymentRequest(const WebPaymentRequest& other) { |
| *this = other; |
| } |
| |
| WebPaymentRequest& WebPaymentRequest::operator=( |
| const WebPaymentRequest& other) { |
| payment_request_id = other.payment_request_id; |
| shipping_address = other.shipping_address ? other.shipping_address->Clone() |
| : mojom::PaymentAddress::New(); |
| shipping_option = other.shipping_option; |
| method_data = other.method_data; |
| details = other.details; |
| options = other.options; |
| return *this; |
| } |
| |
| bool WebPaymentRequest::FromDictionaryValue( |
| const base::DictionaryValue& value) { |
| method_data.clear(); |
| |
| if (!value.GetString(kPaymentRequestId, &payment_request_id)) { |
| return false; |
| } |
| |
| // Parse the payment method data. |
| const base::ListValue* method_data_list = nullptr; |
| // At least one method is required. |
| if (!value.GetList(kPaymentRequestMethodData, &method_data_list) || |
| method_data_list->GetSize() == 0) { |
| return false; |
| } |
| for (size_t i = 0; i < method_data_list->GetSize(); ++i) { |
| const base::DictionaryValue* method_data_dict; |
| if (!method_data_list->GetDictionary(i, &method_data_dict)) |
| return false; |
| |
| payments::PaymentMethodData method_datum; |
| if (!method_datum.FromDictionaryValue(*method_data_dict)) |
| return false; |
| method_data.push_back(method_datum); |
| } |
| |
| // Parse the payment details. |
| const base::DictionaryValue* payment_details_dict = nullptr; |
| if (!value.GetDictionary(kPaymentRequestDetails, &payment_details_dict) || |
| !details.FromDictionaryValue(*payment_details_dict, |
| /*requires_total=*/true)) { |
| return false; |
| } |
| |
| // Parse the payment options. |
| const base::DictionaryValue* payment_options = nullptr; |
| // Options field is optional. |
| if (value.GetDictionary(kPaymentRequestOptions, &payment_options)) |
| if (!options.FromDictionaryValue(*payment_options)) |
| return false; |
| |
| return true; |
| } |
| |
| } // namespace payments |