1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-17 11:47:37 +00:00

Ladybird/WebDriver: Support running headless WebDriver sessions

This adds a dependency from WebDriver to Lagom's headless-browser to be
used if the client's required capabilities indicate to do so.
This commit is contained in:
Timothy Flynn 2022-11-22 08:09:55 -05:00 committed by Andrew Kaster
parent 69cd0d6599
commit a1e380cc38
5 changed files with 46 additions and 11 deletions

View file

@ -29,6 +29,7 @@
#include <QSocketNotifier>
#include <QTimer>
#include <WebContent/ConnectionFromClient.h>
#include <WebContent/PageHost.h>
#include <WebContent/WebDriverConnection.h>
static ErrorOr<void> load_content_filters();
@ -103,7 +104,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
QSocketNotifier webdriver_notifier(QSocketNotifier::Type::Read);
RefPtr<WebContent::WebDriverConnection> webdriver_client;
if (webdriver_fd_passing_socket >= 0)
webdriver_client = TRY(create_connection_from_passed_socket<WebContent::WebDriverConnection>(webdriver_fd_passing_socket, "WebDriver"sv, webdriver_notifier, *webcontent_client, webcontent_client->page_host()));
webdriver_client = TRY(create_connection_from_passed_socket<WebContent::WebDriverConnection>(webdriver_fd_passing_socket, "WebDriver"sv, webdriver_notifier, webcontent_client->page_host()));
return app.exec();
}

View file

@ -3,6 +3,7 @@ set(WEBDRIVER_SOURCE_DIR ${SERENITY_SOURCE_DIR}/Userland/Services/WebDriver)
set(SOURCES
${WEBDRIVER_SOURCE_DIR}/Client.cpp
${WEBDRIVER_SOURCE_DIR}/WebContentConnection.cpp
../Utilities.cpp
Session.cpp
main.cpp
)
@ -14,3 +15,4 @@ target_include_directories(WebDriver PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..)
target_include_directories(WebDriver PRIVATE ${SERENITY_SOURCE_DIR}/Userland)
target_include_directories(WebDriver PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services)
target_link_libraries(WebDriver PRIVATE Qt::Core Qt::Network LibCore LibGfx LibIPC LibJS LibMain LibWeb LibWebSocket)
add_dependencies(WebDriver headless-browser)

View file

@ -11,6 +11,7 @@
#define AK_DONT_REPLACE_STD
#include "Session.h"
#include "../Utilities.h"
#include <LibCore/Stream.h>
#include <LibCore/System.h>
#include <WebDriver/Client.h>
@ -18,8 +19,9 @@
namespace WebDriver {
Session::Session(unsigned session_id, NonnullRefPtr<Client> client)
Session::Session(unsigned session_id, NonnullRefPtr<Client> client, Web::WebDriver::LadybirdOptions options)
: m_client(move(client))
, m_options(move(options))
, m_id(session_id)
{
}
@ -51,6 +53,28 @@ ErrorOr<void> Session::start()
auto fd_passing_socket_string = String::number(webcontent_fd_passing_fd);
if (m_options.headless) {
auto resouces = String::formatted("{}/res", s_serenity_resource_root);
auto error_page = String::formatted("{}/res/html/error.html", s_serenity_resource_root);
auto certs = String::formatted("{}/etc/ca_certs.ini", s_serenity_resource_root);
char const* argv[] = {
"headless-browser",
"--resources",
resouces.characters(),
"--error-page",
error_page.characters(),
"--certs",
certs.characters(),
"--webdriver-fd-passing-socket",
fd_passing_socket_string.characters(),
"about:blank",
nullptr,
};
if (execvp("./_deps/lagom-build/headless-browser", const_cast<char**>(argv)) < 0)
perror("execvp");
} else {
char const* argv[] = {
"ladybird",
"--webdriver-fd-passing-socket",
@ -60,6 +84,8 @@ ErrorOr<void> Session::start()
if (execvp("./ladybird", const_cast<char**>(argv)) < 0)
perror("execvp");
}
VERIFY_NOT_REACHED();
}

View file

@ -19,7 +19,7 @@ namespace WebDriver {
class Session {
public:
Session(unsigned session_id, NonnullRefPtr<Client> client);
Session(unsigned session_id, NonnullRefPtr<Client> client, Web::WebDriver::LadybirdOptions options);
~Session();
unsigned session_id() const { return m_id; }
@ -35,8 +35,11 @@ public:
private:
NonnullRefPtr<Client> m_client;
Web::WebDriver::LadybirdOptions m_options;
bool m_started { false };
unsigned m_id { 0 };
RefPtr<WebContentConnection> m_web_content_connection;
Optional<pid_t> m_browser_pid;
};

View file

@ -6,6 +6,7 @@
#define AK_DONT_REPLACE_STD
#include "../Utilities.h"
#include <LibCore/ArgsParser.h>
#include <LibCore/EventLoop.h>
#include <LibCore/System.h>
@ -36,6 +37,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
return 1;
}
platform_init();
Core::EventLoop loop;
auto server = TRY(Core::TCPServer::try_create());