LibWeb: Add the submit event to HTMLFormElement

Also adds the ability to submit from JavaScript.
This commit is contained in:
Luke 2020-11-21 21:53:18 +00:00 committed by Andreas Kling
parent 9950270808
commit 773df8826d
Notes: sideshowbarker 2024-07-19 01:18:31 +09:00
10 changed files with 120 additions and 4 deletions

View file

@ -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);
}
}