diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index 9cace3c09c..f0c3ecf7eb 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -64,6 +64,8 @@ set(SOURCES Tab.cpp TimerQt.cpp Utilities.cpp + WebSocketClientManagerLadybird.cpp + WebSocketLadybird.cpp ) qt_add_executable(ladybird ${SOURCES} diff --git a/Ladybird/WebSocketClientManagerLadybird.cpp b/Ladybird/WebSocketClientManagerLadybird.cpp new file mode 100644 index 0000000000..e059a73e4a --- /dev/null +++ b/Ladybird/WebSocketClientManagerLadybird.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022, Dex♪ + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "WebSocketClientManagerLadybird.h" +#include "WebSocketLadybird.h" + +namespace Ladybird { + +NonnullRefPtr WebSocketClientManagerLadybird::create() +{ + return adopt_ref(*new WebSocketClientManagerLadybird()); +} + +WebSocketClientManagerLadybird::WebSocketClientManagerLadybird() = default; +WebSocketClientManagerLadybird::~WebSocketClientManagerLadybird() = default; + +RefPtr WebSocketClientManagerLadybird::connect(AK::URL const& url, String const& origin) +{ + WebSocket::ConnectionInfo connection_info(url); + connection_info.set_origin(origin); + + auto connection = WebSocketLadybird::create(WebSocket::WebSocket::create(move(connection_info))); + return connection; +} + +} diff --git a/Ladybird/WebSocketClientManagerLadybird.h b/Ladybird/WebSocketClientManagerLadybird.h new file mode 100644 index 0000000000..58723e3571 --- /dev/null +++ b/Ladybird/WebSocketClientManagerLadybird.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022, Dex♪ + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +#pragma once + +namespace Ladybird { + +class WebSocketClientManagerLadybird : public Web::WebSockets::WebSocketClientManager { +public: + static NonnullRefPtr create(); + + virtual ~WebSocketClientManagerLadybird() override; + virtual RefPtr connect(AK::URL const&, String const& origin) override; + +private: + WebSocketClientManagerLadybird(); +}; + +} diff --git a/Ladybird/WebSocketLadybird.cpp b/Ladybird/WebSocketLadybird.cpp new file mode 100644 index 0000000000..4ace8b15c1 --- /dev/null +++ b/Ladybird/WebSocketLadybird.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022, Dex♪ + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "WebSocketLadybird.h" + +namespace Ladybird { + +NonnullRefPtr WebSocketLadybird::create(NonnullRefPtr underlying_socket) +{ + return adopt_ref(*new WebSocketLadybird(move(underlying_socket))); +} + +WebSocketLadybird::WebSocketLadybird(NonnullRefPtr underlying_socket) + : m_websocket(move(underlying_socket)) +{ + m_websocket->on_open = [weak_this = make_weak_ptr()] { + if (auto strong_this = weak_this.strong_ref()) + if (strong_this->on_open) + strong_this->on_open(); + }; + m_websocket->on_message = [weak_this = make_weak_ptr()](auto message) { + if (auto strong_this = weak_this.strong_ref()) { + if (strong_this->on_message) { + strong_this->on_message(Web::WebSockets::WebSocketClientSocket::Message { + .data = move(message.data()), + .is_text = message.is_text(), + }); + } + } + }; + m_websocket->on_error = [weak_this = make_weak_ptr()](auto error) { + if (auto strong_this = weak_this.strong_ref()) { + if (strong_this->on_error) { + switch (error) { + case WebSocket::WebSocket::Error::CouldNotEstablishConnection: + strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::CouldNotEstablishConnection); + return; + case WebSocket::WebSocket::Error::ConnectionUpgradeFailed: + strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ConnectionUpgradeFailed); + return; + case WebSocket::WebSocket::Error::ServerClosedSocket: + strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ServerClosedSocket); + return; + } + VERIFY_NOT_REACHED(); + } + } + }; + m_websocket->on_close = [weak_this = make_weak_ptr()](u16 code, String reason, bool was_clean) { + if (auto strong_this = weak_this.strong_ref()) + if (strong_this->on_close) + strong_this->on_close(code, move(reason), was_clean); + }; +} + +WebSocketLadybird::~WebSocketLadybird() = default; + +Web::WebSockets::WebSocket::ReadyState WebSocketLadybird::ready_state() +{ + switch (m_websocket->ready_state()) { + case WebSocket::ReadyState::Connecting: + return Web::WebSockets::WebSocket::ReadyState::Connecting; + case WebSocket::ReadyState::Open: + return Web::WebSockets::WebSocket::ReadyState::Open; + case WebSocket::ReadyState::Closing: + return Web::WebSockets::WebSocket::ReadyState::Closing; + case WebSocket::ReadyState::Closed: + return Web::WebSockets::WebSocket::ReadyState::Closed; + } + VERIFY_NOT_REACHED(); +} + +void WebSocketLadybird::send(ByteBuffer binary_or_text_message, bool is_text) +{ + m_websocket->send(WebSocket::Message(binary_or_text_message, is_text)); +} + +void WebSocketLadybird::send(StringView message) +{ + m_websocket->send(WebSocket::Message(message)); +} + +void WebSocketLadybird::close(u16 code, String reason) +{ + m_websocket->close(code, reason); +} + +} diff --git a/Ladybird/WebSocketLadybird.h b/Ladybird/WebSocketLadybird.h new file mode 100644 index 0000000000..879f0eb2ed --- /dev/null +++ b/Ladybird/WebSocketLadybird.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, Dex♪ + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Ladybird { + +class WebSocketLadybird + : public Web::WebSockets::WebSocketClientSocket + , public Weakable { +public: + static NonnullRefPtr create(NonnullRefPtr); + + virtual ~WebSocketLadybird() override; + + virtual Web::WebSockets::WebSocket::ReadyState ready_state() override; + virtual void send(ByteBuffer binary_or_text_message, bool is_text) override; + virtual void send(StringView message) override; + virtual void close(u16 code, String reason) override; + +private: + explicit WebSocketLadybird(NonnullRefPtr); + + NonnullRefPtr m_websocket; +}; + +} diff --git a/Ladybird/WebView.cpp b/Ladybird/WebView.cpp index bb28669821..46d4759844 100644 --- a/Ladybird/WebView.cpp +++ b/Ladybird/WebView.cpp @@ -16,6 +16,7 @@ #include "PageClientLadybird.h" #include "RequestManagerQt.h" #include "Utilities.h" +#include "WebSocketClientManagerLadybird.h" #include #include #include @@ -52,10 +53,6 @@ #include #include #include -#include -#include -#include -#include #include #include #include @@ -390,118 +387,6 @@ void WebView::update_viewport_rect() m_page_client->set_viewport_rect(rect); } -class HeadlessWebSocketClientManager : public Web::WebSockets::WebSocketClientManager { -public: - class HeadlessWebSocket - : public Web::WebSockets::WebSocketClientSocket - , public Weakable { - public: - static NonnullRefPtr create(NonnullRefPtr underlying_socket) - { - return adopt_ref(*new HeadlessWebSocket(move(underlying_socket))); - } - - virtual ~HeadlessWebSocket() override - { - } - - virtual Web::WebSockets::WebSocket::ReadyState ready_state() override - { - switch (m_websocket->ready_state()) { - case WebSocket::ReadyState::Connecting: - return Web::WebSockets::WebSocket::ReadyState::Connecting; - case WebSocket::ReadyState::Open: - return Web::WebSockets::WebSocket::ReadyState::Open; - case WebSocket::ReadyState::Closing: - return Web::WebSockets::WebSocket::ReadyState::Closing; - case WebSocket::ReadyState::Closed: - return Web::WebSockets::WebSocket::ReadyState::Closed; - } - VERIFY_NOT_REACHED(); - } - - virtual void send(ByteBuffer binary_or_text_message, bool is_text) override - { - m_websocket->send(WebSocket::Message(binary_or_text_message, is_text)); - } - - virtual void send(StringView message) override - { - m_websocket->send(WebSocket::Message(message)); - } - - virtual void close(u16 code, String reason) override - { - m_websocket->close(code, reason); - } - - private: - HeadlessWebSocket(NonnullRefPtr underlying_socket) - : m_websocket(move(underlying_socket)) - { - m_websocket->on_open = [weak_this = make_weak_ptr()] { - if (auto strong_this = weak_this.strong_ref()) - if (strong_this->on_open) - strong_this->on_open(); - }; - m_websocket->on_message = [weak_this = make_weak_ptr()](auto message) { - if (auto strong_this = weak_this.strong_ref()) { - if (strong_this->on_message) { - strong_this->on_message(Web::WebSockets::WebSocketClientSocket::Message { - .data = move(message.data()), - .is_text = message.is_text(), - }); - } - } - }; - m_websocket->on_error = [weak_this = make_weak_ptr()](auto error) { - if (auto strong_this = weak_this.strong_ref()) { - if (strong_this->on_error) { - switch (error) { - case WebSocket::WebSocket::Error::CouldNotEstablishConnection: - strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::CouldNotEstablishConnection); - return; - case WebSocket::WebSocket::Error::ConnectionUpgradeFailed: - strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ConnectionUpgradeFailed); - return; - case WebSocket::WebSocket::Error::ServerClosedSocket: - strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ServerClosedSocket); - return; - } - VERIFY_NOT_REACHED(); - } - } - }; - m_websocket->on_close = [weak_this = make_weak_ptr()](u16 code, String reason, bool was_clean) { - if (auto strong_this = weak_this.strong_ref()) - if (strong_this->on_close) - strong_this->on_close(code, move(reason), was_clean); - }; - } - - NonnullRefPtr m_websocket; - }; - - static NonnullRefPtr create() - { - return adopt_ref(*new HeadlessWebSocketClientManager()); - } - - virtual ~HeadlessWebSocketClientManager() override { } - - virtual RefPtr connect(AK::URL const& url, String const& origin) override - { - WebSocket::ConnectionInfo connection_info(url); - connection_info.set_origin(origin); - - auto connection = HeadlessWebSocket::create(WebSocket::WebSocket::create(move(connection_info))); - return connection; - } - -private: - HeadlessWebSocketClientManager() { } -}; - static void platform_init() { #ifdef AK_OS_ANDROID @@ -532,7 +417,7 @@ void initialize_web_engine() Web::Platform::ImageCodecPlugin::install(*new Ladybird::ImageCodecPluginLadybird); Web::ResourceLoader::initialize(RequestManagerQt::create()); - Web::WebSockets::WebSocketClientManager::initialize(HeadlessWebSocketClientManager::create()); + Web::WebSockets::WebSocketClientManager::initialize(Ladybird::WebSocketClientManagerLadybird::create()); Web::FrameLoader::set_default_favicon_path(String::formatted("{}/res/icons/16x16/app-browser.png", s_serenity_resource_root));