Bug 1345365 - PaymentRequest API canMakePayment(), abort() and show() implementation. r=baku

--HG--
extra : rebase_source : 1471c9b98cd919d411b22426c55bc3159d4d2f00
This commit is contained in:
Eden Chuang 2017-06-14 15:59:00 +08:00
Родитель d14a6bb45e
Коммит 5b3b71aae6
32 изменённых файлов: 2148 добавлений и 138 удалений

Просмотреть файл

@ -6,8 +6,10 @@
XPIDL_SOURCES += [ XPIDL_SOURCES += [
'nsIPaymentActionRequest.idl', 'nsIPaymentActionRequest.idl',
'nsIPaymentActionResponse.idl',
'nsIPaymentRequest.idl', 'nsIPaymentRequest.idl',
'nsIPaymentRequestService.idl', 'nsIPaymentRequestService.idl',
'nsIPaymentUIService.idl',
] ]
XPIDL_MODULE = 'dom_payments' XPIDL_MODULE = 'dom_payments'

Просмотреть файл

@ -6,13 +6,26 @@
#include "nsISupports.idl" #include "nsISupports.idl"
#include "nsIVariant.idl" #include "nsIVariant.idl"
#include "nsIPaymentRequest.idl" #include "nsIPaymentRequest.idl"
#include "nsIPaymentActionResponse.idl"
interface nsIArray; interface nsIArray;
[builtinclass, uuid(3fef5459-b0ea-469b-be9f-b99e8ca75d3d)]
interface nsIPaymentActionCallback : nsISupports
{
void respondPayment(in nsIPaymentActionResponse aResponse);
};
[builtinclass, uuid(7ddbe8be-beac-4952-96f6-619981dff7a6)] [builtinclass, uuid(7ddbe8be-beac-4952-96f6-619981dff7a6)]
interface nsIPaymentActionRequest : nsISupports interface nsIPaymentActionRequest : nsISupports
{ {
const uint32_t UNKNOWN_ACTION = 0;
const uint32_t CREATE_ACTION = 1; const uint32_t CREATE_ACTION = 1;
const uint32_t CANMAKE_ACTION = 2;
const uint32_t SHOW_ACTION = 3;
const uint32_t ABORT_ACTION = 4;
const uint32_t COMPLETE_ACTION = 5;
/* /*
* The payment request identifier. * The payment request identifier.
*/ */
@ -23,11 +36,17 @@ interface nsIPaymentActionRequest : nsISupports
*/ */
readonly attribute uint32_t type; readonly attribute uint32_t type;
/*
* The callback for the response from UI module
*/
readonly attribute nsIPaymentActionCallback callback;
/* /*
* Initialize function for this request. * Initialize function for this request.
*/ */
void init(in AString aRequestId, void init(in AString aRequestId,
in uint32_t aType); in uint32_t aType,
in nsIPaymentActionCallback aCallback);
}; };
[builtinclass, uuid(1d38dce6-8bcd-441b-aa94-68e300b6e175)] [builtinclass, uuid(1d38dce6-8bcd-441b-aa94-68e300b6e175)]
@ -57,12 +76,30 @@ interface nsIPaymentCreateActionRequest : nsIPaymentActionRequest
* Initialize function the this request. * Initialize function the this request.
*/ */
void initRequest(in AString aRequestId, void initRequest(in AString aRequestId,
in nsIPaymentActionCallback aCallback,
in uint64_t aTabId, in uint64_t aTabId,
in nsIArray aMethodData, in nsIArray aMethodData,
in nsIPaymentDetails aDetails, in nsIPaymentDetails aDetails,
in nsIPaymentOptions aOptions); in nsIPaymentOptions aOptions);
}; };
[builtinclass, uuid(4429697d-1135-47de-a46e-5196d399ec55)]
interface nsIPaymentCompleteActionRequest : nsIPaymentActionRequest
{
/*
* The complete status from merchant side.
*/
readonly attribute AString completeStatus;
/*
* Initialize function for this request.
*/
void initRequest(in AString aRequestId,
in nsIPaymentActionCallback aCallback,
in AString aCompleteStatus);
};
%{C++ %{C++
#define NS_PAYMENT_ACTION_REQUEST_CID \ #define NS_PAYMENT_ACTION_REQUEST_CID \
{ 0x7ddbe8be, 0xbeac, 0x4952, { 0x96, 0xf6, 0x61, 0x99, 0x81, 0xdf, 0xf7, 0xa6 } } { 0x7ddbe8be, 0xbeac, 0x4952, { 0x96, 0xf6, 0x61, 0x99, 0x81, 0xdf, 0xf7, 0xa6 } }
@ -73,4 +110,10 @@ interface nsIPaymentCreateActionRequest : nsIPaymentActionRequest
{ 0x1d38dce6, 0x8bcd, 0x441b, { 0xaa, 0x94, 0x68, 0xe3, 0x00, 0xb6, 0xe1, 0x75 } } { 0x1d38dce6, 0x8bcd, 0x441b, { 0xaa, 0x94, 0x68, 0xe3, 0x00, 0xb6, 0xe1, 0x75 } }
#define NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID \ #define NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-create-action-request;1" "@mozilla.org/dom/payments/payment-create-action-request;1"
#define NS_PAYMENT_COMPLETE_ACTION_REQUEST_CID \
{ 0x4429697d, 0x1135, 0x47de, { 0xa4, 0x6e, 0x51, 0x96, 0xd3, 0x99, 0xec, 0x55 } }
#define NS_PAYMENT_COMPLETE_ACTION_REQUEST_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-complete-action-request;1"
%} %}

Просмотреть файл

@ -0,0 +1,164 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#include "nsISupports.idl"
#include "nsIVariant.idl"
[builtinclass, scriptable, uuid(a607c095-ef60-4a9b-a3d0-0506c60728b3)]
interface nsIPaymentActionResponse : nsISupports
{
/*
* Align type to nsIPaymentActionRequest types,
* where 1 is for payment request creation.
* the action expects no response from UI module.
*/
const uint32_t NO_TYPE = 0;
// const uint32_t CREATE_ACTION = 1;
const uint32_t CANMAKE_ACTION = 2;
const uint32_t SHOW_ACTION = 3;
const uint32_t ABORT_ACTION = 4;
const uint32_t COMPLETE_ACTION = 5;
const uint32_t ABORT_SUCCEEDED = 1;
const uint32_t ABORT_FAILED = 0;
const uint32_t PAYMENT_ACCEPTED = 1;
const uint32_t PAYMENT_REJECTED = 0;
const uint32_t COMPLETE_SUCCEEDED = 1;
const uint32_t COMPLETE_FAILED = 0;
/*
* The payment request identity.
*/
readonly attribute AString requestId;
/*
* The response type.
*/
readonly attribute uint32_t type;
};
[builtinclass, scriptable, uuid(52fc3f9f-c0cb-4874-b3d4-ee4b6e9cbe9c)]
interface nsIPaymentCanMakeActionResponse : nsIPaymentActionResponse
{
/*
* The result of CanMake task.
*/
readonly attribute bool result;
/*
* Initialize function of this response.
*/
void init(in AString aRequestId, in bool aResult);
};
[builtinclass, scriptable, uuid(184385cb-2d35-4b99-a9a3-7c780bf66b9b)]
interface nsIPaymentShowActionResponse : nsIPaymentActionResponse
{
/*
* Accpet status of the payment.
*/
readonly attribute uint32_t acceptStatus;
/*
* The decided payment method name.
*/
readonly attribute AString methodName;
/*
* The data needed by the payment method. (it must be serializable)
*/
readonly attribute AString data;
/*
* The payer name information.
*/
readonly attribute AString payerName;
/*
* The payer email information.
*/
readonly attribute AString payerEmail;
/*
* The payer phone information.
*/
readonly attribute AString payerPhone;
/*
* Initialize function for this response.
*/
void init(in AString aRequestId,
in uint32_t aAcceptStatus,
in AString aMethodName,
in AString aData,
in AString aPayerName,
in AString aPayerEmail,
in AString aPayerPhone);
/*
* Check if the payment is accpeted
*/
bool isAccepted();
};
[builtinclass, scriptable, uuid(8c72bcdb-0c37-4786-a9e5-510afa2f8ede)]
interface nsIPaymentAbortActionResponse : nsIPaymentActionResponse
{
/*
* The abort task status.
*/
readonly attribute uint32_t abortStatus;
/*
* Initialize function of this response.
*/
void init(in AString aRequestId, in uint32_t aAbortStatus);
/*
* Check if the abort task is succeeded
*/
bool isSucceeded();
};
[builtinclass, scriptable, uuid(62c01e69-9ca4-4060-99e4-b95f628c8e6d)]
interface nsIPaymentCompleteActionResponse : nsIPaymentActionResponse
{
/*
* The UI status after calling complete().
*/
readonly attribute uint32_t completeStatus;
void init(in AString aRequestId,
in uint32_t aCompleteStatus);
/*
* Check if the UI is finished.
*/
bool isCompleted();
};
%{C++
#define NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CID \
{ 0x52fc3f9f, 0xc0cb, 0x4874, { 0xb3, 0xd4, 0xee, 0x4b, 0x6e, 0x9c, 0xbe, 0x9c } }
#define NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-canmake-action-response;1"
#define NS_PAYMENT_SHOW_ACTION_RESPONSE_CID \
{ 0x184385cb, 0x2d35, 0x4b99, { 0xa9, 0xa3, 0x7c, 0x78, 0x0b, 0xf6, 0x6b, 0x9b } }
#define NS_PAYMENT_SHOW_ACTION_RESPONSE_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-show-action-response;1"
#define NS_PAYMENT_ABORT_ACTION_RESPONSE_CID \
{ 0x8c72bcdb, 0x0c37, 0x4786, { 0xa9, 0xe5, 0x51, 0x0a, 0xfa, 0x2f, 0x8e, 0xde } }
#define NS_PAYMENT_ABORT_ACTION_RESPONSE_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-abort-action-response;1"
#define NS_PAYMENT_COMPLETE_ACTION_RESPONSE_CID \
{ 0x62c01e69, 0x9ca4, 0x4060, { 0x99, 0xe4, 0xb9, 0x5f, 0x62, 0x8c, 0x8e, 0x6d } }
#define NS_PAYMENT_COMPLETE_ACTION_RESPONSE_CONTRACT_ID \
"@mozilla.org/dom/payments/payment-complete-action-response;1"
%}

Просмотреть файл

@ -7,7 +7,9 @@
#include "nsIVariant.idl" #include "nsIVariant.idl"
#include "nsIPaymentRequest.idl" #include "nsIPaymentRequest.idl"
#include "nsIPaymentActionRequest.idl" #include "nsIPaymentActionRequest.idl"
#include "nsIPaymentActionResponse.idl"
#include "nsISimpleEnumerator.idl" #include "nsISimpleEnumerator.idl"
#include "nsIPaymentUIService.idl"
/* /*
* nsPaymentRequestService is used to manage the created PaymentRequest in the * nsPaymentRequestService is used to manage the created PaymentRequest in the
@ -17,19 +19,27 @@
[scriptable, builtinclass, uuid(cccd665f-edf3-41fc-ab9b-fc55b37340aa)] [scriptable, builtinclass, uuid(cccd665f-edf3-41fc-ab9b-fc55b37340aa)]
interface nsIPaymentRequestService : nsISupports interface nsIPaymentRequestService : nsISupports
{ {
nsIPaymentRequest getPaymentRequestById(in AString requestId); nsIPaymentRequest getPaymentRequestById(in AString aRequestId);
nsISimpleEnumerator enumerate(); nsISimpleEnumerator enumerate();
/* /*
* This method is only for testing. * These methods are only for testing.
*/ */
void cleanup(); void cleanup();
void setTestingUIService(in nsIPaymentUIService aUIService);
void removeActionCallback(in nsIPaymentActionCallback aCallback);
/* /*
* requestPayment is used to handle the asked action request of the payment * requestPayment is used to handle the asked action request of the payment
* from content process. * from content process.
*/ */
void requestPayment(in nsIPaymentActionRequest aRequest); void requestPayment(in nsIPaymentActionRequest aRequest);
/*
* respondPayment is used for payment UI to respond the asked action result.
*/
void respondPayment(in nsIPaymentActionResponse aResponse);
}; };
%{C++ %{C++

Просмотреть файл

@ -0,0 +1,16 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#include "nsISupports.idl"
#include "nsIPaymentActionResponse.idl"
[scriptable, uuid(ea008d0c-9e9f-411f-a6c5-a62106ba7ab9)]
interface nsIPaymentUIService : nsISupports
{
nsIPaymentActionResponse canMakePayment(in AString requestId);
nsIPaymentActionResponse showPayment(in AString requestId);
nsIPaymentActionResponse abortPayment(in AString requestId);
nsIPaymentActionResponse completePayment(in AString requestId);
};

Просмотреть файл

@ -18,12 +18,21 @@ namespace dom {
NS_IMPL_ISUPPORTS(PaymentActionRequest, NS_IMPL_ISUPPORTS(PaymentActionRequest,
nsIPaymentActionRequest) nsIPaymentActionRequest)
PaymentActionRequest::PaymentActionRequest()
: mRequestId(EmptyString())
, mType(nsIPaymentActionRequest::UNKNOWN_ACTION)
, mCallback(nullptr)
{
}
NS_IMETHODIMP NS_IMETHODIMP
PaymentActionRequest::Init(const nsAString& aRequestId, PaymentActionRequest::Init(const nsAString& aRequestId,
const uint32_t aType) const uint32_t aType,
nsIPaymentActionCallback* aCallback)
{ {
mRequestId = aRequestId; mRequestId = aRequestId;
mType = aType; mType = aType;
mCallback = aCallback;
return NS_OK; return NS_OK;
} }
@ -41,23 +50,42 @@ PaymentActionRequest::GetType(uint32_t* aType)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
PaymentActionRequest::GetCallback(nsIPaymentActionCallback** aCallback)
{
NS_ENSURE_ARG_POINTER(aCallback);
nsCOMPtr<nsIPaymentActionCallback> callback = mCallback;
callback.forget(aCallback);
return NS_OK;
}
/* PaymentCreateActionRequest */ /* PaymentCreateActionRequest */
NS_IMPL_ISUPPORTS_INHERITED(PaymentCreateActionRequest, NS_IMPL_ISUPPORTS_INHERITED(PaymentCreateActionRequest,
PaymentActionRequest, PaymentActionRequest,
nsIPaymentCreateActionRequest) nsIPaymentCreateActionRequest)
PaymentCreateActionRequest::PaymentCreateActionRequest()
: mTabId(0)
{
}
NS_IMETHODIMP NS_IMETHODIMP
PaymentCreateActionRequest::InitRequest(const nsAString& aRequestId, PaymentCreateActionRequest::InitRequest(const nsAString& aRequestId,
nsIPaymentActionCallback* aCallback,
const uint64_t aTabId, const uint64_t aTabId,
nsIArray* aMethodData, nsIArray* aMethodData,
nsIPaymentDetails* aDetails, nsIPaymentDetails* aDetails,
nsIPaymentOptions* aOptions) nsIPaymentOptions* aOptions)
{ {
NS_ENSURE_ARG_POINTER(aCallback);
NS_ENSURE_ARG_POINTER(aMethodData); NS_ENSURE_ARG_POINTER(aMethodData);
NS_ENSURE_ARG_POINTER(aDetails); NS_ENSURE_ARG_POINTER(aDetails);
NS_ENSURE_ARG_POINTER(aOptions); NS_ENSURE_ARG_POINTER(aOptions);
Init(aRequestId, nsIPaymentActionRequest::CREATE_ACTION); nsresult rv = Init(aRequestId, nsIPaymentActionRequest::CREATE_ACTION, aCallback);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mTabId = aTabId; mTabId = aTabId;
mMethodData = aMethodData; mMethodData = aMethodData;
mDetails = aDetails; mDetails = aDetails;
@ -77,7 +105,6 @@ NS_IMETHODIMP
PaymentCreateActionRequest::GetMethodData(nsIArray** aMethodData) PaymentCreateActionRequest::GetMethodData(nsIArray** aMethodData)
{ {
NS_ENSURE_ARG_POINTER(aMethodData); NS_ENSURE_ARG_POINTER(aMethodData);
*aMethodData = nullptr;
MOZ_ASSERT(mMethodData); MOZ_ASSERT(mMethodData);
nsCOMPtr<nsIArray> methodData = mMethodData; nsCOMPtr<nsIArray> methodData = mMethodData;
methodData.forget(aMethodData); methodData.forget(aMethodData);
@ -88,7 +115,6 @@ NS_IMETHODIMP
PaymentCreateActionRequest::GetDetails(nsIPaymentDetails** aDetails) PaymentCreateActionRequest::GetDetails(nsIPaymentDetails** aDetails)
{ {
NS_ENSURE_ARG_POINTER(aDetails); NS_ENSURE_ARG_POINTER(aDetails);
*aDetails = nullptr;
MOZ_ASSERT(mDetails); MOZ_ASSERT(mDetails);
nsCOMPtr<nsIPaymentDetails> details = mDetails; nsCOMPtr<nsIPaymentDetails> details = mDetails;
details.forget(aDetails); details.forget(aDetails);
@ -99,12 +125,43 @@ NS_IMETHODIMP
PaymentCreateActionRequest::GetOptions(nsIPaymentOptions** aOptions) PaymentCreateActionRequest::GetOptions(nsIPaymentOptions** aOptions)
{ {
NS_ENSURE_ARG_POINTER(aOptions); NS_ENSURE_ARG_POINTER(aOptions);
*aOptions = nullptr;
MOZ_ASSERT(mOptions); MOZ_ASSERT(mOptions);
nsCOMPtr<nsIPaymentOptions> options = mOptions; nsCOMPtr<nsIPaymentOptions> options = mOptions;
options.forget(aOptions); options.forget(aOptions);
return NS_OK; return NS_OK;
} }
/* PaymentCompleteActionRequest */
NS_IMPL_ISUPPORTS_INHERITED(PaymentCompleteActionRequest,
PaymentActionRequest,
nsIPaymentCompleteActionRequest)
PaymentCompleteActionRequest::PaymentCompleteActionRequest()
: mCompleteStatus(EmptyString())
{
}
NS_IMETHODIMP
PaymentCompleteActionRequest::GetCompleteStatus(nsAString& aCompleteStatus)
{
aCompleteStatus = mCompleteStatus;
return NS_OK;
}
NS_IMETHODIMP
PaymentCompleteActionRequest::InitRequest(const nsAString& aRequestId,
nsIPaymentActionCallback* aCallback,
const nsAString& aCompleteStatus)
{
NS_ENSURE_ARG_POINTER(aCallback);
nsresult rv = Init(aRequestId, nsIPaymentActionRequest::COMPLETE_ACTION, aCallback);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mCompleteStatus = aCompleteStatus;
return NS_OK;
}
} // end of namespace dom } // end of namespace dom
} // end of namespace mozilla } // end of namespace mozilla

Просмотреть файл

@ -9,7 +9,6 @@
#include "nsIPaymentActionRequest.h" #include "nsIPaymentActionRequest.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsIArray.h" #include "nsIArray.h"
#include "nsString.h" #include "nsString.h"
@ -22,13 +21,14 @@ public:
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
NS_DECL_NSIPAYMENTACTIONREQUEST NS_DECL_NSIPAYMENTACTIONREQUEST
PaymentActionRequest() = default; PaymentActionRequest();
protected: protected:
virtual ~PaymentActionRequest() = default; virtual ~PaymentActionRequest() = default;
nsString mRequestId; nsString mRequestId;
uint32_t mType; uint32_t mType;
nsCOMPtr<nsIPaymentActionCallback> mCallback;
}; };
class PaymentCreateActionRequest final : public nsIPaymentCreateActionRequest class PaymentCreateActionRequest final : public nsIPaymentCreateActionRequest
@ -39,7 +39,7 @@ public:
NS_FORWARD_NSIPAYMENTACTIONREQUEST(PaymentActionRequest::) NS_FORWARD_NSIPAYMENTACTIONREQUEST(PaymentActionRequest::)
NS_DECL_NSIPAYMENTCREATEACTIONREQUEST NS_DECL_NSIPAYMENTCREATEACTIONREQUEST
PaymentCreateActionRequest() = default; PaymentCreateActionRequest();
private: private:
~PaymentCreateActionRequest() = default; ~PaymentCreateActionRequest() = default;
@ -50,6 +50,22 @@ private:
nsCOMPtr<nsIPaymentOptions> mOptions; nsCOMPtr<nsIPaymentOptions> mOptions;
}; };
class PaymentCompleteActionRequest final : public nsIPaymentCompleteActionRequest
, public PaymentActionRequest
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIPAYMENTACTIONREQUEST(PaymentActionRequest::)
NS_DECL_NSIPAYMENTCOMPLETEACTIONREQUEST
PaymentCompleteActionRequest();
private:
~PaymentCompleteActionRequest() = default;
nsString mCompleteStatus;
};
} // end of namespace dom } // end of namespace dom
} // end of namespace mozilla } // end of namespace mozilla

Просмотреть файл

@ -0,0 +1,220 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/. */
#include "PaymentActionResponse.h"
#include "nsIRunnable.h"
namespace mozilla {
namespace dom {
/* PaymentActionResponse */
NS_IMPL_ISUPPORTS(PaymentActionResponse,
nsIPaymentActionResponse)
PaymentActionResponse::PaymentActionResponse()
: mRequestId(EmptyString())
, mType(nsIPaymentActionResponse::NO_TYPE)
{
}
NS_IMETHODIMP
PaymentActionResponse::GetRequestId(nsAString& aRequestId)
{
aRequestId = mRequestId;
return NS_OK;
}
NS_IMETHODIMP
PaymentActionResponse::GetType(uint32_t* aType)
{
NS_ENSURE_ARG_POINTER(aType);
*aType = mType;
return NS_OK;
}
/* PaymentCanMakeActionResponse */
NS_IMPL_ISUPPORTS_INHERITED(PaymentCanMakeActionResponse,
PaymentActionResponse,
nsIPaymentCanMakeActionResponse)
PaymentCanMakeActionResponse::PaymentCanMakeActionResponse()
{
mType = nsIPaymentActionResponse::CANMAKE_ACTION;
}
NS_IMETHODIMP
PaymentCanMakeActionResponse::GetResult(bool* aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
*aResult = mResult;
return NS_OK;
}
NS_IMETHODIMP
PaymentCanMakeActionResponse::Init(const nsAString& aRequestId, const bool aResult)
{
mRequestId = aRequestId;
mResult = aResult;
return NS_OK;
}
/* PaymentShowActionResponse */
NS_IMPL_ISUPPORTS_INHERITED(PaymentShowActionResponse,
PaymentActionResponse,
nsIPaymentShowActionResponse)
PaymentShowActionResponse::PaymentShowActionResponse()
{
mType = nsIPaymentActionResponse::SHOW_ACTION;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetAcceptStatus(uint32_t* aAcceptStatus)
{
NS_ENSURE_ARG_POINTER(aAcceptStatus);
*aAcceptStatus = mAcceptStatus;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetMethodName(nsAString& aMethodName)
{
aMethodName = mMethodName;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetData(nsAString& aData)
{
aData = mData;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetPayerName(nsAString& aPayerName)
{
aPayerName = mPayerName;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetPayerEmail(nsAString& aPayerEmail)
{
aPayerEmail = mPayerEmail;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::GetPayerPhone(nsAString& aPayerPhone)
{
aPayerPhone = mPayerPhone;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::Init(const nsAString& aRequestId,
const uint32_t aAcceptStatus,
const nsAString& aMethodName,
const nsAString& aData,
const nsAString& aPayerName,
const nsAString& aPayerEmail,
const nsAString& aPayerPhone)
{
mRequestId = aRequestId;
mAcceptStatus = aAcceptStatus;
mMethodName = aMethodName;
mData = aData;
mPayerName = aPayerName;
mPayerEmail = aPayerEmail;
mPayerPhone = aPayerPhone;
return NS_OK;
}
NS_IMETHODIMP
PaymentShowActionResponse::IsAccepted(bool* aIsAccepted)
{
NS_ENSURE_ARG_POINTER(aIsAccepted);
*aIsAccepted = (mAcceptStatus == nsIPaymentActionResponse::PAYMENT_ACCEPTED);
return NS_OK;
}
/* PaymentAbortActionResponse */
NS_IMPL_ISUPPORTS_INHERITED(PaymentAbortActionResponse,
PaymentActionResponse,
nsIPaymentAbortActionResponse)
PaymentAbortActionResponse::PaymentAbortActionResponse()
{
mType = nsIPaymentActionResponse::ABORT_ACTION;
}
NS_IMETHODIMP
PaymentAbortActionResponse::GetAbortStatus(uint32_t* aAbortStatus)
{
NS_ENSURE_ARG_POINTER(aAbortStatus);
*aAbortStatus = mAbortStatus;
return NS_OK;
}
NS_IMETHODIMP
PaymentAbortActionResponse::Init(const nsAString& aRequestId,
const uint32_t aAbortStatus)
{
mRequestId = aRequestId;
mAbortStatus = aAbortStatus;
return NS_OK;
}
NS_IMETHODIMP
PaymentAbortActionResponse::IsSucceeded(bool* aIsSucceeded)
{
NS_ENSURE_ARG_POINTER(aIsSucceeded);
*aIsSucceeded = (mAbortStatus == nsIPaymentActionResponse::ABORT_SUCCEEDED);
return NS_OK;
}
/* PaymentCompleteActionResponse */
NS_IMPL_ISUPPORTS_INHERITED(PaymentCompleteActionResponse,
PaymentActionResponse,
nsIPaymentCompleteActionResponse)
PaymentCompleteActionResponse::PaymentCompleteActionResponse()
{
mType = nsIPaymentActionResponse::COMPLETE_ACTION;
}
nsresult
PaymentCompleteActionResponse::Init(const nsAString& aRequestId,
const uint32_t aCompleteStatus)
{
mRequestId = aRequestId;
mCompleteStatus = aCompleteStatus;
return NS_OK;
}
nsresult
PaymentCompleteActionResponse::GetCompleteStatus(uint32_t* aCompleteStatus)
{
NS_ENSURE_ARG_POINTER(aCompleteStatus);
*aCompleteStatus = mCompleteStatus;
return NS_OK;
}
nsresult
PaymentCompleteActionResponse::IsCompleted(bool* aIsCompleted)
{
NS_ENSURE_ARG_POINTER(aIsCompleted);
*aIsCompleted = (mCompleteStatus == nsIPaymentActionResponse::COMPLETE_SUCCEEDED);
return NS_OK;
}
} // end of namespace dom
} // end of namespace mozilla

Просмотреть файл

@ -0,0 +1,104 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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_PaymentActionResponse_h
#define mozilla_dom_PaymentActionResponse_h
#include "nsIPaymentActionResponse.h"
namespace mozilla {
namespace dom {
class PaymentRequestParent;
class PaymentActionResponse : public nsIPaymentActionResponse
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPAYMENTACTIONRESPONSE
PaymentActionResponse();
protected:
virtual ~PaymentActionResponse() = default;
nsString mRequestId;
uint32_t mType;
};
class PaymentCanMakeActionResponse final : public nsIPaymentCanMakeActionResponse
, public PaymentActionResponse
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIPAYMENTACTIONRESPONSE(PaymentActionResponse::)
NS_DECL_NSIPAYMENTCANMAKEACTIONRESPONSE
PaymentCanMakeActionResponse();
private:
~PaymentCanMakeActionResponse() = default;
bool mResult;
};
class PaymentShowActionResponse final : public nsIPaymentShowActionResponse
, public PaymentActionResponse
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIPAYMENTACTIONRESPONSE(PaymentActionResponse::)
NS_DECL_NSIPAYMENTSHOWACTIONRESPONSE
PaymentShowActionResponse();
private:
~PaymentShowActionResponse() = default;
uint32_t mAcceptStatus;
nsString mMethodName;
nsString mData;
nsString mPayerName;
nsString mPayerEmail;
nsString mPayerPhone;
};
class PaymentAbortActionResponse final : public nsIPaymentAbortActionResponse
, public PaymentActionResponse
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIPAYMENTACTIONRESPONSE(PaymentActionResponse::)
NS_DECL_NSIPAYMENTABORTACTIONRESPONSE
PaymentAbortActionResponse();
private:
~PaymentAbortActionResponse() = default;
uint32_t mAbortStatus;
};
class PaymentCompleteActionResponse final : public nsIPaymentCompleteActionResponse
, public PaymentActionResponse
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIPAYMENTACTIONRESPONSE(PaymentActionResponse::)
NS_DECL_NSIPAYMENTCOMPLETEACTIONRESPONSE
PaymentCompleteActionResponse();
private:
~PaymentCompleteActionResponse() = default;
uint32_t mCompleteStatus;
};
} // end of dom
} // end of namespace mozilla
#endif

Просмотреть файл

@ -0,0 +1,128 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/. */
#include "mozilla/dom/PaymentAddress.h"
#include "mozilla/dom/PaymentAddressBinding.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(PaymentAddress, mOwner)
NS_IMPL_CYCLE_COLLECTING_ADDREF(PaymentAddress)
NS_IMPL_CYCLE_COLLECTING_RELEASE(PaymentAddress)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PaymentAddress)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
PaymentAddress::PaymentAddress(nsPIDOMWindowInner* aWindow,
const nsAString& aCountry,
const nsTArray<nsString>& aAddressLine,
const nsAString& aRegion,
const nsAString& aCity,
const nsAString& aDependentLocality,
const nsAString& aPostalCode,
const nsAString& aSortingCode,
const nsAString& aLanguageCode,
const nsAString& aOrganization,
const nsAString& aRecipient,
const nsAString& aPhone)
: mCountry(aCountry)
, mAddressLine(aAddressLine)
, mRegion(aRegion)
, mCity(aCity)
, mDependentLocality(aDependentLocality)
, mPostalCode(aPostalCode)
, mSortingCode(aSortingCode)
, mLanguageCode(aLanguageCode)
, mOrganization(aOrganization)
, mRecipient(aRecipient)
, mPhone(aPhone)
, mOwner(aWindow)
{
}
void
PaymentAddress::GetCountry(nsAString& aRetVal) const
{
aRetVal = mCountry;
}
void
PaymentAddress::GetAddressLine(nsTArray<nsString>& aRetVal) const
{
aRetVal = mAddressLine;
}
void
PaymentAddress::GetRegion(nsAString& aRetVal) const
{
aRetVal = mRegion;
}
void
PaymentAddress::GetCity(nsAString& aRetVal) const
{
aRetVal = mCity;
}
void
PaymentAddress::GetDependentLocality(nsAString& aRetVal) const
{
aRetVal = mDependentLocality;
}
void
PaymentAddress::GetPostalCode(nsAString& aRetVal) const
{
aRetVal = mPostalCode;
}
void
PaymentAddress::GetSortingCode(nsAString& aRetVal) const
{
aRetVal = mSortingCode;
}
void
PaymentAddress::GetLanguageCode(nsAString& aRetVal) const
{
aRetVal = mLanguageCode;
}
void
PaymentAddress::GetOrganization(nsAString& aRetVal) const
{
aRetVal = mOrganization;
}
void
PaymentAddress::GetRecipient(nsAString& aRetVal) const
{
aRetVal = mRecipient;
}
void
PaymentAddress::GetPhone(nsAString& aRetVal) const
{
aRetVal = mPhone;
}
PaymentAddress::~PaymentAddress()
{
}
JSObject*
PaymentAddress::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return PaymentAddressBinding::Wrap(aCx, this, aGivenProto);
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,88 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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_PaymentAddress_h
#define mozilla_dom_PaymentAddress_h
#include "nsPIDOMWindow.h"
#include "nsWrapperCache.h"
namespace mozilla {
namespace dom {
class PaymentAddress final : public nsISupports,
public nsWrapperCache
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PaymentAddress)
PaymentAddress(nsPIDOMWindowInner* aWindow,
const nsAString& aCountry,
const nsTArray<nsString>& aAddressLine,
const nsAString& aRegion,
const nsAString& aCity,
const nsAString& aDependentLocality,
const nsAString& aPostalCode,
const nsAString& aSortingCode,
const nsAString& aLanguageCode,
const nsAString& aOrganization,
const nsAString& aRecipient,
const nsAString& aPhone);
nsPIDOMWindowInner* GetParentObject() const
{
return mOwner;
}
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
// Getter functions
void GetCountry(nsAString& aRetVal) const;
void GetAddressLine(nsTArray<nsString>& aRetVal) const;
void GetRegion(nsAString& aRetVal) const;
void GetCity(nsAString& aRetVal) const;
void GetDependentLocality(nsAString& aRetVal) const;
void GetPostalCode(nsAString& aRetVal) const;
void GetSortingCode(nsAString& aRetVal) const;
void GetLanguageCode(nsAString& aRetVal) const;
void GetOrganization(nsAString& aRetVal) const;
void GetRecipient(nsAString& aRetVal) const;
void GetPhone(nsAString& aRetVal) const;
private:
~PaymentAddress();
nsString mCountry;
nsTArray<nsString> mAddressLine;
nsString mRegion;
nsString mCity;
nsString mDependentLocality;
nsString mPostalCode;
nsString mSortingCode;
nsString mLanguageCode;
nsString mOrganization;
nsString mRecipient;
nsString mPhone;
nsCOMPtr<nsPIDOMWindowInner> mOwner;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_PaymentAddress_h

Просмотреть файл

@ -5,6 +5,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/PaymentRequest.h" #include "mozilla/dom/PaymentRequest.h"
#include "mozilla/dom/PaymentResponse.h"
#include "nsContentUtils.h" #include "nsContentUtils.h"
#include "PaymentRequestManager.h" #include "PaymentRequestManager.h"
@ -21,10 +22,20 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PaymentRequest, NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PaymentRequest,
DOMEventTargetHelper) DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResultPromise)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAcceptPromise)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAbortPromise)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResponse)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mShippingAddress)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PaymentRequest, NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PaymentRequest,
DOMEventTargetHelper) DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mResultPromise)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mAcceptPromise)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mAbortPromise)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mResponse)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mShippingAddress)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(PaymentRequest) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(PaymentRequest)
@ -39,6 +50,26 @@ PaymentRequest::PrefEnabled(JSContext* aCx, JSObject* aObj)
return Preferences::GetBool("dom.payments.request.enabled"); return Preferences::GetBool("dom.payments.request.enabled");
} }
bool
PaymentRequest::IsValidMethodData(const Sequence<PaymentMethodData>& aMethodData,
nsAString& aErrorMsg)
{
if (!aMethodData.Length()) {
aErrorMsg.AssignLiteral("At least one payment method is required.");
return false;
}
for (const PaymentMethodData& methodData : aMethodData) {
if (!methodData.mSupportedMethods.Length()) {
aErrorMsg.AssignLiteral(
"At least one payment method identifier is required.");
return false;
}
}
return true;
}
bool bool
PaymentRequest::IsValidNumber(const nsAString& aItem, PaymentRequest::IsValidNumber(const nsAString& aItem,
const nsAString& aStr, const nsAString& aStr,
@ -152,11 +183,10 @@ PaymentRequest::Constructor(const GlobalObject& aGlobal,
// [TODO] Bug 1318988 - Implement `allowPaymentRequest` on iframe // [TODO] Bug 1318988 - Implement `allowPaymentRequest` on iframe
// Check payment methods is done by webidl // Check payment methods and details
// Check payment details
nsAutoString message; nsAutoString message;
if (!IsValidDetailsInit(aDetails, message)) { if (!IsValidMethodData(aMethodData, message) ||
!IsValidDetailsInit(aDetails, message)) {
aRv.ThrowTypeError<MSG_ILLEGAL_PR_CONSTRUCTOR>(message); aRv.ThrowTypeError<MSG_ILLEGAL_PR_CONSTRUCTOR>(message);
return nullptr; return nullptr;
} }
@ -171,6 +201,7 @@ PaymentRequest::Constructor(const GlobalObject& aGlobal,
nsresult rv = manager->CreatePayment(window, aMethodData, aDetails, nsresult rv = manager->CreatePayment(window, aMethodData, aDetails,
aOptions, getter_AddRefs(request)); aOptions, getter_AddRefs(request));
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
return nullptr; return nullptr;
} }
@ -198,6 +229,7 @@ PaymentRequest::CreatePaymentRequest(nsPIDOMWindowInner* aWindow, nsresult& aRv)
PaymentRequest::PaymentRequest(nsPIDOMWindowInner* aWindow, const nsAString& aInternalId) PaymentRequest::PaymentRequest(nsPIDOMWindowInner* aWindow, const nsAString& aInternalId)
: DOMEventTargetHelper(aWindow) : DOMEventTargetHelper(aWindow)
, mInternalId(aInternalId) , mInternalId(aInternalId)
, mShippingAddress(nullptr)
, mUpdating(false) , mUpdating(false)
, mState(eCreated) , mState(eCreated)
{ {
@ -205,24 +237,180 @@ PaymentRequest::PaymentRequest(nsPIDOMWindowInner* aWindow, const nsAString& aIn
} }
already_AddRefed<Promise> already_AddRefed<Promise>
PaymentRequest::Show(ErrorResult& aRv) PaymentRequest::CanMakePayment(ErrorResult& aRv)
{ {
aRv.Throw(NS_ERROR_FAILURE); if (mState != eCreated) {
return nullptr; aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
if (mResultPromise) {
aRv.Throw(NS_ERROR_DOM_NOT_ALLOWED_ERR);
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
ErrorResult result;
RefPtr<Promise> promise = Promise::Create(global, result);
if (result.Failed()) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
if (NS_WARN_IF(!manager)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsresult rv = manager->CanMakePayment(mInternalId);
if (NS_WARN_IF(NS_FAILED(rv))) {
promise->MaybeReject(NS_ERROR_FAILURE);
return promise.forget();
}
mResultPromise = promise;
return promise.forget();
}
void
PaymentRequest::RespondCanMakePayment(bool aResult)
{
MOZ_ASSERT(mResultPromise);
mResultPromise->MaybeResolve(aResult);
mResultPromise = nullptr;
} }
already_AddRefed<Promise> already_AddRefed<Promise>
PaymentRequest::CanMakePayment(ErrorResult& aRv) PaymentRequest::Show(ErrorResult& aRv)
{ {
aRv.Throw(NS_ERROR_FAILURE); if (mState != eCreated) {
return nullptr; aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
ErrorResult result;
RefPtr<Promise> promise = Promise::Create(global, result);
if (result.Failed()) {
mState = eClosed;
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
if (NS_WARN_IF(!manager)) {
mState = eClosed;
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsresult rv = manager->ShowPayment(mInternalId);
if (NS_WARN_IF(NS_FAILED(rv))) {
promise->MaybeReject(NS_ERROR_FAILURE);
mState = eClosed;
return promise.forget();
}
mAcceptPromise = promise;
mState = eInteractive;
return promise.forget();
}
void
PaymentRequest::RejectShowPayment(nsresult aRejectReason)
{
MOZ_ASSERT(mAcceptPromise);
MOZ_ASSERT(ReadyForUpdate());
mAcceptPromise->MaybeReject(aRejectReason);
mState = eClosed;
mAcceptPromise = nullptr;
}
void
PaymentRequest::RespondShowPayment(bool aAccept,
const nsAString& aMethodName,
const nsAString& aDetails,
const nsAString& aPayerName,
const nsAString& aPayerEmail,
const nsAString& aPayerPhone,
nsresult aRv)
{
MOZ_ASSERT(mAcceptPromise);
MOZ_ASSERT(ReadyForUpdate());
MOZ_ASSERT(mState == eInteractive);
if (!aAccept) {
RejectShowPayment(aRv);
return;
}
RefPtr<PaymentResponse> paymentResponse =
new PaymentResponse(GetOwner(), mInternalId, mId, aMethodName,
mShippingOption, mShippingAddress, aDetails,
aPayerName, aPayerEmail, aPayerPhone);
mResponse = paymentResponse;
mAcceptPromise->MaybeResolve(paymentResponse);
mState = eClosed;
mAcceptPromise = nullptr;
}
void
PaymentRequest::RespondComplete()
{
MOZ_ASSERT(mResponse);
mResponse->RespondComplete();
} }
already_AddRefed<Promise> already_AddRefed<Promise>
PaymentRequest::Abort(ErrorResult& aRv) PaymentRequest::Abort(ErrorResult& aRv)
{ {
aRv.Throw(NS_ERROR_FAILURE); if (mState != eInteractive) {
return nullptr; aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
if (mAbortPromise) {
aRv.Throw(NS_ERROR_DOM_NOT_ALLOWED_ERR);
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
ErrorResult result;
RefPtr<Promise> promise = Promise::Create(global, result);
if (result.Failed()) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
if (NS_WARN_IF(!manager)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsresult rv = manager->AbortPayment(mInternalId);
if (NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
mAbortPromise = promise;
return promise.forget();
}
void
PaymentRequest::RespondAbortPayment(bool aSuccess)
{
MOZ_ASSERT(mAbortPromise);
MOZ_ASSERT(mState == eInteractive);
if (aSuccess) {
mAbortPromise->MaybeResolve(JS::UndefinedHandleValue);
mAbortPromise = nullptr;
RejectShowPayment(NS_ERROR_DOM_ABORT_ERR);
} else {
mAbortPromise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
mAbortPromise = nullptr;
}
} }
void void
@ -249,12 +437,25 @@ PaymentRequest::Equals(const nsAString& aInternalId) const
return mInternalId.Equals(aInternalId); return mInternalId.Equals(aInternalId);
} }
bool
PaymentRequest::ReadyForUpdate()
{
return mState == eInteractive && !mUpdating;
}
void void
PaymentRequest::SetUpdating(bool aUpdating) PaymentRequest::SetUpdating(bool aUpdating)
{ {
mUpdating = aUpdating; mUpdating = aUpdating;
} }
already_AddRefed<PaymentAddress>
PaymentRequest::GetShippingAddress() const
{
RefPtr<PaymentAddress> address = mShippingAddress;
return address.forget();
}
void void
PaymentRequest::GetShippingOption(nsAString& aRetVal) const PaymentRequest::GetShippingOption(nsAString& aRetVal) const
{ {

Просмотреть файл

@ -17,6 +17,7 @@ namespace mozilla {
namespace dom { namespace dom {
class EventHandlerNonNull; class EventHandlerNonNull;
class PaymentAddress;
class PaymentResponse; class PaymentResponse;
class PaymentRequest final : public DOMEventTargetHelper class PaymentRequest final : public DOMEventTargetHelper
@ -34,6 +35,9 @@ public:
static bool PrefEnabled(JSContext* aCx, JSObject* aObj); static bool PrefEnabled(JSContext* aCx, JSObject* aObj);
static bool IsValidMethodData(const Sequence<PaymentMethodData>& aMethodData,
nsAString& aErrorMsg);
static bool static bool
IsValidNumber(const nsAString& aItem, IsValidNumber(const nsAString& aItem,
const nsAString& aStr, const nsAString& aStr,
@ -57,9 +61,22 @@ public:
const PaymentOptions& aOptions, const PaymentOptions& aOptions,
ErrorResult& aRv); ErrorResult& aRv);
already_AddRefed<Promise> Show(ErrorResult& aRv);
already_AddRefed<Promise> Abort(ErrorResult& aRv);
already_AddRefed<Promise> CanMakePayment(ErrorResult& aRv); already_AddRefed<Promise> CanMakePayment(ErrorResult& aRv);
void RespondCanMakePayment(bool aResult);
already_AddRefed<Promise> Show(ErrorResult& aRv);
void RespondShowPayment(bool aAccept,
const nsAString& aMethodName,
const nsAString& aDetails,
const nsAString& aPayerName,
const nsAString& aPayerEmail,
const nsAString& aPayerPhone,
nsresult aRv = NS_ERROR_DOM_ABORT_ERR);
void RejectShowPayment(nsresult aRejectReason);
void RespondComplete();
already_AddRefed<Promise> Abort(ErrorResult& aRv);
void RespondAbortPayment(bool aResult);
void GetId(nsAString& aRetVal) const; void GetId(nsAString& aRetVal) const;
void GetInternalId(nsAString& aRetVal); void GetInternalId(nsAString& aRetVal);
@ -67,8 +84,10 @@ public:
bool Equals(const nsAString& aInternalId) const; bool Equals(const nsAString& aInternalId) const;
bool ReadyForUpdate();
void SetUpdating(bool aUpdating); void SetUpdating(bool aUpdating);
already_AddRefed<PaymentAddress> GetShippingAddress() const;
void GetShippingOption(nsAString& aRetVal) const; void GetShippingOption(nsAString& aRetVal) const;
Nullable<PaymentShippingType> GetShippingType() const; Nullable<PaymentShippingType> GetShippingType() const;
@ -87,6 +106,16 @@ protected:
// mId is initialized to details.id if it exists // mId is initialized to details.id if it exists
// otherwise, mId has the same value as mInternalId. // otherwise, mId has the same value as mInternalId.
nsString mId; nsString mId;
// Promise for "PaymentRequest::CanMakePayment"
RefPtr<Promise> mResultPromise;
// Promise for "PaymentRequest::Show"
RefPtr<Promise> mAcceptPromise;
// Promise for "PaymentRequest::Abort"
RefPtr<Promise> mAbortPromise;
// Resolve mAcceptPromise with mResponse if user accepts the request.
RefPtr<PaymentResponse> mResponse;
// It is populated when the user provides a shipping address.
RefPtr<PaymentAddress> mShippingAddress;
// It is populated when the user chooses a shipping option. // It is populated when the user chooses a shipping option.
nsString mShippingOption; nsString mShippingOption;

Просмотреть файл

@ -28,7 +28,6 @@ SerializeFromJSObject(JSContext* aCx, JS::HandleObject aObject, nsAString& aSeri
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
JS::RootedValue value(aCx, JS::ObjectValue(*aObject)); JS::RootedValue value(aCx, JS::ObjectValue(*aObject));
//JS::Value value = JS::ObjectValue(*aObject);
return serializer->EncodeFromJSVal(value.address(), aCx, aSerializedObject); return serializer->EncodeFromJSVal(value.address(), aCx, aSerializedObject);
} }
@ -292,6 +291,31 @@ PaymentRequestManager::ReleasePaymentChild(PaymentRequest* aRequest)
return NS_OK; return NS_OK;
} }
nsresult
PaymentRequestManager::SendRequestPayment(PaymentRequest* aRequest,
const IPCPaymentActionRequest& aAction,
bool aReleaseAfterSend)
{
RefPtr<PaymentRequestChild> requestChild;
nsresult rv = GetPaymentChild(aRequest, getter_AddRefs(requestChild));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = requestChild->RequestPayment(aAction);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (aReleaseAfterSend) {
rv = ReleasePaymentChild(aRequest);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
}
return NS_OK;
}
already_AddRefed<PaymentRequestManager> already_AddRefed<PaymentRequestManager>
PaymentRequestManager::GetSingleton() PaymentRequestManager::GetSingleton()
{ {
@ -346,7 +370,7 @@ PaymentRequestManager::CreatePayment(nsPIDOMWindowInner* aWindow,
IPCPaymentOptions options; IPCPaymentOptions options;
ConvertOptions(aOptions, options); ConvertOptions(aOptions, options);
RefPtr<PaymentRequest> paymentRequest = PaymentRequest::CreatePaymentRequest(aWindow, rv); RefPtr<PaymentRequest> request = PaymentRequest::CreatePaymentRequest(aWindow, rv);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return rv; return rv;
} }
@ -359,34 +383,155 @@ PaymentRequestManager::CreatePayment(nsPIDOMWindowInner* aWindow,
if (aDetails.mId.WasPassed() && !aDetails.mId.Value().IsEmpty()) { if (aDetails.mId.WasPassed() && !aDetails.mId.Value().IsEmpty()) {
requestId = aDetails.mId.Value(); requestId = aDetails.mId.Value();
} else { } else {
paymentRequest->GetInternalId(requestId); request->GetInternalId(requestId);
}
paymentRequest->SetId(requestId);
RefPtr<PaymentRequestChild> requestChild;
rv = GetPaymentChild(paymentRequest, getter_AddRefs(requestChild));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
} }
request->SetId(requestId);
nsAutoString internalId; nsAutoString internalId;
paymentRequest->GetInternalId(internalId); request->GetInternalId(internalId);
IPCPaymentCreateActionRequest request(internalId, IPCPaymentCreateActionRequest action(internalId,
methodData, methodData,
details, details,
options); options);
rv = requestChild->RequestPayment(request);
rv = SendRequestPayment(request, action, true);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return rv; return rv;
} }
mRequestQueue.AppendElement(request);
request.forget(aRequest);
return NS_OK;
}
rv = ReleasePaymentChild(paymentRequest); nsresult
if (NS_WARN_IF(NS_FAILED(rv))) { PaymentRequestManager::CanMakePayment(const nsAString& aRequestId)
return rv; {
RefPtr<PaymentRequest> request = GetPaymentRequestById(aRequestId);
if (!request) {
return NS_ERROR_FAILURE;
} }
mRequestQueue.AppendElement(paymentRequest); nsAutoString requestId(aRequestId);
paymentRequest.forget(aRequest); IPCPaymentCanMakeActionRequest action(requestId);
return SendRequestPayment(request, action);
}
nsresult
PaymentRequestManager::ShowPayment(const nsAString& aRequestId)
{
RefPtr<PaymentRequest> request = GetPaymentRequestById(aRequestId);
if (!request) {
return NS_ERROR_FAILURE;
}
nsAutoString requestId(aRequestId);
IPCPaymentShowActionRequest action(requestId);
return SendRequestPayment(request, action);
}
nsresult
PaymentRequestManager::AbortPayment(const nsAString& aRequestId)
{
RefPtr<PaymentRequest> request = GetPaymentRequestById(aRequestId);
if (!request) {
return NS_ERROR_FAILURE;
}
nsAutoString requestId(aRequestId);
IPCPaymentAbortActionRequest action(requestId);
return SendRequestPayment(request, action);
}
nsresult
PaymentRequestManager::CompletePayment(const nsAString& aRequestId,
const PaymentComplete& aComplete)
{
RefPtr<PaymentRequest> request = GetPaymentRequestById(aRequestId);
if (!request) {
return NS_ERROR_FAILURE;
}
nsString completeStatusString(NS_LITERAL_STRING("unknown"));
uint8_t completeIndex = static_cast<uint8_t>(aComplete);
if (completeIndex < ArrayLength(PaymentCompleteValues::strings)) {
completeStatusString.AssignASCII(
PaymentCompleteValues::strings[completeIndex].value);
}
nsAutoString requestId(aRequestId);
IPCPaymentCompleteActionRequest action(requestId, completeStatusString);
return SendRequestPayment(request, action);
}
nsresult
PaymentRequestManager::RespondPayment(const IPCPaymentActionResponse& aResponse)
{
switch (aResponse.type()) {
case IPCPaymentActionResponse::TIPCPaymentCanMakeActionResponse: {
IPCPaymentCanMakeActionResponse response = aResponse;
RefPtr<PaymentRequest> request = GetPaymentRequestById(response.requestId());
if (NS_WARN_IF(!request)) {
return NS_ERROR_FAILURE;
}
request->RespondCanMakePayment(response.result());
nsresult rv = ReleasePaymentChild(request);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
break;
}
case IPCPaymentActionResponse::TIPCPaymentShowActionResponse: {
IPCPaymentShowActionResponse response = aResponse;
RefPtr<PaymentRequest> request = GetPaymentRequestById(response.requestId());
if (NS_WARN_IF(!request)) {
return NS_ERROR_FAILURE;
}
request->RespondShowPayment(response.isAccepted(),
response.methodName(),
response.data(),
response.payerName(),
response.payerEmail(),
response.payerPhone());
break;
}
case IPCPaymentActionResponse::TIPCPaymentAbortActionResponse: {
IPCPaymentAbortActionResponse response = aResponse;
RefPtr<PaymentRequest> request = GetPaymentRequestById(response.requestId());
if (NS_WARN_IF(!request)) {
return NS_ERROR_FAILURE;
}
request->RespondAbortPayment(response.isSucceeded());
if (response.isSucceeded()) {
mRequestQueue.RemoveElement(request);
nsresult rv = ReleasePaymentChild(request);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
}
break;
}
case IPCPaymentActionResponse::TIPCPaymentCompleteActionResponse: {
IPCPaymentCompleteActionResponse response = aResponse;
RefPtr<PaymentRequest> request = GetPaymentRequestById(response.requestId());
if (NS_WARN_IF(!request)) {
return NS_ERROR_FAILURE;
}
request->RespondComplete();
mRequestQueue.RemoveElement(request);
nsresult rv = ReleasePaymentChild(request);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
break;
}
default: {
return NS_ERROR_FAILURE;
}
}
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -10,6 +10,7 @@
#include "nsISupports.h" #include "nsISupports.h"
#include "PaymentRequest.h" #include "PaymentRequest.h"
#include "mozilla/dom/PaymentRequestBinding.h" #include "mozilla/dom/PaymentRequestBinding.h"
#include "mozilla/dom/PaymentResponseBinding.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
#include "nsTArray.h" #include "nsTArray.h"
@ -17,6 +18,7 @@ namespace mozilla {
namespace dom { namespace dom {
class PaymentRequestChild; class PaymentRequestChild;
class IPCPaymentActionRequest;
/* /*
* PaymentRequestManager is a singleton used to manage the created PaymentRequests. * PaymentRequestManager is a singleton used to manage the created PaymentRequests.
@ -44,9 +46,18 @@ public:
const PaymentOptions& aOptions, const PaymentOptions& aOptions,
PaymentRequest** aRequest); PaymentRequest** aRequest);
nsresult CanMakePayment(const nsAString& aRequestId);
nsresult ShowPayment(const nsAString& aRequestId);
nsresult AbortPayment(const nsAString& aRequestId);
nsresult CompletePayment(const nsAString& aRequestId,
const PaymentComplete& aComplete);
nsresult RespondPayment(const IPCPaymentActionResponse& aResponse);
nsresult nsresult
ReleasePaymentChild(PaymentRequestChild* aPaymentChild); ReleasePaymentChild(PaymentRequestChild* aPaymentChild);
protected:
private:
PaymentRequestManager() = default; PaymentRequestManager() = default;
~PaymentRequestManager() = default; ~PaymentRequestManager() = default;
@ -54,6 +65,10 @@ protected:
PaymentRequestChild** aPaymentChild); PaymentRequestChild** aPaymentChild);
nsresult ReleasePaymentChild(PaymentRequest* aRequest); nsresult ReleasePaymentChild(PaymentRequest* aRequest);
nsresult SendRequestPayment(PaymentRequest* aRequest,
const IPCPaymentActionRequest& action,
bool aReleaseAfterSend = false);
// The container for the created PaymentRequests // The container for the created PaymentRequests
nsTArray<RefPtr<PaymentRequest>> mRequestQueue; nsTArray<RefPtr<PaymentRequest>> mRequestQueue;
nsRefPtrHashtable<nsRefPtrHashKey<PaymentRequest>, PaymentRequestChild> mPaymentChildHash; nsRefPtrHashtable<nsRefPtrHashKey<PaymentRequest>, PaymentRequestChild> mPaymentChildHash;

Просмотреть файл

@ -6,24 +6,45 @@
#include "mozilla/ModuleUtils.h" #include "mozilla/ModuleUtils.h"
#include "PaymentActionRequest.h" #include "PaymentActionRequest.h"
#include "PaymentActionResponse.h"
#include "PaymentRequestService.h" #include "PaymentRequestService.h"
using mozilla::dom::PaymentActionRequest; using mozilla::dom::PaymentActionRequest;
using mozilla::dom::PaymentCreateActionRequest; using mozilla::dom::PaymentCreateActionRequest;
using mozilla::dom::PaymentCompleteActionRequest;
using mozilla::dom::PaymentCanMakeActionResponse;
using mozilla::dom::PaymentAbortActionResponse;
using mozilla::dom::PaymentShowActionResponse;
using mozilla::dom::PaymentCompleteActionResponse;
using mozilla::dom::PaymentRequestService; using mozilla::dom::PaymentRequestService;
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentActionRequest) NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentActionRequest)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentCreateActionRequest) NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentCreateActionRequest)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentCompleteActionRequest)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentCanMakeActionResponse)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentAbortActionResponse)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentShowActionResponse)
NS_GENERIC_FACTORY_CONSTRUCTOR(PaymentCompleteActionResponse)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(PaymentRequestService, NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(PaymentRequestService,
PaymentRequestService::GetSingleton) PaymentRequestService::GetSingleton)
NS_DEFINE_NAMED_CID(NS_PAYMENT_ACTION_REQUEST_CID); NS_DEFINE_NAMED_CID(NS_PAYMENT_ACTION_REQUEST_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_CREATE_ACTION_REQUEST_CID); NS_DEFINE_NAMED_CID(NS_PAYMENT_CREATE_ACTION_REQUEST_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_COMPLETE_ACTION_REQUEST_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_ABORT_ACTION_RESPONSE_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_SHOW_ACTION_RESPONSE_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_COMPLETE_ACTION_RESPONSE_CID);
NS_DEFINE_NAMED_CID(NS_PAYMENT_REQUEST_SERVICE_CID); NS_DEFINE_NAMED_CID(NS_PAYMENT_REQUEST_SERVICE_CID);
static const mozilla::Module::CIDEntry kPaymentRequestCIDs[] = { static const mozilla::Module::CIDEntry kPaymentRequestCIDs[] = {
{ &kNS_PAYMENT_ACTION_REQUEST_CID, false, nullptr, PaymentActionRequestConstructor}, { &kNS_PAYMENT_ACTION_REQUEST_CID, false, nullptr, PaymentActionRequestConstructor},
{ &kNS_PAYMENT_CREATE_ACTION_REQUEST_CID, false, nullptr, PaymentCreateActionRequestConstructor}, { &kNS_PAYMENT_CREATE_ACTION_REQUEST_CID, false, nullptr, PaymentCreateActionRequestConstructor},
{ &kNS_PAYMENT_COMPLETE_ACTION_REQUEST_CID, false, nullptr, PaymentCompleteActionRequestConstructor},
{ &kNS_PAYMENT_CANMAKE_ACTION_RESPONSE_CID, false, nullptr, PaymentCanMakeActionResponseConstructor},
{ &kNS_PAYMENT_ABORT_ACTION_RESPONSE_CID, false, nullptr, PaymentAbortActionResponseConstructor},
{ &kNS_PAYMENT_SHOW_ACTION_RESPONSE_CID, false, nullptr, PaymentShowActionResponseConstructor},
{ &kNS_PAYMENT_COMPLETE_ACTION_RESPONSE_CID, false, nullptr, PaymentCompleteActionResponseConstructor},
{ &kNS_PAYMENT_REQUEST_SERVICE_CID, true, nullptr, PaymentRequestServiceConstructor }, { &kNS_PAYMENT_REQUEST_SERVICE_CID, true, nullptr, PaymentRequestServiceConstructor },
{ nullptr } { nullptr }
}; };
@ -31,6 +52,11 @@ static const mozilla::Module::CIDEntry kPaymentRequestCIDs[] = {
static const mozilla::Module::ContractIDEntry kPaymentRequestContracts[] = { static const mozilla::Module::ContractIDEntry kPaymentRequestContracts[] = {
{ NS_PAYMENT_ACTION_REQUEST_CONTRACT_ID, &kNS_PAYMENT_ACTION_REQUEST_CID }, { NS_PAYMENT_ACTION_REQUEST_CONTRACT_ID, &kNS_PAYMENT_ACTION_REQUEST_CID },
{ NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID, &kNS_PAYMENT_CREATE_ACTION_REQUEST_CID }, { NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID, &kNS_PAYMENT_CREATE_ACTION_REQUEST_CID },
{ NS_PAYMENT_COMPLETE_ACTION_REQUEST_CONTRACT_ID, &kNS_PAYMENT_COMPLETE_ACTION_REQUEST_CID },
{ NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CONTRACT_ID, &kNS_PAYMENT_CANMAKE_ACTION_RESPONSE_CID },
{ NS_PAYMENT_ABORT_ACTION_RESPONSE_CONTRACT_ID, &kNS_PAYMENT_ABORT_ACTION_RESPONSE_CID },
{ NS_PAYMENT_SHOW_ACTION_RESPONSE_CONTRACT_ID, &kNS_PAYMENT_SHOW_ACTION_RESPONSE_CID },
{ NS_PAYMENT_COMPLETE_ACTION_RESPONSE_CONTRACT_ID, &kNS_PAYMENT_COMPLETE_ACTION_RESPONSE_CID },
{ NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID, &kNS_PAYMENT_REQUEST_SERVICE_CID }, { NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID, &kNS_PAYMENT_REQUEST_SERVICE_CID },
{ nullptr } { nullptr }
}; };
@ -38,6 +64,11 @@ static const mozilla::Module::ContractIDEntry kPaymentRequestContracts[] = {
static const mozilla::Module::CategoryEntry kPaymentRequestCategories[] = { static const mozilla::Module::CategoryEntry kPaymentRequestCategories[] = {
{ "payment-request", "PaymentActionRequest", NS_PAYMENT_ACTION_REQUEST_CONTRACT_ID }, { "payment-request", "PaymentActionRequest", NS_PAYMENT_ACTION_REQUEST_CONTRACT_ID },
{ "payment-request", "PaymentCreateActionRequest", NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID }, { "payment-request", "PaymentCreateActionRequest", NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID },
{ "payment-request", "PaymentCompleteActionRequest", NS_PAYMENT_COMPLETE_ACTION_REQUEST_CONTRACT_ID },
{ "payment-request", "PaymentCanMakeActionResponse", NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CONTRACT_ID },
{ "payment-request", "PaymentAbortActionResponse", NS_PAYMENT_ABORT_ACTION_RESPONSE_CONTRACT_ID },
{ "payment-request", "PaymentShowActionResponse", NS_PAYMENT_SHOW_ACTION_RESPONSE_CONTRACT_ID },
{ "payment-request", "PaymentCompleteActionResponse", NS_PAYMENT_COMPLETE_ACTION_RESPONSE_CONTRACT_ID },
{ "payment-request", "PaymentRequestService", NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID }, { "payment-request", "PaymentRequestService", NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID },
{ nullptr } { nullptr }
}; };

Просмотреть файл

@ -138,15 +138,123 @@ PaymentRequestService::Cleanup()
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
PaymentRequestService::SetTestingUIService(nsIPaymentUIService* aUIService)
{
// aUIService can be nullptr
mTestingUIService = aUIService;
return NS_OK;
}
nsresult
PaymentRequestService::CallTestingUIAction(const nsAString& aRequestId, uint32_t aActionType)
{
nsCOMPtr<nsIPaymentActionResponse> response;
nsresult rv;
if (mTestingUIService) {
switch (aActionType) {
case nsIPaymentActionRequest::CANMAKE_ACTION: {
rv = mTestingUIService->CanMakePayment(aRequestId, getter_AddRefs(response));
break;
}
case nsIPaymentActionRequest::SHOW_ACTION: {
rv = mTestingUIService->ShowPayment(aRequestId, getter_AddRefs(response));
break;
}
case nsIPaymentActionRequest::ABORT_ACTION: {
rv = mTestingUIService->AbortPayment(aRequestId, getter_AddRefs(response));
break;
}
case nsIPaymentActionRequest::COMPLETE_ACTION: {
rv = mTestingUIService->CompletePayment(aRequestId, getter_AddRefs(response));
break;
}
default : {
return NS_ERROR_FAILURE;
}
}
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
} else {
// Since there is no UI implementation and no testing UI Service is registered,
// set false response for canMakePayment() and ABORT_SUCCEEDED for abort()
switch (aActionType) {
case nsIPaymentActionRequest::CANMAKE_ACTION: {
nsCOMPtr<nsIPaymentCanMakeActionResponse> canMakeResponse =
do_CreateInstance(NS_PAYMENT_CANMAKE_ACTION_RESPONSE_CONTRACT_ID);
MOZ_ASSERT(canMakeResponse);
rv = canMakeResponse->Init(aRequestId, false);
NS_ENSURE_SUCCESS(rv, rv);
response = do_QueryInterface(canMakeResponse);
MOZ_ASSERT(response);
break;
}
case nsIPaymentActionRequest::ABORT_ACTION: {
nsCOMPtr<nsIPaymentAbortActionResponse> abortResponse =
do_CreateInstance(NS_PAYMENT_ABORT_ACTION_RESPONSE_CONTRACT_ID);
MOZ_ASSERT(abortResponse);
rv = abortResponse->Init(aRequestId, nsIPaymentActionResponse::ABORT_SUCCEEDED);
NS_ENSURE_SUCCESS(rv, rv);
response = do_QueryInterface(abortResponse);
MOZ_ASSERT(response);
break;
}
default : {
break;
}
}
}
if (response) {
rv = RespondPayment(response);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
}
return NS_OK;
}
NS_IMETHODIMP
PaymentRequestService::RemoveActionCallback(nsIPaymentActionCallback* aCallback)
{
NS_ENSURE_ARG_POINTER(aCallback);
for (auto iter = mCallbackHashtable.Iter(); !iter.Done(); iter.Next()) {
nsCOMPtr<nsIPaymentActionCallback> callback = iter.Data();
MOZ_ASSERT(callback);
if (callback == aCallback) {
iter.Remove();
return NS_OK;
}
}
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
PaymentRequestService::RequestPayment(nsIPaymentActionRequest* aRequest) PaymentRequestService::RequestPayment(nsIPaymentActionRequest* aRequest)
{ {
NS_ENSURE_ARG_POINTER(aRequest); NS_ENSURE_ARG_POINTER(aRequest);
uint32_t type;
nsresult rv = aRequest->GetType(&type); nsAutoString requestId;
nsresult rv = aRequest->GetRequestId(requestId);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return rv; return rv;
} }
nsCOMPtr<nsIPaymentActionCallback> callback;
rv = aRequest->GetCallback(getter_AddRefs(callback));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = SetActionCallback(requestId, callback);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
uint32_t type;
rv = aRequest->GetType(&type);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
switch (type) { switch (type) {
case nsIPaymentActionRequest::CREATE_ACTION: { case nsIPaymentActionRequest::CREATE_ACTION: {
nsCOMPtr<nsIPaymentCreateActionRequest> request = nsCOMPtr<nsIPaymentCreateActionRequest> request =
@ -158,38 +266,52 @@ PaymentRequestService::RequestPayment(nsIPaymentActionRequest* aRequest)
return rv; return rv;
} }
nsString requestId;
rv = request->GetRequestId(requestId);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIArray> methodData; nsCOMPtr<nsIArray> methodData;
rv = request->GetMethodData(getter_AddRefs(methodData)); rv = request->GetMethodData(getter_AddRefs(methodData));
if (NS_WARN_IF(NS_FAILED(rv) || !methodData)) { if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsCOMPtr<nsIPaymentDetails> details; nsCOMPtr<nsIPaymentDetails> details;
rv = request->GetDetails(getter_AddRefs(details)); rv = request->GetDetails(getter_AddRefs(details));
if (NS_WARN_IF(NS_FAILED(rv) || !details)) { if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsCOMPtr<nsIPaymentOptions> options; nsCOMPtr<nsIPaymentOptions> options;
rv = request->GetOptions(getter_AddRefs(options)); rv = request->GetOptions(getter_AddRefs(options));
if (NS_WARN_IF(NS_FAILED(rv) || !options)) { if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsCOMPtr<nsIPaymentRequest> payment = nsCOMPtr<nsIPaymentRequest> payment =
new payments::PaymentRequest(tabId, requestId, methodData, details, options); new payments::PaymentRequest(tabId, requestId, methodData, details, options);
if (!mRequestQueue.AppendElement(payment, mozilla::fallible)) { if (!mRequestQueue.AppendElement(payment, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
break; break;
} }
/*
* TODO: 1. Check basic card support once the Basic Card Payment spec is
* implemented.
* https://www.w3.org/TR/payment-method-basic-card/
* 2. Check third party payment app support by traversing all
* registered third party payment apps.
*/
case nsIPaymentActionRequest::CANMAKE_ACTION:
/*
* TODO: Launch/inform payment UI here once the UI module is implemented.
*/
case nsIPaymentActionRequest::SHOW_ACTION:
case nsIPaymentActionRequest::ABORT_ACTION:
case nsIPaymentActionRequest::COMPLETE_ACTION: {
rv = CallTestingUIAction(requestId, type);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_FAILURE;
}
break;
}
default: { default: {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -197,5 +319,84 @@ PaymentRequestService::RequestPayment(nsIPaymentActionRequest* aRequest)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
PaymentRequestService::RespondPayment(nsIPaymentActionResponse* aResponse)
{
NS_ENSURE_ARG_POINTER(aResponse);
nsAutoString requestId;
nsresult rv = aResponse->GetRequestId(requestId);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIPaymentRequest> request;
rv = GetPaymentRequestById(requestId, getter_AddRefs(request));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIPaymentActionCallback> callback;
if (!mCallbackHashtable.Get(requestId, getter_AddRefs(callback))) {
return NS_ERROR_FAILURE;
}
if (NS_WARN_IF(!callback)) {
return NS_ERROR_FAILURE;
}
rv = callback->RespondPayment(aResponse);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
// Remove nsIPaymentRequest from mRequestQueue while receive succeeded abort
// response or complete response
uint32_t type;
rv = aResponse->GetType(&type);
NS_ENSURE_SUCCESS(rv, rv);
switch (type) {
case nsIPaymentActionResponse::ABORT_ACTION: {
nsCOMPtr<nsIPaymentAbortActionResponse> response =
do_QueryInterface(aResponse);
MOZ_ASSERT(response);
bool isSucceeded;
rv = response->IsSucceeded(&isSucceeded);
NS_ENSURE_SUCCESS(rv, rv);
if (isSucceeded) {
mRequestQueue.RemoveElement(request);
}
break;
}
case nsIPaymentActionResponse::COMPLETE_ACTION: {
mRequestQueue.RemoveElement(request);
break;
}
default: {
break;
}
}
return NS_OK;
}
nsresult
PaymentRequestService::SetActionCallback(const nsAString& aRequestId,
nsIPaymentActionCallback* aCallback)
{
NS_ENSURE_ARG_POINTER(aCallback);
nsCOMPtr<nsIPaymentActionCallback> callback;
if (mCallbackHashtable.Get(aRequestId, getter_AddRefs(callback))) {
mCallbackHashtable.Remove(aRequestId);
}
mCallbackHashtable.Put(aRequestId, aCallback);
return NS_OK;
}
nsresult
PaymentRequestService::RemoveActionCallback(const nsAString& aRequestId)
{
nsCOMPtr<nsIPaymentActionCallback> callback;
if (!mCallbackHashtable.Get(aRequestId, getter_AddRefs(callback))) {
return NS_ERROR_FAILURE;
}
mCallbackHashtable.Remove(aRequestId);
return NS_OK;
}
} // end of namespace dom } // end of namespace dom
} // end of namespace mozilla } // end of namespace mozilla

Просмотреть файл

@ -36,7 +36,21 @@ public:
private: private:
~PaymentRequestService() = default; ~PaymentRequestService() = default;
nsresult
SetActionCallback(const nsAString& aRequestId,
nsIPaymentActionCallback* aCallback);
nsresult
RemoveActionCallback(const nsAString& aRequestId);
// this method is only used for testing
nsresult
CallTestingUIAction(const nsAString& aRequestId, uint32_t aActionType);
FallibleTArray<nsCOMPtr<nsIPaymentRequest>> mRequestQueue; FallibleTArray<nsCOMPtr<nsIPaymentRequest>> mRequestQueue;
nsInterfaceHashtable<nsStringHashKey, nsIPaymentActionCallback> mCallbackHashtable;
nsCOMPtr<nsIPaymentUIService> mTestingUIService;
}; };
} // end of namespace dom } // end of namespace dom

Просмотреть файл

@ -38,53 +38,5 @@ ConvertStringstoISupportsStrings(const nsTArray<nsString>& aStrings,
return NS_OK; return NS_OK;
} }
nsresult
ConvertISupportsStringstoStrings(nsIArray* aIStrings,
nsTArray<nsString>& aStrings)
{
NS_ENSURE_ARG_POINTER(aIStrings);
uint32_t length;
aStrings.Clear();
nsresult rv = aIStrings->GetLength(&length);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
for (uint32_t index = 0; index < length; ++index) {
nsCOMPtr<nsISupportsString> iString = do_QueryElementAt(aIStrings, index);
if (NS_WARN_IF(!iString)) {
return NS_ERROR_FAILURE;
}
nsString string;
rv = iString->GetData(string);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
aStrings.AppendElement(string);
}
return NS_OK;
}
nsresult
CopyISupportsStrings(nsIArray* aSourceStrings, nsIArray** aTargetStrings)
{
NS_ENSURE_ARG_POINTER(aTargetStrings);
*aTargetStrings = nullptr;
nsCOMPtr<nsIMutableArray> strings = do_CreateInstance(NS_ARRAY_CONTRACTID);
uint32_t length;
nsresult rv = aSourceStrings->GetLength(&length);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
for (uint32_t index = 0; index < length; ++index) {
nsCOMPtr<nsISupportsString> string = do_QueryElementAt(aSourceStrings, index);
if (NS_WARN_IF(!string)) {
return NS_ERROR_FAILURE;
}
strings->AppendElement(string, false);
}
strings.forget(aTargetStrings);
return NS_OK;
}
} // end of namespace dom } // end of namespace dom
} // end of namespace mozilla } // end of namespace mozilla

Просмотреть файл

@ -17,13 +17,6 @@ nsresult
ConvertStringstoISupportsStrings(const nsTArray<nsString>& aStrings, ConvertStringstoISupportsStrings(const nsTArray<nsString>& aStrings,
nsIArray** aIStrings); nsIArray** aIStrings);
nsresult
ConvertISupportsStringstoStrings(nsIArray* aIStrings,
nsTArray<nsString>& aStrings);
nsresult
CopyISupportsStrings(nsIArray* aSourceStrings, nsIArray** aTargetStrings);
} // end of namespace dom } // end of namespace dom
} // end of namespace mozilla } // end of namespace mozilla

Просмотреть файл

@ -0,0 +1,155 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/. */
#include "mozilla/dom/PaymentResponse.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(PaymentResponse, mOwner,
mShippingAddress, mPromise)
NS_IMPL_CYCLE_COLLECTING_ADDREF(PaymentResponse)
NS_IMPL_CYCLE_COLLECTING_RELEASE(PaymentResponse)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PaymentResponse)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
PaymentResponse::PaymentResponse(nsPIDOMWindowInner* aWindow,
const nsAString& aInternalId,
const nsAString& aRequestId,
const nsAString& aMethodName,
const nsAString& aShippingOption,
RefPtr<PaymentAddress> aShippingAddress,
const nsAString& aDetails,
const nsAString& aPayerName,
const nsAString& aPayerEmail,
const nsAString& aPayerPhone)
: mOwner(aWindow)
, mCompleteCalled(false)
, mInternalId(aInternalId)
, mRequestId(aRequestId)
, mMethodName(aMethodName)
, mShippingOption(aShippingOption)
, mPayerName(aPayerName)
, mPayerEmail(aPayerEmail)
, mPayerPhone(aPayerPhone)
, mShippingAddress(aShippingAddress)
{
// TODO: from https://github.com/w3c/browser-payment-api/issues/480
// Add payerGivenName + payerFamilyName to PaymentAddress
// TODO : need to figure how to deserialize aDetails to JSObject
}
PaymentResponse::~PaymentResponse()
{
}
JSObject*
PaymentResponse::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return PaymentResponseBinding::Wrap(aCx, this, aGivenProto);
}
void
PaymentResponse::GetRequestId(nsString& aRetVal) const
{
aRetVal = mRequestId;
}
void
PaymentResponse::GetMethodName(nsString& aRetVal) const
{
aRetVal = mMethodName;
}
void
PaymentResponse::GetDetails(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const
{
// TODO : need to save aDetails as JSObject
}
void
PaymentResponse::GetShippingOption(nsString& aRetVal) const
{
aRetVal = mShippingOption;
}
void
PaymentResponse::GetPayerName(nsString& aRetVal) const
{
aRetVal = mPayerName;
}
void PaymentResponse::GetPayerEmail(nsString& aRetVal) const
{
aRetVal = mPayerEmail;
}
void PaymentResponse::GetPayerPhone(nsString& aRetVal) const
{
aRetVal = mPayerPhone;
}
// TODO:
// 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<PaymentAddress>
PaymentResponse::GetShippingAddress() const
{
RefPtr<PaymentAddress> address = mShippingAddress;
return address.forget();
}
already_AddRefed<Promise>
PaymentResponse::Complete(PaymentComplete result, ErrorResult& aRv)
{
if (mCompleteCalled) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(mOwner);
ErrorResult errResult;
RefPtr<Promise> promise = Promise::Create(global, errResult);
if (errResult.Failed()) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
mCompleteCalled = true;
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
if (NS_WARN_IF(!manager)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsresult rv = manager->CompletePayment(mInternalId, result);
if (NS_WARN_IF(NS_FAILED(rv))) {
promise->MaybeReject(NS_ERROR_FAILURE);
return promise.forget();
}
mPromise = promise;
return promise.forget();
}
void
PaymentResponse::RespondComplete()
{
MOZ_ASSERT(mPromise);
mPromise->MaybeResolve(JS::UndefinedHandleValue);
mPromise = nullptr;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,89 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/dom/PaymentResponseBinding.h" // PaymentComplete
#include "nsPIDOMWindow.h"
#include "nsWrapperCache.h"
namespace mozilla {
namespace dom {
class PaymentAddress;
class Promise;
class PaymentResponse final : public nsISupports,
public nsWrapperCache
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PaymentResponse)
PaymentResponse(nsPIDOMWindowInner* aWindow,
const nsAString& aInternalId,
const nsAString& aRequestId,
const nsAString& aMethodName,
const nsAString& aShippingOption,
RefPtr<PaymentAddress> aShippingAddress,
const nsAString& aDetails,
const nsAString& aPayerName,
const nsAString& aPayerEmail,
const nsAString& aPayerPhone);
nsPIDOMWindowInner* GetParentObject() const
{
return mOwner;
}
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();
protected:
~PaymentResponse();
private:
nsCOMPtr<nsPIDOMWindowInner> mOwner;
bool mCompleteCalled;
nsString mInternalId;
nsString mRequestId;
nsString mMethodName;
nsString mShippingOption;
nsString mPayerName;
nsString mPayerEmail;
nsString mPayerPhone;
RefPtr<PaymentAddress> mShippingAddress;
// Promise for "PaymentResponse::Complete"
RefPtr<Promise> mPromise;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_PaymentResponse_h

Просмотреть файл

@ -75,9 +75,71 @@ struct IPCPaymentCreateActionRequest
IPCPaymentOptions options; IPCPaymentOptions options;
}; };
struct IPCPaymentCanMakeActionRequest
{
nsString requestId;
};
struct IPCPaymentShowActionRequest
{
nsString requestId;
};
struct IPCPaymentAbortActionRequest
{
nsString requestId;
};
struct IPCPaymentCompleteActionRequest
{
nsString requestId;
nsString completeStatus;
};
union IPCPaymentActionRequest union IPCPaymentActionRequest
{ {
IPCPaymentCreateActionRequest; IPCPaymentCreateActionRequest;
IPCPaymentCanMakeActionRequest;
IPCPaymentShowActionRequest;
IPCPaymentAbortActionRequest;
IPCPaymentCompleteActionRequest;
};
struct IPCPaymentCanMakeActionResponse
{
nsString requestId;
bool result;
};
struct IPCPaymentShowActionResponse
{
nsString requestId;
bool isAccepted;
nsString methodName;
nsString data;
nsString payerName;
nsString payerEmail;
nsString payerPhone;
};
struct IPCPaymentAbortActionResponse
{
nsString requestId;
bool isSucceeded;
};
struct IPCPaymentCompleteActionResponse
{
nsString requestId;
bool isCompleted;
};
union IPCPaymentActionResponse
{
IPCPaymentCanMakeActionResponse;
IPCPaymentShowActionResponse;
IPCPaymentAbortActionResponse;
IPCPaymentCompleteActionResponse;
}; };
sync protocol PPaymentRequest sync protocol PPaymentRequest
@ -88,6 +150,9 @@ parent:
async __delete__(); async __delete__();
async RequestPayment(IPCPaymentActionRequest aAction); async RequestPayment(IPCPaymentActionRequest aAction);
child:
async RespondPayment(IPCPaymentActionResponse aResponse);
}; };
} // end of namespace dom } // end of namespace dom

Просмотреть файл

@ -21,17 +21,38 @@ PaymentRequestChild::RequestPayment(const IPCPaymentActionRequest& aAction)
if (!mActorAlive) { if (!mActorAlive) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
SendRequestPayment(aAction); if (!SendRequestPayment(aAction)) {
return NS_ERROR_FAILURE;
}
return NS_OK; return NS_OK;
} }
mozilla::ipc::IPCResult
PaymentRequestChild::RecvRespondPayment(const IPCPaymentActionResponse& aResponse)
{
if (!mActorAlive) {
return IPC_FAIL_NO_REASON(this);
}
const IPCPaymentActionResponse& response = aResponse;
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
MOZ_ASSERT(manager);
nsresult rv = manager->RespondPayment(response);
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this);
}
return IPC_OK();
}
void void
PaymentRequestChild::ActorDestroy(ActorDestroyReason aWhy) PaymentRequestChild::ActorDestroy(ActorDestroyReason aWhy)
{ {
mActorAlive = false; mActorAlive = false;
RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton(); RefPtr<PaymentRequestManager> manager = PaymentRequestManager::GetSingleton();
MOZ_ASSERT(manager); MOZ_ASSERT(manager);
manager->ReleasePaymentChild(this); nsresult rv = manager->ReleasePaymentChild(this);
if (NS_WARN_IF(NS_FAILED(rv))) {
MOZ_ASSERT(false);
}
} }
void void

Просмотреть файл

@ -18,6 +18,9 @@ class PaymentRequestChild final : public PPaymentRequestChild
public: public:
PaymentRequestChild(); PaymentRequestChild();
virtual mozilla::ipc::IPCResult
RecvRespondPayment(const IPCPaymentActionResponse& aResponse) override;
void ActorDestroy(ActorDestroyReason aWhy) override; void ActorDestroy(ActorDestroyReason aWhy) override;
void MaybeDelete(); void MaybeDelete();

Просмотреть файл

@ -8,7 +8,6 @@
#include "nsArrayUtils.h" #include "nsArrayUtils.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
#include "nsIMutableArray.h" #include "nsIMutableArray.h"
#include "nsIPaymentActionRequest.h"
#include "nsIPaymentRequestService.h" #include "nsIPaymentRequestService.h"
#include "nsISupportsPrimitives.h" #include "nsISupportsPrimitives.h"
#include "nsServiceManagerUtils.h" #include "nsServiceManagerUtils.h"
@ -18,6 +17,8 @@
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
NS_IMPL_ISUPPORTS(PaymentRequestParent, nsIPaymentActionCallback)
PaymentRequestParent::PaymentRequestParent(uint64_t aTabId) PaymentRequestParent::PaymentRequestParent(uint64_t aTabId)
: mActorAlived(true) : mActorAlived(true)
, mTabId(aTabId) , mTabId(aTabId)
@ -27,12 +28,16 @@ PaymentRequestParent::PaymentRequestParent(uint64_t aTabId)
mozilla::ipc::IPCResult mozilla::ipc::IPCResult
PaymentRequestParent::RecvRequestPayment(const IPCPaymentActionRequest& aRequest) PaymentRequestParent::RecvRequestPayment(const IPCPaymentActionRequest& aRequest)
{ {
MOZ_ASSERT(mActorAlived); if (!mActorAlived) {
nsCOMPtr<nsIPaymentActionRequest> actionRequest; return IPC_FAIL_NO_REASON(this);
}
nsCOMPtr<nsIPaymentActionRequest> action;
nsCOMPtr<nsIPaymentActionCallback> callback = do_QueryInterface(this);
MOZ_ASSERT(callback);
nsresult rv; nsresult rv;
switch (aRequest.type()) { switch (aRequest.type()) {
case IPCPaymentActionRequest::TIPCPaymentCreateActionRequest: { case IPCPaymentActionRequest::TIPCPaymentCreateActionRequest: {
IPCPaymentCreateActionRequest request = aRequest; const IPCPaymentCreateActionRequest& request = aRequest;
nsCOMPtr<nsIMutableArray> methodData = do_CreateInstance(NS_ARRAY_CONTRACTID); nsCOMPtr<nsIMutableArray> methodData = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(methodData); MOZ_ASSERT(methodData);
@ -60,22 +65,67 @@ PaymentRequestParent::RecvRequestPayment(const IPCPaymentActionRequest& aRequest
return IPC_FAIL_NO_REASON(this); return IPC_FAIL_NO_REASON(this);
} }
nsCOMPtr<nsIPaymentCreateActionRequest> createRequest = nsCOMPtr<nsIPaymentCreateActionRequest> createAction =
do_CreateInstance(NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID); do_CreateInstance(NS_PAYMENT_CREATE_ACTION_REQUEST_CONTRACT_ID);
if (NS_WARN_IF(!createRequest)) { if (NS_WARN_IF(!createAction)) {
return IPC_FAIL_NO_REASON(this); return IPC_FAIL_NO_REASON(this);
} }
rv = createRequest->InitRequest(request.requestId(), rv = createAction->InitRequest(request.requestId(),
mTabId, callback,
methodData, mTabId,
details, methodData,
options); details,
options);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this); return IPC_FAIL_NO_REASON(this);
} }
actionRequest = do_QueryInterface(createRequest); action = do_QueryInterface(createAction);
MOZ_ASSERT(actionRequest); MOZ_ASSERT(action);
break;
}
case IPCPaymentActionRequest::TIPCPaymentCanMakeActionRequest: {
const IPCPaymentCanMakeActionRequest& request = aRequest;
rv = CreateActionRequest(request.requestId(),
nsIPaymentActionRequest::CANMAKE_ACTION,
getter_AddRefs(action));
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this);
}
break;
}
case IPCPaymentActionRequest::TIPCPaymentShowActionRequest: {
const IPCPaymentShowActionRequest& request = aRequest;
rv = CreateActionRequest(request.requestId(),
nsIPaymentActionRequest::SHOW_ACTION,
getter_AddRefs(action));
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this);
}
break;
}
case IPCPaymentActionRequest::TIPCPaymentAbortActionRequest: {
const IPCPaymentAbortActionRequest& request = aRequest;
rv = CreateActionRequest(request.requestId(),
nsIPaymentActionRequest::ABORT_ACTION,
getter_AddRefs(action));
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this);
}
break;
}
case IPCPaymentActionRequest::TIPCPaymentCompleteActionRequest: {
const IPCPaymentCompleteActionRequest& request = aRequest;
nsCOMPtr<nsIPaymentCompleteActionRequest> completeAction =
do_CreateInstance(NS_PAYMENT_COMPLETE_ACTION_REQUEST_CONTRACT_ID);
rv = completeAction->InitRequest(request.requestId(),
callback,
request.completeStatus());
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this);
}
action = do_QueryInterface(completeAction);
MOZ_ASSERT(action);
break; break;
} }
default: { default: {
@ -85,13 +135,110 @@ PaymentRequestParent::RecvRequestPayment(const IPCPaymentActionRequest& aRequest
nsCOMPtr<nsIPaymentRequestService> service = nsCOMPtr<nsIPaymentRequestService> service =
do_GetService(NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID); do_GetService(NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID);
MOZ_ASSERT(service); MOZ_ASSERT(service);
rv = service->RequestPayment(actionRequest); rv = service->RequestPayment(action);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_FAIL_NO_REASON(this); return IPC_FAIL_NO_REASON(this);
} }
return IPC_OK(); return IPC_OK();
} }
NS_IMETHODIMP
PaymentRequestParent::RespondPayment(nsIPaymentActionResponse* aResponse)
{
if (!NS_IsMainThread()) {
nsCOMPtr<nsIPaymentActionCallback> self = do_QueryInterface(this);
MOZ_ASSERT(self);
nsCOMPtr<nsIPaymentActionResponse> response = aResponse;
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self, response] ()
{
self->RespondPayment(response);
});
return NS_DispatchToMainThread(r);
}
if (!mActorAlived) {
return NS_ERROR_FAILURE;
}
uint32_t type;
nsresult rv = aResponse->GetType(&type);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString requestId;
rv = aResponse->GetRequestId(requestId);
NS_ENSURE_SUCCESS(rv, rv);
switch (type) {
case nsIPaymentActionResponse::CANMAKE_ACTION: {
nsCOMPtr<nsIPaymentCanMakeActionResponse> response = do_QueryInterface(aResponse);
MOZ_ASSERT(response);
bool result;
rv = response->GetResult(&result);
NS_ENSURE_SUCCESS(rv, rv);
IPCPaymentCanMakeActionResponse actionResponse(requestId, result);
if (!SendRespondPayment(actionResponse)) {
return NS_ERROR_FAILURE;
}
break;
}
case nsIPaymentActionResponse::SHOW_ACTION: {
nsCOMPtr<nsIPaymentShowActionResponse> response =
do_QueryInterface(aResponse);
MOZ_ASSERT(response);
bool isAccepted;
NS_ENSURE_SUCCESS(response->IsAccepted(&isAccepted), NS_ERROR_FAILURE);
nsAutoString methodName;
NS_ENSURE_SUCCESS(response->GetMethodName(methodName), NS_ERROR_FAILURE);
nsAutoString data;
NS_ENSURE_SUCCESS(response->GetData(data), NS_ERROR_FAILURE);
nsAutoString payerName;
NS_ENSURE_SUCCESS(response->GetPayerName(payerName), NS_ERROR_FAILURE);
nsAutoString payerEmail;
NS_ENSURE_SUCCESS(response->GetPayerEmail(payerEmail), NS_ERROR_FAILURE);
nsAutoString payerPhone;
NS_ENSURE_SUCCESS(response->GetPayerPhone(payerPhone), NS_ERROR_FAILURE);
IPCPaymentShowActionResponse actionResponse(requestId,
isAccepted,
methodName,
data,
payerName,
payerEmail,
payerPhone);
if (!SendRespondPayment(actionResponse)) {
return NS_ERROR_FAILURE;
}
break;
}
case nsIPaymentActionResponse::ABORT_ACTION: {
nsCOMPtr<nsIPaymentAbortActionResponse> response =
do_QueryInterface(aResponse);
MOZ_ASSERT(response);
bool isSucceeded;
rv = response->IsSucceeded(&isSucceeded);
NS_ENSURE_SUCCESS(rv, rv);
IPCPaymentAbortActionResponse actionResponse(requestId, isSucceeded);
if (!SendRespondPayment(actionResponse)) {
return NS_ERROR_FAILURE;
}
break;
}
case nsIPaymentActionResponse::COMPLETE_ACTION: {
nsCOMPtr<nsIPaymentCompleteActionResponse> response =
do_QueryInterface(aResponse);
MOZ_ASSERT(response);
bool isCompleted;
rv = response->IsCompleted(&isCompleted);
NS_ENSURE_SUCCESS(rv, rv);
IPCPaymentCompleteActionResponse actionResponse(requestId, isCompleted);
if (!SendRespondPayment(actionResponse)) {
return NS_ERROR_FAILURE;
}
break;
}
default: {
return NS_ERROR_FAILURE;
}
}
return NS_OK;
}
mozilla::ipc::IPCResult mozilla::ipc::IPCResult
PaymentRequestParent::Recv__delete__() PaymentRequestParent::Recv__delete__()
{ {
@ -103,6 +250,34 @@ void
PaymentRequestParent::ActorDestroy(ActorDestroyReason aWhy) PaymentRequestParent::ActorDestroy(ActorDestroyReason aWhy)
{ {
mActorAlived = false; mActorAlived = false;
nsCOMPtr<nsIPaymentRequestService> service =
do_GetService(NS_PAYMENT_REQUEST_SERVICE_CONTRACT_ID);
MOZ_ASSERT(service);
nsCOMPtr<nsIPaymentActionCallback> callback = do_QueryInterface(this);
MOZ_ASSERT(callback);
nsresult rv = service->RemoveActionCallback(callback);
if (NS_WARN_IF(NS_FAILED(rv))) {
MOZ_ASSERT(false);
}
}
nsresult
PaymentRequestParent::CreateActionRequest(const nsAString& aRequestId,
uint32_t aActionType,
nsIPaymentActionRequest** aAction)
{
NS_ENSURE_ARG_POINTER(aAction);
nsCOMPtr<nsIPaymentActionRequest> action =
do_CreateInstance(NS_PAYMENT_ACTION_REQUEST_CONTRACT_ID);
MOZ_ASSERT(action);
nsCOMPtr<nsIPaymentActionCallback> callback = do_QueryInterface(this);
MOZ_ASSERT(callback);
nsresult rv = action->Init(aRequestId, aActionType, callback);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
action.forget(aAction);
return NS_OK;
} }
} // end of namespace dom } // end of namespace dom

Просмотреть файл

@ -8,15 +8,16 @@
#define mozilla_dom_PaymentRequestParent_h #define mozilla_dom_PaymentRequestParent_h
#include "mozilla/dom/PPaymentRequestParent.h" #include "mozilla/dom/PPaymentRequestParent.h"
#include "nsISupports.h" #include "nsIPaymentActionRequest.h"
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
class PaymentRequestParent final : public PPaymentRequestParent class PaymentRequestParent final : public nsIPaymentActionCallback
, public PPaymentRequestParent
{ {
public: NS_DECL_THREADSAFE_ISUPPORTS
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PaymentRequestParent) NS_DECL_NSIPAYMENTACTIONCALLBACK
explicit PaymentRequestParent(uint64_t aTabId); explicit PaymentRequestParent(uint64_t aTabId);
@ -30,6 +31,10 @@ protected:
private: private:
~PaymentRequestParent() = default; ~PaymentRequestParent() = default;
nsresult CreateActionRequest(const nsAString& aRequestId,
uint32_t aActionType,
nsIPaymentActionRequest** aAction);
bool mActorAlived; bool mActorAlived;
uint64_t mTabId; uint64_t mTabId;
}; };

Просмотреть файл

@ -14,18 +14,23 @@ EXPORTS += [
] ]
EXPORTS.mozilla.dom += [ EXPORTS.mozilla.dom += [
'PaymentAddress.h',
'PaymentRequest.h', 'PaymentRequest.h',
'PaymentRequestManager.h', 'PaymentRequestManager.h',
'PaymentResponse.h',
] ]
UNIFIED_SOURCES += [ UNIFIED_SOURCES += [
'PaymentActionRequest.cpp', 'PaymentActionRequest.cpp',
'PaymentActionResponse.cpp',
'PaymentAddress.cpp',
'PaymentRequest.cpp', 'PaymentRequest.cpp',
'PaymentRequestData.cpp', 'PaymentRequestData.cpp',
'PaymentRequestManager.cpp', 'PaymentRequestManager.cpp',
'PaymentRequestModule.cpp', 'PaymentRequestModule.cpp',
'PaymentRequestService.cpp', 'PaymentRequestService.cpp',
'PaymentRequestUtils.cpp', 'PaymentRequestUtils.cpp',
'PaymentResponse.cpp',
] ]
include('/ipc/chromium/chromium-config.mozbuild') include('/ipc/chromium/chromium-config.mozbuild')

Просмотреть файл

@ -0,0 +1,31 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/.
*
* The origin of this WebIDL file is
* https://www.w3.org/TR/payment-request/#paymentaddress-interface
*/
[SecureContext,
Func="mozilla::dom::PaymentRequest::PrefEnabled"]
interface PaymentAddress {
// TODO: Use serializer once available. (Bug 863402)
// serializer = {attribute};
jsonifier;
readonly attribute DOMString country;
// TODO: Use FrozenArray once available. (Bug 1236777)
// readonly attribute FrozenArray<DOMString> addressLine;
[Frozen, Cached, Pure]
readonly attribute sequence<DOMString> addressLine;
readonly attribute DOMString region;
readonly attribute DOMString city;
readonly attribute DOMString dependentLocality;
readonly attribute DOMString postalCode;
readonly attribute DOMString sortingCode;
readonly attribute DOMString languageCode;
readonly attribute DOMString organization;
readonly attribute DOMString recipient;
readonly attribute DOMString phone;
};

Просмотреть файл

@ -68,19 +68,15 @@ dictionary PaymentOptions {
SecureContext, SecureContext,
Func="mozilla::dom::PaymentRequest::PrefEnabled"] Func="mozilla::dom::PaymentRequest::PrefEnabled"]
interface PaymentRequest : EventTarget { interface PaymentRequest : EventTarget {
/* TODO : Add show() support in Bug 1345366
[NewObject] [NewObject]
Promise<PaymentResponse> show(); Promise<PaymentResponse> show();
*/
[NewObject] [NewObject]
Promise<void> abort(); Promise<void> abort();
[NewObject] [NewObject]
Promise<boolean> canMakePayment(); Promise<boolean> canMakePayment();
readonly attribute DOMString id; readonly attribute DOMString id;
/* TODO : Add PaymentAddress support in Bug 1345369
readonly attribute PaymentAddress? shippingAddress; readonly attribute PaymentAddress? shippingAddress;
*/
readonly attribute DOMString? shippingOption; readonly attribute DOMString? shippingOption;
readonly attribute PaymentShippingType? shippingType; readonly attribute PaymentShippingType? shippingType;

Просмотреть файл

@ -0,0 +1,34 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/.
*
* The origin of this WebIDL file is
* https://www.w3.org/TR/payment-request/#paymentresponse-interface
*/
enum PaymentComplete {
"success",
"fail",
"unknown"
};
[SecureContext,
Func="mozilla::dom::PaymentRequest::PrefEnabled"]
interface PaymentResponse {
// TODO: Use serializer once available. (Bug 863402)
// serializer = {attribute};
jsonifier;
readonly attribute DOMString requestId;
readonly attribute DOMString methodName;
readonly attribute object details;
readonly attribute PaymentAddress? shippingAddress;
readonly attribute DOMString? shippingOption;
readonly attribute DOMString? payerName;
readonly attribute DOMString? payerEmail;
readonly attribute DOMString? payerPhone;
[NewObject]
Promise<void> complete(optional PaymentComplete result = "unknown");
};

Просмотреть файл

@ -724,7 +724,9 @@ WEBIDL_FILES = [
'PaintWorkletGlobalScope.webidl', 'PaintWorkletGlobalScope.webidl',
'PannerNode.webidl', 'PannerNode.webidl',
'ParentNode.webidl', 'ParentNode.webidl',
'PaymentAddress.webidl',
'PaymentRequest.webidl', 'PaymentRequest.webidl',
'PaymentResponse.webidl',
'Performance.webidl', 'Performance.webidl',
'PerformanceEntry.webidl', 'PerformanceEntry.webidl',
'PerformanceMark.webidl', 'PerformanceMark.webidl',