<!doctype html>
<meta charset=utf-8>
<!--  WARNING: These tests are preliminary and probably partly incorrect.   -->
<title>CSSOM View automated IDL tests</title>
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
<link rel="help" href="https://drafts.csswg.org/cssom-1/#idl-index">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>

<input id="caretPositionInput" style="position: absolute; top: 0; left: 0; border: 0;">

<h1>CSSOM View IDL tests</h1>
<div id=log></div>

<script>
"use strict";

function doTest([html, dom, cssom, geometry, cssom_view]) {

  var idlArray = new IdlArray();
  var svg = "interface SVGElement : Element {};";
  idlArray.add_untested_idls(html + dom + svg + cssom + geometry);
  idlArray.add_idls(cssom_view);

  idlArray.add_objects({
    "Window": ["window"],
    "MediaQueryList": ["matchMedia('all')"],
    "MediaQueryListEvent": ["new MediaQueryListEvent('change')"],
    "Screen": ["screen"],
    "Document": ["document"],
    "CaretPosition": ["document.caretPositionFromPoint(5, 5)"],
    "Element": ["document.createElementNS('x', 'y')"],
    "HTMLElement": ["document.createElement('div')"],
    "HTMLImageElement": ["document.createElement('img')"],
    "Range": ["new Range()"],
    // "MouseEvent": ["new MouseEvent('foo')"],
    "Text": ["document.createTextNode('x')"],
    // "CSSPseudoElement": [],
    "Document": ["document"],
  });
  idlArray.test();
};

function fetchData(url) {
  return fetch(url).then((response) => response.text());
}

function waitForLoad() {
  return new Promise(function(resolve) {
    addEventListener("load", resolve);
  });
}

promise_test(function() {
  // Have to wait for onload
  return Promise.all([fetchData("/interfaces/html.idl"),
                      fetchData("/interfaces/dom.idl"),
                      fetchData("/interfaces/cssom.idl"),
                      fetchData("/interfaces/geometry.idl"),
                      fetchData("/interfaces/cssom-view.idl"),
                      waitForLoad()])
                .then(doTest);
}, "Test driver");

</script>
