mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:02:45 +00:00 
			
		
		
		
	LibWeb: Use JS::VM::call() in timer and RAF callback invocation
This removes assumptions about having an Interpreter, and also unbreaks requestAnimationFrame which was asserting.
This commit is contained in:
		
							parent
							
								
									340d6b0ef7
								
							
						
					
					
						commit
						700cbc02ec
					
				
					 1 changed files with 8 additions and 9 deletions
				
			
		|  | @ -26,7 +26,6 @@ | |||
| 
 | ||||
| #include <LibGUI/DisplayLink.h> | ||||
| #include <LibGUI/MessageBox.h> | ||||
| #include <LibJS/Interpreter.h> | ||||
| #include <LibJS/Runtime/Function.h> | ||||
| #include <LibWeb/DOM/Document.h> | ||||
| #include <LibWeb/DOM/Timer.h> | ||||
|  | @ -86,6 +85,7 @@ void Window::timer_did_fire(Badge<Timer>, Timer& timer) | |||
| { | ||||
|     // We should not be here if there's no JS wrapper for the Window object.
 | ||||
|     ASSERT(wrapper()); | ||||
|     auto& vm = wrapper()->vm(); | ||||
| 
 | ||||
|     // NOTE: This protector pointer keeps the timer alive until the end of this function no matter what.
 | ||||
|     NonnullRefPtr protector(timer); | ||||
|  | @ -94,10 +94,9 @@ void Window::timer_did_fire(Badge<Timer>, Timer& timer) | |||
|         m_timers.remove(timer.id()); | ||||
|     } | ||||
| 
 | ||||
|     auto& interpreter = document().interpreter(); | ||||
|     (void)interpreter.call(timer.callback(), wrapper()); | ||||
|     if (interpreter.exception()) | ||||
|         interpreter.vm().clear_exception(); | ||||
|     (void)vm.call(timer.callback(), wrapper()); | ||||
|     if (vm.exception()) | ||||
|         vm.clear_exception(); | ||||
| } | ||||
| 
 | ||||
| i32 Window::allocate_timer_id(Badge<Timer>) | ||||
|  | @ -122,11 +121,11 @@ i32 Window::request_animation_frame(JS::Function& callback) | |||
| 
 | ||||
|     i32 link_id = GUI::DisplayLink::register_callback([handle = make_handle(&callback)](i32 link_id) { | ||||
|         auto& function = const_cast<JS::Function&>(static_cast<const JS::Function&>(*handle.cell())); | ||||
|         auto& interpreter = function.interpreter(); | ||||
|         auto& vm = function.vm(); | ||||
|         fake_timestamp += 10; | ||||
|         (void)interpreter.call(function, {}, JS::Value(fake_timestamp)); | ||||
|         if (interpreter.exception()) | ||||
|             interpreter.vm().clear_exception(); | ||||
|         (void)vm.call(function, {}, JS::Value(fake_timestamp)); | ||||
|         if (vm.exception()) | ||||
|             vm.clear_exception(); | ||||
|         GUI::DisplayLink::unregister_callback(link_id); | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling