mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:12:43 +00:00 
			
		
		
		
	LibWeb: Implement HTMLFormElement.requestSubmit()
				
					
				
			This can be used to submit a form using a specific submit button.
This commit is contained in:
		
							parent
							
								
									94149db073
								
							
						
					
					
						commit
						816d24f647
					
				
					 5 changed files with 72 additions and 1 deletions
				
			
		
							
								
								
									
										4
									
								
								Tests/LibWeb/Text/expected/form-requestSubmit.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Tests/LibWeb/Text/expected/form-requestSubmit.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | |||
|        Submitter is null | ||||
| <INPUT id="form-associated-button" > | ||||
| Exception: NotFoundError | ||||
| Exception: TypeError | ||||
							
								
								
									
										41
									
								
								Tests/LibWeb/Text/input/form-requestSubmit.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Tests/LibWeb/Text/input/form-requestSubmit.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | |||
| <!DOCTYPE html> | ||||
| <span id="not-a-submit-button"></span> | ||||
| <form> | ||||
|     <input type="Submit" id="form-associated-button"  /> | ||||
| </form> | ||||
| <input type="Submit" id="other-button" /> | ||||
| <script src="./include.js"></script> | ||||
| <script> | ||||
|     test(() => { | ||||
|         const form = document.forms[0]; | ||||
|         form.addEventListener("submit", event => { | ||||
|             event.preventDefault(); | ||||
|             if (event.submitter) { | ||||
|                 printElement(event.submitter); | ||||
|             } else { | ||||
|                 println("Submitter is null"); | ||||
|             } | ||||
|         }); | ||||
|          | ||||
|         form.requestSubmit(); | ||||
|          | ||||
|         const formAssociatedButton = document.getElementById("form-associated-button"); | ||||
|         form.requestSubmit(formAssociatedButton); | ||||
| 
 | ||||
|         const otherButton = document.getElementById("other-button"); | ||||
|         try { | ||||
|             form.requestSubmit(otherButton); | ||||
|             println("FAIL"); | ||||
|         } catch (e) { | ||||
|             println(`Exception: ${e.name}`); | ||||
|         } | ||||
| 
 | ||||
|         const notASubmitButton = document.getElementById("not-a-submit-button"); | ||||
|         try { | ||||
|             form.requestSubmit(notASubmitButton); | ||||
|             println("FAIL"); | ||||
|         } catch (e) { | ||||
|             println(`Exception: ${e.name}`); | ||||
|         } | ||||
|     }); | ||||
| </script> | ||||
|  | @ -319,6 +319,29 @@ WebIDL::ExceptionOr<void> HTMLFormElement::submit() | |||
|     return submit_form(*this, { .from_submit_binding = true }); | ||||
| } | ||||
| 
 | ||||
| // https://html.spec.whatwg.org/multipage/forms.html#dom-form-requestsubmit
 | ||||
| WebIDL::ExceptionOr<void> HTMLFormElement::request_submit(JS::GCPtr<Element> submitter) | ||||
| { | ||||
|     // 1. If submitter is not null, then:
 | ||||
|     if (submitter) { | ||||
|         // 1. If submitter is not a submit button, then throw a TypeError.
 | ||||
|         auto* form_associated_element = dynamic_cast<FormAssociatedElement*>(submitter.ptr()); | ||||
|         if (!(form_associated_element && form_associated_element->is_submit_button())) | ||||
|             return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "The submitter is not a submit button"sv }; | ||||
| 
 | ||||
|         // 2. If submitter's form owner is not this form element, then throw a "NotFoundError" DOMException.
 | ||||
|         if (form_associated_element->form() != this) | ||||
|             return WebIDL::NotFoundError::create(realm(), "The submitter is not owned by this form element"_fly_string); | ||||
|     } | ||||
|     // 2. Otherwise, set submitter to this form element.
 | ||||
|     else { | ||||
|         submitter = this; | ||||
|     } | ||||
| 
 | ||||
|     // 3. Submit this form element, from submitter.
 | ||||
|     return submit_form(static_cast<HTMLElement&>(*submitter), {}); | ||||
| } | ||||
| 
 | ||||
| // https://html.spec.whatwg.org/multipage/forms.html#dom-form-reset
 | ||||
| void HTMLFormElement::reset() | ||||
| { | ||||
|  |  | |||
|  | @ -65,6 +65,9 @@ public: | |||
|     // NOTE: This is for the JS bindings. Use submit_form instead.
 | ||||
|     WebIDL::ExceptionOr<void> submit(); | ||||
| 
 | ||||
|     // NOTE: This is for the JS bindings. Use submit_form instead.
 | ||||
|     WebIDL::ExceptionOr<void> request_submit(JS::GCPtr<Element> submitter); | ||||
| 
 | ||||
|     // NOTE: This is for the JS bindings. Use submit_form instead.
 | ||||
|     void reset(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ interface HTMLFormElement : HTMLElement { | |||
|     getter (RadioNodeList or Element) (DOMString name); | ||||
| 
 | ||||
|     undefined submit(); | ||||
|     // FIXME: undefined requestSubmit(optional HTMLElement? submitter = null); | ||||
|     undefined requestSubmit(optional HTMLElement? submitter = null); | ||||
|     [CEReactions] undefined reset(); | ||||
|     boolean checkValidity(); | ||||
|     boolean reportValidity(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tim Ledbetter
						Tim Ledbetter