mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-18 07:45:30 +00:00
0dc3847027
It seems that we were flushing any pending submission when changing the action or target attributes of a form, but not when unsetting those attributes. MozReview-Commit-ID: E6aUnokg54k --HG-- extra : rebase_source : 1e331b0ce03dbd77a79a8bafa6bb3ea39c6ea22b
86 lines
3.5 KiB
JavaScript
86 lines
3.5 KiB
JavaScript
"use strict";
|
|
// Form submissions triggered by the Javascript 'submit' event listener are
|
|
// deferred until the event listener finishes. However, changes to specific
|
|
// attributes ("action" and "target" attributes) need to cause an immediate
|
|
// flush of any pending submission to prevent the form submission from using the
|
|
// wrong action or target. This test ensures that such flushes happen properly.
|
|
|
|
const kTestPage = "http://example.org/browser/dom/html/test/submission_flush.html";
|
|
// This is the page pointed to by the form action in the test HTML page.
|
|
const kPostActionPage = "http://example.org/browser/dom/html/test/post_action_page.html";
|
|
|
|
const kFormId = "test_form"
|
|
const kFrameId = "test_frame"
|
|
const kSubmitButtonId = "submit_button"
|
|
|
|
// Take in a variety of actions (in the form of setting and unsetting form
|
|
// attributes). Then submit the form in the submit event listener to cause a
|
|
// deferred form submission. Then perform the test actions and ensure that the
|
|
// form used the correct attribute values rather than the changed ones.
|
|
async function runTest(aTestActions) {
|
|
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, kTestPage);
|
|
registerCleanupFunction(() => BrowserTestUtils.removeTab(tab));
|
|
|
|
let frame_url = await ContentTask.spawn(gBrowser.selectedBrowser,
|
|
{kFormId, kFrameId, kSubmitButtonId, aTestActions},
|
|
async function({kFormId, kFrameId, kSubmitButtonId,
|
|
aTestActions}) {
|
|
let form = content.document.getElementById(kFormId);
|
|
|
|
form.addEventListener("submit", (event) => {
|
|
// Need to trigger the deferred submission by submitting in the submit
|
|
// event handler. To prevent the form from being submitted twice, the
|
|
// <form> tag contains the attribute |onsubmit="return false;"| to cancel
|
|
// the original submission.
|
|
form.submit();
|
|
|
|
if (aTestActions.setattr) {
|
|
for (let {attr, value} of aTestActions.setattr) {
|
|
form.setAttribute(attr, value);
|
|
}
|
|
}
|
|
if (aTestActions.unsetattr) {
|
|
for (let attr of aTestActions.unsetattr) {
|
|
form.removeAttribute(attr);
|
|
}
|
|
}
|
|
}, {capture: true, once: true});
|
|
|
|
// Trigger the above event listener
|
|
content.document.getElementById(kSubmitButtonId).click();
|
|
|
|
// Test that the form was submitted to the correct target (the frame) with
|
|
// the correct action (kPostActionPage).
|
|
let frame = content.document.getElementById(kFrameId);
|
|
await new Promise(resolve => {
|
|
frame.addEventListener("load", resolve, {once: true});
|
|
});
|
|
return frame.contentWindow.location.href;
|
|
});
|
|
is(frame_url, kPostActionPage,
|
|
"Form should have submitted with correct target and action");
|
|
}
|
|
|
|
add_task(async function() {
|
|
info("Changing action should flush pending submissions");
|
|
await runTest({setattr: [{attr: "action", value: "about:blank"}]});
|
|
});
|
|
|
|
add_task(async function() {
|
|
info("Changing target should flush pending submissions");
|
|
await runTest({setattr: [{attr: "target", value: "_blank"}]});
|
|
});
|
|
|
|
add_task(async function() {
|
|
info("Unsetting action should flush pending submissions");
|
|
await runTest({unsetattr: ["action"]});
|
|
});
|
|
|
|
// On failure, this test will time out rather than failing an assert. When the
|
|
// target attribute is not set, the form will submit the active page, navigating
|
|
// it away and preventing the wait for iframe load from ever finishing.
|
|
add_task(async function() {
|
|
info("Unsetting target should flush pending submissions");
|
|
await runTest({unsetattr: ["target"]});
|
|
});
|