1d7f1c3a00e7620a4bfbc93b2bca94d1260dbd14
[WebKit-https.git] / LayoutTests / http / tests / security / clipboard / resources / clipboard-file-access.js
1 description("Tests access to event.dataTransfer.files and .types");
2
3 var dragTarget = document.createElement("div");
4 dragTarget.innerHTML = "Drag here"
5 dragTarget.style.backgroundColor = "blue";
6 dragTarget.style.width = "100px";
7 dragTarget.style.height = "100px";
8 // Important that we put this at the top of the doc so that logging does not cause it to go out of view (and be undragable)
9 document.body.insertBefore(dragTarget, document.body.firstChild);
10
11 dragTarget.addEventListener("dragenter", function() {
12     debug("On dragenter:")
13     event.dataTransfer.dropEffect = "copy";
14     eventShouldContainTransferType(event, "Files");
15     fileListShouldBe("event.dataTransfer.files", []);
16     event.preventDefault();
17 }, false);
18
19 dragTarget.addEventListener("dragover", function() {
20     debug("On dragover:")
21     event.dataTransfer.dropEffect = "copy";
22     eventShouldContainTransferType(event, "Files");
23     fileListShouldBe("event.dataTransfer.files", []);
24     event.preventDefault();
25 }, false);
26
27 dragTarget.addEventListener("dragleave", function() {
28     debug("On dragleave:")
29     eventShouldContainTransferType(event, "Files");
30     fileListShouldBe("event.dataTransfer.files", []);
31 }, false);
32
33 var expectedFilesOnDrop;
34 dragTarget.addEventListener("drop", function() {
35     debug("On drop:")
36     eventShouldContainTransferType(event, "Files");
37     fileListShouldBe("event.dataTransfer.files", expectedFilesOnDrop);
38     event.preventDefault();
39 }, false);
40
41 function moveMouseToCenterOfElement(element) {
42     var centerX = element.offsetLeft + element.offsetWidth / 2;
43     var centerY = element.offsetTop + element.offsetHeight / 2;
44     eventSender.mouseMoveTo(centerX, centerY);
45 }
46
47 function moveMouseToOutsideOfElement(element) {
48     var outsideX = element.offsetLeft + element.offsetWidth + 42;
49     var outsideY = element.offsetTop + element.offsetHeight + 42;
50     eventSender.mouseMoveTo(outsideX, outsideY);
51 }
52
53 function dragFilesOntoDragTarget(files, leave) {
54     eventSender.beginDragWithFiles(files);
55     moveMouseToCenterOfElement(dragTarget);
56     if (leave && leave === true)
57         moveMouseToOutsideOfElement(dragTarget);
58     eventSender.mouseUp();
59 }
60
61 function eventShouldContainTransferType(event, typeString)
62 {
63    if (event.dataTransfer.types.indexOf(typeString) == -1)
64        testFailed("event.dataTransfer.types " + typeString + " expected.");
65    else
66        testPassed("event.dataTransfer.types contains " + typeString + ".");
67 }
68
69 function fileListShouldBe(fileListString, filesArray)
70 {
71     shouldBe(fileListString + ".length", "" + filesArray.length);
72     for (var x = 0; x < filesArray.length; x++) {
73         var fileValueString = fileListString + "[" + x + "]";
74         shouldBeEqualToString(fileValueString + ".fileName", filesArray[x]['name']);
75         shouldBe(fileValueString + ".fileSize", "" + filesArray[x]['size']);
76     }
77 }
78
79 function draggingPathsShouldResultInFiles(pathsArray, filesArray, leave)
80 {
81     expectedFilesOnDrop = filesArray;
82     dragFilesOntoDragTarget(pathsArray, leave || false);
83 }
84
85 function testDraggingFiles(filesArray, leave)
86 {
87     // We could make a way to parse the filename from the path, and then only need to pass
88     // the path in the filesArray.
89     var pathsOnly = filesArray.map(function(fileSpec) { return fileSpec['path']; });
90     draggingPathsShouldResultInFiles(pathsOnly, filesArray, leave || false);
91 }
92
93 function runTest()
94 {
95     debug("Dragging no files should return an empty file list (arbitrary implementation detail):");
96     testDraggingFiles([]);
97
98     debug("Drag drop a single (non-existant) file onto an element:");
99     testDraggingFiles([
100         { 'path': 'DRTFakeFile', 'name' : 'DRTFakeFile', 'size' : 0 }
101     ]);
102
103     debug("FIXME: File.fileSize always returns 0 for files dropped by eventSender.beginDragWithFiles from http tests:  https://bugs.webkit.org/show_bug.cgi?id=25909");
104
105     debug("Drag files over an element, leave that element and release the mouse:");   
106     testDraggingFiles([
107         { 'path': 'resources/apple.gif', 'name' : 'apple.gif', 'size' : 1476 }
108     ], true);
109
110     debug("Drag drop a real file onto an element:");
111     testDraggingFiles([
112         { 'path': 'resources/apple.gif', 'name' : 'apple.gif', 'size' : 1476 }
113     ]);
114     
115     debug("Drag drop two files onto an element:");
116     testDraggingFiles([
117         { 'path': 'resources/apple.gif', 'name' : 'apple.gif', 'size' : 1476 },
118         { 'path': 'resources/mozilla.gif', 'name' : 'mozilla.gif', 'size' : 2593 }
119     ]);
120
121     debug("Drag drop two files in reverse alphabetical order onto an element:");
122     testDraggingFiles([
123         { 'path': 'resources/mozilla.gif', 'name' : 'mozilla.gif', 'size' : 2593 },
124         { 'path': 'resources/apple.gif', 'name' : 'apple.gif', 'size' : 1476 }
125     ]);
126
127     // Directory dragging behavior is covered by https://bugs.webkit.org/show_bug.cgi?id=25852 and https://bugs.webkit.org/show_bug.cgi?id=25879
128     debug("FIXME: We should not allow element to accept drops including directories unless https://bugs.webkit.org/show_bug.cgi?id=25879 is fixed to make directory File objects useful from JavaScript.  The page is given File objects corresponding to directories, but form submission and xhr.send() will fail.");
129     debug("Drag drop a directory onto an element:");
130     draggingPathsShouldResultInFiles(['resources/directory-for-dragging'], []);
131
132     // Note: The order of selection in the Finder changes the order of file paths in the pasteboard
133     // thus it's important that we test different orders here as well (at least on the Mac)
134     // Both drops should be refused or succeed based on how https://bugs.webkit.org/show_bug.cgi?id=25879 is resolved.  Currently we expect drops to be refused.
135     debug("Drag drop a file and a directory onto an element:");
136     draggingPathsShouldResultInFiles(['resources/apple.gif', 'resources/directory-for-dragging'], []);
137
138     debug("Drag drop a directory and a file onto an element:")
139     draggingPathsShouldResultInFiles(['resources/directory-for-dragging', 'resources/apple.gif'], []);
140 }
141
142 if (window.eventSender) {
143     runTest();
144     // Clean up after ourselves
145     dragTarget.parentNode.removeChild(dragTarget);
146 } else {
147     testFailed("This test is not interactive, please run using DumpRenderTree");
148 }
149
150 var successfullyParsed = true;