6 border: 1px solid black;
11 border: 1px solid black;
17 function assertEq(left, right)
20 log('PASS: ' + left + " === " + right);
22 log('FAIL: ' + left + "(of type " + (typeof left) + ") !== " + right + "(of type " + (typeof right) + ")");
26 var result = document.getElementById('result');
27 result.appendChild(document.createTextNode(str));
28 result.appendChild(document.createElement('br'));
31 function legacyDragStart(dataTransfer)
33 dataTransfer.setData('text', 'sample');
34 dataTransfer.setData('url', 'http://www.google.com/');
35 dataTransfer.setData('text/html', '<em>Markup</em>');
36 dataTransfer.setData('custom-data', 'hello world');
39 function itemListDragStart(dataTransfer)
41 dataTransfer.items.add('sample', 'text/plain');
42 dataTransfer.items.add('http://www.google.com/', 'text/uri-list');
43 dataTransfer.items.add('<em>Markup</em>', 'text/html');
44 dataTransfer.items.add('hello world', 'custom-data');
47 function dragstart(event)
49 var dragMethod = document.getElementById('dragMethod');
50 if (dragMethod.selectedIndex == 0)
51 legacyDragStart(event.dataTransfer);
52 else if (dragMethod.selectedIndex == 1)
53 itemListDragStart(event.dataTransfer);
56 function dragenter(event)
58 event.preventDefault();
61 function dragover(event)
63 event.preventDefault();
66 function legacyDrop(dataTransfer)
68 assertEq(4, dataTransfer.types.length);
69 if (dataTransfer.types.indexOf('text/plain') < 0)
70 log('FAIL: types array did not contain "text"');
71 if (dataTransfer.types.indexOf('text/uri-list') < 0)
72 log('FAIL: types array did not contain "text/uri-list"');
73 if (dataTransfer.types.indexOf('text/html') < 0)
74 log('FAIL: types array did not contain "text/html"');
75 if (dataTransfer.types.indexOf('custom-data') < 0)
76 log('FAIL: types array did not contain "custom-data"');
77 assertEq('sample', dataTransfer.getData('text'));
78 assertEq('http://www.google.com/', dataTransfer.getData('url'));
79 assertEq('<em>Markup</em>', dataTransfer.getData('text/html'));
80 assertEq('hello world', dataTransfer.getData('custom-data'));
84 var outstandingRequests;
85 function itemListDrop(dataTransfer)
87 outstandingRequests = 0;
88 assertEq(4, dataTransfer.items.length);
90 for (var i = 0; i < dataTransfer.items.length; ++i) {
91 types.push({kind: dataTransfer.items[i].kind, type: dataTransfer.items[i].type});
93 types.sort(function (a, b) { return a.type.localeCompare(b.type); });
95 { kind: 'string', type: 'custom-data'},
96 { kind: 'string', type: 'text/html'},
97 { kind: 'string', type: 'text/plain'},
98 { kind: 'string', type: 'text/uri-list'},
100 assertEq(JSON.stringify(expectedTypes), JSON.stringify(types));
101 var expectedResults = {
102 'custom-data': 'hello world',
103 'text/html': '<em>Markup</em>',
104 'text/plain': 'sample',
105 'text/uri-list': 'http://www.google.com/',
107 function makeClosure(expectedData)
109 ++outstandingRequests;
110 return function (data) {
111 assertEq(expectedData, data);
112 if (--outstandingRequests == 0)
113 window.setTimeout(runNext, 0);
116 // We use this funky loop to make sure we always print out results in the same order.
117 for (var i = 0; i < types.length; ++i) {
118 for (var j = 0; j < dataTransfer.items.length; ++j) {
119 if (types[i].type == dataTransfer.items[j].type) {
120 dataTransfer.items[j].getAsString(makeClosure(expectedResults[types[i].type]));
129 var dropMethod = document.getElementById('dropMethod');
130 if (dropMethod.selectedIndex == 0)
131 legacyDrop(event.dataTransfer);
132 else if (dropMethod.selectedIndex == 1)
133 itemListDrop(event.dataTransfer);
134 event.preventDefault();
137 function runTest(dragMethodIndex, dropMethodIndex)
139 var dragMethod = document.getElementById('dragMethod');
140 var dropMethod = document.getElementById('dropMethod');
141 dragMethod.selectedIndex = dragMethodIndex;
142 dropMethod.selectedIndex = dropMethodIndex;
143 log('Running test with ' + dragMethod.value + ' drag handler and ' + dropMethod.value + ' drop handler');
145 var dragElement = document.getElementById('drag');
146 eventSender.mouseMoveTo(dragElement.offsetLeft + dragElement.offsetWidth / 2,
147 dragElement.offsetTop + dragElement.offsetHeight / 2);
148 eventSender.mouseDown();
149 eventSender.leapForward(100);
150 var dropElement = document.getElementById('drop');
151 eventSender.mouseMoveTo(dropElement.offsetLeft + dropElement.offsetWidth / 2,
152 dropElement.offsetTop + dropElement.offsetHeight / 2);
153 eventSender.mouseUp();
164 if (!window.layoutTestController)
166 var testCase = testCases.shift();
168 runTest.apply(null, testCase);
170 layoutTestController.notifyDone();
173 window.onload = function()
175 if (!window.layoutTestController)
177 layoutTestController.dumpAsText();
178 layoutTestController.waitUntilDone();
185 <p>To manually test, drag 'Drag Me' to 'Drop Here' and drop. Several lines that say 'PASS' should appear below.
186 <div draggable="true" id="drag" ondragstart="dragstart(event)">Drag Me</div>
187 <div id="drop" ondragenter="dragenter(event)" ondragover="dragover(event)" ondrop="drop(event)">Drop Here</div>
189 <div>Drag handler: <select id="dragMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
190 <div>Drop handler: <select id="dropMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
191 <div id="result"></div>