<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>dataTransfer.items during SVG link drag and drop</title>
<a xlink:href="data:text/plain,PASS">
	<polygon points="0,0 100,0 100,100" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="15">Drag green triangle above and drop it in the gray box below. Gray box should turn green.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,PASS', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
a = document.querySelector('a'), rect = document.querySelector('rect'), text = document.querySelector('textArea'), e = 0, result = true;
a.addEventListener('dragstart',
	function (event)
		{event.dataTransfer.effectAllowed = 'copy';
		for(var i = 0; i != dataTypes.length; i++)
			{event.dataTransfer.setData(dataTypes[i], data[i]);}
		for(var i = event.dataTransfer.items.length; i != 0; i--)
			{if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
				{delete event.dataTransfer.items[i-1]}
			}
		if(event.dataTransfer.items.length != dataTypes.length)
				{say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
		for(var i = 0; i != event.dataTransfer.items.length; i++)
			{if(event.dataTransfer.items[i].kind != 'string')
				{say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
			if(event.dataTransfer.items[i].type != dataTypes[i])
				{say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
			event.dataTransfer.items[i].getAsString(
				function ()
					{if(arguments[0] != data[e++])
						{say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
					}
				);
			}
		},false);
a.addEventListener('drag',
	function (event)
		{event.dataTransfer.items.clear();
		if(event.dataTransfer.items.length != dataTypes.length)
			{say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
		for(var i = 0; i != event.dataTransfer.items.length; i++)
			{if(event.dataTransfer.items[i].kind != 'string')
				{say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
			if(event.dataTransfer.items[i].type != dataTypes[i])
				{say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
			event.dataTransfer.items[i].getAsString(
				function ()
					{if(arguments[0])
						{say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
					}
				);
			}
		},false);
rect.addEventListener('dragenter',
	function (event)
		{event.preventDefault();
		event.dataTransfer.items.clear();
		if(event.dataTransfer.items.length != dataTypes.length)
			{say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
		for(var i = 0; i != event.dataTransfer.items.length; i++)
			{delete event.dataTransfer.items[i];
			if(event.dataTransfer.items[i].kind != 'string')
				{say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
			if(event.dataTransfer.items[i].type != dataTypes[i])
				{say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
			event.dataTransfer.items[i].getAsString(
				function ()
					{if(arguments[0])
						{say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
					}
				);
			}
		},false);
rect.addEventListener('dragover',
	function (event)
		{event.preventDefault();
		event.dataTransfer.items.clear();
		if(event.dataTransfer.items.length != dataTypes.length)
			{say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
		for(var i = 0; i != event.dataTransfer.items.length; i++)
			{if(event.dataTransfer.items[i].kind != 'string')
				{say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
			if(event.dataTransfer.items[i].type != dataTypes[i])
				{say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
			event.dataTransfer.items[i].getAsString(
				function ()
					{if(arguments[0])
						{say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
					}
				);
			}
		},false);
rect.addEventListener('drop',
	function (event)
		{e = 0;
		event.dataTransfer.items.clear();
		if(event.dataTransfer.items.length != dataTypes.length)
				{say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
		for(var i = 0; i != event.dataTransfer.items.length; i++)
			{delete event.dataTransfer.items[i];
			if(event.dataTransfer.items[i].kind != 'string')
				{say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
			if(event.dataTransfer.items[i].type != dataTypes[i])
				{say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
			event.dataTransfer.items[i].getAsString(
				function ()
					{if(arguments[0] != data[e++])
						{say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
					}
				);
			}
		rect.setAttribute('fill',result?'green':'red');
		},false);
function say(it)
	{text.appendChild(document.createTextNode(it + '.'));
	result = false;}
]]>
</script>
</svg>
