chromium/third_party/blink/public/mojom/payments/payment_app.mojom

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module payments.mojom;

import "components/payments/mojom/payment_request_data.mojom";
import "third_party/blink/public/mojom/manifest/manifest.mojom";
import "third_party/blink/public/mojom/payments/payment_request.mojom";
import "third_party/blink/public/mojom/payments/payment_handler_host.mojom";
import "url/mojom/url.mojom";

enum PaymentHandlerStatus {
  SUCCESS,
  NOT_FOUND,
  NO_ACTIVE_WORKER,
  STORAGE_OPERATION_FAILED,
  FETCH_INSTRUMENT_ICON_FAILED,
  FETCH_PAYMENT_APP_INFO_FAILED,
};

enum CanMakePaymentEventResponseType {
  // Reasons for not firing the "canmakepayment" event.
  INCOGNITO,
  NO_EXPLICITLY_VERIFIED_METHODS,
  NOT_INSTALLED,
  NO_URL_BASED_PAYMENT_METHODS,
  BOOLEAN_CONVERSION_ERROR,
  BROWSER_ERROR,
  INTERNAL_ERROR,
  NO_RESPONSE,
  REJECT,
  SUCCESS,
  TIMEOUT,
};

enum PaymentEventResponseType {
  PAYER_NAME_EMPTY,
  PAYER_EMAIL_EMPTY,
  PAYER_PHONE_EMPTY,
  PAYMENT_DETAILS_ABSENT,
  PAYMENT_DETAILS_NOT_OBJECT,
  PAYMENT_DETAILS_STRINGIFY_ERROR,
  PAYMENT_EVENT_BROWSER_ERROR,
  PAYMENT_EVENT_INTERNAL_ERROR,
  PAYMENT_EVENT_NO_RESPONSE,
  PAYMENT_EVENT_REJECT,
  PAYMENT_EVENT_SERVICE_WORKER_ERROR,
  PAYMENT_EVENT_SUCCESS,
  PAYMENT_EVENT_TIMEOUT,
  PAYMENT_HANDLER_ACTIVITY_DIED,
  PAYMENT_HANDLER_FAIL_TO_LOAD_MAIN_FRAME,
  PAYMENT_HANDLER_INSECURE_NAVIGATION,
  PAYMENT_HANDLER_INSTALL_FAILED,
  PAYMENT_HANDLER_WINDOW_CLOSING,
  PAYMENT_METHOD_NAME_EMPTY,
  SHIPPING_ADDRESS_INVALID,
  SHIPPING_OPTION_EMPTY,
};

// This struct is provided to hold a payment instrument from render
// side (PaymentInstrument.idl).
struct PaymentInstrument {
  string name;
  array<blink.mojom.ManifestImageResource> icons;
  string method;
  string stringified_capabilities;

  // Parsed basic-card specific capabilities.
  // Non-empty only if |method| is "basic-card".
  array<BasicCardNetwork> supported_networks;
};

enum PaymentDelegation {
  SHIPPING_ADDRESS,
  PAYER_NAME,
  PAYER_PHONE,
  PAYER_EMAIL,
};

// This interface provides implementation of PaymentInstruments.idl
// and PaymentManager.idl in render side. This interface is implemented
// by payment_manager.cc and runs in browser side.
interface PaymentManager {
  // |context_url| is the url of the web page creating this interface.
  // |service_worker_scope| is passed as string since it is from
  // ServiceWorkerRegistration and the interface is used for
  // ServiceWorkerRegistration.idl
  Init(url.mojom.Url context_url, string service_worker_scope);
  DeletePaymentInstrument(string instrument_key)
      => (PaymentHandlerStatus status);
  GetPaymentInstrument(string instrument_key)
      => (PaymentInstrument instrument, PaymentHandlerStatus status);
  KeysOfPaymentInstruments()
      => (array<string> keys, PaymentHandlerStatus status);
  HasPaymentInstrument(string instrument_key)
      => (PaymentHandlerStatus status);
  SetPaymentInstrument(string instrument_key, PaymentInstrument instrument)
      => (PaymentHandlerStatus status);
  ClearPaymentInstruments()
      => (PaymentHandlerStatus status);
  SetUserHint(string user_hint);
  // A method from PaymentManager.idl which lets payment handlers specify
  // whether or not they can handle shipping address or contact info (payer's
  // name/email/phone).
  EnableDelegations(array<PaymentDelegation> delegations)
     =>(PaymentHandlerStatus status);
};

// This struct is provided to send payment request data to render side
// (CanMakePaymentEvent.idl).
struct CanMakePaymentEventData {
  url.mojom.Url top_origin;
  url.mojom.Url payment_request_origin;
  array<PaymentMethodData> method_data;
  array<PaymentDetailsModifier> modifiers;
};

// This struct is provided to send payment request data to render side
// (PaymentRequestEvent.idl).
struct PaymentRequestEventData {
  url.mojom.Url top_origin;
  url.mojom.Url payment_request_origin;
  string payment_request_id;
  array<PaymentMethodData> method_data;
  PaymentCurrencyAmount total;
  array<PaymentDetailsModifier> modifiers;
  string instrument_key;
  PaymentOptions? payment_options;
  array<PaymentShippingOption>? shipping_options;

  // Handles events raised by the payment handler, such as "payment method
  // changed" event. NullRemote in content_browsertests.
  pending_remote<PaymentHandlerHost>? payment_handler_host;
};

// Response to "can make payment" query. Sent from the renderer to the browser.
struct CanMakePaymentResponse {
  CanMakePaymentEventResponseType response_type;
  bool can_make_payment;
};

// This struct is provided to receive payment app response from render
// side (PaymentHandlerResponse.idl).
struct PaymentHandlerResponse {
  string method_name;
  string stringified_details;
  PaymentEventResponseType response_type;
  string? payer_name;
  string? payer_email;
  string? payer_phone;
  PaymentAddress? shipping_address;
  string? shipping_option;
};

// This interface is provided to pass a payment handler response from payment
// request event in renderer side to browser side by calling respondWith().
interface PaymentHandlerResponseCallback {
  // Response from the renderer to the browser about the status of attempted
  // abort of payment.
  OnResponseForAbortPayment(bool payment_aborted);

  // Response from the renderer to the browser about the ability of the payment
  // handler to make payments.
  OnResponseForCanMakePayment(CanMakePaymentResponse response);

  // Response from the renderer to the browser containing the payment details
  // from the payment handler.
  OnResponseForPaymentRequest(PaymentHandlerResponse response);
};