|  | // 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 |