mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-27 12:46:06 +00:00
WebDriver: Stop using the ancient Core::EventReceiver parent/child API
Before this change, clients were kept alive by making them children of the TCPServer object. This ownership model is going away (and this was the only remaining use of it!) so let's just put the clients in a hash table instead.
This commit is contained in:
parent
045eaa1576
commit
dfe776b722
Notes:
github-actions[bot]
2025-08-11 14:57:31 +00:00
Author: https://github.com/awesomekling
Commit: dfe776b722
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5817
Reviewed-by: https://github.com/gmta ✅
5 changed files with 24 additions and 12 deletions
|
@ -176,9 +176,8 @@ static JsonValue make_success_response(JsonValue value)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::Client(NonnullOwnPtr<Core::BufferedTCPSocket> socket, Core::EventReceiver* parent)
|
Client::Client(NonnullOwnPtr<Core::BufferedTCPSocket> socket)
|
||||||
: Core::EventReceiver(parent)
|
: m_socket(move(socket))
|
||||||
, m_socket(move(socket))
|
|
||||||
{
|
{
|
||||||
m_socket->on_ready_to_read = [this] {
|
m_socket->on_ready_to_read = [this] {
|
||||||
if (auto result = on_ready_to_read(); result.is_error())
|
if (auto result = on_ready_to_read(); result.is_error())
|
||||||
|
@ -194,7 +193,10 @@ Client::~Client()
|
||||||
void Client::die()
|
void Client::die()
|
||||||
{
|
{
|
||||||
// We defer removing this connection to avoid closing its socket while we are inside the on_ready_to_read callback.
|
// We defer removing this connection to avoid closing its socket while we are inside the on_ready_to_read callback.
|
||||||
deferred_invoke([this] { remove_from_parent(); });
|
deferred_invoke([this] {
|
||||||
|
if (on_death)
|
||||||
|
on_death();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void, Client::WrappedError> Client::on_ready_to_read()
|
ErrorOr<void, Client::WrappedError> Client::on_ready_to_read()
|
||||||
|
|
|
@ -116,8 +116,10 @@ public:
|
||||||
// 18. Print, https://w3c.github.io/webdriver/#print
|
// 18. Print, https://w3c.github.io/webdriver/#print
|
||||||
virtual Response print_page(Parameters parameters, JsonValue payload) = 0;
|
virtual Response print_page(Parameters parameters, JsonValue payload) = 0;
|
||||||
|
|
||||||
|
Function<void()> on_death;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Client(NonnullOwnPtr<Core::BufferedTCPSocket>, Core::EventReceiver* parent);
|
explicit Client(NonnullOwnPtr<Core::BufferedTCPSocket>);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using WrappedError = Variant<AK::Error, HTTP::HttpRequest::ParseError, WebDriver::Error>;
|
using WrappedError = Variant<AK::Error, HTTP::HttpRequest::ParseError, WebDriver::Error>;
|
||||||
|
|
|
@ -21,17 +21,17 @@
|
||||||
|
|
||||||
namespace WebDriver {
|
namespace WebDriver {
|
||||||
|
|
||||||
ErrorOr<NonnullRefPtr<Client>> Client::try_create(NonnullOwnPtr<Core::BufferedTCPSocket> socket, LaunchBrowserCallback launch_browser_callback, Core::EventReceiver* parent)
|
ErrorOr<NonnullRefPtr<Client>> Client::try_create(NonnullOwnPtr<Core::BufferedTCPSocket> socket, LaunchBrowserCallback launch_browser_callback)
|
||||||
{
|
{
|
||||||
if (!launch_browser_callback)
|
if (!launch_browser_callback)
|
||||||
return Error::from_string_literal("The callback to launch the browser must be provided");
|
return Error::from_string_literal("The callback to launch the browser must be provided");
|
||||||
|
|
||||||
TRY(socket->set_blocking(true));
|
TRY(socket->set_blocking(true));
|
||||||
return adopt_nonnull_ref_or_enomem(new (nothrow) Client(move(socket), move(launch_browser_callback), parent));
|
return adopt_nonnull_ref_or_enomem(new (nothrow) Client(move(socket), move(launch_browser_callback)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::Client(NonnullOwnPtr<Core::BufferedTCPSocket> socket, LaunchBrowserCallback launch_browser_callback, Core::EventReceiver* parent)
|
Client::Client(NonnullOwnPtr<Core::BufferedTCPSocket> socket, LaunchBrowserCallback launch_browser_callback)
|
||||||
: Web::WebDriver::Client(move(socket), parent)
|
: Web::WebDriver::Client(move(socket))
|
||||||
, m_launch_browser_callback(move(launch_browser_callback))
|
, m_launch_browser_callback(move(launch_browser_callback))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,13 +23,13 @@ class Client final : public Web::WebDriver::Client {
|
||||||
C_OBJECT_ABSTRACT(Client);
|
C_OBJECT_ABSTRACT(Client);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ErrorOr<NonnullRefPtr<Client>> try_create(NonnullOwnPtr<Core::BufferedTCPSocket>, LaunchBrowserCallback, Core::EventReceiver* parent);
|
static ErrorOr<NonnullRefPtr<Client>> try_create(NonnullOwnPtr<Core::BufferedTCPSocket>, LaunchBrowserCallback);
|
||||||
virtual ~Client() override;
|
virtual ~Client() override;
|
||||||
|
|
||||||
LaunchBrowserCallback const& launch_browser_callback() const { return m_launch_browser_callback; }
|
LaunchBrowserCallback const& launch_browser_callback() const { return m_launch_browser_callback; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Client(NonnullOwnPtr<Core::BufferedTCPSocket>, LaunchBrowserCallback, Core::EventReceiver* parent);
|
Client(NonnullOwnPtr<Core::BufferedTCPSocket>, LaunchBrowserCallback);
|
||||||
|
|
||||||
virtual Web::WebDriver::Response new_session(Web::WebDriver::Parameters parameters, JsonValue payload) override;
|
virtual Web::WebDriver::Response new_session(Web::WebDriver::Parameters parameters, JsonValue payload) override;
|
||||||
virtual Web::WebDriver::Response delete_session(Web::WebDriver::Parameters parameters, JsonValue payload) override;
|
virtual Web::WebDriver::Response delete_session(Web::WebDriver::Parameters parameters, JsonValue payload) override;
|
||||||
|
|
|
@ -106,6 +106,8 @@ ErrorOr<int> ladybird_main(Main::Arguments arguments)
|
||||||
Core::EventLoop loop;
|
Core::EventLoop loop;
|
||||||
auto server = TRY(Core::TCPServer::try_create());
|
auto server = TRY(Core::TCPServer::try_create());
|
||||||
|
|
||||||
|
HashTable<NonnullRefPtr<WebDriver::Client>> clients;
|
||||||
|
|
||||||
// FIXME: Propagate errors
|
// FIXME: Propagate errors
|
||||||
server->on_ready_to_accept = [&] {
|
server->on_ready_to_accept = [&] {
|
||||||
auto maybe_client_socket = server->accept();
|
auto maybe_client_socket = server->accept();
|
||||||
|
@ -125,11 +127,17 @@ ErrorOr<int> ladybird_main(Main::Arguments arguments)
|
||||||
return launch_process("Ladybird"sv, arguments.span());
|
return launch_process("Ladybird"sv, arguments.span());
|
||||||
};
|
};
|
||||||
|
|
||||||
auto maybe_client = WebDriver::Client::try_create(maybe_buffered_socket.release_value(), move(launch_browser_callback), server);
|
auto maybe_client = WebDriver::Client::try_create(maybe_buffered_socket.release_value(), move(launch_browser_callback));
|
||||||
if (maybe_client.is_error()) {
|
if (maybe_client.is_error()) {
|
||||||
warnln("Could not create a WebDriver client: {}", maybe_client.error());
|
warnln("Could not create a WebDriver client: {}", maybe_client.error());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto client = maybe_client.release_value();
|
||||||
|
client->on_death = [&] {
|
||||||
|
clients.remove(client);
|
||||||
|
};
|
||||||
|
clients.set(move(client));
|
||||||
};
|
};
|
||||||
|
|
||||||
TRY(server->listen(ipv4_address.value(), port, Core::TCPServer::AllowAddressReuse::Yes));
|
TRY(server->listen(ipv4_address.value(), port, Core::TCPServer::AllowAddressReuse::Yes));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue