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 |