blob: b0900ac70c771e868156d46cfeb7dc68b994a0b4 [file] [log] [blame]
// Copyright 2019 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.
#ifndef COMPONENTS_PAYMENTS_CONTENT_PAYMENT_HANDLER_HOST_H_
#define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_HANDLER_HOST_H_
#include <stdint.h>
#include <string>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h"
#include "url/origin.h"
namespace content {
class WebContents;
} // namespace content
namespace payments {
using ChangePaymentRequestDetailsCallback =
base::OnceCallback<void(mojom::PaymentRequestDetailsUpdatePtr)>;
// Handles the communication from the payment handler renderer process to the
// merchant renderer process.
class PaymentHandlerHost : public mojom::PaymentHandlerHost {
public:
// The interface to be implemented by the object that can communicate to the
// merchant's renderer process.
class Delegate {
public:
virtual ~Delegate() {}
// Notifies the merchant that the payment method has changed. Returns
// "false" if the state is invalid.
virtual bool ChangePaymentMethod(const std::string& method_name,
const std::string& stringified_data) = 0;
// Notifies the merchant that the shipping option has changed. Returns
// "false" if the state is invalid.
virtual bool ChangeShippingOption(
const std::string& shipping_option_id) = 0;
// Notifies the merchant that the shipping address has changed after
// redacting the address whenever needed. Returns "false" if the state is
// invalid.
virtual bool ChangeShippingAddress(
mojom::PaymentAddressPtr shipping_address) = 0;
};
// The |delegate| cannot be null and must outlive this object. Typically this
// is accomplished by the |delegate| owning this object. The |web_contents| is
// used for developer tools logging and should be from the same browser
// context as the payment handler.
PaymentHandlerHost(content::WebContents* web_contents, Delegate* delegate);
~PaymentHandlerHost() override;
// Sets the origin of the payment handler / service worker registration scope.
// Used for developer tools logging.
void set_sw_origin_for_logs(const url::Origin& origin) {
sw_origin_for_logs_ = origin;
}
// Sets the registration identifier of the payment handler / service worker.
// Used for developer tools logging.
void set_registration_id_for_logs(int64_t id) {
registration_id_for_logs_ = id;
}
// Sets the identifier for the Payment Request object. Used for developer
// tools logging.
void set_payment_request_id_for_logs(const std::string& id) {
payment_request_id_for_logs_ = id;
}
// Returns "true" when the payment handler has changed any of the payment
// method, shipping address or shipping option, but has not received the
// response from the merchant yet.
bool is_waiting_for_payment_details_update() const {
return !!change_payment_request_details_callback_;
}
// Binds to an IPC endpoint and returns it.
mojo::PendingRemote<mojom::PaymentHandlerHost> Bind();
// Notifies the payment handler of the updated details, such as updated total,
// in response to the change of any of the following: payment method, shipping
// address, or shipping option.
void UpdateWith(mojom::PaymentRequestDetailsUpdatePtr response);
// Notifies the payment handler that the merchant did not handle the payment
// method, shipping option, or shipping address change events, so the payment
// details are unchanged.
void OnPaymentDetailsNotUpdated();
// Disconnects from the payment handler.
void Disconnect();
base::WeakPtr<PaymentHandlerHost> AsWeakPtr();
private:
// mojom::PaymentHandlerHost
void ChangePaymentMethod(
mojom::PaymentHandlerMethodDataPtr method_data,
ChangePaymentRequestDetailsCallback callback) override;
// mojom::PaymentHandlerHost
void ChangeShippingOption(
const std::string& shipping_option_id,
ChangePaymentRequestDetailsCallback callback) override;
// mojom::PaymentHandlerHost
void ChangeShippingAddress(
mojom::PaymentAddressPtr shipping_address,
ChangePaymentRequestDetailsCallback callback) override;
// Payment handler's callback to invoke after merchant responds to any of the
// "payment method change", "shipping option change", or "shipping address
// change" events.
ChangePaymentRequestDetailsCallback change_payment_request_details_callback_;
// The end-point for the payment handler renderer process to call into the
// browser process.
mojo::Receiver<mojom::PaymentHandlerHost> receiver_{this};
// The merchant page that invoked the Payment Request API.
content::WebContents* web_contents_;
// Not null and outlives this object. Owns this object.
Delegate* delegate_;
// The origin of the payment handler / service worker registration scope. Used
// for developer tools logging.
url::Origin sw_origin_for_logs_;
// The registration identifier for the payment handler / service worker. Used
// for developer tools logging.
int64_t registration_id_for_logs_ = -1;
// The identifier for the Payment Request object. Used for developer tools
// logging.
std::string payment_request_id_for_logs_;
base::WeakPtrFactory<PaymentHandlerHost> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(PaymentHandlerHost);
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_HANDLER_HOST_H_