diff --git a/web-based-payment-handler/app-reject-errors.js b/web-based-payment-handler/app-reject-errors.js new file mode 100644 index 00000000000000..3d2b30e96d2877 --- /dev/null +++ b/web-based-payment-handler/app-reject-errors.js @@ -0,0 +1,48 @@ +/** + * A payment handler that opens a window and allows the user to trigger + * different types of promise rejections for testing error propagation. + */ + +let resolver = null; +let rejecter = null; +let activeMethodName = null; + +self.addEventListener('canmakepayment', event => { + event.respondWith(true); +}); + +self.addEventListener('message', msgEvent => { + if (!resolver || !rejecter) return; + + if (msgEvent.data === 'success') { + resolver({ + methodName: activeMethodName, + details: {status: 'success'}, + }); + } else if (msgEvent.data === 'reject-operation-error') { + rejecter(new DOMException('Reject with OperationError', 'OperationError')); + } else if (msgEvent.data === 'reject-syntax-error') { + rejecter(new DOMException('Reject with SyntaxError', 'SyntaxError')); + } else { + return; // Message not for us. + } + + resolver = null; + rejecter = null; + activeMethodName = null; +}); + +self.addEventListener('paymentrequest', event => { + activeMethodName = event.methodData[0].supportedMethods; + event.respondWith(new Promise((resolve, reject) => { + resolver = resolve; + rejecter = reject; + + event.openWindow('payment-app/reject-errors.html').catch(err => { + resolver = null; + rejecter = null; + activeMethodName = null; + reject(err); + }); + })); +}); diff --git a/web-based-payment-handler/payment-app/reject-errors.html b/web-based-payment-handler/payment-app/reject-errors.html new file mode 100644 index 00000000000000..4f7361ee52f3fe --- /dev/null +++ b/web-based-payment-handler/payment-app/reject-errors.html @@ -0,0 +1,18 @@ + + +Reject Error Payment App +

Please click one of the buttons below to complete or reject the payment.

+ + + + + diff --git a/web-based-payment-handler/payment-request-reject-errors-manifest.json b/web-based-payment-handler/payment-request-reject-errors-manifest.json new file mode 100644 index 00000000000000..ea6c372f3988c3 --- /dev/null +++ b/web-based-payment-handler/payment-request-reject-errors-manifest.json @@ -0,0 +1,15 @@ +{ + "default_applications": ["payment-request-reject-errors-manifest.json"], + "name": "Reject Errors Payment Handler", + "icons": [ + { + "src": "/images/rgrg-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "serviceworker": { + "src": "app-reject-errors.js", + "scope": "./" + } +} diff --git a/web-based-payment-handler/payment-request-reject-errors-manifest.json.headers b/web-based-payment-handler/payment-request-reject-errors-manifest.json.headers new file mode 100644 index 00000000000000..88ddbb0a5e8c57 --- /dev/null +++ b/web-based-payment-handler/payment-request-reject-errors-manifest.json.headers @@ -0,0 +1 @@ +Link: ; rel="payment-method-manifest" diff --git a/web-based-payment-handler/payment-request-reject-operation-error-manual.https.html b/web-based-payment-handler/payment-request-reject-operation-error-manual.https.html new file mode 100644 index 00000000000000..7a9575c8b04e08 --- /dev/null +++ b/web-based-payment-handler/payment-request-reject-operation-error-manual.https.html @@ -0,0 +1,37 @@ + + +Manual Tests for rejecting respondWith with errors + + + + + +

This test verifies that if a payment app rejects the promise passed to respondWith with an OperationError, the original PaymentRequest.show() call also rejects with an OperationError. For other error types, it should still reject with an AbortError.

+

Please follow these instructions:

+
    +
  1. For the first test (OperationError), click "Reject with OperationError".
  2. +
  3. For the second test (SyntaxError), click "Reject with SyntaxError".
  4. +
+ +