<!DOCTYPE html>
<title>MediaMetadata interface</title>
<script src=/resources/testharness.js></script>
<script src="/resources/testharnessreport.js"></script>
<script>

test(function() {
  var metadata = new MediaMetadata({});
  navigator.mediaSession.metadata = metadata;
  assert_equals(navigator.mediaSession.metadata, metadata);
}, "Test that mediaSession.metadata is properly set");

test(function() {
  var metadata = new MediaMetadata({});
  navigator.mediaSession.metadata = metadata;
  metadata.title = 'foo';
  assert_equals(navigator.mediaSession.metadata.title, 'foo');
}, "Test that changes to metadata propagate properly");

test(function() {
  var metadata = new MediaMetadata({});
  navigator.mediaSession.metadata = metadata;
  navigator.mediaSession.metadata = null;
  assert_equals(navigator.mediaSession.metadata, null);
}, "Test that resetting metadata to null is reflected");

test(function() {
  var metadata = new MediaMetadata({});
  assert_not_equals(metadata, null);

  assert_throws(new TypeError(), _ => new MediaMetadata('foobar'));
  assert_throws(new TypeError(), _ => new MediaMetadata(42));
}, 'Test that MediaMetadata is constructed using a dictionary');

test(function() {
  var metadata = new MediaMetadata();
  assert_not_equals(metadata, null);
}, "Test that MediaMetadata constructor can take no parameter");

test(function() {
  var image1 = { src: 'http://example.com/1', sizes: 'sizes1', type: 'type1' };
  var image2 = { src: 'http://example.com/2', sizes: 'sizes2', type: 'type2' };
  var metadata = new MediaMetadata({
      title: 'foo', album: 'bar', artist: 'plop', artwork: [ image1, image2 ]
  });

  assert_equals(metadata.title, 'foo');
  assert_equals(metadata.album, 'bar');
  assert_equals(metadata.artist, 'plop');
  assert_equals(metadata.artwork.length, 2);
  assert_equals(metadata.artwork[0].src, image1.src);
  assert_equals(metadata.artwork[0].sizes, image1.sizes);
  assert_equals(metadata.artwork[0].type, image1.type);
  assert_equals(metadata.artwork[1].src, image2.src);
  assert_equals(metadata.artwork[1].sizes, image2.sizes);
  assert_equals(metadata.artwork[1].type, image2.type);
}, 'Test the different values allowed in MediaMetadata init dictionary');

test(function() {
  var metadata = new MediaMetadata({});
  assert_equals(metadata.title, '');
  assert_equals(metadata.artist, '');
  assert_equals(metadata.album, '');
  assert_equals(0, metadata.artwork.length);
}, 'Test the default values for MediaMetadata with empty init dictionary');

test(function() {
  var metadata = new MediaMetadata();
  assert_equals(metadata.title, '');
  assert_equals(metadata.artist, '');
  assert_equals(metadata.album, '');
  assert_equals(0, metadata.artwork.length);
}, 'Test the default values for MediaMetadata with no init dictionary');

test(function() {
  var metadata = new MediaMetadata({ randomValueThatWillNotBeAdded: '... hopefully ;)' });
  assert_equals(metadata.randomValueThatWillNotBeAdded, undefined);
}, 'Test that passing unknown values to the dictionary is a no-op');

test(function() {
  var image1 = { src: 'http://example.com/1', sizes: 'sizes1', type: 'type1' };
  var image2 = { src: 'http://example.com/2', sizes: 'sizes2', type: 'type2' };
  var metadata = new MediaMetadata({
    title: 'foo', album: 'bar', artist: 'plop', artwork: [ image1, image2 ]
  });

  metadata.title = 'something else';
  assert_equals(metadata.title, 'something else');

  metadata.album = 'other value';
  assert_equals(metadata.album, 'other value');

  metadata.artist = 'someone else';
  assert_equals(metadata.artist, 'someone else');

  var image = { src: 'http://example.com/', sizes: '40x40', type: 'image/png' };
  metadata.artwork = [ image ];
  assert_equals(metadata.artwork.length, 1);
  assert_equals(metadata.artwork[0].src, 'http://example.com/');
  assert_equals(metadata.artwork[0].sizes, '40x40');
  assert_equals(metadata.artwork[0].type, 'image/png');
}, "Test that MediaMetadata is read/write");

test(function() {
  var metadata = new MediaMetadata({ artwork: [ { src: 'http://foo.com/' } ] });
  assert_throws(new TypeError(), _ => {
    metadata.artwork.push({
      src: 'http://example.com/', sizes: '40x40', type: 'image/png',
    });
  });

  metadata.artwork[0].src = 'bar';
  assert_equals(metadata.artwork[0].src, 'http://foo.com/');
}, "Test that MediaMetadat.artwork can't be modified");

test(function() {
  var metadata = new MediaMetadata({ artwork: [{
    src: 'http://example.com/', sizes: '40x40', type: 'image/png',
    some_other_value: 'foo',
  }]});
  assert_equals(metadata.artwork[0].src, 'http://example.com/');
  assert_equals(metadata.artwork[0].sizes, '40x40');
  assert_equals(metadata.artwork[0].type, 'image/png');
  assert_false('some_other_value' in metadata.artwork[0]);

  metadata.artwork[0].something_else = 'bar';
  assert_false('something_else' in metadata.artwork[0]);
}, "Test that MediaMetadata.artwork will not expose unknown properties");

test(function() {
  var metadata = new MediaMetadata({ artwork: [
    { src: 'http://example.com/1', sizes: '40x40', type: 'image/png' },
    { src: 'http://example.com/2', sizes: '40x40', type: 'image/png' },
  ]});

  assert_true(Object.isFrozen(metadata.artwork));
  for (var i = 0; i < metadata.artwork.length; ++i)
    assert_true(Object.isFrozen(metadata.artwork[i]));
}, "Test that MediaMetadata.artwork is Frozen");

test(function() {
  var metadata = new MediaMetadata({ artwork: [
    { src: 'http://example.com', sizes: '40x40', type: 'image/png' },
    { src: '../foo', sizes: '40x40', type: 'image/png' },
    { src: '/foo/bar', sizes: '40x40', type: 'image/png' },
  ]});

  assert_equals(metadata.artwork[0].src, new URL('http://example.com', document.URL).href)
  assert_equals(metadata.artwork[1].src, new URL('../foo', document.URL).href)
  assert_equals(metadata.artwork[2].src, new URL('/foo/bar', document.URL).href)
}, "Test that MediaMetadata.artwork returns parsed urls");

test(function() {
  var metadata = 42;

  assert_throws(new TypeError(), _ => {
    metadata
      new MediaMetadata({ artwork: [ { src: 'http://[example.com]' }] });
  });
  assert_equals(metadata, 42);

  metadata = new MediaMetadata();
  assert_throws(new TypeError(), _ => {
    metadata.artwork = [
      // Valid url.
      { src: 'http://example.com' },
      // Invalid url.
      { src: 'http://example.com:demo' },
    ];
  });
  assert_equals(metadata.artwork.length, 0);

}, "Test that MediaMetadata throws when setting an invalid url");

test(function() {
  var metadata = new MediaMetadata({ artwork: [ { src: 'foo.jpg' } ] });
  assert_equals(metadata.artwork[0].type, '');
  assert_equals(metadata.artwork[0].sizes, '');
}, "Test MediaImage default values");

test(function() {
  assert_throws(new TypeError(), _ => {
    new MediaMetadata({ artwork: [ {} ] });
  });

  var metadata = new MediaMetadata();
  assert_throws(new TypeError(), _ => {
    metadata.artwork = [ { type: 'image/png', sizes: '40x40' } ];
  });
}, "Test that MediaImage.src is required")

</script>
