<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Pointer Lock IDL tests</title>
<link rel="author" title="W3C" href="http://www.w3.org/" />
<link rel="help" href="http://www.w3.org/TR/pointerlock/#element-interface"/>
<link rel="help" href="http://www.w3.org/TR/pointerlock/#extensions-to-the-document-interface">
<link rel="help" href="http://www.w3.org/TR/pointerlock/#extensions-to-the-mouseevent-interface">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
</head>

<body>
<h1>Pointer Lock IDL tests</h1>

<pre id='untested_idl' style='display:none'>

interface EventTarget {
};

interface Node : EventTarget {
};

interface Element : Node {
};

interface Document : Node {
};

interface Event {
};

interface MouseEvent : Event {
};
</pre>

<pre id='idl'>

partial interface Element {
    void requestPointerLock ();
};

partial interface Document {
                attribute EventHandler? onpointerlockchange;
                attribute EventHandler? onpointerlockerror;
    readonly    attribute Element?      pointerLockElement;
    void exitPointerLock ();
};

partial interface MouseEvent {
    readonly    attribute long movementX;
    readonly    attribute long movementY;
};

</pre>

<div id="log"></div>

<script>

var idl_array = new IdlArray();

setup(function() {
	idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
	idl_array.add_idls(document.getElementById("idl").textContent);

	idl_array.add_objects({ Document: ["window.document"],
                            Element: ["window.document.documentElement"],
                            MouseEvent: ["new MouseEvent('mousemove')", "new MouseEvent('pointerlockchange')"] });
});

idl_array.test();

</script>
</body>
</html>
