Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions web-based-payment-handler/app-reject-errors.js
Original file line number Diff line number Diff line change
@@ -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);
});
}));
});
18 changes: 18 additions & 0 deletions web-based-payment-handler/payment-app/reject-errors.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!doctype html>
<meta charset="utf-8">
<title>Reject Error Payment App</title>
<p>Please click one of the buttons below to complete or reject the payment.</p>
<button id="success">Authorize (Success)</button>
<button id="reject-operation-error">Reject with OperationError</button>
<button id="reject-syntax-error">Reject with SyntaxError</button>

<script>
for (const id of ['success', 'reject-operation-error', 'reject-syntax-error']) {
document.getElementById(id).onclick = () => {
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage(id);
}
window.close();
};
}
</script>
Original file line number Diff line number Diff line change
@@ -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": "./"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Link: </web-based-payment-handler/payment-request-reject-errors-manifest.json>; rel="payment-method-manifest"
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<!doctype html>
<meta charset="utf-8">
<title>Manual Tests for rejecting respondWith with errors</title>
<link rel="help" href="https://w3c.github.io/web-based-payment-handler/#the-paymentrequestevent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<p>This test verifies that if a payment app rejects the promise passed to <code>respondWith</code> with an <code>OperationError</code>, the original <code>PaymentRequest.show()</code> call also rejects with an <code>OperationError</code>. For other error types, it should still reject with an <code>AbortError</code>.</p>
<p>Please follow these instructions:</p>
<ol>
<li>For the first test (<b>OperationError</b>), click "Reject with OperationError".</li>
<li>For the second test (<b>SyntaxError</b>), click "Reject with SyntaxError".</li>
</ol>

<script>
const methodName = window.location.origin + '/web-based-payment-handler/'
+ 'payment-request-reject-errors-manifest.json';

promise_test(async t => {
await test_driver.bless('invoking a payment app for OperationError');
const request = new PaymentRequest([{supportedMethods: methodName}], {
total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
});
// show() should reject with the SAME error if it's OperationError.
await promise_rejects_dom(t, 'OperationError', request.show());
}, 'If a payment app rejects with OperationError, show() rejects with OperationError');

promise_test(async t => {
await test_driver.bless('invoking a payment app for SyntaxError');
const request = new PaymentRequest([{supportedMethods: methodName}], {
total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
});
// show() should reject with AbortError for other error types.
await promise_rejects_dom(t, 'AbortError', request.show());
}, 'If a payment app rejects with SyntaxError, show() rejects with AbortError');
</script>
Loading