<!doctype html>
<html>
	<head>
		<title>Dragging a file to the system</title>
		<style type="text/css">
span { display: inline-block; height: 100px; width: 100px; background: orange; }
		</style>
		<script type="text/javascript">
window.onload = function () {
	var drag = document.getElementsByTagName('span')[0];
	drag.ondragstart = function (e) {
		e.dataTransfer.setData('text','PASS');
		e.dataTransfer.effectAllowed = 'copy';
		var filein = document.getElementsByTagName('input')[0];
		if( !filein.files ) {
			document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
			return;
		}
		if( !filein.files[0] ) {
			document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
			return;
		}
		var thefile = filein.files[0];
		try {
			e.dataTransfer.items.add(thefile);
		} catch(err) {
			document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
			e.preventDefault();
			return;
		}
		if( e.dataTransfer.files.length != 1 ) {
			document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
			e.preventDefault();
		}
	};
};
		</script>
	</head>
	<body>
		<div>This test only applies to platforms where dropping a file onto a folder in the system's file manager copies/moves the file to that folder.</div>
		<ol>
			<li>Open an empty folder in your system's file manager.</li>
			<li>Select a non-empty file on your computer using the following input: <input type="file"></li>
			<li>Drag the orange square onto the folder in your system's file manager, and release it:<br><span draggable="true"></span></li>
			<li>Pass if the file is copied to the folder.</li>
		</ol>
		<p></p>
		<noscript><p>Enable JavaScript and reload</p></noscript>
	</body>
</html>