<!doctype html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script type="text/javascript">
test(function () {
  assert_greater_than_equal(navigator.plugins.length, 1, "At least one plugin must be available.");
  assert_greater_than_equal(navigator.mimeTypes.length, 1, "At least one mime type must be available.");
  for (var i = 0; i < navigator.plugins.length; i++) {
    var plugin = navigator.plugins[i];
    var name = plugin.name;
    assert_equals(plugin, navigator.plugins[i]);
    assert_equals(plugin, navigator.plugins[name]);
  }
  for (var i = 0; i < navigator.mimeTypes.length; i++) {
    var mime_type = navigator.mimeTypes[i];
    var type = mime_type.type;
    assert_equals(mime_type, navigator.mimeTypes[i]);
    assert_equals(mime_type, navigator.mimeTypes[type]);
    assert_equals(mime_type.enabledPlugin, navigator.plugins[mime_type.enabledPlugin.name]);
  }
}, "Tests that navigator.plugins returns the same object when queried multiple times.");

test(function () {
  assert_greater_than_equal(navigator.plugins.length, 1, "At least one plugin must be available.");
  assert_greater_than_equal(navigator.mimeTypes.length, 1, "At least one mime type must be available.");
  var iframe = document.createElement("iframe");
  iframe.src = "about:blank";
  document.body.appendChild(iframe);
  assert_equals(navigator.plugins.length, iframe.contentWindow.navigator.plugins.length);
  assert_equals(navigator.mimeTypes.length, iframe.contentWindow.navigator.mimeTypes.length);
  for (var i = 0; i < navigator.plugins.length; i++) {
    var plugin = navigator.plugins[i];
    var name = plugin.name;
    assert_not_equals(plugin, iframe.contentWindow.navigator.plugins[i]);
    assert_not_equals(plugin, iframe.contentWindow.navigator.plugins[name]);
  }
  for (var i = 0; i < navigator.mimeTypes.length; i++) {
    var mime_type = navigator.mimeTypes[i];
    var type = mime_type.type;
    assert_not_equals(mime_type, iframe.contentWindow.navigator.mimeTypes[i]);
    assert_not_equals(mime_type, iframe.contentWindow.navigator.mimeTypes[type]);
    assert_not_equals(mime_type.enabledPlugin, iframe.contentWindow.navigator.plugins[mime_type.enabledPlugin.name]);
  }
  iframe.remove();
}, "Tests that navigator.plugins does not return the same object on different frames.");

test(function () {
  assert_greater_than_equal(navigator.plugins.length, 2, "At least two plugins must be available.");
  assert_greater_than_equal(navigator.mimeTypes.length, 2, "At least two mime types must be available.");
  for (var i = 1; i < navigator.plugins.length; i++) {
    assert_less_than_equal(navigator.plugins[i-1].name.localeCompare(navigator.plugins[i].name), 0);
  }
  for (var i = 1; i < navigator.mimeTypes.length; i++) {
    assert_less_than_equal(navigator.mimeTypes[i-1].type.localeCompare(navigator.mimeTypes[i].type), 0);
  }
}, "Tests that navigator.plugins returns plugins sorted in alphabetical order by plugin name.");

test(function() {
  assert_greater_than_equal(navigator.plugins.length, 1, "At least one plugin must be available.");
  assert_greater_than_equal(navigator.mimeTypes.length, 1, "At least one mime type must be available.");
  assert_equals(null, navigator.plugins.item(navigator.plugins.length));
  assert_equals(null, navigator.mimeTypes.item(navigator.mimeTypes.length));
  assert_equals(null, navigator.plugins[0].item(navigator.plugins[0].length));
}, "Tests out-of-bounds access in navigator.plugins");
</script>
</body>
</html>
