Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: third_party/WebKit/LayoutTests/fast/dnd/file-drag-drop-on-page.html

Issue 2572023002: Remove special DataTransfer permissions for file: origins. (Closed)
Patch Set: Feedback from dcheng. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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();
jsbell 2016/12/16 21:16:15 nit: no () needed around single argument (here and
jsbell 2016/12/16 21:16:16 Something we should decide on in the style guide:
pwnall 2016/12/17 00:44:48 Done.
pwnall 2016/12/17 00:44:48 Done.
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 dropZone.ondrop = (event) => {
63 event.preventDefault(); // Needed to prevent drop navigation.
64 resolve(copyDataTransfer(event.dataTransfer));
65 };
66 });
67
68 const wrapperRect = dropWrapper.getBoundingClientRect();
jsbell 2016/12/16 21:16:15 These can move into the if block.
pwnall 2016/12/17 00:44:48 I have them outside so I can see typos in the cons
jsbell 2016/12/19 17:25:17 OK to leave as is.
69 const dropRect = dropZone.getBoundingClientRect();
70 if (window.eventSender) {
71 eventSender.mouseMoveTo(0, 0);
72 eventSender.beginDragWithFiles(['resources/dragged-file.txt']);
73
74 // dragenter + dragover on #dropwrapper
75 const wrapperX = wrapperRect.left + 10;
76 const wrapperY = wrapperRect.top + 10;
77 eventSender.mouseMoveTo(wrapperX, wrapperY);
78
79 // dragleave on #dropwrapper and dragenter + dragover + dragleave on #dropzone
80 setTimeout(() => {
81 const centerX = (dropRect.left + dropRect.right) / 2;
82 const centerY = (dropRect.top + dropRect.bottom) / 2;
83 eventSender.mouseMoveTo(centerX, centerY);
84 eventSender.mouseUp();
85 }, 16);
jsbell 2016/12/16 21:16:15 Why 16?
pwnall 2016/12/17 00:44:48 I wanted to have the move go in a different frame
86 }
87
88 promise_test(() => {
89 return dragEnterPromise.then((dataTransfer) => {
90 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]');
jsbell 2016/12/16 21:16:15 Will this work? assert_array_equals(dataTransfer.
pwnall 2016/12/17 00:44:48 Done. FWIW, I had assert_array_equals at first, b
jsbell 2016/12/19 17:25:17 Agreed. I think the tests should focus on expressi
pwnall 2016/12/19 21:51:19 Done. I filed https://github.com/w3c/testharness.j
91 });
92 }, 'dragenter types');
jsbell 2016/12/16 21:16:15 Can you clarify - in either the test names or asse
pwnall 2016/12/17 00:44:48 Done.
93
94 promise_test(() => {
95 return dragOverPromise.then((dataTransfer) => {
96 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]');
97 });
98 }, 'dragover types');
99
100 promise_test(() => {
101 return dragLeavePromise.then((dataTransfer) => {
102 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]');
103 });
104 }, 'dragleave types');
105
106 promise_test(() => {
107 return dropPromise.then((dataTransfer) => {
108 assert_equals(JSON.stringify(dataTransfer.types), '["Files"]');
109 });
110 }, 'drop types');
111
112 promise_test(() => {
113 return dragEnterPromise.then((dataTransfer) => {
114 assert_equals(dataTransfer.data['Files'], '');
115 });
116 }, 'dragenter getData() return value');
117
118 promise_test(() => {
119 return dragOverPromise.then((dataTransfer) => {
120 assert_equals(dataTransfer.data['Files'], '');
121 });
122 }, 'dragover getData() return value');
123
124 promise_test(() => {
125 return dragLeavePromise.then((dataTransfer) => {
126 assert_equals(dataTransfer.data['Files'], '');
127 });
128 }, 'dragleave getData() return value');
129
130 promise_test(() => {
131 return dropPromise.then((dataTransfer) => {
132 assert_equals(dataTransfer.data['Files'], '');
133 });
134 }, 'drop getData() return value');
135
136 promise_test(() => {
137 return dragEnterPromise.then((dataTransfer) => {
138 assert_equals(JSON.stringify(dataTransfer.files), '[]');
jsbell 2016/12/16 21:16:15 Can you assert that length is 0 rather than using
pwnall 2016/12/17 00:44:48 Done. I guess I don't have the same issue here as
139 });
140 }, 'dragenter files');
141
142 promise_test(() => {
143 return dragOverPromise.then((dataTransfer) => {
144 assert_equals(JSON.stringify(dataTransfer.files), '[]');
145 });
146 }, 'dragover files');
147
148 promise_test(() => {
149 return dragLeavePromise.then((dataTransfer) => {
150 assert_equals(JSON.stringify(dataTransfer.files), '[]');
151 });
152 }, 'dragleave files');
153
154 promise_test(() => {
155 return dropPromise.then((dataTransfer) => {
156 assert_equals(dataTransfer.files.length, 1);
157 const file = dataTransfer.files[0];
158 assert_equals(file.file.name, 'dragged-file.txt');
159 assert_equals(file.file.type, 'text/plain');
160 assert_equals(file.file.size, 21);
161 assert_equals(file.data, 'The test has FAILED.\n');
162 });
163 }, 'drop files');
164
165 promise_test(() => {
166 return dragEnterPromise.then((dataTransfer) => {
167 assert_equals(dataTransfer.items.length, 1);
168 const item = dataTransfer.items[0];
169 assert_equals(item.kind, 'file');
170 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF
171 assert_equals(item.file, null); // FF returns the file's metadata.
172 assert_equals(item.data, undefined);
173 assert_equals(item.error, undefined); // FF throws a SecurityError.
174 });
175 }, 'dragenter items');
176
177 promise_test(() => {
178 return dragOverPromise.then((dataTransfer) => {
179 assert_equals(dataTransfer.items.length, 1);
180 const item = dataTransfer.items[0];
181 assert_equals(item.kind, 'file');
182 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF
183 assert_equals(item.file, null); // FF returns the file's metadata.
184 assert_equals(item.data, undefined);
185 assert_equals(item.error, undefined); // FF throws a SecurityError.
186 });
187 }, 'dragover items');
188
189 promise_test(() => {
190 return dragLeavePromise.then((dataTransfer) => {
191 assert_equals(dataTransfer.items.length, 1);
192 const item = dataTransfer.items[0];
193 assert_equals(item.kind, 'file');
194 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF
195 assert_equals(item.file, null); // FF returns the file's metadata.
196 assert_equals(item.data, undefined);
197 assert_equals(item.error, undefined); // FF throws a SecurityError.
198 });
199 }, 'dragleave items');
200
201 promise_test(() => {
202 return dropPromise.then((dataTransfer) => {
203 assert_equals(dataTransfer.items.length, 1);
204 const item = dataTransfer.items[0];
205 assert_equals(item.kind, 'file');
206 assert_equals(item.type, 'text/plain'); // application/x-moz-file in FF
207 assert_equals(item.error, undefined);
208 assert_equals(item.file.name, 'dragged-file.txt');
209 assert_equals(item.file.type, 'text/plain');
210 assert_equals(item.file.size, 21);
211 assert_equals(item.data, 'The test has FAILED.\n');
212 });
213 }, 'drop items');
214
215 </script>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698