<!doctype html>
<html>
	<head>
		<title>allowTargetOrigin events</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});
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','dummy text');
		if( evtdone[e.type] ) { return; }
		evtdone[e.type] = true;
		test(function() {
			assert_true( !!e.dataTransfer.allowTargetOrigin );
		}, 'allowTargetOrigin should exist in '+e.type );
		test(function() {
			e.dataTransfer.allowTargetOrigin('*');
		}, 'allowTargetOrigin should work in '+e.type );
	};
	blue.ondragenter = blue.ondragover = function (e) {
		e.preventDefault();
	};
	orange.ondrag = blue.ondragleave = function (e) {
		if( evtdone[e.type] ) { return; }
		evtdone[e.type] = true;
		test(function() {
			assert_true( !!e.dataTransfer.allowTargetOrigin );
		}, 'allowTargetOrigin should exist in '+e.type );
		test(function() {
			assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
		}, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
	};
	fuchsia.ondragenter = fuchsia.ondragover = fuchsia.ondrop = function (e) {
		e.preventDefault();
		if( evtdone[e.type] ) { return; }
		evtdone[e.type] = true;
		test(function() {
			assert_true( !!e.dataTransfer.allowTargetOrigin );
		}, 'allowTargetOrigin should exist in '+e.type );
		test(function() {
			assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
		}, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
	};
	orange.ondragend = function (e) {
		if( evtdone[e.type] ) { return; }
		evtdone[e.type] = true;
		test(function() {
			assert_true( !!e.dataTransfer.allowTargetOrigin );
		}, 'allowTargetOrigin should exist in '+e.type );
		test(function() {
			assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
		}, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
		test(function() {
			var failtxt = '- Reload and try again';
			assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
			assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
			assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
			assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
			assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
			assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
			assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
		}, 'all event types must now have been tested' );
		done();
	};
};
		</script>
	</head>
	<body>
		<blockquote draggable="true"></blockquote>
		<blockquote></blockquote>
		<blockquote></blockquote>
		<div id="log">Drag the orange square over the blue square then the fuchsia square, then release it.</div>
		<noscript><p>Enable JavaScript and reload</p></noscript>
	</body>
</html>