Prechádzať zdrojové kódy

LibWeb: Implement <button>'s activation behaviour

This allows us to submit forms from <button> elements and not just
<input type="submit">

This allows Discord to progress past the username registration :^)
Luke Wilde 3 rokov pred
rodič
commit
4fa270d81f

+ 36 - 0
Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp

@@ -4,13 +4,49 @@
  * SPDX-License-Identifier: BSD-2-Clause
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
+#include <LibWeb/DOM/Document.h>
 #include <LibWeb/HTML/HTMLButtonElement.h>
 #include <LibWeb/HTML/HTMLButtonElement.h>
+#include <LibWeb/HTML/HTMLFormElement.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
 HTMLButtonElement::HTMLButtonElement(DOM::Document& document, DOM::QualifiedName qualified_name)
 HTMLButtonElement::HTMLButtonElement(DOM::Document& document, DOM::QualifiedName qualified_name)
     : FormAssociatedElement(document, move(qualified_name))
     : FormAssociatedElement(document, move(qualified_name))
 {
 {
+    // https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element:activation-behaviour
+    activation_behavior = [this](auto&) {
+        // 1. If element is disabled, then return.
+        if (!enabled())
+            return;
+
+        // 2. If element does not have a form owner, then return.
+        if (!form())
+            return;
+
+        // 3. If element's node document is not fully active, then return.
+        if (!this->document().is_fully_active())
+            return;
+
+        // 4. Switch on element's type attribute's state:
+        switch (type_state()) {
+        case TypeAttributeState::Submit:
+            // Submit Button
+            // Submit element's form owner from element.
+            form()->submit_form(this);
+            break;
+        case TypeAttributeState::Reset:
+            // Reset Button
+            // FIXME: Reset element's form owner.
+            TODO();
+            break;
+        case TypeAttributeState::Button:
+            // Button
+            // Do nothing.
+            break;
+        default:
+            VERIFY_NOT_REACHED();
+        }
+    };
 }
 }
 
 
 HTMLButtonElement::~HTMLButtonElement()
 HTMLButtonElement::~HTMLButtonElement()