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