d8e5b9b4fec938243c033e26178f22bd60d8c8a9
[WebKit-https.git] / LayoutTests / http / tests / local / fileapi / script-tests / send-sliced-dragged-file.js
1 description("Test for slicing a dragged file and sending it via XMLHttpRequest.");
2
3 var tempFileContent = "1234567890";
4 var tempFileName = "send-slice-dragged-file.tmp";
5 var subfile;
6
7 function uploadFile(file, filePath, start, length, expectedException)
8 {
9     var xhr = new XMLHttpRequest();
10     xhr.open("POST", "http://127.0.0.1:8000/resources/post-and-verify.cgi?path=" + filePath + "&start=" + start + "&length=" + length, false);
11
12     var passed;
13     var message;
14     try {
15         xhr.send(file);
16         if (expectedException) {
17             passed = false;
18             message = "Unexpected response data received: " + xhr.responseText + ". Expecting exception thrown";
19         } else {
20             if (xhr.responseText == "OK") {
21                 passed = true;
22                 message = "Expected response data received: " + xhr.responseText;
23             } else {
24                 passed = false;
25                 message = "Unexpected response data received: " + xhr.responseText;
26             }
27         }
28     } catch (ex) {
29         if (expectedException) {
30             passed = true;
31             message = "Expected exception thrown: " + ex;
32         } else {
33             passed = false;
34             message = "Unexpected exception thrown: " + ex;
35         }
36     }
37
38     if (passed)
39         testPassed(message);
40     else
41         testFailed(message);
42 }
43
44 function createTempFile(fileData)
45 {
46     var xhr = new XMLHttpRequest();
47     xhr.open("POST", "http://127.0.0.1:8000/resources/write-temp-file.php?filename=" + tempFileName + "&data=" + fileData, false);
48     xhr.send();
49     if (xhr.status != 200) {
50         testFailed("Unexpected response status received: " + xhr.status);
51         return;
52     }
53
54     var values = xhr.responseText.split('\n');
55     if (xhr.responseText.indexOf("FAIL") == 0) {
56         testFailed("Unexpected response text received: " + xhr.responseText);
57         return;
58     }
59
60     return xhr.responseText;
61 }
62
63 function touchTempFile()
64 {
65     var xhr = new XMLHttpRequest();
66     xhr.open("POST", "http://127.0.0.1:8000/resources/touch-temp-file.php?filename=" + tempFileName, false);
67     xhr.send();
68 }
69
70 function removeTempFile()
71 {
72     var xhr = new XMLHttpRequest();
73     xhr.open("POST", "http://127.0.0.1:8000/resources/reset-temp-file.php?filename=" + tempFileName, false);
74     xhr.send();
75 }
76
77 function computeExpectedLength(fileLength, start, length)
78 {
79     var expectedLength = length;
80     if (start + length > fileLength) {
81         if (start >= fileLength)
82             expectedLength = 0;
83         else
84             expectedLength = fileLength - start;
85     }
86     return expectedLength;
87 }
88
89 function onStableFileDrop(file, filePath, fileLength, start, length, contentType)
90 {
91     // Slice the file.
92     subfile = file.webkitSlice(start, start + length, contentType);
93     shouldEvaluateTo("subfile.size", computeExpectedLength(fileLength, start, length));
94     shouldBe("subfile.type", (contentType != undefined && contentType != null) ? '"' + contentType + '"' : '""');
95
96     // Upload the sliced file.
97     uploadFile(subfile, filePath, start, length, false);
98 }
99
100 function dragAndSliceStableFile(filePath, fileLength, start, length, contentType)
101 {
102     setFileInputDropCallback(function(file) { onStableFileDrop(file, "../local/fileapi/" + filePath, fileLength, start, length, contentType); });
103     eventSender.beginDragWithFiles([filePath]);
104     moveMouseToCenterOfElement(fileInput);
105     eventSender.mouseUp();
106 }
107
108 function onUnstableFileDrop(file, filePath, fileLength, start, length, contentType)
109 {
110     // Slice the file.
111     subfile = file.webkitSlice(start, start + length, contentType);
112     shouldEvaluateTo("subfile.size", computeExpectedLength(fileLength, start, length));
113     shouldBe("subfile.type", (contentType != undefined && contentType != null) ? '"' + contentType + '"' : '""');
114   
115     // Upload the sliced file.
116     uploadFile(subfile, filePath, start, length, false);
117
118     // Touch the underlying temp file.
119     touchTempFile();
120     
121     // Upload the sliced file. We should receive an exception since the file has been changed.
122     uploadFile(subfile, filePath, start, length, true);
123
124     // Remove the temp file.
125     removeTempFile();
126 }
127
128 function dragAndSliceUnstableFile(start, length, contentType)
129 {
130     var tempFilePath = createTempFile(tempFileContent);
131     if (tempFilePath.length == 0)
132         return;
133
134     setFileInputDropCallback(function(file) { onUnstableFileDrop(file, tempFilePath, tempFileContent.length, start, length, contentType); });
135     eventSender.beginDragWithFiles([tempFilePath]);
136     moveMouseToCenterOfElement(fileInput);
137     eventSender.mouseUp();
138 }
139
140 function runTest()
141 {
142     debug("Test slicing and sending an empty file.");
143     dragAndSliceStableFile("../resources/empty.txt", 0, 0, 10);
144
145     debug("Test slicing and sending a small file.");
146     dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 2, 4, null);
147     dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 2, 20, "type/foo");
148     dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 15, 20, "type/bar");
149
150     // This is to test a file that exceeds the read buffer limit (2K in Mac).
151     debug("Test slicing and sending a big file.");
152     dragAndSliceStableFile("../resources/abe.png", 12242, 10, 40);
153     dragAndSliceStableFile("../resources/abe.png", 12242, 10, 3000);
154     dragAndSliceStableFile("../resources/abe.png", 12242, 3000, 15000);
155
156     debug("Test slicing and sending a file that has been changed right before sending.");
157     dragAndSliceUnstableFile(3, 5);
158 }
159
160 if (window.eventSender) {
161     runTest();
162     // Clean up after ourselves
163     removeFileInputElement();
164 } else {
165     testFailed("This test is not interactive, please run using DumpRenderTree");
166 }
167
168 var successfullyParsed = true;