summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/editing/dnd/datastore
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /testing/web-platform/tests/html/editing/dnd/datastore
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'testing/web-platform/tests/html/editing/dnd/datastore')
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/001.xhtml71
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/002.xhtml54
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/003.xhtml55
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/004.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/005.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/006.xhtml55
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/007.xhtml57
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/008.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/009-1.xhtml35
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/009.xhtml30
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/010-1.xhtml27
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/010.xhtml47
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/011.xhtml32
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/012.xhtml33
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/013-1.xhtml28
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/013.xhtml10
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/014-1.xhtml55
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/014.xhtml10
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/015-manual.html62
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/016.xhtml58
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/017.xhtml58
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/018.xhtml59
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/019.xhtml59
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/020.xhtml64
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/021.xhtml60
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/022.xhtml74
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/023.xhtml55
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/024.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/025.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/026.xhtml57
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/027.xhtml58
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/028.xhtml62
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/029.xhtml58
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/030.xhtml72
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/031.xhtml141
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/032.xhtml125
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/033.xhtml125
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/034.xhtml126
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/035.xhtml126
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/036.xhtml125
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/037.xhtml127
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/038.xhtml146
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/039.xhtml131
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/040.xhtml131
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/041.xhtml132
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/042.xhtml132
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/043.xhtml131
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/044.xhtml132
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/045.xhtml57
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/046.xhtml172
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/047.xhtml157
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/048.xhtml157
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/049.xhtml158
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/050.xhtml158
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/051.xhtml157
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/052.xhtml158
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/053.html83
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/054.html83
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/055.html46
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/056.xhtml55
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/057.xhtml56
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/058.html79
-rw-r--r--testing/web-platform/tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml35
63 files changed, 5176 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/001.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/001.xhtml
new file mode 100644
index 000000000..a6f538710
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/001.xhtml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/002.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/002.xhtml
new file mode 100644
index 000000000..5bbfb9a4d
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/002.xhtml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/003.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/003.xhtml
new file mode 100644
index 000000000..dbd5851a5
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/003.xhtml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/004.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/004.xhtml
new file mode 100644
index 000000000..cdf2d16c7
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/004.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/005.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/005.xhtml
new file mode 100644
index 000000000..949e6c3ca
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/005.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/006.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/006.xhtml
new file mode 100644
index 000000000..24e30bd83
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/006.xhtml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/007.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/007.xhtml
new file mode 100644
index 000000000..66c89a24f
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/007.xhtml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.setData/getData during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/008.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/008.xhtml
new file mode 100644
index 000000000..1ff328d9e
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/008.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Influence of reload during drag and drop on datastore</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location.reload();}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/009-1.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/009-1.xhtml
new file mode 100644
index 000000000..ed55dc5a4
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/009-1.xhtml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Redirect during drag and drop: helper file</title>
+<style type="text/css">
+html, body
+ {height:100%;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)">
+<p>Drop box here. Page should turn green and test results should appear below.</p>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/009.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/009.xhtml
new file mode 100644
index 000000000..d0719fdfd
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/009.xhtml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Influence of redirect during drag and drop on datastore</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location = '009-1.xhtml'}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)"/>
+<p>Try to drag box above. You should be redirected to the new page and be able to drop it there.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/010-1.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/010-1.xhtml
new file mode 100644
index 000000000..427624a6f
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/010-1.xhtml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>History navigation during drag and drop: helper file</title>
+<style type="text/css">
+div[ondragenter]
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
+div[ondragenter]:before
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
+</style>
+</head>
+<body>
+<p>Drag box to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
+<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/010.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/010.xhtml
new file mode 100644
index 000000000..9e32b36f3
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/010.xhtml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Influence of history navigation during drag and drop on datastore</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location = '010-1.xhtml'}
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)"/>
+<p>Drag green box above. You will be redirected to new page. When you return back drop it on the gray box below. Gray box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/011.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/011.xhtml
new file mode 100644
index 000000000..6b51611eb
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/011.xhtml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: dragging element to iframe</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
+iframe
+ {width:500px;
+ height:500px;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)"/>
+<p>Drag box above to the frame below.</p>
+<iframe src="helper-drop-box-here.xhtml">XHTML document</iframe>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/012.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/012.xhtml
new file mode 100644
index 000000000..b80ed24fa
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/012.xhtml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: dragging element to object</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
+object
+ {width:500px;
+ height:500px;
+ border:solid medium navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)"/>
+<p>Drag box above to the frame below.</p>
+<object type="application/xhtml+xml" data="helper-drop-box-here.xhtml">XHTML document</object>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/013-1.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/013-1.xhtml
new file mode 100644
index 000000000..d724679e6
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/013-1.xhtml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: helper file</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)"/>
+<p>Drag box above to the frame below.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/013.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/013.xhtml
new file mode 100644
index 000000000..312a66d1f
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/013.xhtml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: dragging element between frames</title>
+</head>
+<frameset rows="50%, 50%">
+<frame src="013-1.xhtml"/>
+<frame src="helper-drop-box-here.xhtml"/>
+</frameset>
+</html>
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/014-1.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/014-1.xhtml
new file mode 100644
index 000000000..7a5069317
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/014-1.xhtml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: helper file</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link from one frame to the silver box in another frame and drop it. Silver box should turn green and test results should appear.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/014.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/014.xhtml
new file mode 100644
index 000000000..e1892c5a3
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/014.xhtml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: dragging element between two instances of document</title>
+</head>
+<frameset rows="50%, 50%">
+<frame src="014-1.xhtml"/>
+<frame src="014-1.xhtml"/>
+</frameset>
+</html>
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/015-manual.html b/testing/web-platform/tests/html/editing/dnd/datastore/015-manual.html
new file mode 100644
index 000000000..74fff038d
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/015-manual.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Using 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 () {
+ test(function () {
+ assert_equals( dataTransfer.getData('text'), '', 'step 1' );
+ dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( dataTransfer.getData('text'), '', 'step 2' );
+ },'dragstart data store should be protected after new thread starts');
+ },0);
+ };
+
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
+
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ var dataTransfer = e.dataTransfer;
+ setTimeout(function () {
+ test(function () {
+ assert_equals( dataTransfer.getData('text'), '', 'step 1' );
+ dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( dataTransfer.getData('text'), '', 'step 2' );
+ },'drop data store should be protected after new thread starts');
+ 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> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/016.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/016.xhtml
new file mode 100644
index 000000000..5c5a49a2a
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/016.xhtml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/017.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/017.xhtml
new file mode 100644
index 000000000..2cf031c12
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/017.xhtml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/018.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/018.xhtml
new file mode 100644
index 000000000..ecf703b73
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/018.xhtml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/019.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/019.xhtml
new file mode 100644
index 000000000..2aa803c61
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/019.xhtml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/020.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/020.xhtml
new file mode 100644
index 000000000..73689e1da
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/020.xhtml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/021.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/021.xhtml
new file mode 100644
index 000000000..a32ce7280
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/021.xhtml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/022.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/022.xhtml
new file mode 100644
index 000000000..1e1eb64ce
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/022.xhtml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/023.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/023.xhtml
new file mode 100644
index 000000000..bf58316e6
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/023.xhtml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.clearData and reload during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ window.location.reload();}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ }
+function dataDrop(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/024.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/024.xhtml
new file mode 100644
index 000000000..5629bd746
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/024.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/025.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/025.xhtml
new file mode 100644
index 000000000..7ac04e6e3
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/025.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/026.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/026.xhtml
new file mode 100644
index 000000000..8b2fd3714
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/026.xhtml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/027.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/027.xhtml
new file mode 100644
index 000000000..ecd57b3ac
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/027.xhtml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
+l = 0;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/028.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/028.xhtml
new file mode 100644
index 000000000..e6aec005e
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/028.xhtml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/029.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/029.xhtml
new file mode 100644
index 000000000..e8471a198
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/029.xhtml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/030.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/030.xhtml
new file mode 100644
index 000000000..31263c3f5
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/030.xhtml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Clear datastore data during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</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">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/031.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/031.xhtml
new file mode 100644
index 000000000..a275fcb74
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/031.xhtml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/032.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/032.xhtml
new file mode 100644
index 000000000..9aca29597
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/032.xhtml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', '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'],
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/033.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/033.xhtml
new file mode 100644
index 000000000..d7aa67d3a
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/033.xhtml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', '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'],
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/034.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/034.xhtml
new file mode 100644
index 000000000..1eeb227fc
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/034.xhtml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/035.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/035.xhtml
new file mode 100644
index 000000000..797f7669e
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/035.xhtml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/036.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/036.xhtml
new file mode 100644
index 000000000..ce4bd16ab
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/036.xhtml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'],
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/037.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/037.xhtml
new file mode 100644
index 000000000..4a2023ac7
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/037.xhtml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/038.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/038.xhtml
new file mode 100644
index 000000000..35826b0cd
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/038.xhtml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/039.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/039.xhtml
new file mode 100644
index 000000000..37f165fe1
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/039.xhtml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/040.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/040.xhtml
new file mode 100644
index 000000000..19ed6e146
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/040.xhtml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/041.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/041.xhtml
new file mode 100644
index 000000000..7bd22d848
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/041.xhtml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/042.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/042.xhtml
new file mode 100644
index 000000000..945de1171
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/042.xhtml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/043.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/043.xhtml
new file mode 100644
index 000000000..c42baa09d
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/043.xhtml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/044.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/044.xhtml
new file mode 100644
index 000000000..9a1efdcc0
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/044.xhtml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.items and getData during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(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)')}
+ }
+ );
+ }
+ }
+function enterElement(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)')}
+ }
+ );
+ }
+ }
+function overElement(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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/045.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/045.xhtml
new file mode 100644
index 000000000..e354ff7f1
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/045.xhtml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Text and url aliases</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text', 'url', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/046.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/046.xhtml
new file mode 100644
index 000000000..8a4a3cbae
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/046.xhtml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during canvas drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+</p>
+<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+<script type="application/ecmascript">
+var canvas = document.querySelector('canvas'),
+c = canvas.getContext('2d');
+for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+data[1] = canvas.toDataURL('image/png');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/047.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/047.xhtml
new file mode 100644
index 000000000..fc43f811c
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/047.xhtml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during PNG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/048.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/048.xhtml
new file mode 100644
index 000000000..49c87f722
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/048.xhtml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during SVG image drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><img ondragstart="start(event)" ondrag="dragElement(event)" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
+<p>Drag circle above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/049.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/049.xhtml
new file mode 100644
index 000000000..5c810dd2a
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/049.xhtml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during text input selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="document.querySelector('input').select()">
+<p><input value="Drag me" ondragstart="start(event)" ondrag="dragElement(event)"/></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/050.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/050.xhtml
new file mode 100644
index 000000000..33e41c653
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/050.xhtml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during selection drag and drop</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+data = ['Drag me', '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'];
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/051.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/051.xhtml
new file mode 100644
index 000000000..f073c6078
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/051.xhtml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during link drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/052.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/052.xhtml
new file mode 100644
index 000000000..65983990f
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/052.xhtml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>dataTransfer.types during block element drag and drop</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
+p + div
+ {background-color:gray;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'],
+e = 0, result = true;
+function start(event)
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ }
+function dragElement(event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function enterElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function overElement(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ 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)')}
+ }
+ );
+ }
+ }
+function dataDrop(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 + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ 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] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+function say(it)
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<div draggable="true" ondragstart="start(event)" ondrag="dragElement(event)"/>
+<p>Drag green box above to the gray box below and drop it. Gray box should turn green.</p>
+<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/053.html b/testing/web-platform/tests/html/editing/dnd/datastore/053.html
new file mode 100644
index 000000000..9f1a0d730
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/053.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Adding a file to dnd data store</title>
+ <style type="text/css">
+span { display: inline-block; height: 100px; width: 100px; background: orange; }
+span + span { background: blue; }
+ </style>
+ <script type="text/javascript">
+window.onload = function () {
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ var drop = document.getElementsByTagName('span')[1];
+ drop.ondragenter = drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
+};
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/054.html b/testing/web-platform/tests/html/editing/dnd/datastore/054.html
new file mode 100644
index 000000000..0c6a1200a
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/054.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Adding a file to dnd data store with drag out of window</title>
+ <style type="text/css">
+span { display: inline-block; height: 100px; width: 100px; background: orange; }
+span + span { background: blue; }
+ </style>
+ <script type="text/javascript">
+window.onload = function () {
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ var drop = document.getElementsByTagName('span')[1];
+ drop.ondragenter = drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
+};
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square outside the browser window (not over the taskbar), then back onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/055.html b/testing/web-platform/tests/html/editing/dnd/datastore/055.html
new file mode 100644
index 000000000..570571e9b
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/055.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<html>
+ <head>
+ <title>text/uri-list conversion</title>
+ <style type="text/css">
+div { height: 100px; width: 100px; background: orange; }
+ </style>
+ <script type="text/javascript">
+window.onload = function () {
+ var drag = document.getElementsByTagName('div')[0], fails = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('url','http://example.com/');
+ if( !e.dataTransfer.getData('url') ) {
+ document.getElementsByTagName('p')[0].innerHTML = "FAIL - getData('url') returned nothing";
+ } else if( e.dataTransfer.getData('url') != e.dataTransfer.getData('text/uri-list') ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list is not the same as url';
+ } else {
+
+ e.dataTransfer.setData('url','#foo\r\n http://example.com/#bar \r\n http://example.org/');
+ if( e.dataTransfer.getData('url') != 'http://example.com/#bar' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - only the first URL should be returned - "'+e.dataTransfer.getData('url')+'"';
+ } else if( e.dataTransfer.getData('text/uri-list') != '#foo\r\n http://example.com/#bar \r\n http://example.org/' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list should return the full data';
+ } else {
+
+ e.dataTransfer.setData('url',' ');
+ if( e.dataTransfer.getData('url') ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - space was not a valid URL so an empty string should have been returned';
+ } else {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+
+ }
+
+ }
+ e.preventDefault();
+ };
+};
+ </script>
+ </head>
+ <body>
+ <div draggable="true"></div>
+ <p>Attempt to drag the orange square.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/056.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/056.xhtml
new file mode 100644
index 000000000..dd85dbe88
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/056.xhtml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Caseinsensitivity in dataTransfer.setData/getData</title>
+<style type="text/css">
+div
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
+</style>
+<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,1', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData((i%2 == 0)?(dataTypes[i].toUpperCase()):(dataTypes[i].replace(/i/g,'I')), data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData((i%2 == 0)?(dataTypes[i].replace(/t/g,'T')):(dataTypes[i].toUpperCase())) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body>
+<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="dragElement(event)">Drag me</a></p>
+<p>Drag link above to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/057.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/057.xhtml
new file mode 100644
index 000000000..4c6f6f579
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/057.xhtml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Various data item type strings in dataTransfer.setData/getData</title>
+<style type="text/css">
+div
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'http://', '<?xml version="1.0" encoding="utf-8"?>', '<html xmlns="http://www.w3.org/1999/xhtml"/>', '<mn>1</mn>', '☺', 'type="text/html"', '[({#;:,.`~*-_=+\|/%!?&$@^})]'],
+data = ['Drag me', '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'];
+function start(event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
+function dragElement(event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(string' + i + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
+<p><span ondragstart="start(event)" ondrag="dragElement(event)">Drag me</span></p>
+<p>Drag selection above to the navy box below and drop it. Navy box should turn green and test results should appear below.</p>
+<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
+<pre/>
+</body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/058.html b/testing/web-platform/tests/html/editing/dnd/datastore/058.html
new file mode 100644
index 000000000..1bf9e5801
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/058.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Dropping file into dropzone</title>
+ <style type="text/css">
+span { display: inline-block; height: 100px; width: 100px; background: orange; }
+span + span { background: blue; }
+ </style>
+ <script type="text/javascript">
+window.onload = function () {
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ document.getElementsByTagName('span')[1].ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
+};
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty plain text file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span dropzone="copy file:text/plain"></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html> \ No newline at end of file
diff --git a/testing/web-platform/tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml b/testing/web-platform/tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml
new file mode 100644
index 000000000..70341c5c6
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Drag and drop datastore: helper file</title>
+<style type="text/css">
+html, body
+ {height:100%;}
+</style>
+<script type="application/ecmascript">
+<![CDATA[
+var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
+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'];
+function enterElement(event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+function dataDrop(event)
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
+function say(it)
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+]]>
+</script>
+</head>
+<body ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)">
+<p>Drop box here. Frame should turn green and test results should appear below.</p>
+<pre/>
+</body>
+</html> \ No newline at end of file