OLD | NEW |
---|---|
(Empty) | |
1 <!DOCTYPE html> | |
2 | |
3 <style> | |
4 #draggable, #testend { | |
5 border: 1px solid black; | |
6 width: 100px; | |
7 height: 100px; | |
8 margin: 20px; | |
9 } | |
10 </style> | |
11 | |
12 <div id="draggable" draggable="true"> | |
13 </div> | |
14 <div id="testend"> | |
15 </div> | |
16 <a id="link" href="https://www.chromium.org">A draggable link</a> | |
17 | |
18 <p> | |
19 This tests WebKit's drag and drop thresholds. Due to the fine movements | |
20 required, manual testing is not possible. | |
21 </p> | |
22 | |
23 <pre id="results"></pre> | |
24 | |
25 <script> | |
26 | |
27 function runCase(name, target, deltaX, deltaY, expectedDrag) { | |
28 const draggableCenterX = target.offsetLeft + target.offsetWidth / 2; | |
29 const draggableCenterY = target.offsetTop + target.offsetHeight / 2; | |
30 | |
31 const testEnd = document.getElementById('testend'); | |
32 const endCenterX = testEnd.offsetLeft + testEnd.offsetWidth / 2; | |
33 const endCenterY = testEnd.offsetTop + testEnd.offsetHeight / 2; | |
34 | |
35 let dragStarted = false; | |
36 target.ondragstart = () => { dragStarted = true; } | |
37 | |
38 const testEndPromise = new Promise((resolve, reject) => { | |
39 testEnd.onmouseup = () => { resolve(true); } | |
40 | |
41 eventSender.mouseMoveTo(draggableCenterX, draggableCenterY); | |
42 eventSender.mouseDown(); | |
43 setTimeout(() => { | |
44 eventSender.mouseMoveTo( | |
45 draggableCenterX + deltaX, draggableCenterY + deltaY); | |
46 eventSender.mouseUp(); | |
47 | |
48 eventSender.mouseMoveTo(endCenterX, endCenterY); | |
49 eventSender.mouseDown(); | |
50 eventSender.mouseUp(); | |
51 }, 100); | |
52 }); | |
53 | |
54 return testEndPromise.then(() => { | |
55 verdict = (expectedDrag === dragStarted) ? 'OK' : 'FAILED'; | |
56 results.textContent += | |
57 `${name}: ${verdict} expected ${expectedDrag} got ${dragStarted}\n`; | |
58 }); | |
59 } | |
60 | |
61 window.onload = () => { | |
62 if (!window.testRunner) | |
63 return; | |
64 | |
65 testRunner.dumpAsText(); | |
66 testRunner.waitUntilDone(); | |
67 | |
68 const draggable = document.getElementById('draggable'); | |
69 const link = document.getElementById('link'); | |
70 link.onclick = (event) => event.preventDefault(); | |
71 | |
72 const testCases = [ | |
73 ['No movement', draggable, 0, 0, false], | |
74 ['Small positive X movement', draggable, 2, 0, false], | |
75 ['Large positive X movement', draggable, 20, 0, true], | |
76 ['Small negative X movement', draggable, -2, 0, false], | |
77 ['Large negative X movement', draggable, -20, 0, true], | |
78 ['Small positive Y movement', draggable, 0, 2, false], | |
79 ['Large positive Y movement', draggable, 0, 20, true], | |
80 ['Small negative Y movement', draggable, 0, -2, false], | |
81 ['Large negative Y movement', draggable, 0, 20, true], | |
82 ['Small positive X + positive Y movement', draggable, 2, 2, false], | |
83 ['Small negative X + positive Y movement', draggable, -2, 2, false], | |
84 ['Small positive X + negative Y movement', draggable, 2, -2, false], | |
85 ['Small negative X + negative Y movement', draggable, -2, -2, false], | |
86 ['Link, small positive X movement', link, 2, 0, false], | |
87 ['Link, large positive X movement', link, 20, 0, true], | |
88 ['Link, small negative X movement', link, -2, 0, false], | |
89 ['Link, large negative X movement', link, -20, 0, true], | |
90 ['Link, small positive Y movement', link, 0, 2, false], | |
91 ['Link, large positive Y movement', link, 0, 20, true], | |
92 ['Link, small negative Y movement', link, 0, -2, false], | |
93 ['Link, large negative Y movement', link, 0, 20, true], | |
94 ]; | |
95 | |
96 let promise = Promise.resolve(true); | |
97 for (const testCase of testCases) { | |
98 promise = promise.then(() => runCase(...testCase)); | |
99 } | |
100 promise.then(() => testRunner.notifyDone()); | |
101 }; | |
102 | |
103 </script> | |
dcheng
2016/10/20 02:40:47
Thanks for the good test! Would you be willing to
pwnall
2016/10/20 05:25:30
Done.
Thank you for the suggestion! I didn't think
| |
OLD | NEW |