DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (b6d82b1a6b02)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_PaymentResponse_h
#define mozilla_dom_PaymentResponse_h

#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/dom/PaymentResponseBinding.h"  // PaymentComplete
#include "nsPIDOMWindow.h"
#include "nsITimer.h"

namespace mozilla {
namespace dom {

class PaymentAddress;
class PaymentRequest;
class Promise;

class GeneralData final {
 public:
  GeneralData() = default;
  ~GeneralData() = default;
  nsString data;
};

class BasicCardData final {
 public:
  struct Address {
    nsString country;
    nsTArray<nsString> addressLine;
    nsString region;
    nsString regionCode;
    nsString city;
    nsString dependentLocality;
    nsString postalCode;
    nsString sortingCode;
    nsString organization;
    nsString recipient;
    nsString phone;
  };
  BasicCardData() = default;
  ~BasicCardData() = default;

  nsString cardholderName;
  nsString cardNumber;
  nsString expiryMonth;
  nsString expiryYear;
  nsString cardSecurityCode;
  Address billingAddress;
};

class ResponseData final {
 public:
  enum Type { Unknown = 0, GeneralResponse = 1, BasicCardResponse };
  ResponseData() : mType(ResponseData::Unknown) {}
  explicit ResponseData(const GeneralData& aGeneralData)
      : mType(GeneralResponse), mGeneralData(aGeneralData) {}
  explicit ResponseData(const BasicCardData& aBasicCardData)
      : mType(BasicCardResponse), mBasicCardData(aBasicCardData) {}
  ResponseData& operator=(const GeneralData& aGeneralData) {
    mType = GeneralResponse;
    mGeneralData = aGeneralData;
    mBasicCardData = BasicCardData();
    return *this;
  }
  ResponseData& operator=(const BasicCardData& aBasicCardData) {
    mType = BasicCardResponse;
    mGeneralData = GeneralData();
    mBasicCardData = aBasicCardData;
    return *this;
  }
  ~ResponseData() = default;

  const Type& type() const { return mType; }
  const GeneralData& generalData() const { return mGeneralData; }
  const BasicCardData& basicCardData() const { return mBasicCardData; }

 private:
  Type mType;
  GeneralData mGeneralData;
  BasicCardData mBasicCardData;
};

class PaymentResponse final : public DOMEventTargetHelper,
                              public nsITimerCallback {
 public:
  NS_DECL_ISUPPORTS_INHERITED

  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(PaymentResponse,
                                                         DOMEventTargetHelper)

  NS_IMETHOD Notify(nsITimer* aTimer) override;

  PaymentResponse(nsPIDOMWindowInner* aWindow, PaymentRequest* aRequest,
                  const nsAString& aRequestId, const nsAString& aMethodName,
                  const nsAString& aShippingOption,
                  PaymentAddress* aShippingAddress,
                  const ResponseData& aDetails, const nsAString& aPayerName,
                  const nsAString& aPayerEmail, const nsAString& aPayerPhone);

  virtual JSObject* WrapObject(JSContext* aCx,
                               JS::Handle<JSObject*> aGivenProto) override;

  void GetRequestId(nsString& aRetVal) const;

  void GetMethodName(nsString& aRetVal) const;

  void GetDetails(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const;

  already_AddRefed<PaymentAddress> GetShippingAddress() const;

  void GetShippingOption(nsString& aRetVal) const;

  void GetPayerName(nsString& aRetVal) const;

  void GetPayerEmail(nsString& aRetVal) const;

  void GetPayerPhone(nsString& aRetVal) const;

  // Return a raw pointer here to avoid refcounting, but make sure it's safe
  // (the object should be kept alive by the callee).
  already_AddRefed<Promise> Complete(PaymentComplete result, ErrorResult& aRv);

  void RespondComplete();

  IMPL_EVENT_HANDLER(payerdetailchange);

  nsresult UpdatePayerDetail(const nsAString& aPayerName,
                             const nsAString& aPayerEmail,
                             const nsAString& aPayerPhone);

  already_AddRefed<Promise> Retry(JSContext* aCx,
                                  const PaymentValidationErrors& errorField,
                                  ErrorResult& aRv);

  void RespondRetry(const nsAString& aMethodName,
                    const nsAString& aShippingOption,
                    PaymentAddress* aShippingAddress,
                    const ResponseData& aDetails, const nsAString& aPayerName,
                    const nsAString& aPayerEmail, const nsAString& aPayerPhone);
  void RejectRetry(nsresult aRejectReason);

 protected:
  ~PaymentResponse();

  nsresult ValidatePaymentValidationErrors(
      const PaymentValidationErrors& aErrors);

  nsresult ConvertPaymentMethodErrors(JSContext* aCx,
                                      const PaymentValidationErrors& aErrors,
                                      nsAString& aErrorMsg) const;

  nsresult DispatchUpdateEvent(const nsAString& aType);

 private:
  bool mCompleteCalled;
  PaymentRequest* mRequest;
  nsString mRequestId;
  nsString mMethodName;
  ResponseData mDetails;
  nsString mShippingOption;
  nsString mPayerName;
  nsString mPayerEmail;
  nsString mPayerPhone;
  RefPtr<PaymentAddress> mShippingAddress;
  // Promise for "PaymentResponse::Complete"
  RefPtr<Promise> mPromise;
  // Timer for timing out if the page doesn't call
  // complete()
  nsCOMPtr<nsITimer> mTimer;
  // Promise for "PaymentResponse::Retry"
  RefPtr<Promise> mRetryPromise;
};

}  // namespace dom
}  // namespace mozilla

#endif  // mozilla_dom_PaymentResponse_h