<!doctype html>
<html>
	<head>
		<title>Synthetic events using real dataTransfer in new thread</title>
		<style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
		</style>
		<script type="text/javascript" src="/resources/testharness.js"></script>
		<script type="text/javascript">
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {

	var orange  = document.getElementsByTagName('blockquote')[0],
	    blue    = document.getElementsByTagName('blockquote')[1],
	    fuchsia = document.getElementsByTagName('blockquote')[2],
	    evtdone = {};

	orange.ondragstart = function (e) {
		e.dataTransfer.effectAllowed = 'copy';
		e.dataTransfer.setData('text','dragstart real data');
		var dataTransfer = e.dataTransfer;
		setTimeout(function () {
			var t = async_test('new thread should see data store in protected mode after dragstart');
			blue.ondragstart = function (e) {
				t.step(function() {
					assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
					e.dataTransfer.setData('text','new thread after dragstart');
					assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
				});
			};
			t.step(function() {
    var evt = new DragEvent('dragstart', {dataTransfer:dataTransfer});
				blue.dispatchEvent(evt);
			});
			t.done();
		},0);
	};

	fuchsia.ondragenter = fuchsia.ondragover = function (e) {
		e.preventDefault();
	};

	fuchsia.ondrop = function (e) {
		e.preventDefault();
		var dataTransfer = e.dataTransfer;
		setTimeout(function () {
			var t = async_test('new thread should see data store in protected mode after drop');
			blue.ondragstart = function (e) {
				t.step(function() {
					assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
					e.dataTransfer.setData('text','new thread after dragstart');
					assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
				});
			};
			t.step(function() {
    var evt = new DragEvent('dragstart', {dataTransfer:dataTransfer});
				blue.dispatchEvent(evt);
			});
			t.done();
			done();
		},0);
	};

};
		</script>
	</head>
	<body>
		<p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
		<blockquote draggable="true"></blockquote>
		<blockquote></blockquote>
		<blockquote></blockquote>
		<div id="log"></div>
		<noscript><p>Enable JavaScript and reload</p></noscript>
	</body>
</html>