Timer.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/Timer.h>
  7. #include <LibJS/Runtime/Object.h>
  8. #include <LibWeb/HTML/Timer.h>
  9. #include <LibWeb/HTML/Window.h>
  10. namespace Web::HTML {
  11. JS::NonnullGCPtr<Timer> Timer::create(JS::Object& window_or_worker_global_scope, i32 milliseconds, Function<void()> callback, i32 id)
  12. {
  13. auto heap_function_callback = JS::create_heap_function(window_or_worker_global_scope.heap(), move(callback));
  14. return window_or_worker_global_scope.heap().allocate_without_realm<Timer>(window_or_worker_global_scope, milliseconds, heap_function_callback, id);
  15. }
  16. Timer::Timer(JS::Object& window_or_worker_global_scope, i32 milliseconds, JS::NonnullGCPtr<JS::HeapFunction<void()>> callback, i32 id)
  17. : m_window_or_worker_global_scope(window_or_worker_global_scope)
  18. , m_callback(move(callback))
  19. , m_id(id)
  20. {
  21. m_timer = Core::Timer::create_single_shot(milliseconds, [this] {
  22. m_callback->function()();
  23. }).release_value_but_fixme_should_propagate_errors();
  24. }
  25. void Timer::visit_edges(Cell::Visitor& visitor)
  26. {
  27. Base::visit_edges(visitor);
  28. visitor.visit(m_window_or_worker_global_scope.ptr());
  29. visitor.visit(m_callback);
  30. }
  31. Timer::~Timer()
  32. {
  33. VERIFY(!m_timer->is_active());
  34. }
  35. void Timer::start()
  36. {
  37. m_timer->start();
  38. }
  39. void Timer::stop()
  40. {
  41. m_timer->stop();
  42. }
  43. }