| 
									
										
										
										
											2024-10-30 20:13:31 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2022, the SerenityOS developers. | 
					
						
							|  |  |  |  * Copyright (c) 2024, Andreas Kling <andreas@ladybird.org> | 
					
						
							|  |  |  |  * Copyright (c) 2024, Tim Flynn <trflynn89@ladybird.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-31 10:05:44 -04:00
										 |  |  | #include <AK/ScopeGuard.h>
 | 
					
						
							| 
									
										
										
										
											2024-10-30 20:13:31 -04:00
										 |  |  | #include <LibWeb/HTML/AnimationFrameCallbackDriver.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::HTML { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC_DEFINE_ALLOCATOR(AnimationFrameCallbackDriver); | 
					
						
							| 
									
										
										
										
											2024-10-30 20:13:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | void AnimationFrameCallbackDriver::visit_edges(Cell::Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Base::visit_edges(visitor); | 
					
						
							|  |  |  |     visitor.visit(m_callbacks); | 
					
						
							| 
									
										
										
										
											2024-10-31 10:05:44 -04:00
										 |  |  |     visitor.visit(m_executing_callbacks); | 
					
						
							| 
									
										
										
										
											2024-10-30 20:13:31 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebIDL::UnsignedLong AnimationFrameCallbackDriver::add(Callback handler) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto id = ++m_animation_frame_callback_identifier; | 
					
						
							|  |  |  |     m_callbacks.set(id, handler); | 
					
						
							|  |  |  |     return id; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimationFrameCallbackDriver::remove(WebIDL::UnsignedLong id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_callbacks.remove(id); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimationFrameCallbackDriver::has_callbacks() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return !m_callbacks.is_empty(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimationFrameCallbackDriver::run(double now) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-10-31 10:05:44 -04:00
										 |  |  |     AK::ScopeGuard guard { [&]() { m_executing_callbacks.clear(); } }; | 
					
						
							|  |  |  |     m_executing_callbacks = move(m_callbacks); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (auto& [id, callback] : m_executing_callbacks) | 
					
						
							| 
									
										
										
										
											2024-10-30 20:13:31 -04:00
										 |  |  |         callback->function()(now); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |