<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <title>TestDriver bless method</title>
  <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>
  <script>
promise_test(() => {
  return test_driver.bless('empty', () => {});
}, 'functions in the absence of a `body` element');
  </script>
</head>
<body>
<script>
// At the time of this writing, the only standard requirement for user
// activation concerns the interaction between iframe elements and their parent
// browsing contexts [1]. Because testdriver.js currently cannot operate within
// an iframe, the standard requirement cannot be used to verify the correctness
// of the `bless` method. Instead, rely on the non-standard restriction on
// unattended media playback. Browsers which do not implement such a
// restriction will pass this test spuriously.
//
// [1] https://html.spec.whatwg.org/multipage/origin.html#attr-iframe-sandbox-allow-top-navigation-by-user-activation
promise_test(() => {
  const video = document.createElement('video');
  video.setAttribute('src', '/media/counting.ogv');
  document.body.appendChild(video);
  return test_driver.bless('start video playback', () => video.play())
}, 'user activation');

promise_test(() => {
  return test_driver.bless('demonstrates return value without action')
    .then((value) => {
      assert_equals(value, undefined);
    });
}, 'no action function provided');

promise_test(() => {
  const expectedValue = {};

  return test_driver.bless('demonstrate a synchronous return value', () => {
      return expectedValue;
    }).then((actualValue) => {
      assert_equals(
        actualValue,
        expectedValue,
        'the promise should be fulfilled with the returned value'
      );
    });

}, 'synchronous return value');

promise_test(() => {
  const expectedError = new Error();

  return test_driver.bless('demonstrates a synchronous error', () => {
     throw expectedError;
    })
    .then(() => {
      assert_unreached('the promise should be rejected');
    }, (actualError) => {
      assert_equals(
        actualError,
        expectedError,
        'the promise should be rejected with the thrown value'
      );
    });
}, 'synchronous error');

promise_test(() => {
  const expectedValue = {};

  return test_driver.bless('demonstrate an asynchronous return value', () => {
      return Promise.resolve(expectedValue);
    }).then((actualValue) => {
      assert_equals(
        actualValue,
        expectedValue,
        'the promise should be fulfilled with the fulfillment value'
      );
    });

}, 'asynchronous return value');

promise_test(() => {
  const expectedError = new Error();

  return test_driver.bless('demonstrates an asynchronous error', () => {
     return Promise.reject(expectedError);
    })
    .then(() => {
      assert_unreached('the promise should be rejected');
    }, (actualError) => {
      assert_equals(
        actualError,
        expectedError,
        'the promise should be rejected with the rejected value'
      );
    });
}, 'asynchronous error');
</script>
</body>
