blob: a7c77c0673a2b70cc19e5cceefc243b1b7e5e70f [file] [log] [blame]
// Copyright 2016 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 "third_party/blink/renderer/modules/payments/payment_event_data_conversion.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_currency_amount.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_details_modifier.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_item.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_method_data.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_options.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_request_event_init.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_shipping_option.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
namespace blink {
namespace {
PaymentItem* ToPaymentItem(payments::mojom::blink::PaymentItemPtr data) {
PaymentItem* item = PaymentItem::Create();
if (!data)
return item;
item->setLabel(data->label);
item->setAmount(
PaymentEventDataConversion::ToPaymentCurrencyAmount(data->amount));
item->setPending(data->pending);
return item;
}
PaymentDetailsModifier* ToPaymentDetailsModifier(
ScriptState* script_state,
payments::mojom::blink::PaymentDetailsModifierPtr data) {
DCHECK(data);
PaymentDetailsModifier* modifier = PaymentDetailsModifier::Create();
modifier->setSupportedMethod(data->method_data->supported_method);
modifier->setTotal(ToPaymentItem(std::move(data->total)));
HeapVector<Member<PaymentItem>> additional_display_items;
for (auto& item : data->additional_display_items)
additional_display_items.push_back(ToPaymentItem(std::move(item)));
modifier->setAdditionalDisplayItems(additional_display_items);
return modifier;
}
ScriptValue StringDataToScriptValue(ScriptState* script_state,
const String& stringified_data) {
if (!script_state->ContextIsValid())
return ScriptValue();
ScriptState::Scope scope(script_state);
v8::Local<v8::Value> v8_value;
if (!v8::JSON::Parse(script_state->GetContext(),
V8String(script_state->GetIsolate(), stringified_data))
.ToLocal(&v8_value)) {
return ScriptValue();
}
return ScriptValue(script_state->GetIsolate(), v8_value);
}
PaymentMethodData* ToPaymentMethodData(
ScriptState* script_state,
payments::mojom::blink::PaymentMethodDataPtr data) {
DCHECK(data);
PaymentMethodData* method_data = PaymentMethodData::Create();
method_data->setSupportedMethod(data->supported_method);
method_data->setData(
StringDataToScriptValue(script_state, data->stringified_data));
return method_data;
}
PaymentOptions* ToPaymentOptions(
payments::mojom::blink::PaymentOptionsPtr options) {
DCHECK(options);
PaymentOptions* payment_options = PaymentOptions::Create();
payment_options->setRequestPayerName(options->request_payer_name);
payment_options->setRequestPayerEmail(options->request_payer_email);
payment_options->setRequestPayerPhone(options->request_payer_phone);
payment_options->setRequestShipping(options->request_shipping);
String shipping_type = "";
switch (options->shipping_type) {
case payments::mojom::PaymentShippingType::SHIPPING:
shipping_type = "shipping";
break;
case payments::mojom::PaymentShippingType::DELIVERY:
shipping_type = "delivery";
break;
case payments::mojom::PaymentShippingType::PICKUP:
shipping_type = "pickup";
break;
}
payment_options->setShippingType(shipping_type);
return payment_options;
}
PaymentShippingOption* ToShippingOption(
payments::mojom::blink::PaymentShippingOptionPtr option) {
DCHECK(option);
PaymentShippingOption* shipping_option = PaymentShippingOption::Create();
shipping_option->setAmount(
PaymentEventDataConversion::ToPaymentCurrencyAmount(option->amount));
shipping_option->setLabel(option->label);
shipping_option->setId(option->id);
shipping_option->setSelected(option->selected);
return shipping_option;
}
} // namespace
PaymentCurrencyAmount* PaymentEventDataConversion::ToPaymentCurrencyAmount(
payments::mojom::blink::PaymentCurrencyAmountPtr& input) {
PaymentCurrencyAmount* output = PaymentCurrencyAmount::Create();
if (!input)
return output;
output->setCurrency(input->currency);
output->setValue(input->value);
return output;
}
PaymentRequestEventInit* PaymentEventDataConversion::ToPaymentRequestEventInit(
ScriptState* script_state,
payments::mojom::blink::PaymentRequestEventDataPtr event_data) {
DCHECK(script_state);
DCHECK(event_data);
PaymentRequestEventInit* event_init = PaymentRequestEventInit::Create();
if (!script_state->ContextIsValid())
return event_init;
ScriptState::Scope scope(script_state);
event_init->setTopOrigin(event_data->top_origin.GetString());
event_init->setPaymentRequestOrigin(
event_data->payment_request_origin.GetString());
event_init->setPaymentRequestId(event_data->payment_request_id);
HeapVector<Member<PaymentMethodData>> method_data;
for (auto& md : event_data->method_data) {
method_data.push_back(ToPaymentMethodData(script_state, std::move(md)));
}
event_init->setMethodData(method_data);
event_init->setTotal(ToPaymentCurrencyAmount(event_data->total));
HeapVector<Member<PaymentDetailsModifier>> modifiers;
for (auto& modifier : event_data->modifiers) {
modifiers.push_back(
ToPaymentDetailsModifier(script_state, std::move(modifier)));
}
event_init->setModifiers(modifiers);
event_init->setInstrumentKey(event_data->instrument_key);
bool request_shipping = false;
if (event_data->payment_options) {
request_shipping = event_data->payment_options->request_shipping;
event_init->setPaymentOptions(
ToPaymentOptions(std::move(event_data->payment_options)));
}
if (event_data->shipping_options.has_value() && request_shipping) {
HeapVector<Member<PaymentShippingOption>> shipping_options;
for (auto& option : event_data->shipping_options.value()) {
shipping_options.push_back(ToShippingOption(std::move(option)));
}
event_init->setShippingOptions(shipping_options);
}
return event_init;
}
CanMakePaymentEventInit* PaymentEventDataConversion::ToCanMakePaymentEventInit(
ScriptState* script_state,
payments::mojom::blink::CanMakePaymentEventDataPtr event_data) {
DCHECK(script_state);
DCHECK(event_data);
CanMakePaymentEventInit* event_init = CanMakePaymentEventInit::Create();
if (!script_state->ContextIsValid())
return event_init;
ScriptState::Scope scope(script_state);
event_init->setTopOrigin(event_data->top_origin.GetString());
event_init->setPaymentRequestOrigin(
event_data->payment_request_origin.GetString());
HeapVector<Member<PaymentMethodData>> method_data;
for (auto& md : event_data->method_data) {
method_data.push_back(ToPaymentMethodData(script_state, std::move(md)));
}
event_init->setMethodData(method_data);
HeapVector<Member<PaymentDetailsModifier>> modifiers;
for (auto& modifier : event_data->modifiers) {
modifiers.push_back(
ToPaymentDetailsModifier(script_state, std::move(modifier)));
}
event_init->setModifiers(modifiers);
event_init->setCurrency(event_data->currency);
return event_init;
}
} // namespace blink