diff --git a/Libraries/LibCore/Promise.h b/Libraries/LibCore/Promise.h index e2136056671..4b98154b977 100644 --- a/Libraries/LibCore/Promise.h +++ b/Libraries/LibCore/Promise.h @@ -14,13 +14,21 @@ namespace Core { -template -class Promise : public EventReceiver { - C_OBJECT(Promise); +class PromiseBase + : public RefCounted + , public Weakable { +public: + virtual ~PromiseBase() = default; +}; +template +class Promise : public PromiseBase { public: using ErrorType = TError; + virtual ~Promise() = default; + static NonnullRefPtr construct() { return adopt_ref(*new Promise()); } + Function(Result&)> on_resolution; Function on_rejection; @@ -156,6 +164,8 @@ public: return *this; } + void add_child(NonnullRefPtr child) { m_children.append(move(child)); } + private: template void possibly_handle_rejection(ErrorOr& result) @@ -167,6 +177,8 @@ private: Promise() = default; Optional> m_result_or_rejection; + + Vector> m_children; }; } diff --git a/Services/WebDriver/Session.cpp b/Services/WebDriver/Session.cpp index 6e37e875561..7d608342280 100644 --- a/Services/WebDriver/Session.cpp +++ b/Services/WebDriver/Session.cpp @@ -252,7 +252,7 @@ ErrorOr> Session::create_server(NonnullRefPtr Session::start(LaunchBrowserCallback const& launch_browser_callback) { - auto promise = TRY(ServerPromise::try_create()); + auto promise = ServerPromise::construct(); m_web_content_socket_path = ByteString::formatted("{}/webdriver/session_{}_{}", TRY(Core::StandardPaths::runtime_directory()), getpid(), m_session_id); m_web_content_server = TRY(create_server(promise)); diff --git a/Tests/LibCore/TestLibCorePromise.cpp b/Tests/LibCore/TestLibCorePromise.cpp index 52da3487309..feb39cd504a 100644 --- a/Tests/LibCore/TestLibCorePromise.cpp +++ b/Tests/LibCore/TestLibCorePromise.cpp @@ -15,7 +15,7 @@ TEST_CASE(promise_await_async_event) { Core::EventLoop loop; - auto promise = MUST(Core::Promise::try_create()); + auto promise = Core::Promise::construct(); loop.deferred_invoke([=] { promise->resolve(42); @@ -30,7 +30,7 @@ TEST_CASE(promise_await_async_event_rejection) { Core::EventLoop loop; - auto promise = MUST(Core::Promise::try_create()); + auto promise = Core::Promise::construct(); loop.deferred_invoke([=] { promise->reject(AK::Error::from_string_literal("lol no")); @@ -48,7 +48,7 @@ TEST_CASE(promise_chain_handlers) bool resolved = false; bool rejected = false; - NonnullRefPtr> promise = MUST(Core::Promise::try_create()) + NonnullRefPtr> promise = Core::Promise::construct() ->when_resolved([&](int&) -> ErrorOr { resolved = true; return {}; }) .when_rejected([&](AK::Error const&) { rejected = true; }); @@ -68,7 +68,7 @@ TEST_CASE(infallible_promise_chain_handlers) bool resolved = false; bool rejected = false; - NonnullRefPtr> promise = MUST(Core::Promise::try_create()) + NonnullRefPtr> promise = Core::Promise::construct() ->when_resolved([&](int&) { resolved = true; }) .when_rejected([&](AK::Error const&) { rejected = true; }); @@ -85,7 +85,7 @@ TEST_CASE(promise_map) { Core::EventLoop loop; - auto promise = MUST(Core::Promise::try_create()); + auto promise = Core::Promise::construct(); auto mapped_promise = promise->map([](int result) { return result * 2; }); @@ -103,7 +103,7 @@ TEST_CASE(promise_map_already_resolved) { Core::EventLoop loop; - auto promise = MUST(Core::Promise::try_create()); + auto promise = Core::Promise::construct(); promise->resolve(21); auto mapped_promise = promise->map([](int result) {