| <html> |
| <head> |
| <script src="../../../resources/js-test-pre.js"></script> |
| </head> |
| <body onload="test()"> |
| <form id="form" method="post" enctype="multipart/form-data"> |
| <input id="text-input" type="text" name="posted-text"> |
| <input id="file-input" type="file" name="posted-file"> |
| <input id="multiple-file-input" type="file" multiple="multiple" name="posted-files"> |
| </form> |
| <div id="manual-instructions"> |
| To run this test manually: |
| <ul> |
| <li>Enter something to the text field and choose files with the files choosers. |
| <li>Click <u><a onclick="navigateAway()">here</a></u> to navigate away from the page. |
| <li>Click <u><a onclick="navigateBack()">here</a></u> to navigate back to the page. |
| <li>Check that the state of the form was restored. |
| </ul> |
| </div> |
| <div id="console"></div> |
| <script> |
| var jsTestIsAsync = true; |
| |
| description("Test that the state of a file chooser is recovered when navigating away and navigating back."); |
| |
| // Structure of the test: |
| // Start of the test (document.location.search == "") |
| // - Fill out a form. |
| // - Navigate to a different location. |
| // On the different page (document.location.search == "?differentpage") |
| // - Navigate back. |
| // Back on the original page (document.location.search == "" && window.name == "wentback") |
| // - Check the form data. |
| |
| function test() { |
| if (!window.testRunner) |
| return; |
| if (document.location.search == "" && window.name == "") { |
| // Start of the test. Set the values to the input elements. |
| document.getElementById("text-input").value = "text to be posted"; |
| dragFilesOntoInput(document.getElementById("file-input"), ["../resources/test.txt"]); |
| dragFilesOntoInput(document.getElementById("multiple-file-input"), |
| ["../resources/test.txt", "../resources/test2.txt"]); |
| navigateAway(); |
| } else if (document.location.search == "?differentpage") { |
| // We have navigated to a different page. Now navigate back. |
| navigateBack(); |
| } else if (document.location.search == "" && window.name == "wentback") { |
| // We have navigated back. Now check the form values. |
| shouldBeEqualToString("document.getElementById('text-input').value", "text to be posted"); |
| |
| // The real file paths cannot be read from the file chooser element, but |
| // we can verify that the path was restored properly by reading the |
| // file. |
| expectFileContents(document.getElementById("file-input").files[0], "Hello"); |
| expectFileContents(document.getElementById("multiple-file-input").files[0], "Hello"); |
| expectFileContents(document.getElementById("multiple-file-input").files[1], "Another"); |
| } |
| } |
| |
| function navigateAway() { |
| // Navigate away; do it with a timeout so that it will create a history entry. |
| setTimeout(function() {document.location = document.location + "?differentpage";}, 0); |
| } |
| |
| function navigateBack() { |
| window.name = "wentback"; |
| history.back(); |
| } |
| |
| var filesRead = 0; |
| |
| function checkFileContents(expected, evt) { |
| document.readFileContents = evt.target.result; |
| shouldBeEqualToString("document.readFileContents", expected); |
| ++filesRead; |
| if (filesRead == 3) { |
| finishJSTest(); |
| } |
| } |
| |
| function expectFileContents(file, contents) { |
| var reader = new FileReader(); |
| reader.readAsText(file, "UTF-8"); |
| reader.onload = checkFileContents.bind(undefined, contents); |
| } |
| |
| function moveMouseToCenterOfElement(element) { |
| var centerX = element.offsetLeft + element.offsetWidth / 2; |
| var centerY = element.offsetTop + element.offsetHeight / 2; |
| eventSender.mouseMoveTo(centerX, centerY); |
| } |
| |
| function dragFilesOntoInput(input, files) { |
| eventSender.beginDragWithFiles(files); |
| moveMouseToCenterOfElement(input); |
| eventSender.mouseUp(); |
| } |
| </script> |
| <script src="../../../resources/js-test-post.js"></script> |
| </body> |
| </html> |