summaryrefslogtreecommitdiffstats
path: root/dom/html/HTMLFormElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/HTMLFormElement.cpp')
-rw-r--r--dom/html/HTMLFormElement.cpp31
1 files changed, 12 insertions, 19 deletions
diff --git a/dom/html/HTMLFormElement.cpp b/dom/html/HTMLFormElement.cpp
index 46f2c2a735..7796c4b1f4 100644
--- a/dom/html/HTMLFormElement.cpp
+++ b/dom/html/HTMLFormElement.cpp
@@ -209,22 +209,16 @@ void HTMLFormElement::GetMethod(nsAString& aValue) {
GetEnumAttr(nsGkAtoms::method, kFormDefaultMethod->tag, aValue);
}
-void HTMLFormElement::ReportInvalidUnfocusableElements() {
+void HTMLFormElement::ReportInvalidUnfocusableElements(
+ const nsTArray<RefPtr<Element>>&& aInvalidElements) {
RefPtr<nsFocusManager> focusManager = nsFocusManager::GetFocusManager();
MOZ_ASSERT(focusManager);
- // This shouldn't be called recursively, so use a rather large value
- // for the preallocated buffer.
- AutoTArray<RefPtr<nsGenericHTMLFormElement>, 100> sortedControls;
- if (NS_FAILED(mControls->GetSortedControls(sortedControls))) {
- return;
- }
-
- for (auto& _e : sortedControls) {
- // MOZ_CAN_RUN_SCRIPT requires explicit copy, Bug 1620312
- RefPtr<nsGenericHTMLFormElement> element = _e;
+ for (const auto& element : aInvalidElements) {
bool isFocusable = false;
- focusManager->ElementIsFocusable(element, 0, &isFocusable);
+ // MOZ_KnownLive because 'aInvalidElements' is guaranteed to keep it alive.
+ // This can go away once bug 1620312 is fixed.
+ focusManager->ElementIsFocusable(MOZ_KnownLive(element), 0, &isFocusable);
if (!isFocusable) {
nsTArray<nsString> params;
nsAutoCString messageName("InvalidFormControlUnfocusable");
@@ -291,7 +285,6 @@ void HTMLFormElement::MaybeSubmit(Element* aSubmitter) {
HasAttr(nsGkAtoms::novalidate) ||
(aSubmitter && aSubmitter->HasAttr(nsGkAtoms::formnovalidate));
if (!noValidateState && !CheckValidFormSubmission()) {
- ReportInvalidUnfocusableElements();
return;
}
@@ -494,7 +487,7 @@ static void CollectOrphans(nsINode* aRemovalRoot,
}
}
-void HTMLFormElement::UnbindFromTree(bool aNullParent) {
+void HTMLFormElement::UnbindFromTree(UnbindContext& aContext) {
MaybeFireFormRemoved();
// Note, this is explicitly using uncomposed doc, since we count
@@ -506,7 +499,7 @@ void HTMLFormElement::UnbindFromTree(bool aNullParent) {
MarkOrphans(mControls->mNotInElements.AsList());
MarkOrphans(mImageElements.AsList());
- nsGenericHTMLElement::UnbindFromTree(aNullParent);
+ nsGenericHTMLElement::UnbindFromTree(aContext);
nsINode* ancestor = this;
nsINode* cur;
@@ -1759,7 +1752,8 @@ bool HTMLFormElement::CheckValidFormSubmission() {
/**
* Check for form validity: do not submit a form if there are unhandled
* invalid controls in the form.
- * This should not be done if the form has been submitted with .submit().
+ * This should not be done if the form has been submitted with .submit() or
+ * has been submitted and novalidate/formnovalidate is used.
*
* NOTE: for the moment, we are also checking that whether the MozInvalidForm
* event gets prevented default so it will prevent blocking form submission if
@@ -1770,9 +1764,6 @@ bool HTMLFormElement::CheckValidFormSubmission() {
* submitted when invalid. See bug 587671.
*/
- NS_ASSERTION(!HasAttr(nsGkAtoms::novalidate),
- "We shouldn't be there if novalidate is set!");
-
AutoTArray<RefPtr<Element>, 32> invalidElements;
if (CheckFormValidity(&invalidElements)) {
return true;
@@ -1797,6 +1788,8 @@ bool HTMLFormElement::CheckValidFormSubmission() {
DispatchEvent(*event);
+ ReportInvalidUnfocusableElements(std::move(invalidElements));
+
return !event->DefaultPrevented();
}