mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:52:45 +00:00 
			
		
		
		
	LibWeb: Ensure lazy WindowObject creation when activating event handler
This commit is contained in:
		
							parent
							
								
									f9e8f02451
								
							
						
					
					
						commit
						192f4b0258
					
				
					 1 changed files with 8 additions and 5 deletions
				
			
		|  | @ -519,15 +519,18 @@ void EventTarget::activate_event_handler(FlyString const& name, HTML::EventHandl | |||
|     //        returning the element's document's global object, which is the HTML::Window object.
 | ||||
|     //        For any other HTMLElement who just had an element attribute set, `this` will be that HTMLElement, so the global object is this's document's realm's global object.
 | ||||
|     //        For anything else, it came from JavaScript, so use the global object of the provided callback function.
 | ||||
|     //        Sadly, this doesn't work if an element attribute is set on a <body> element before any script is run, as Window::wrapper() will be null.
 | ||||
|     JS::GlobalObject* global_object = nullptr; | ||||
|     if (is_attribute == IsAttribute::Yes) { | ||||
|         if (is<HTML::Window>(this)) { | ||||
|             auto* window_global_object = verify_cast<HTML::Window>(this)->wrapper(); | ||||
|             global_object = static_cast<JS::GlobalObject*>(window_global_object); | ||||
|             auto& window = verify_cast<HTML::Window>(*this); | ||||
|             // If an element attribute is set on a <body> element before any script is run, Window::wrapper() will be null.
 | ||||
|             // Force creation of the global object via the Document::interpreter() lazy initialization mechanism.
 | ||||
|             if (window.wrapper() == nullptr) | ||||
|                 window.associated_document().interpreter(); | ||||
|             global_object = static_cast<JS::GlobalObject*>(window.wrapper()); | ||||
|         } else { | ||||
|             auto* html_element = verify_cast<HTML::HTMLElement>(this); | ||||
|             global_object = &html_element->document().realm().global_object(); | ||||
|             auto& html_element = verify_cast<HTML::HTMLElement>(*this); | ||||
|             global_object = &html_element.document().realm().global_object(); | ||||
|         } | ||||
|     } else { | ||||
|         global_object = &event_handler.value.get<Bindings::CallbackType>().callback.cell()->global_object(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh