forked from SerenityOS/serenity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ApplicationBridge.cpp
59 lines (46 loc) 路 2.2 KB
/
ApplicationBridge.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
* Copyright (c) 2024, Tim Flynn <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/ByteString.h>
#include <Application/ApplicationBridge.h>
#include <Ladybird/AppKit/UI/LadybirdWebViewBridge.h>
#include <Ladybird/HelperProcess.h>
#include <Ladybird/Utilities.h>
#include <LibProtocol/RequestClient.h>
#include <LibWebView/WebContentClient.h>
namespace Ladybird {
// Unfortunately, the Protocol namespace conflicts hard with a @Protocol interface defined by Objective-C. And the #define
// trick we use for e.g. Duration does not work for Protocol. So here, we make sure that any use of the Protocol namespace
// is limited to .cpp files (i.e. not .h files that an Objective-C file can include).
struct ApplicationBridgeImpl {
RefPtr<Protocol::RequestClient> request_server_client;
};
ApplicationBridge::ApplicationBridge()
: m_impl(make<ApplicationBridgeImpl>())
{
}
ApplicationBridge::~ApplicationBridge() = default;
ErrorOr<void> ApplicationBridge::launch_request_server(Vector<ByteString> const& certificates)
{
auto request_server_paths = TRY(get_paths_for_helper_process("RequestServer"sv));
auto protocol_client = TRY(launch_request_server_process(request_server_paths, s_serenity_resource_root, certificates));
m_impl->request_server_client = move(protocol_client);
return {};
}
ErrorOr<NonnullRefPtr<WebView::WebContentClient>> ApplicationBridge::launch_web_content(WebViewBridge& web_view_bridge)
{
// FIXME: Fail to open the tab, rather than crashing the whole application if this fails
auto request_server_sockets = TRY(connect_new_request_server_client(*m_impl->request_server_client));
auto web_content_paths = TRY(get_paths_for_helper_process("WebContent"sv));
auto web_content = TRY(launch_web_content_process(web_view_bridge, web_content_paths, web_view_bridge.web_content_options(), move(request_server_sockets)));
return web_content;
}
ErrorOr<WebView::SocketPair> ApplicationBridge::launch_web_worker()
{
auto web_worker_paths = TRY(get_paths_for_helper_process("WebWorker"sv));
auto worker_client = TRY(launch_web_worker_process(web_worker_paths, *m_impl->request_server_client));
return worker_client->dup_sockets();
}
}