summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/payment-handler/payment-instruments.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/payment-handler/payment-instruments.https.html')
-rw-r--r--testing/web-platform/tests/payment-handler/payment-instruments.https.html379
1 files changed, 379 insertions, 0 deletions
diff --git a/testing/web-platform/tests/payment-handler/payment-instruments.https.html b/testing/web-platform/tests/payment-handler/payment-instruments.https.html
new file mode 100644
index 0000000000..121c131568
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/payment-instruments.https.html
@@ -0,0 +1,379 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Tests for PaymentInstruments interface</title>
+<link rel="help" href="https://w3c.github.io/payment-handler/#paymentinstruments-interface">
+<link rel="manifest" href="manifest.json">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="register-and-activate-service-worker.js"></script>
+<script>
+function runTests(registration) {
+ const methodName = window.location.origin + '/payment-handler/payment-app/';
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set('instrument-key-1', {
+ name: 'Instrument Name 1',
+ });
+ await registration.paymentManager.instruments.set('instrument-key-2', {
+ name: 'Instrument Name 2',
+ });
+ await registration.paymentManager.instruments.delete('instrument-key-1');
+ await registration.paymentManager.instruments.set('instrument-key-1', {
+ name: 'Instrument Name 1',
+ });
+ const keys = await registration.paymentManager.instruments.keys();
+ assert_array_equals(keys, ['instrument-key-2', 'instrument-key-1']);
+ }, 'Instrument keys are returned in the original insertion order');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name',
+ },
+ );
+ const result = await registration.paymentManager.instruments.delete(
+ 'existing-instrument-key',
+ );
+ assert_true(result);
+ }, 'Deleting an existing instrument returns true');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name',
+ },
+ );
+ await registration.paymentManager.instruments.delete(
+ 'existing-instrument-key',
+ );
+ const result = await registration.paymentManager.instruments.delete(
+ 'existing-instrument-key',
+ );
+ assert_false(result);
+ }, 'Deleting an existing instrument the second time returns false');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const result = await registration.paymentManager.instruments.delete(
+ 'non-existing-instrument-key',
+ );
+ assert_false(result);
+ }, 'Deleting a non-existing instrument returns false');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ const result = await registration.paymentManager.instruments.get(
+ 'existing-instrument-key',
+ );
+ assert_equals(result.name, 'Instrument Name');
+ }, 'Getting an existing instrument returns the instrument');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const result = await registration.paymentManager.instruments.get(
+ 'non-existing-instrument-key',
+ );
+ assert_equals(result, undefined);
+ }, 'Getting a non-existing instrument returns undefined');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name v1',
+ icons: [
+ {src: '/images/green-16x16.png', sizes: '16x16', type: 'image/png'},
+ ],
+ method: methodName,
+ },
+ );
+ let result = await registration.paymentManager.instruments.get(
+ 'existing-instrument-key',
+ );
+ assert_equals(result.name, 'Instrument Name v1');
+ assert_equals(result.icons.length, 1);
+ assert_equals(
+ result.icons[0].src,
+ new URL('/images/green-16x16.png', window.location.href).href,
+ );
+ assert_equals(result.icons[0].sizes, '16x16');
+ assert_equals(result.icons[0].type, 'image/png');
+ assert_equals(result.method, methodName);
+ assert_array_equals(result.capabilities.supportedNetworks, ['mir']);
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name v2',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ result = await registration.paymentManager.instruments.get(
+ 'existing-instrument-key',
+ );
+ assert_equals(result.name, 'Instrument Name v2');
+ assert_equals(result.icons.length, 1);
+ assert_equals(
+ result.icons[0].src,
+ new URL('/images/rgrg-256x256.png', window.location.href).href,
+ );
+ assert_equals(result.icons[0].sizes, '256x256');
+ assert_equals(result.icons[0].type, 'image/png');
+ assert_equals(result.method, methodName);
+ }, 'Resetting an existing instrument updates the instrument');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(
+ 'existing-instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ await registration.paymentManager.instruments.clear();
+ const result = await registration.paymentManager.instruments.get(
+ 'existing-instrument-key',
+ );
+ assert_equals(result, undefined);
+ }, 'Clearing the instruments');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/jif',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, 'Cannot register instruments with invalid icon media type image/jif');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/pn' + 'g'.repeat(100000),
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, "Don't crash when registering instruments with very long icon media type image/pngggggg...");
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ return registration.paymentManager.instruments.set('instrument-key', {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '8'.repeat(100000) + 'x' + '8'.repeat(100000),
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ });
+ }, "Don't crash when registering an instrument with a very long icon size 888...x888...");
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ return registration.paymentManager.instruments.set('instrument-key', {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ });
+ }, "Don't crash when 'sizes' missing from icon definition");
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ return registration.paymentManager.instruments.set('instrument-key', {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256x256',
+ },
+ ],
+ method: methodName,
+ });
+ }, "Don't crash when 'type' missing from icon definition");
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rgrg-256x256.png',
+ sizes: '256 256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, 'Cannot register instruments with invalid icon size "256 256" (missing "x")');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: '/images/rg\0rg-256x256.png',
+ sizes: '256x256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, 'Cannot register instruments with invalid icon URL (has a null character)');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src: 'http://test.example/images/rgrg-256x256.png',
+ sizes: '256x256',
+ type: 'image/png',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, 'Cannot register instruments with non-existing non-https icon URL');
+
+ promise_test(async t => {
+ await registration.paymentManager.instruments.clear();
+ const setPromise = registration.paymentManager.instruments.set(
+ 'instrument-key',
+ {
+ name: 'Instrument Name',
+ icons: [
+ {
+ src:
+ 'http://www.chromium.org/_/rsrc/1438879449147/config/customLogo.gif',
+ sizes: '48x48',
+ type: 'image/gif',
+ },
+ ],
+ method: methodName,
+ },
+ );
+ return promise_rejects_js(t, TypeError, setPromise);
+ }, 'Cannot register instruments with an existing non-https icon URL');
+
+ async function testUnusualStrings(existingKey, nonExistingKey) {
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set(existingKey, {
+ name: existingKey,
+ icons: [
+ {src: '/images/rgrg-256x256.png', sizes: '256x256', type: 'image/png'},
+ ],
+ method: existingKey,
+ capabilities: {aCapabilityName: existingKey},
+ });
+ const hasExistingInstrument = await registration.paymentManager.instruments.has(
+ existingKey,
+ );
+ assert_true(hasExistingInstrument);
+ const hasNonExistingInstrument = await registration.paymentManager.instruments.has(
+ nonExistingKey,
+ );
+ assert_false(hasNonExistingInstrument);
+ const existingInstrument = await registration.paymentManager.instruments.get(
+ existingKey,
+ );
+ assert_equals(existingInstrument.name, existingKey);
+ const nonExistingInstrument = await registration.paymentManager.instruments.get(
+ nonExistingKey,
+ );
+ assert_equals(nonExistingInstrument, undefined);
+ const deletedExistingInstrument = await registration.paymentManager.instruments.delete(
+ existingKey,
+ );
+ assert_true(deletedExistingInstrument);
+ const deletedNonExistingInstrument = await registration.paymentManager.instruments.delete(
+ nonExistingKey,
+ );
+ assert_false(deletedNonExistingInstrument);
+ }
+
+ promise_test(async t => {
+ const length = 100000;
+ await testUnusualStrings('0'.repeat(length), '1'.repeat(length));
+ }, "Don't crash on very long key, name, method, and capability strings.");
+
+ promise_test(async t => {
+ await testUnusualStrings('foo\0bar', 'foo\0baz');
+ }, "Don't crash on null characters in key, name, method, and capability strings.");
+}
+
+registerAndActiveServiceWorker('app-simple.js', 'payment-app/', runTests);
+</script>