AnimationFrameCallbackDriver.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * Copyright (c) 2022, the SerenityOS developers.
  3. * Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
  4. * Copyright (c) 2024, Tim Flynn <trflynn89@ladybird.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include <AK/ScopeGuard.h>
  9. #include <LibWeb/HTML/AnimationFrameCallbackDriver.h>
  10. namespace Web::HTML {
  11. GC_DEFINE_ALLOCATOR(AnimationFrameCallbackDriver);
  12. void AnimationFrameCallbackDriver::visit_edges(Cell::Visitor& visitor)
  13. {
  14. Base::visit_edges(visitor);
  15. visitor.visit(m_callbacks);
  16. visitor.visit(m_executing_callbacks);
  17. }
  18. WebIDL::UnsignedLong AnimationFrameCallbackDriver::add(Callback handler)
  19. {
  20. auto id = ++m_animation_frame_callback_identifier;
  21. m_callbacks.set(id, handler);
  22. return id;
  23. }
  24. bool AnimationFrameCallbackDriver::remove(WebIDL::UnsignedLong id)
  25. {
  26. return m_callbacks.remove(id);
  27. }
  28. bool AnimationFrameCallbackDriver::has_callbacks() const
  29. {
  30. return !m_callbacks.is_empty();
  31. }
  32. void AnimationFrameCallbackDriver::run(double now)
  33. {
  34. AK::ScopeGuard guard { [&]() { m_executing_callbacks.clear(); } };
  35. m_executing_callbacks = move(m_callbacks);
  36. for (auto& [id, callback] : m_executing_callbacks)
  37. callback->function()(now);
  38. }
  39. }