self.addEventListener('canmakepayment', event => { if (event.methodData.length !== 1) { const msg = 'Expected exactly one method data.'; event.respondWith(Promise.reject(new Error(msg))); return; } const [method] = event.methodData; if (!method || method.supportedMethods.length !== 1) { const msg = 'Expected exactly one supported method name'; event.respondWith(Promise.reject(new Error(msg))); return; } if (method.data.defaultParameter !== 'defaultValue') { const msg = `Unexpected value for "defaultParameter": ${ method.data.defaultParameter }`; event.respondWith(Promise.reject(new Error(msg))); return; } if ('defaultUnsupportedParameter' in method.data) { const msg = 'Unexpected "defaultUnsupportedParameter"'; event.respondWith(Promise.reject(new Error(msg))); return; } if (event.modifiers.length !== 1) { const msg = 'Expected exactly one modifier'; event.respondWith(Promise.reject(new Error(msg))); return; } const [modifier] = event.modifiers; if (!modifier || modifier.supportedMethods.length !== 1) { const msg = 'Expected exactly one supported method name in modifier'; event.respondWith(Promise.reject(new Error(msg))); return; } for (const member of [ 'additionalDisplayItems', 'modifiedUnsupportedParameter', 'total', ]) { if (member in modifier) { const msg = `Unexpected member "${member}" in modifier`; event.respondWith(Promise.reject(new Error(msg))); return; } } const [methodName] = method.supportedMethods; if (methodName === 'basic-card') { const msg = '"basic-card" payment method must never be checked in CanMakePaymentEvent'; event.respondWith(Promise.reject(new Error(msg))); return; } const [modifierMethodName] = modifier.supportedMethods; if (modifierMethodName !== methodName) { const msg = `Unexpected modifier method name: "${modifierMethodName}". Expected "${methodName}".`; event.respondWith(Promise.reject(new Error(msg))); return; } if (modifier.data.modifiedParameter !== 'modifiedValue') { const msg = `Unexpected value for 'modifiedParameter': ${ modifier.data.modifiedParameter }`; event.respondWith(Promise.reject(new Error(msg))); return; } const methodAsURL = new URL(methodName); if (event.topOrigin !== methodAsURL.origin) { const msg = `Unexpected event.topOrigin: "${ event.topOrigin }". Expected "${methodAsURL.origin}".`; event.respondWith(Promise.reject(new Error(msg))); return; } if (event.paymentRequestOrigin !== methodAsURL.origin) { const msg = `Unexpected iframe origin ${event.paymentRequestOrigin}`; event.respondWith(Promise.reject(new Error(msg))); return; } switch (methodAsURL.pathname.substr(1)) { case 'canMakePayment-true': event.respondWith(true); break; case 'canMakePayment-false': event.respondWith(false); break; case 'canMakePayment-promise-true': event.respondWith(Promise.resolve(true)); break; case 'canMakePayment-promise-false': event.respondWith(Promise.resolve(false)); break; case 'canMakePayment-custom-error': event.respondWith(Promise.reject(new Error('Custom error'))); break; default: const msg = `Unrecognized payment method name "${methodName}".`; event.respondWith(Promise.reject(new Error(msg))); break; } });