summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWebView/ViewImplementation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibWebView/ViewImplementation.cpp')
-rw-r--r--Userland/Libraries/LibWebView/ViewImplementation.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp
index c77b8c27f9..0686544921 100644
--- a/Userland/Libraries/LibWebView/ViewImplementation.cpp
+++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp
@@ -126,7 +126,7 @@ void ViewImplementation::run_javascript(StringView js_source)
#if !defined(AK_OS_SERENITY)
-ErrorOr<NonnullRefPtr<WebView::WebContentClient>> ViewImplementation::launch_web_content_process(ReadonlySpan<String> candidate_web_content_paths)
+ErrorOr<NonnullRefPtr<WebView::WebContentClient>> ViewImplementation::launch_web_content_process(ReadonlySpan<String> candidate_web_content_paths, EnableCallgrindProfiling enable_callgrind_profiling)
{
int socket_fds[2] {};
TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds));
@@ -149,15 +149,22 @@ ErrorOr<NonnullRefPtr<WebView::WebContentClient>> ViewImplementation::launch_web
auto webcontent_fd_passing_socket_string = TRY(String::number(wc_fd_passing_fd));
- auto arguments = Array {
- "WebContent"sv,
- "--webcontent-fd-passing-socket"sv,
- webcontent_fd_passing_socket_string
- };
-
ErrorOr<void> result;
for (auto const& path : candidate_web_content_paths) {
- result = Core::System::exec(path, arguments, Core::System::SearchInPath::Yes);
+ constexpr auto callgrind_prefix_length = 3;
+ auto arguments_with_callgrind_prefix = Array {
+ "valgrind"sv,
+ "--tool=callgrind"sv,
+ "--instr-atstart=no"sv,
+ path.bytes_as_string_view(),
+ "--webcontent-fd-passing-socket"sv,
+ webcontent_fd_passing_socket_string
+ };
+ auto arguments = arguments_with_callgrind_prefix.span();
+ if (enable_callgrind_profiling == EnableCallgrindProfiling::No)
+ arguments = arguments.slice(callgrind_prefix_length);
+
+ result = Core::System::exec(arguments[0], arguments, Core::System::SearchInPath::Yes);
if (!result.is_error())
break;
}
@@ -176,6 +183,13 @@ ErrorOr<NonnullRefPtr<WebView::WebContentClient>> ViewImplementation::launch_web
auto new_client = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) WebView::WebContentClient(move(socket), *this)));
new_client->set_fd_passing_socket(TRY(Core::LocalSocket::adopt_fd(ui_fd_passing_fd)));
+ if (enable_callgrind_profiling == EnableCallgrindProfiling::Yes) {
+ dbgln();
+ dbgln("\033[1;45mLaunched WebContent process under callgrind!\033[0m");
+ dbgln("\033[100mRun `\033[4mcallgrind_control -i on\033[24m` to start instrumentation and `\033[4mcallgrind_control -i off\033[24m` stop it again.\033[0m");
+ dbgln();
+ }
+
return new_client;
}