diff options
Diffstat (limited to 'Userland/Libraries/LibWebView/ViewImplementation.cpp')
-rw-r--r-- | Userland/Libraries/LibWebView/ViewImplementation.cpp | 30 |
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; } |