ladybird/Userland/Libraries/LibWeb/WebDriver/HeapTimer.h
Timothy Flynn bf0bc62654 WebContent+WebDriver: Asynchronously wait for navigations to complete
Similar to commit c2cf65adac, we should
avoid spinning the event loop from the WebContent-side of the WebDriver
connection. This can result in deadlocks if another component in LibWeb
also spins the event loop.

The AO to await navigations has two event loop spinners - waiting for
the navigation to complete and for the document to reach the target
readiness state. We now use NavigationObserver and DocumentObserver to
be notified when these conditions are met. And we use the same async IPC
mechanism as script execution to notify the WebDriver process when all
conditions are met (or timed out).
2024-10-26 11:25:42 +02:00

37 lines
838 B
C++

/*
* Copyright (c) 2024, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibCore/Forward.h>
#include <LibJS/Heap/GCPtr.h>
#include <LibJS/Heap/HeapFunction.h>
namespace Web::WebDriver {
class HeapTimer : public JS::Cell {
JS_CELL(HeapTimer, JS::Cell);
JS_DECLARE_ALLOCATOR(HeapTimer);
public:
explicit HeapTimer();
virtual ~HeapTimer() override;
void start(u64 timeout_ms, JS::NonnullGCPtr<JS::HeapFunction<void()>> on_timeout);
void stop_and_fire_timeout_handler();
void stop();
bool is_timed_out() const { return m_timed_out; }
private:
virtual void visit_edges(JS::Cell::Visitor& visitor) override;
NonnullRefPtr<Core::Timer> m_timer;
JS::GCPtr<JS::HeapFunction<void()>> m_on_timeout;
bool m_timed_out { false };
};
}