blob: cd69acfa68248425a202ba8c558cfa8e6471644a [file] [log] [blame]
// Copyright 2020 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/goods/dom_window_digital_goods.h"
#include <utility>
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/modules/payments/goods/digital_goods_service.h"
#include "third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h"
#include "third_party/blink/renderer/modules/payments/goods/util.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
namespace {
using blink::digital_goods_util::LogConsoleError;
using payments::mojom::blink::CreateDigitalGoodsResponseCode;
void OnCreateDigitalGoodsResponse(
ScriptPromiseResolver* resolver,
CreateDigitalGoodsResponseCode code,
mojo::PendingRemote<payments::mojom::blink::DigitalGoods> pending_remote) {
if (code != CreateDigitalGoodsResponseCode::kOk) {
DCHECK(!pending_remote);
LogConsoleError(resolver->GetScriptState(),
"GetDigitalGoodsService: " + mojo::ConvertTo<String>(code));
resolver->Resolve(v8::Null(resolver->GetScriptState()->GetIsolate()));
return;
}
DCHECK(pending_remote);
auto* digital_goods_service_ =
MakeGarbageCollected<DigitalGoodsService>(std::move(pending_remote));
resolver->Resolve(digital_goods_service_);
}
} // namespace
const char DOMWindowDigitalGoods::kSupplementName[] = "DOMWindowDigitalGoods";
ScriptPromise DOMWindowDigitalGoods::getDigitalGoodsService(
ScriptState* script_state,
LocalDOMWindow& window,
const String& payment_method) {
return FromState(&window)->GetDigitalGoodsService(script_state,
payment_method);
}
ScriptPromise DOMWindowDigitalGoods::GetDigitalGoodsService(
ScriptState* script_state,
const String& payment_method) {
auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
auto promise = resolver->Promise();
if (payment_method.IsEmpty()) {
LogConsoleError(script_state,
"GetDigitalGoodsService: Empty payment method.");
resolver->Resolve(v8::Null(script_state->GetIsolate()));
return promise;
}
if (!script_state->ContextIsValid()) {
LogConsoleError(script_state, "GetDigitalGoodsService: internal error.");
resolver->Resolve(v8::Null(script_state->GetIsolate()));
return promise;
}
auto* execution_context = ExecutionContext::From(script_state);
DCHECK(execution_context);
if (execution_context->IsContextDestroyed()) {
LogConsoleError(script_state, "GetDigitalGoodsService: internal error.");
resolver->Resolve(v8::Null(script_state->GetIsolate()));
return promise;
}
if (!execution_context->IsFeatureEnabled(
mojom::blink::FeaturePolicyFeature::kPayment)) {
LogConsoleError(script_state,
"GetDigitalGoodsService: Payments not enabled.");
resolver->Resolve(v8::Null(script_state->GetIsolate()));
return promise;
}
if (!mojo_service_) {
execution_context->GetBrowserInterfaceBroker().GetInterface(
mojo_service_.BindNewPipeAndPassReceiver());
}
mojo_service_->CreateDigitalGoods(
payment_method,
WTF::Bind(&OnCreateDigitalGoodsResponse, WrapPersistent(resolver)));
return promise;
}
void DOMWindowDigitalGoods::Trace(Visitor* visitor) const {
Supplement<LocalDOMWindow>::Trace(visitor);
}
// static
DOMWindowDigitalGoods* DOMWindowDigitalGoods::FromState(
LocalDOMWindow* window) {
DOMWindowDigitalGoods* supplement =
Supplement<LocalDOMWindow>::From<DOMWindowDigitalGoods>(window);
if (!supplement) {
supplement = MakeGarbageCollected<DOMWindowDigitalGoods>();
ProvideTo(*window, supplement);
}
return supplement;
}
} // namespace blink