зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1551758 - Form submission reentrancy protection for 'submit' and 'invalid' event; r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D53696 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
3c293b08a8
Коммит
fd9869d4f3
|
@ -119,7 +119,8 @@ HTMLFormElement::HTMLFormElement(
|
||||||
mNotifiedObservers(false),
|
mNotifiedObservers(false),
|
||||||
mNotifiedObserversResult(false),
|
mNotifiedObserversResult(false),
|
||||||
mEverTriedInvalidSubmit(false),
|
mEverTriedInvalidSubmit(false),
|
||||||
mIsConstructingEntryList(false) {
|
mIsConstructingEntryList(false),
|
||||||
|
mIsFiringSubmissionEvents(false) {
|
||||||
// We start out valid.
|
// We start out valid.
|
||||||
AddStatesSilently(NS_EVENT_STATE_VALID);
|
AddStatesSilently(NS_EVENT_STATE_VALID);
|
||||||
}
|
}
|
||||||
|
@ -236,6 +237,15 @@ void HTMLFormElement::MaybeSubmit(Element* aSubmitter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 6.1. If form's firing submission events is true, then return.
|
||||||
|
if (mIsFiringSubmissionEvents) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6.2. Set form's firing submission events to true.
|
||||||
|
AutoRestore<bool> resetFiringSubmissionEventsFlag(mIsFiringSubmissionEvents);
|
||||||
|
mIsFiringSubmissionEvents = true;
|
||||||
|
|
||||||
// 6.3. If the submitter element's no-validate state is false, then
|
// 6.3. If the submitter element's no-validate state is false, then
|
||||||
// interactively validate the constraints of form and examine the result.
|
// interactively validate the constraints of form and examine the result.
|
||||||
// If the result is negative (i.e., the constraint validation concluded
|
// If the result is negative (i.e., the constraint validation concluded
|
||||||
|
|
|
@ -616,6 +616,8 @@ class HTMLFormElement final : public nsGenericHTMLElement,
|
||||||
bool mEverTriedInvalidSubmit;
|
bool mEverTriedInvalidSubmit;
|
||||||
/** Whether we are constructing entry list */
|
/** Whether we are constructing entry list */
|
||||||
bool mIsConstructingEntryList;
|
bool mIsConstructingEntryList;
|
||||||
|
/** Whether we are firing submission event */
|
||||||
|
bool mIsFiringSubmissionEvents;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NotNull<const Encoding*> GetSubmitEncoding();
|
NotNull<const Encoding*> GetSubmitEncoding();
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
[form-submission-algorithm.html]
|
[form-submission-algorithm.html]
|
||||||
[If form's firing submission events is true, then return; 'invalid' event]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[firing an event named submit; form.requestSubmit(submitter)]
|
[firing an event named submit; form.requestSubmit(submitter)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,21 @@ test(() => {
|
||||||
assert_equals(counter, 2);
|
assert_equals(counter, 2);
|
||||||
}, 'If constructing entry list flag of form is true, then return');
|
}, 'If constructing entry list flag of form is true, then return');
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
let form = populateForm('<input><input type=submit>');
|
||||||
|
let submitter1 = form.querySelector('input[type=submit]');
|
||||||
|
let valid = form.elements[0];
|
||||||
|
let counter = 0;
|
||||||
|
valid.oninvalid = () => {
|
||||||
|
++counter;
|
||||||
|
};
|
||||||
|
form.onsubmit = () => {
|
||||||
|
valid.required = true;
|
||||||
|
submitter1.dispatchEvent(new MouseEvent("click"));
|
||||||
|
};
|
||||||
|
submitter1.dispatchEvent(new MouseEvent("click"));
|
||||||
|
assert_equals(counter, 0);
|
||||||
|
}, "If firing submission events flag of form is true, then return");
|
||||||
|
|
||||||
test(() => {
|
test(() => {
|
||||||
let form = populateForm('<input required><input type=submit><button type=submit></button>');
|
let form = populateForm('<input required><input type=submit><button type=submit></button>');
|
||||||
|
|
Загрузка…
Ссылка в новой задаче