From 69b884d39cbcb6497187a65d1fac6782ef823040 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Fri, 19 Jul 2024 15:19:06 +0000 Subject: [PATCH] Add CefTaskManager::GetTaskIdForBrowserId Update https://tests/task_manager to show the current browser's renderer task in bold. Approved-by: Nik Pavlov --- include/capi/cef_task_manager_capi.h | 12 +++++++++- include/cef_api_hash.h | 8 +++---- include/cef_task_manager.h | 9 ++++++++ libcef/browser/browser_host_base.cc | 17 ++++++++++++++ libcef/browser/browser_host_base.h | 2 ++ libcef/browser/task_manager_impl.cc | 17 ++++++++++++++ libcef/browser/task_manager_impl.h | 1 + libcef_dll/cpptoc/task_manager_cpptoc.cc | 24 +++++++++++++++++++- libcef_dll/ctocpp/task_manager_ctocpp.cc | 20 +++++++++++++++- libcef_dll/ctocpp/task_manager_ctocpp.h | 3 ++- tests/cefclient/browser/task_manager_test.cc | 13 ++++++++--- tests/cefclient/resources/task_manager.html | 7 ++++++ 12 files changed, 122 insertions(+), 11 deletions(-) diff --git a/include/capi/cef_task_manager_capi.h b/include/capi/cef_task_manager_capi.h index e5ec5db8e..7c2e86832 100644 --- a/include/capi/cef_task_manager_capi.h +++ b/include/capi/cef_task_manager_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=944e04f8c3213981c3955d6b5ede036b887d4d9e$ +// $hash=324b0399edef39e64fb54fce053e7f8e347e07de$ // #ifndef CEF_INCLUDE_CAPI_CEF_TASK_MANAGER_CAPI_H_ @@ -92,6 +92,16 @@ typedef struct _cef_task_manager_t { /// int(CEF_CALLBACK* kill_task)(struct _cef_task_manager_t* self, int64_t task_id); + + /// + /// Returns the task ID associated with the main task for |browser_id| (value + /// from cef_browser_t::GetIdentifier). Returns -1 if |browser_id| is invalid, + /// does not currently have an associated task, or the function was called + /// from the incorrect thread. + /// + int64_t(CEF_CALLBACK* get_task_id_for_browser_id)( + struct _cef_task_manager_t* self, + int browser_id); } cef_task_manager_t; /// diff --git a/include/cef_api_hash.h b/include/cef_api_hash.h index 7dcb5e028..a9ea26afe 100644 --- a/include/cef_api_hash.h +++ b/include/cef_api_hash.h @@ -42,13 +42,13 @@ // way that may cause binary incompatibility with other builds. The universal // hash value will change if any platform is affected whereas the platform hash // values will change only if that particular platform is affected. -#define CEF_API_HASH_UNIVERSAL "af31a52a9b7a67e9e43aecc3dca57be096bd3c52" +#define CEF_API_HASH_UNIVERSAL "9428a74387b371a45469c91f7dbd648b2dc74132" #if defined(OS_WIN) -#define CEF_API_HASH_PLATFORM "b24a9d79201dabc26957dc207746d8b6248e0e58" +#define CEF_API_HASH_PLATFORM "e76d3804b2419a0bf024e97d6b9e10df53d93dad" #elif defined(OS_MAC) -#define CEF_API_HASH_PLATFORM "1b1e2db70d324c123a5be09fd9c528acbf49b9a4" +#define CEF_API_HASH_PLATFORM "c88c77c84ecbd81cbf4489c1b1ab4bf0396c26c3" #elif defined(OS_LINUX) -#define CEF_API_HASH_PLATFORM "9d549b9917bc2f0be789a75179e1aeea134798ef" +#define CEF_API_HASH_PLATFORM "84373e28b1ed172ce6a08da2ea33ca787f92d6dc" #endif #ifdef __cplusplus diff --git a/include/cef_task_manager.h b/include/cef_task_manager.h index c49235410..8b8ae90f1 100644 --- a/include/cef_task_manager.h +++ b/include/cef_task_manager.h @@ -95,6 +95,15 @@ class CefTaskManager : public virtual CefBaseRefCounted { /// /*--cef()--*/ virtual bool KillTask(int64_t task_id) = 0; + + /// + /// Returns the task ID associated with the main task for |browser_id| + /// (value from CefBrowser::GetIdentifier). Returns -1 if |browser_id| is + /// invalid, does not currently have an associated task, or the method was + /// called from the incorrect thread. + /// + /*--cef()--*/ + virtual int64_t GetTaskIdForBrowserId(int browser_id) = 0; }; #endif // CEF_INCLUDE_CEF_TASK_MANAGER_H_ diff --git a/libcef/browser/browser_host_base.cc b/libcef/browser/browser_host_base.cc index fc3c4a7fc..d02b6ebf9 100644 --- a/libcef/browser/browser_host_base.cc +++ b/libcef/browser/browser_host_base.cc @@ -217,6 +217,23 @@ CefBrowserHostBase::GetBrowserForTopLevelNativeWindow( return nullptr; } +// static +CefRefPtr CefBrowserHostBase::GetBrowserForBrowserId( + int browser_id) { + DCHECK_GT(browser_id, 0); + + for (const auto& browser_info : + CefBrowserInfoManager::GetInstance()->GetBrowserInfoList()) { + if (auto browser = browser_info->browser()) { + if (browser->GetIdentifier() == browser_id) { + return browser; + } + } + } + + return nullptr; +} + // static CefRefPtr CefBrowserHostBase::GetLikelyFocusedBrowser() { CEF_REQUIRE_UIT(); diff --git a/libcef/browser/browser_host_base.h b/libcef/browser/browser_host_base.h index cbc058582..d266c36c9 100644 --- a/libcef/browser/browser_host_base.h +++ b/libcef/browser/browser_host_base.h @@ -151,6 +151,8 @@ class CefBrowserHostBase : public CefBrowserHost, // Returns the browser associated with the specified top-level window. static CefRefPtr GetBrowserForTopLevelNativeWindow( gfx::NativeWindow owning_window); + // Returns the browser associated with the specified browser ID. + static CefRefPtr GetBrowserForBrowserId(int browser_id); // Returns the browser most likely to be focused. This may be somewhat iffy // with windowless browsers as there is no guarantee that the client has only diff --git a/libcef/browser/task_manager_impl.cc b/libcef/browser/task_manager_impl.cc index ef38f33f0..a884d4cf7 100644 --- a/libcef/browser/task_manager_impl.cc +++ b/libcef/browser/task_manager_impl.cc @@ -7,6 +7,7 @@ #include "base/check.h" #include "base/ranges/algorithm.h" #include "base/system/sys_info.h" +#include "cef/libcef/browser/browser_host_base.h" #include "cef/libcef/browser/context.h" #include "cef/libcef/browser/thread_util.h" #include "chrome/browser/task_manager/task_manager_interface.h" @@ -148,6 +149,22 @@ bool CefTaskManagerImpl::KillTask(int64_t task_id) { return true; } +int64_t CefTaskManagerImpl::GetTaskIdForBrowserId(int browser_id) { + CEF_REQUIRE_UIT_RETURN(-1); + + auto browser = CefBrowserHostBase::GetBrowserForBrowserId(browser_id); + if (!browser) { + return -1; + } + + auto* web_contents = browser->GetWebContents(); + if (!web_contents) { + return -1; + } + + return task_manager_->GetTaskIdForWebContents(web_contents); +} + bool CefTaskManagerImpl::IsValidTaskId(int64_t task_id) const { return base::ranges::find(tasks_, task_id) != tasks_.end(); } diff --git a/libcef/browser/task_manager_impl.h b/libcef/browser/task_manager_impl.h index 1b90d83ad..df50a0d84 100644 --- a/libcef/browser/task_manager_impl.h +++ b/libcef/browser/task_manager_impl.h @@ -29,6 +29,7 @@ class CefTaskManagerImpl : public task_manager::TaskManagerObserver, bool GetTaskIdsList(TaskIdList& task_ids) override; bool GetTaskInfo(int64_t task_id, CefTaskInfo& info) override; bool KillTask(int64_t task_id) override; + int64_t GetTaskIdForBrowserId(int browser_id) override; private: bool IsValidTaskId(int64_t task_id) const; diff --git a/libcef_dll/cpptoc/task_manager_cpptoc.cc b/libcef_dll/cpptoc/task_manager_cpptoc.cc index c27ead1ec..2904d5b74 100644 --- a/libcef_dll/cpptoc/task_manager_cpptoc.cc +++ b/libcef_dll/cpptoc/task_manager_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=07933b22615488a634fd4df87e9691156ae23ec4$ +// $hash=93050197dccd1c7999c7b90700a6144e5225c773$ // #include "libcef_dll/cpptoc/task_manager_cpptoc.h" @@ -155,6 +155,26 @@ int CEF_CALLBACK task_manager_kill_task(struct _cef_task_manager_t* self, return _retval; } +int64_t CEF_CALLBACK +task_manager_get_task_id_for_browser_id(struct _cef_task_manager_t* self, + int browser_id) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) { + return 0; + } + + // Execute + int64_t _retval = + CefTaskManagerCppToC::Get(self)->GetTaskIdForBrowserId(browser_id); + + // Return type: simple + return _retval; +} + } // namespace // CONSTRUCTOR - Do not edit by hand. @@ -164,6 +184,8 @@ CefTaskManagerCppToC::CefTaskManagerCppToC() { GetStruct()->get_task_ids_list = task_manager_get_task_ids_list; GetStruct()->get_task_info = task_manager_get_task_info; GetStruct()->kill_task = task_manager_kill_task; + GetStruct()->get_task_id_for_browser_id = + task_manager_get_task_id_for_browser_id; } // DESTRUCTOR - Do not edit by hand. diff --git a/libcef_dll/ctocpp/task_manager_ctocpp.cc b/libcef_dll/ctocpp/task_manager_ctocpp.cc index fdcb0d0a5..778d0f849 100644 --- a/libcef_dll/ctocpp/task_manager_ctocpp.cc +++ b/libcef_dll/ctocpp/task_manager_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=56907c5bc7334bc3289f0a97dbc4a70c3ac9b41a$ +// $hash=5838ce3611dda9523ff072eceb36137663828dd6$ // #include "libcef_dll/ctocpp/task_manager_ctocpp.h" @@ -132,6 +132,24 @@ NO_SANITIZE("cfi-icall") bool CefTaskManagerCToCpp::KillTask(int64_t task_id) { return _retval ? true : false; } +NO_SANITIZE("cfi-icall") +int64_t CefTaskManagerCToCpp::GetTaskIdForBrowserId(int browser_id) { + shutdown_checker::AssertNotShutdown(); + + cef_task_manager_t* _struct = GetStruct(); + if (CEF_MEMBER_MISSING(_struct, get_task_id_for_browser_id)) { + return 0; + } + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Execute + int64_t _retval = _struct->get_task_id_for_browser_id(_struct, browser_id); + + // Return type: simple + return _retval; +} + // CONSTRUCTOR - Do not edit by hand. CefTaskManagerCToCpp::CefTaskManagerCToCpp() {} diff --git a/libcef_dll/ctocpp/task_manager_ctocpp.h b/libcef_dll/ctocpp/task_manager_ctocpp.h index bac210136..4b0ad4e65 100644 --- a/libcef_dll/ctocpp/task_manager_ctocpp.h +++ b/libcef_dll/ctocpp/task_manager_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=d51db130ffb459b22574d7393e63e87c87dd75e0$ +// $hash=2d35ee921c7a1abda4c83b66708bce2451b38f20$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_TASK_MANAGER_CTOCPP_H_ @@ -38,6 +38,7 @@ class CefTaskManagerCToCpp : public CefCToCppRefCounted& tasks) { +std::string TasksToJsonString(const std::vector& tasks, + int64_t browser_task_id) { std::string json = "["; for (size_t i = 0; i < tasks.size(); ++i) { const auto& task = tasks[i]; @@ -68,7 +69,9 @@ std::string TasksToJsonString(const std::vector& tasks) { json += "\"memory\":" + std::to_string(task.memory) + ","; json += "\"gpu_memory\":" + std::to_string(task.gpu_memory) + ","; json += "\"is_gpu_memory_inflated\":"; - json += (task.is_gpu_memory_inflated ? "true" : "false"); + json += std::string(task.is_gpu_memory_inflated ? "true" : "false") + ","; + json += "\"is_this_browser\":"; + json += (task.id == browser_task_id ? "true" : "false"); json += "}"; } json += "]"; @@ -102,7 +105,11 @@ class Handler final : public CefMessageRouterBrowserSide::Handler { task_manager_->GetTaskInfo(task_id, info); tasks.push_back(info); } - callback->Success(TasksToJsonString(tasks)); + + int64_t browser_task_id = + task_manager_->GetTaskIdForBrowserId(browser->GetIdentifier()); + + callback->Success(TasksToJsonString(tasks, browser_task_id)); return true; } diff --git a/tests/cefclient/resources/task_manager.html b/tests/cefclient/resources/task_manager.html index 7f7ac55f1..ddb6c2a87 100644 --- a/tests/cefclient/resources/task_manager.html +++ b/tests/cefclient/resources/task_manager.html @@ -18,6 +18,9 @@ th { background-color: #f2f2f2; } + .highlight { + font-weight: bold; + } @@ -106,6 +109,10 @@ endButton.onclick = () => endProcess(task.id); actionCell.appendChild(endButton); } + + if (task.is_this_browser) { + row.classList.add('highlight'); + } }); } catch (error) { console.error("Error fetching tasks:", error);