diff options
Diffstat (limited to '')
-rw-r--r-- | dom/html/test/browser_form_post_from_file_to_http.js | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/dom/html/test/browser_form_post_from_file_to_http.js b/dom/html/test/browser_form_post_from_file_to_http.js new file mode 100644 index 0000000000..2b69210cc2 --- /dev/null +++ b/dom/html/test/browser_form_post_from_file_to_http.js @@ -0,0 +1,180 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ + +const TEST_HTTP_POST = + "http://example.org/browser/dom/html/test/form_submit_server.sjs"; + +// Test for bug 1351358. +async function runTest(doNewTab) { + // Create file URI and test data file paths. + let testFile = getChromeDir(getResolvedURI(gTestPath)); + testFile.append("dummy_page.html"); + const fileUriString = Services.io.newFileURI(testFile).spec; + let filePaths = []; + testFile.leafName = "form_data_file.txt"; + filePaths.push(testFile.path); + testFile.leafName = "form_data_file.bin"; + filePaths.push(testFile.path); + + // Open file:// page tab in which to run the test. + await BrowserTestUtils.withNewTab( + fileUriString, + async function (fileBrowser) { + // Create a form to post to server that writes posted data into body as JSON. + + var promiseLoad; + if (doNewTab) { + promiseLoad = BrowserTestUtils.waitForNewTab( + gBrowser, + TEST_HTTP_POST, + true, + false + ); + } else { + promiseLoad = BrowserTestUtils.browserLoaded( + fileBrowser, + false, + TEST_HTTP_POST + ); + } + + /* eslint-disable no-shadow */ + await SpecialPowers.spawn( + fileBrowser, + [TEST_HTTP_POST, filePaths, doNewTab], + (actionUri, filePaths, doNewTab) => { + Cu.importGlobalProperties(["File"]); + + let doc = content.document; + let form = doc.body.appendChild(doc.createElement("form")); + form.action = actionUri; + form.method = "POST"; + form.enctype = "multipart/form-data"; + if (doNewTab) { + form.target = "_blank"; + } + + let inputText = form.appendChild(doc.createElement("input")); + inputText.type = "text"; + inputText.name = "text"; + inputText.value = "posted"; + + let inputCheckboxOn = form.appendChild(doc.createElement("input")); + inputCheckboxOn.type = "checkbox"; + inputCheckboxOn.name = "checked"; + inputCheckboxOn.checked = true; + + let inputCheckboxOff = form.appendChild(doc.createElement("input")); + inputCheckboxOff.type = "checkbox"; + inputCheckboxOff.name = "unchecked"; + inputCheckboxOff.checked = false; + + let inputFile = form.appendChild(doc.createElement("input")); + inputFile.type = "file"; + inputFile.name = "file"; + let fileList = []; + let promises = []; + for (let path of filePaths) { + promises.push( + File.createFromFileName(path).then(file => { + fileList.push(file); + }) + ); + } + + Promise.all(promises).then(() => { + inputFile.mozSetFileArray(fileList); + form.submit(); + }); + } + ); + /* eslint-enable no-shadow */ + + var href; + var testBrowser; + var newTab; + if (doNewTab) { + newTab = await promiseLoad; + testBrowser = newTab.linkedBrowser; + href = testBrowser.currentURI.spec; + } else { + testBrowser = fileBrowser; + href = await promiseLoad; + } + is( + href, + TEST_HTTP_POST, + "Check that the loaded page is the one to which we posted." + ); + + let binContentType; + if (AppConstants.platform == "macosx") { + binContentType = "application/macbinary"; + } else { + binContentType = "application/octet-stream"; + } + + /* eslint-disable no-shadow */ + await SpecialPowers.spawn( + testBrowser, + [binContentType], + binContentType => { + let data = JSON.parse(content.document.body.textContent); + is( + data[0].headers["Content-Disposition"], + 'form-data; name="text"', + "Check text input Content-Disposition" + ); + is(data[0].body, "posted", "Check text input body"); + + is( + data[1].headers["Content-Disposition"], + 'form-data; name="checked"', + "Check checkbox input Content-Disposition" + ); + is(data[1].body, "on", "Check checkbox input body"); + + // Note that unchecked checkbox details are not sent. + + is( + data[2].headers["Content-Disposition"], + 'form-data; name="file"; filename="form_data_file.txt"', + "Check text file input Content-Disposition" + ); + is( + data[2].headers["Content-Type"], + "text/plain", + "Check text file input Content-Type" + ); + is(data[2].body, "1234\n", "Check text file input body"); + + is( + data[3].headers["Content-Disposition"], + 'form-data; name="file"; filename="form_data_file.bin"', + "Check binary file input Content-Disposition" + ); + is( + data[3].headers["Content-Type"], + binContentType, + "Check binary file input Content-Type" + ); + is( + data[3].body, + "\u0001\u0002\u0003\u0004\n", + "Check binary file input body" + ); + } + ); + /* eslint-enable no-shadow */ + + if (newTab) { + BrowserTestUtils.removeTab(newTab); + } + } + ); +} + +add_task(async function runWithDocumentChannel() { + await runTest(false); + await runTest(true); +}); |