<!doctype html>
<html>
	<head>
		<title>Modifier keys selecting dropEffect with 'all'</title>
		<style type="text/css">
div:first-child {
	height: 100px;
	width: 100px;
	background: orange;
	display: inline-block;
}
div:first-child + div {
	height: 100px;
	width: 100px;
	background: blue;
	display: inline-block;
}
div:first-child + div + div {
	height: 100px;
	width: 100px;
	background: fuchsia;
	display: inline-block;
}
table {
	display: inline-table;
	margin-right: 1em;
	border-collapse: collapse;
}
table, th, td {
	border: 1px solid black;
}
thead th {
	background: silver;
	color: black;
}
		</style>
		<script type="text/javascript">
window.onload = function () {
	var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
	var orange = document.getElementsByTagName('div')[0];
	orange.ondragstart = function (e) {
		e.dataTransfer.setData('text','http://example.com/');
		e.dataTransfer.effectAllowed = 'all';
		bde = bdo = bdo2 = fde = fdo = fdr = '';
	};
	var blue = document.getElementsByTagName('div')[1];
	blue.ondragenter = function (e) {
		e.preventDefault();
		if( !bde ) { bde = e.dataTransfer.dropEffect; }
	};
	blue.ondragover = function (e) {
		e.preventDefault();
		if( !bdo ) {
			bdo = e.dataTransfer.dropEffect;
		}
		//bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
		//test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
		bdo2 = e.dataTransfer.dropEffect;
	};
	var fuchsia = document.getElementsByTagName('div')[2];
	fuchsia.ondragenter = function (e) {
		e.preventDefault();
		if( !fde ) { fde = e.dataTransfer.dropEffect; }
	};
	fuchsia.ondragover = function (e) {
		e.preventDefault();
		if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
	};
	fuchsia.ondrop = function (e) {
		e.preventDefault();
		fdr = e.dataTransfer.dropEffect;
	};
	orange.ondragend = function (e) {
		var ode = e.dataTransfer.dropEffect, temparray;
		if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
			if( bde == fdr ) {
				tmparray = [fdr];
			} else {
				tmparray = [bde,fdr];
			}
		} else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
			tmparray = [bde,fdo,ode];
		} else {
			tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
		}
		tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
		document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
	};
};
		</script>
	</head>
	<body>

		<div draggable="true"></div>
		<div></div>
		<div></div>
		<div><strong>&nbsp;</strong></div>
		<ol>
			<li>Drag the orange square over the blue square</li>
			<li>Press the relevant modifier keys for your platform</li>
			<li>Continue dragging over the pink square</li>
			<li>Release the drag, then the keys</li>
			<li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
		</ol>
		<!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
		<!-- Anything else invalidates the modifiers, and reverts to default. -->
		<table>
			<caption>Windows</caption>
			<thead>
				<tr><th>Modifier</th><th>Drop effect</th></tr>
			</thead>
			<tbody>
				<tr><td>None</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
				<tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Alt</td><td>copy=&gt;<strong>link</strong></td></tr>
				<tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
				<tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
				<tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
			</tbody>
		</table>
		<!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
		<!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
		<!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
		<!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
		<table>
			<caption>Unix/Linux</caption>
			<thead>
				<tr><th>Modifier</th><th>Drop effect</th></tr>
			</thead>
			<tbody>
				<tr><td>None</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
				<tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Alt</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
				<tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
				<tr><td>Alt+Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
			</tbody>
		</table>
		<!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
		<!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
		<table>
			<caption>Mac</caption>
			<thead>
				<tr><th>Modifier</th><th>Drop effect</th></tr>
			</thead>
			<tbody>
				<tr><td>None</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
				<tr><td>Shift</td><td><strong>copy</strong></td></tr>
				<tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
				<tr><td>Command</td><td>copy=&gt;<strong>move</strong></td></tr>

				<tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
				<tr><td>Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>

				<tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
				<tr><td>Ctrl+Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
				<tr><td>Ctrl+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
				<tr><td>Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>

				<tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
			</tbody>
		</table>
		<noscript><p>Enable JavaScript and reload</p></noscript>

	</body>
</html>