044.xhtml (6314B)
1 <?xml version="1.0" encoding="utf-8"?> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>dataTransfer.items and getData during block element drag and drop</title> 5 <style type="text/css"> 6 div 7 {height:100px; 8 width:100px; 9 padding:20px; 10 background-color:green;} 11 p + div 12 {background-color:gray;} 13 </style> 14 <script type="application/ecmascript"> 15 <![CDATA[ 16 var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'], 17 data = ['PASS', 'data:text/plain,1', '<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'], 18 e = 0, result = true; 19 function start(event) 20 {event.dataTransfer.items.clear(); 21 event.dataTransfer.effectAllowed = 'copy'; 22 for(var i = 0; i != dataTypes.length; i++) 23 {event.dataTransfer.items.add(data[i],dataTypes[i])} 24 if(event.dataTransfer.items.length != dataTypes.length) 25 {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')} 26 for(var i = 0; i != dataTypes.length; i++) 27 {if(event.dataTransfer.getData(dataTypes[i]) != data[i]) 28 {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')} 29 } 30 for(var i = 0; i != event.dataTransfer.items.length; i++) 31 {if(event.dataTransfer.items[i].kind != 'string') 32 {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')} 33 if(event.dataTransfer.items[i].type != dataTypes[i]) 34 {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')} 35 event.dataTransfer.items[i].getAsString( 36 function () 37 {if(arguments[0] != data[e++]) 38 {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')} 39 } 40 ); 41 } 42 } 43 function dragElement(event) 44 {event.dataTransfer.items.clear(); 45 if(event.dataTransfer.items.length != dataTypes.length) 46 {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')} 47 for(var i = 0; i != event.dataTransfer.items.length; i++) 48 {if(event.dataTransfer.items[i].kind != 'string') 49 {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')} 50 if(event.dataTransfer.items[i].type != dataTypes[i]) 51 {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')} 52 event.dataTransfer.items[i].getAsString( 53 function () 54 {if(arguments[0]) 55 {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')} 56 } 57 ); 58 } 59 } 60 function enterElement(event) 61 {event.preventDefault(); 62 event.dataTransfer.items.clear(); 63 if(event.dataTransfer.items.length != dataTypes.length) 64 {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')} 65 for(var i = 0; i != event.dataTransfer.items.length; i++) 66 {delete event.dataTransfer.items[i]; 67 if(event.dataTransfer.items[i].kind != 'string') 68 {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')} 69 if(event.dataTransfer.items[i].type != dataTypes[i]) 70 {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')} 71 event.dataTransfer.items[i].getAsString( 72 function () 73 {if(arguments[0]) 74 {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')} 75 } 76 ); 77 } 78 } 79 function overElement(event) 80 {event.preventDefault(); 81 event.dataTransfer.items.clear(); 82 if(event.dataTransfer.items.length != dataTypes.length) 83 {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')} 84 for(var i = 0; i != event.dataTransfer.items.length; i++) 85 {if(event.dataTransfer.items[i].kind != 'string') 86 {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')} 87 if(event.dataTransfer.items[i].type != dataTypes[i]) 88 {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')} 89 event.dataTransfer.items[i].getAsString( 90 function () 91 {if(arguments[0]) 92 {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')} 93 } 94 ); 95 } 96 } 97 function dataDrop(event) 98 {e = 0; 99 event.dataTransfer.items.clear(); 100 if(event.dataTransfer.items.length != dataTypes.length) 101 {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')} 102 for(var i = 0; i != dataTypes.length; i++) 103 {if(event.dataTransfer.getData(dataTypes[i]) != data[i]) 104 {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')} 105 } 106 for(var i = 0; i != event.dataTransfer.items.length; i++) 107 {delete event.dataTransfer.items[i]; 108 if(event.dataTransfer.items[i].kind != 'string') 109 {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')} 110 if(event.dataTransfer.items[i].type != dataTypes[i]) 111 {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')} 112 event.dataTransfer.items[i].getAsString( 113 function () 114 {if(arguments[0] != data[e++]) 115 {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')} 116 } 117 ); 118 } 119 document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));} 120 function say(it) 121 {result = false; 122 document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));} 123 ]]> 124 </script> 125 </head> 126 <body> 127 <div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/> 128 <p>Drag green box above to the gray box below and drop it. Gray box should turn green.</p> 129 <div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/> 130 <pre/> 131 </body> 132 </html>