// META: script=/resources/testharness.js
// META: script=/resources/testharnessreport.js

'use strict';

test(() => {
  assert_throws_js(TypeError, () => fetchLater());
}, `fetchLater() cannot be called without request.`);

test(() => {
  assert_throws_js(TypeError, () => fetchLater('http://www.google.com'));
  assert_throws_js(TypeError, () => fetchLater('file://tmp'));
  assert_throws_js(TypeError, () => fetchLater('ssh://example.com'));
  assert_throws_js(TypeError, () => fetchLater('wss://example.com'));
  assert_throws_js(TypeError, () => fetchLater('about:blank'));
  assert_throws_js(TypeError, () => fetchLater(`javascript:alert('');`));
}, `fetchLater() throws TypeError on non-HTTPS URL.`);

test(() => {
  const result = fetchLater('/');
  assert_false(result.activated);
}, `fetchLater()'s return tells the deferred request is not yet sent.`);

test(() => {
  const result = fetchLater('/');
  assert_throws_js(TypeError, () => result.activated = true);
}, `fetchLater() throws TypeError when mutating its returned state.`);

test(() => {
  const controller = new AbortController();
  // Immediately aborts the controller.
  controller.abort();
  assert_throws_dom(
      'AbortError', () => fetchLater('/', {signal: controller.signal}));
}, `fetchLater() throws AbortError when its initial abort signal is aborted.`);
