// META: script=./resources/pending_beacon-helper.js 'use strict'; test(() => { assert_throws_js(TypeError, () => new PendingBeacon('/')); }, `PendingBeacon cannot be constructed directly.`); for (const beaconType of BeaconTypes) { test(() => { assert_throws_js(TypeError, () => new beaconType.type()); assert_throws_js(TypeError, () => new beaconType.type(undefined)); assert_throws_js(TypeError, () => new beaconType.type(null)); }, `${beaconType.name}: constructor throws TypeError if URL is missing.`); test(() => { assert_throws_js( TypeError, () => new beaconType.type('http://www.google.com')); assert_throws_js(TypeError, () => new beaconType.type('file://tmp')); assert_throws_js(TypeError, () => new beaconType.type('ssh://example.com')); assert_throws_js(TypeError, () => new beaconType.type('wss://example.com')); assert_throws_js(TypeError, () => new beaconType.type('about:blank')); assert_throws_js( TypeError, () => new beaconType.type(`javascript:alert('');`)); }, `${beaconType.name}: constructor throws TypeError on non-HTTPS URL.`); test(() => { const beacon = new beaconType.type('/'); assert_equals(beacon.url, '/'); assert_equals(beacon.method, beaconType.expectedMethod); assert_equals(beacon.backgroundTimeout, -1); assert_equals(beacon.timeout, -1); assert_true(beacon.pending); }, `${beaconType.name}: constructor sets default properties if missing.`); test(() => { const beacon = new beaconType.type( 'https://www.google.com', {backgroundTimeout: 200, timeout: 100}); assert_equals(beacon.url, 'https://www.google.com'); assert_equals(beacon.method, beaconType.expectedMethod); assert_equals(beacon.backgroundTimeout, 200); assert_equals(beacon.timeout, 100); assert_true(beacon.pending); }, `${beaconType.name}: constructor can set properties.`); test(() => { let beacon = new beaconType.type( 'https://www.google.com', {method: 'GET', backgroundTimeout: 200, timeout: 100}); beacon.backgroundTimeout = 400; assert_equals(beacon.backgroundTimeout, 400); beacon.timeout = 600; assert_equals(beacon.timeout, 600); }, `${beaconType.name}: 'backgroundTimeout' & 'timeout' can be mutated.`); test( () => { let beacon = new beaconType.type('https://www.google.com'); assert_throws_js(TypeError, () => beacon.url = '/'); assert_throws_js(TypeError, () => beacon.method = 'FOO'); assert_throws_js(TypeError, () => beacon.pending = false); }, `${beaconType.name}: throws TypeError when mutating ` + `'url', 'method', 'pending'.`); } test(() => { let beacon = new PendingGetBeacon('/'); assert_throws_js(TypeError, () => new beacon.setURL()); assert_throws_js(TypeError, () => new beacon.setURL(undefined)); assert_throws_js(TypeError, () => new beacon.setURL(null)); }, `PendingGetBeacon: setURL() throws TypeError if URL is missing.`); test(() => { let beacon = new PendingGetBeacon('/'); assert_throws_js(TypeError, () => beacon.setURL('http://www.google.com')); assert_throws_js(TypeError, () => beacon.setURL('file://tmp')); assert_throws_js(TypeError, () => beacon.setURL('ssh://example.com')); assert_throws_js(TypeError, () => beacon.setURL('wss://example.com')); assert_throws_js(TypeError, () => beacon.setURL('about:blank')); assert_throws_js(TypeError, () => beacon.setURL(`javascript:alert('');`)); }, `PendingGetBeacon: setURL() throws TypeError on non-HTTPS URL.`);