Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <!doctype html> | |
| 2 <meta charset="utf-8" /> | |
| 3 <script src="../../resources/testharness.js"></script> | |
| 4 <script src="../../resources/testharnessreport.js"></script> | |
| 5 <script src="resources/copy-data-transfer.js"></script> | |
| 6 <style> | |
| 7 #dropwrapper { | |
| 8 display: block; | |
| 9 width: 400px; | |
| 10 height: 200px; | |
| 11 position: relative; | |
| 12 padding: 50px 0 0 100px; | |
| 13 } | |
| 14 #dropzone { | |
| 15 display: block; | |
| 16 border: 1px solid black; | |
| 17 width: 200px; | |
| 18 height: 100px; | |
| 19 } | |
| 20 </style> | |
| 21 | |
| 22 <p> | |
| 23 Please download <a download href="resources/dragged-file.txt">this file</a>, | |
| 24 and drag it into the box below. | |
| 25 </p> | |
| 26 | |
| 27 <div id="dropwrapper"> | |
| 28 <div id="dropzone"> | |
| 29 Drop Here | |
| 30 </div> | |
| 31 </div> | |
| 32 | |
| 33 <script> | |
| 34 | |
| 35 const dropWrapper = document.querySelector('#dropwrapper'); | |
| 36 const dropZone = document.querySelector('#dropzone'); | |
| 37 | |
| 38 const dragEnterPromise = new Promise((resolve, reject) => { | |
| 39 // Needed to keep the drag-and-drop going. | |
| 40 dropWrapper.ondragenter = (event) => event.preventDefault(); | |
| 41 | |
| 42 dropZone.ondragenter = (event) => { | |
| 43 event.preventDefault(); // Needed to keep the drag-and-drop going. | |
| 44 resolve(copyDataTransfer(event.dataTransfer)); | |
| 45 }; | |
| 46 }); | |
| 47 const dragOverPromise = new Promise((resolve, reject) => { | |
| 48 // Needed to keep the drag-and-drop going. | |
| 49 dropZone.ondragover = (event) => event.preventDefault(); | |
| 50 | |
| 51 dropWrapper.ondragover = (event) => { | |
| 52 event.preventDefault(); // Needed to keep the drag-and-drop going. | |
| 53 resolve(copyDataTransfer(event.dataTransfer)); | |
| 54 }; | |
| 55 }); | |
| 56 const dragLeavePromise = new Promise((resolve, reject) => { | |
| 57 dropWrapper.ondragleave = (event) => { | |
| 58 resolve(copyDataTransfer(event.dataTransfer)); | |
| 59 }; | |
| 60 }); | |
| 61 const dropPromise = new Promise((resolve, reject) => { | |
| 62 dropWrapper.ondrop = (event) => event.preventDefault(); | |
|
dcheng
2016/12/16 18:41:57
Why do we need to install listeners on the wrapper
pwnall
2016/12/16 19:37:38
Ahh, good point. Thank you very much for catching
| |
| 63 | |
| 64 dropZone.ondrop = (event) => { | |
| 65 event.preventDefault(); // Needed to prevent drop navigation. | |
| 66 resolve(copyDataTransfer(event.dataTransfer)); | |
| 67 }; | |
| 68 }); | |
| 69 | |
| 70 const wrapperRect = dropWrapper.getBoundingClientRect(); | |
| 71 const dropRect = dropZone.getBoundingClientRect(); | |
| 72 if (window.eventSender) { | |
| 73 eventSender.mouseMoveTo(0, 0); | |
| 74 eventSender.beginDragWithFiles(['resources/dragged-file.txt']); | |
| 75 | |
| 76 // dragenter + dragover on #dropwrapper | |
| 77 const wrapperX = wrapperRect.left + 10; | |
| 78 const wrapperY = wrapperRect.top + 10; | |
| 79 eventSender.mouseMoveTo(wrapperX, wrapperY); | |
| 80 | |
| 81 // dragleave on #dropwrapper and dragenter + dragover + dragleave on #dropzone | |
| 82 setTimeout(() => { | |
| 83 const centerX = (dropRect.left + dropRect.right) / 2; | |
| 84 const centerY = (dropRect.top + dropRect.bottom) / 2; | |
| 85 eventSender.mouseMoveTo(centerX, centerY); | |
| 86 eventSender.mouseUp(); | |
| 87 }, 16); | |
| 88 } | |
| 89 | |
| 90 promise_test(() => { | |
| 91 return dragEnterPromise.then((dataTransfer) => { | |
| 92 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]'); | |
| 93 }); | |
| 94 }, 'dragenter types'); | |
| 95 | |
| 96 promise_test(() => { | |
| 97 return dragOverPromise.then((dataTransfer) => { | |
| 98 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]'); | |
| 99 }); | |
| 100 }, 'dragover types'); | |
| 101 | |
| 102 promise_test(() => { | |
| 103 return dragLeavePromise.then((dataTransfer) => { | |
| 104 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]'); | |
| 105 }); | |
| 106 }, 'dragleave types'); | |
| 107 | |
| 108 promise_test(() => { | |
| 109 return dropPromise.then((dataTransfer) => { | |
| 110 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]'); | |
| 111 }); | |
| 112 }, 'drop types'); | |
| 113 | |
| 114 promise_test(() => { | |
| 115 return dragEnterPromise.then((dataTransfer) => { | |
| 116 assert_equals(dataTransfer.data['Files'], ''); | |
| 117 }); | |
| 118 }, 'dragenter getData() return value'); | |
| 119 | |
| 120 promise_test(() => { | |
| 121 return dragOverPromise.then((dataTransfer) => { | |
| 122 assert_equals(dataTransfer.data['Files'], ''); | |
| 123 }); | |
| 124 }, 'dragover getData() return value'); | |
| 125 | |
| 126 promise_test(() => { | |
| 127 return dragLeavePromise.then((dataTransfer) => { | |
| 128 assert_equals(dataTransfer.data['Files'], ''); | |
| 129 }); | |
| 130 }, 'dragleave getData() return value'); | |
| 131 | |
| 132 promise_test(() => { | |
| 133 return dropPromise.then((dataTransfer) => { | |
| 134 assert_equals(dataTransfer.data['Files'], ''); | |
| 135 }); | |
| 136 }, 'drop getData() return value'); | |
| 137 | |
| 138 promise_test(() => { | |
| 139 return dragEnterPromise.then((dataTransfer) => { | |
| 140 assert_equals(JSON.stringify(dataTransfer.files), '[]'); | |
| 141 }); | |
| 142 }, 'dragenter files'); | |
| 143 | |
| 144 promise_test(() => { | |
| 145 return dragOverPromise.then((dataTransfer) => { | |
| 146 assert_equals(JSON.stringify(dataTransfer.files), '[]'); | |
| 147 }); | |
| 148 }, 'dragover files'); | |
| 149 | |
| 150 promise_test(() => { | |
| 151 return dragLeavePromise.then((dataTransfer) => { | |
| 152 assert_equals(JSON.stringify(dataTransfer.files), '[]'); | |
| 153 }); | |
| 154 }, 'dragleave files'); | |
| 155 | |
| 156 promise_test(() => { | |
| 157 return dropPromise.then((dataTransfer) => { | |
| 158 assert_equals(dataTransfer.files.length, 1); | |
| 159 const file = dataTransfer.files[0]; | |
| 160 assert_equals(file.file.name, 'dragged-file.txt'); | |
| 161 assert_equals(file.file.type, 'text/plain'); | |
| 162 assert_equals(file.file.size, 21); | |
| 163 assert_equals(file.data, 'The test has FAILED.\n'); | |
| 164 }); | |
| 165 }, 'drop files'); | |
| 166 | |
| 167 promise_test(() => { | |
| 168 return dragEnterPromise.then((dataTransfer) => { | |
| 169 assert_equals(dataTransfer.items.length, 1); | |
| 170 const item = dataTransfer.items[0]; | |
| 171 assert_equals(item.kind, 'file'); | |
| 172 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF | |
| 173 assert_equals(item.file, null); // FF returns the file's metadata. | |
| 174 assert_equals(item.data, undefined); | |
| 175 assert_equals(item.error, undefined); // FF throws a SecurityError. | |
| 176 }); | |
| 177 }, 'dragenter items'); | |
| 178 | |
| 179 promise_test(() => { | |
| 180 return dragOverPromise.then((dataTransfer) => { | |
| 181 assert_equals(dataTransfer.items.length, 1); | |
| 182 const item = dataTransfer.items[0]; | |
| 183 assert_equals(item.kind, 'file'); | |
| 184 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF | |
| 185 assert_equals(item.file, null); // FF returns the file's metadata. | |
| 186 assert_equals(item.data, undefined); | |
| 187 assert_equals(item.error, undefined); // FF throws a SecurityError. | |
| 188 }); | |
| 189 }, 'dragover items'); | |
| 190 | |
| 191 promise_test(() => { | |
| 192 return dragLeavePromise.then((dataTransfer) => { | |
| 193 assert_equals(dataTransfer.items.length, 1); | |
| 194 const item = dataTransfer.items[0]; | |
| 195 assert_equals(item.kind, 'file'); | |
| 196 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF | |
| 197 assert_equals(item.file, null); // FF returns the file's metadata. | |
| 198 assert_equals(item.data, undefined); | |
| 199 assert_equals(item.error, undefined); // FF throws a SecurityError. | |
| 200 }); | |
| 201 }, 'dragleave items'); | |
| 202 | |
| 203 promise_test(() => { | |
| 204 return dropPromise.then((dataTransfer) => { | |
| 205 assert_equals(dataTransfer.items.length, 1); | |
| 206 const item = dataTransfer.items[0]; | |
| 207 assert_equals(item.kind, 'file'); | |
| 208 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF | |
| 209 assert_equals(item.error, undefined); | |
| 210 assert_equals(item.file.name, 'dragged-file.txt'); | |
| 211 assert_equals(item.file.type, 'text/plain'); | |
| 212 assert_equals(item.file.size, 21); | |
| 213 assert_equals(item.data, 'The test has FAILED.\n'); | |
| 214 }); | |
| 215 }, 'drop items'); | |
| 216 | |
| 217 </script> | |
| OLD | NEW |