summaryrefslogtreecommitdiff
path: root/Libraries/LibWeb/HTML/HTMLFormElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibWeb/HTML/HTMLFormElement.cpp')
-rw-r--r--Libraries/LibWeb/HTML/HTMLFormElement.cpp41
1 files changed, 40 insertions, 1 deletions
diff --git a/Libraries/LibWeb/HTML/HTMLFormElement.cpp b/Libraries/LibWeb/HTML/HTMLFormElement.cpp
index b709538cff..b05ebdce0f 100644
--- a/Libraries/LibWeb/HTML/HTMLFormElement.cpp
+++ b/Libraries/LibWeb/HTML/HTMLFormElement.cpp
@@ -25,8 +25,10 @@
*/
#include <AK/StringBuilder.h>
+#include <LibWeb/HTML/EventNames.h>
#include <LibWeb/HTML/HTMLFormElement.h>
#include <LibWeb/HTML/HTMLInputElement.h>
+#include <LibWeb/HTML/SubmitEvent.h>
#include <LibWeb/InProcessWebView.h>
#include <LibWeb/Page/Frame.h>
#include <LibWeb/URLEncoder.h>
@@ -42,8 +44,11 @@ HTMLFormElement::~HTMLFormElement()
{
}
-void HTMLFormElement::submit(RefPtr<HTMLInputElement> submitter)
+void HTMLFormElement::submit_form(RefPtr<HTMLElement> submitter, bool from_submit_binding)
{
+ if (cannot_navigate())
+ return;
+
if (action().is_null()) {
dbg() << "Unsupported form action ''";
return;
@@ -60,6 +65,35 @@ void HTMLFormElement::submit(RefPtr<HTMLInputElement> submitter)
effective_method = "get";
}
+ if (!from_submit_binding) {
+ if (m_firing_submission_events)
+ return;
+
+ m_firing_submission_events = true;
+
+ // FIXME: If the submitter element's no-validate state is false...
+
+ RefPtr<HTMLElement> submitter_button;
+
+ if (submitter != this)
+ submitter_button = submitter;
+
+ auto submit_event = SubmitEvent::create(EventNames::submit, submitter_button);
+ submit_event->set_bubbles(true);
+ submit_event->set_cancelable(true);
+ bool continue_ = dispatch_event(submit_event);
+
+ m_firing_submission_events = false;
+
+ if (!continue_)
+ return;
+
+ // This is checked again because arbitrary JS may have run when handling submit,
+ // which may have changed the result.
+ if (cannot_navigate())
+ return;
+ }
+
URL url(document().complete_url(action()));
if (!url.is_valid()) {
@@ -109,4 +143,9 @@ void HTMLFormElement::submit(RefPtr<HTMLInputElement> submitter)
page->load(request);
}
+void HTMLFormElement::submit()
+{
+ submit_form(this, true);
+}
+
}