3 <script src="../js/resources/js-test-pre.js"></script>
5 #dropTarget, #dragMe { text-align: center; display: table-cell; vertical-align: middle }
6 #dropTarget {width: 256px; height: 256px; border: 1px dashed}
7 #dragMe {-webkit-user-drag: element; -webkit-user-select: none; background: #ff0000; width: 64px; height: 64px; color: white}
12 var effectAllowedElem;
17 window.onload = function()
19 dragMe = document.getElementById("dragMe");
20 dropTarget = document.getElementById("dropTarget");
21 effectAllowedElem = document.getElementById("effectAllowed");
22 dropEffectElem = document.getElementById("dropEffect");
23 consoleElm = document.getElementById("console");
25 if (!dragMe || !dropTarget || !effectAllowedElem || !dropEffectElem || !consoleElm)
28 dragMe.ondragstart = dragStart;
29 dragMe.ondragend = dragEnd;
31 dropTarget.ondragenter = dragEntered;
32 dropTarget.ondragover = dragOver;
33 dropTarget.ondrop = drop;
41 if (effectAllowedElem.options[effectAllowedElem.selectedIndex].value != "undefined")
42 e.dataTransfer.effectAllowed = effectAllowedElem.options[effectAllowedElem.selectedIndex].value;
44 e.dataTransfer.setData('Text', e.target.textContent);
53 function dragEntered(e)
55 dragEnteredAndUpdated(e);
60 dragEnteredAndUpdated(e);
63 function dragEnteredAndUpdated(e)
66 e.dataTransfer.dropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
75 function cancelDrag(e)
80 // Assume this script is executing within Internet Explorer
81 e.returnValue = false;
85 function checkDragState(e)
88 var chosenDropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
89 var chosenEffectAllowed = effectAllowedElem.options[effectAllowedElem.selectedIndex].value;
90 var actualDropEffect = e.dataTransfer.dropEffect;
92 if (chosenEffectAllowed === "undefined") {
93 // If no effectAllowed is set, we should default to uninitialized. Make sure that's the case.
94 shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
96 // Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
97 // doesn't need special cases for undefined.
98 chosenEffectAllowed = "uninitialized";
101 if (chosenEffectAllowed === "dummy") {
102 // If a bad effectAllowed is attempted to be set, it should never be set, and the
103 // effectAllowed should be uninitialized.
104 shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
106 // Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
107 // doesn't need special cases for undefined.
108 chosenEffectAllowed = "uninitialized";
110 expected = dropEffectElem.options[dropEffectElem.selectedIndex].value;
111 if (chosenDropEffect == "dummy") {
112 switch (chosenEffectAllowed) {
115 case "uninitialized":
125 expected = chosenEffectAllowed;
128 if (isDropEffectAllowed(chosenDropEffect, chosenEffectAllowed))
129 shouldBeEqualToString('event.dataTransfer.dropEffect', expected);
131 shouldBeEqualToString('event.dataTransfer.dropEffect', 'none');
135 function isDropEffectAllowed(chosenDropEffect, allowedDropEffect) {
136 // Extracted from the HTML 5 drag-and-drop section, http://dev.w3.org/html5/spec/Overview.html#dnd
137 if (chosenDropEffect == "none")
139 if (chosenDropEffect == "copy" && ["copy", "copyLink", "copyMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
141 if (chosenDropEffect == "move" && ["move", "copyMove", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
143 if (chosenDropEffect == "link" && ["link", "copyLink", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
145 if (chosenDropEffect == "dummy" && ["copy", "link", "move", "copyLink", "copyMove", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
152 if (!window.eventSender)
155 if (window.testRunner)
156 testRunner.dumpAsText();
158 var startX = dragMe.offsetLeft + 10;
159 var startY = dragMe.offsetTop + dragMe.offsetHeight / 2;
160 var endX = dropTarget.offsetLeft + 10;
161 var endY = dropTarget.offsetTop + dropTarget.offsetHeight / 2;
163 var numEffectAllowed = effectAllowedElem.options.length;
164 var numEffects = dropEffectElem.options.length;
166 for (var i = 0; i < numEffectAllowed; ++i) {
167 effectAllowedElem.options[i].selected = true;
168 debug('<br />When effectAllowed == "' + effectAllowedElem.options[i].value + '"<br />');
169 for (var j = 0; j < numEffects; ++j) {
170 dropEffectElem.options[j].selected = true;
171 eventSender.mouseMoveTo(startX, startY);
172 eventSender.mouseDown();
173 eventSender.leapForward(100);
174 eventSender.mouseMoveTo(endX, endY);
175 eventSender.mouseUp();
178 var testContainer = document.getElementById("test-container");
180 document.body.removeChild(testContainer);
181 debug('<br /><span class="pass">TEST COMPLETE</span>');
186 <p id="description"></p>
187 <div id="test-container">
188 <label for="effectAllowed">effectAllowed</label> <select id="effectAllowed">
189 <option value="uninitialized">Uninitialized</option>
190 <option value="undefined">Undefined</option>
191 <option value="none">None</option>
192 <option value="all">All</option>
193 <option value="copy">Copy</option>
194 <option value="move">Move</option>
195 <option value="link">Link</option>
196 <option value="copyMove">CopyMove</option>
197 <option value="copyLink">CopyLink</option>
198 <option value="linkMove">LinkMove</option>
199 <option value="dummy">Nonexistent (Dummy) Effect</option>
202 <div id="dropTarget">Drop the red square onto me.<br/><br/>
203 <label for="dropEffect">Expects dropEffect</label> <select id="dropEffect">
204 <option value="none">None</option>
205 <option value="copy">Copy</option>
206 <option value="move">Move</option>
207 <option value="link">Link</option>
208 <option value="dummy">Nonexistent (Dummy) Effect</option>
212 <p>Items that can be dragged to the drop target:</p>
213 <div id="dragMe" draggable="true">Square</div>
216 <div id="console"></div>
218 description("This test checks that drag-and-drop support works and conforms to the HTML 5 specification.<br/>" +
219 "For each effectAllowed, iterates through the possible dropEffects: none, copy, move, link, dummy.");