diff options
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html')
-rw-r--r-- | testing/web-platform/tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html b/testing/web-platform/tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html new file mode 100644 index 0000000000..b4028784ed --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html @@ -0,0 +1,142 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-algorithm"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/targetted-form.js"></script> + +<!-- The onclick requestSubmit() should get superseded by the default + action submit, which isn't preventDefaulted by onclick here. + This is per the Form Submission Algorithm [1], which + says that new planned navigations replace old planned navigations. + [1] https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#planned-navigation + --> + +<body> + <script> + function runTest({ submitterType, preventDefaultSubmitButton, preventDefaultRequestSubmit, passSubmitter, testName }) { + if (preventDefaultRequestSubmit && preventDefaultSubmitButton) { + // In this case, no submit action will take place. + return; + } + + promise_test(async () => { + const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v2>${submitterType == 'button' ? '</button>' : ''}`); + const input = form.elements[0]; + const submitter = form.elements[1]; + submitter.addEventListener('click', e => { + form.addEventListener('submit', e => { + submitter.value = 'v3'; + if (preventDefaultRequestSubmit) { + e.preventDefault(); + } + }, { once: true }); + + form.requestSubmit(passSubmitter ? submitter : null); + input.value = 'v2'; + + form.addEventListener('submit', e => { + submitter.value = 'v4'; + if (preventDefaultSubmitButton) { + e.preventDefault(); + } + }, { once: true }); + }); + + let formDataInEvent; + form.addEventListener('formdata', e => { + formDataInEvent = e.formData; + }); + + submitter.click(); + assert_equals(formDataInEvent.get('n1'), preventDefaultSubmitButton ? 'v1' : 'v2'); + if (preventDefaultSubmitButton && !passSubmitter) { + assert_false(formDataInEvent.has('n2')); + } else { + assert_equals(formDataInEvent.get('n2'), + preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4') + } + + let iframe = form.previousSibling; + await loadPromise(iframe); + assert_equals(getParamValue(iframe, 'n1'), preventDefaultSubmitButton ? 'v1' : 'v2'); + if (preventDefaultSubmitButton && !passSubmitter) { + assert_equals(getParamValue(iframe, 'n2'), null); + } else { + assert_equals(getParamValue(iframe, 'n2'), + preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4'); + } + }, testName); + } + + function runTest2({ submitterType, callRequestSubmit, callSubmit, preventDefault, passSubmitter, testName }) { + if (!callSubmit && preventDefault) { + // Without callSubmit, preventDefault will cause the form to not get + // submitted. + return; + } + + promise_test(async () => { + const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v3>${submitterType == 'button' ? '</button>' : ''}`); + const input = form.elements[0]; + const submitter = form.elements[1]; + + form.addEventListener('submit', e => { + if (callRequestSubmit) { + form.requestSubmit(passSubmitter ? submitter : null); + input.value = 'v2'; + } + if (callSubmit) { + form.submit(); + } + if (preventDefault) { + e.preventDefault(); + } + }); + + form.requestSubmit(passSubmitter ? submitter : null); + let iframe = form.previousSibling; + await loadPromise(iframe); + + assert_equals(getParamValue(iframe, 'n1'), callRequestSubmit ? 'v2' : 'v1'); + if (callSubmit || !passSubmitter) { + assert_equals(getParamValue(iframe, 'n2'), null); + } else { + assert_equals(getParamValue(iframe, 'n2'), 'v3') + } + }, testName); + } + + function callWithArgs(test, argsLeft, args) { + if (argsLeft.length == 0) { + args.testName = 'test ' + test.name + ' with ' + Object.entries(args).map(([key, value]) => `${key}: ${value}`).join(', '); + test(args); + return; + } + + let [name, values] = argsLeft[0]; + for (let value of values) { + callWithArgs(test, argsLeft.slice(1), { ...args, [name]: value }) + } + } + + let args = { + submitterType: ['input', 'button'], + preventDefaultRequestSubmit: [true, false], + preventDefaultSubmitButton: [true, false], + passSubmitter: [true, false], + }; + callWithArgs(runTest, Object.entries(args), {}); + + args = { + submitterType: ['input', 'button'], + callRequestSubmit: [true, false], + callSubmit: [true, false], + preventDefault: [true, false], + passSubmitter: [true, false], + }; + callWithArgs(runTest2, Object.entries(args), {}); + </script> +</body> |