Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Unified Diff: third_party/WebKit/Source/core/html/HTMLFormElement.cpp

Issue 2340213002: submit() in submit event handler should not contains a value of a submit button. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/HTMLFormElement.cpp
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
index 6e0639b6ceef796b13321feaab62e9f7bd4f9469..ad9d90724c81b50af19a4532bd10fbd647dab4df 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -235,17 +235,7 @@ void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmission
}
}
if (fromImplicitSubmissionTrigger && submissionTriggerCount == 1)
- prepareForSubmission(event);
-}
-
-// FIXME: Consolidate this and similar code in FormSubmission.cpp.
-static inline HTMLFormControlElement* submitElementFromEvent(const Event* event)
-{
- for (Node* node = event->target()->toNode(); node; node = node->parentOrShadowHostNode()) {
- if (node->isElementNode() && toElement(node)->isFormControlElement())
- return toHTMLFormControlElement(node);
- }
- return 0;
+ prepareForSubmission(event, nullptr);
}
bool HTMLFormElement::validateInteractively()
@@ -291,7 +281,7 @@ bool HTMLFormElement::validateInteractively()
return false;
}
-void HTMLFormElement::prepareForSubmission(Event* event)
+void HTMLFormElement::prepareForSubmission(Event* event, HTMLFormControlElement* submitButton)
{
LocalFrame* frame = document().frame();
if (!frame || m_isSubmitting || m_inUserJSSubmitEvent)
@@ -304,8 +294,7 @@ void HTMLFormElement::prepareForSubmission(Event* event)
bool skipValidation = !document().page() || noValidate();
DCHECK(event);
- HTMLFormControlElement* submitElement = submitElementFromEvent(event);
- if (submitElement && submitElement->formNoValidate())
+ if (submitButton && submitButton->formNoValidate())
skipValidation = true;
UseCounter::count(document(), UseCounter::FormSubmissionStarted);
@@ -321,7 +310,7 @@ void HTMLFormElement::prepareForSubmission(Event* event)
}
if (shouldSubmit) {
m_plannedNavigation = nullptr;
- submit(event, true);
+ submit(event, submitButton);
}
if (!m_plannedNavigation)
return;
@@ -332,7 +321,7 @@ void HTMLFormElement::prepareForSubmission(Event* event)
void HTMLFormElement::submitFromJavaScript()
{
- submit(0, false);
+ submit(nullptr, nullptr);
}
void HTMLFormElement::submitDialog(FormSubmission* formSubmission)
@@ -345,7 +334,7 @@ void HTMLFormElement::submitDialog(FormSubmission* formSubmission)
}
}
-void HTMLFormElement::submit(Event* event, bool activateSubmitButton)
+void HTMLFormElement::submit(Event* event, HTMLFormControlElement* submitButton)
{
FrameView* view = document().view();
LocalFrame* frame = document().frame();
@@ -366,27 +355,24 @@ void HTMLFormElement::submit(Event* event, bool activateSubmitButton)
EventQueueScope scopeForDialogClose;
AutoReset<bool> submitScope(&m_isSubmitting, true);
- HTMLFormControlElement* firstSuccessfulSubmitButton = nullptr;
- bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button?
-
- const FormAssociatedElement::List& elements = associatedElements();
- for (unsigned i = 0; i < elements.size(); ++i) {
- FormAssociatedElement* associatedElement = elements[i];
- if (!associatedElement->isFormControlElement())
- continue;
- if (needButtonActivation) {
+ if (event && !submitButton) {
+ // In a case of implicit submission without a submit button, 'submit'
+ // event handler might add a submit button. We search for a submit
+ // button again.
+ // TODO(tkent): Do we really need to activate such submit button?
+ for (const auto& associatedElement : associatedElements()) {
+ if (!associatedElement->isFormControlElement())
+ continue;
HTMLFormControlElement* control = toHTMLFormControlElement(associatedElement);
- if (control->isActivatedSubmit())
- needButtonActivation = false;
- else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton())
- firstSuccessfulSubmitButton = control;
+ DCHECK(!control->isActivatedSubmit());
+ if (control->isSuccessfulSubmitButton()) {
+ submitButton = control;
+ break;
+ }
}
}
- if (needButtonActivation && firstSuccessfulSubmitButton)
- firstSuccessfulSubmitButton->setActivatedSubmit(true);
-
- FormSubmission* formSubmission = FormSubmission::create(this, m_attributes, event);
+ FormSubmission* formSubmission = FormSubmission::create(this, m_attributes, event, submitButton);
if (formSubmission->method() == FormSubmission::DialogMethod) {
submitDialog(formSubmission);
} else if (m_inUserJSSubmitEvent) {
@@ -398,9 +384,6 @@ void HTMLFormElement::submit(Event* event, bool activateSubmitButton)
// protocol.
scheduleFormSubmission(formSubmission);
}
-
- if (needButtonActivation && firstSuccessfulSubmitButton)
- firstSuccessfulSubmitButton->setActivatedSubmit(false);
}
void HTMLFormElement::scheduleFormSubmission(FormSubmission* submission)
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLFormElement.h ('k') | third_party/WebKit/Source/core/html/forms/ImageInputType.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698