From d76608b945872372902e54e85718bb90be400c86 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 22 Jan 2026 17:31:38 -0600 Subject: [PATCH] refactor: use `gin::Wrappable` in `electron::api::PowerSaveBlocker` (#49381) * refactor: PowerSaveBlocker subclasses gin::Wrappable * chore: update chore_add_electron_objects_to_wrappablepointertag.patch * chore: e patches all --- ...ctron_objects_to_wrappablepointertag.patch | 5 +- .../api/electron_api_power_save_blocker.cc | 51 +++++++++++-------- .../api/electron_api_power_save_blocker.h | 20 ++++---- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch b/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch index 3b203ed601..870da9ff98 100644 --- a/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch +++ b/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch @@ -8,10 +8,10 @@ electron objects that extend gin::Wrappable and gets allocated on the cpp heap diff --git a/gin/public/wrappable_pointer_tags.h b/gin/public/wrappable_pointer_tags.h -index 573bcb2e56068a2ade6d8ab28964b077487874fd..42add73062b723b03fc15ddcce905e4d5061c384 100644 +index 573bcb2e56068a2ade6d8ab28964b077487874fd..a21a0ebda93b16f592977768bfe1c717caaf93b5 100644 --- a/gin/public/wrappable_pointer_tags.h +++ b/gin/public/wrappable_pointer_tags.h -@@ -74,7 +74,15 @@ enum WrappablePointerTag : uint16_t { +@@ -74,7 +74,16 @@ enum WrappablePointerTag : uint16_t { kTextInputControllerBindings, // content::TextInputControllerBindings kWebAXObjectProxy, // content::WebAXObjectProxy kWrappedExceptionHandler, // extensions::WrappedExceptionHandler @@ -21,6 +21,7 @@ index 573bcb2e56068a2ade6d8ab28964b077487874fd..42add73062b723b03fc15ddcce905e4d + kElectronEvent, // gin_helper::internal::Event + kElectronMenu, // electron::api::Menu + kElectronNetLog, // electron::api::NetLog ++ kElectronPowerSaveBlocker, // electron::api::PowerSaveBlocker + kElectronReplyChannel, // gin_helper::internal::ReplyChannel + kElectronSession, // electron::api::Session + kElectronWebRequest, // electron::api::WebRequest diff --git a/shell/browser/api/electron_api_power_save_blocker.cc b/shell/browser/api/electron_api_power_save_blocker.cc index 5799557870..d8d5f30287 100644 --- a/shell/browser/api/electron_api_power_save_blocker.cc +++ b/shell/browser/api/electron_api_power_save_blocker.cc @@ -16,6 +16,8 @@ #include "shell/browser/javascript_environment.h" #include "shell/common/gin_helper/handle.h" #include "shell/common/node_includes.h" +#include "v8/include/cppgc/allocation.h" +#include "v8/include/v8-cppgc.h" namespace gin { @@ -41,14 +43,39 @@ struct Converter { namespace electron::api { -gin::DeprecatedWrapperInfo PowerSaveBlocker::kWrapperInfo = { - gin::kEmbedderNativeGin}; +const gin::WrapperInfo PowerSaveBlocker::kWrapperInfo = { + {gin::kEmbedderNativeGin}, + gin::kElectronPowerSaveBlocker}; PowerSaveBlocker::PowerSaveBlocker(v8::Isolate* isolate) : current_lock_type_(device::mojom::WakeLockType::kPreventAppSuspension) {} PowerSaveBlocker::~PowerSaveBlocker() = default; +// static +gin_helper::Handle PowerSaveBlocker::Create( + v8::Isolate* isolate) { + return gin_helper::CreateHandle( + isolate, cppgc::MakeGarbageCollected( + isolate->GetCppHeap()->GetAllocationHandle(), isolate)); +} + +const gin::WrapperInfo* PowerSaveBlocker::wrapper_info() const { + return &kWrapperInfo; +} + +const char* PowerSaveBlocker::GetHumanReadableName() const { + return "Electron / PowerSaveBlocker"; +} + +gin::ObjectTemplateBuilder PowerSaveBlocker::GetObjectTemplateBuilder( + v8::Isolate* isolate) { + return gin::Wrappable::GetObjectTemplateBuilder(isolate) + .SetMethod("start", &PowerSaveBlocker::Start) + .SetMethod("stop", &PowerSaveBlocker::Stop) + .SetMethod("isStarted", &PowerSaveBlocker::IsStarted); +} + void PowerSaveBlocker::UpdatePowerSaveBlocker() { if (wake_lock_types_.empty()) { if (is_wake_lock_active_) { @@ -66,6 +93,7 @@ void PowerSaveBlocker::UpdatePowerSaveBlocker() { // Only the highest-precedence blocker type takes effect. device::mojom::WakeLockType new_lock_type = device::mojom::WakeLockType::kPreventAppSuspension; + for (const auto& element : wake_lock_types_) { if (element.second == device::mojom::WakeLockType::kPreventDisplaySleep) { new_lock_type = device::mojom::WakeLockType::kPreventDisplaySleep; @@ -114,25 +142,6 @@ bool PowerSaveBlocker::IsStarted(int id) const { return wake_lock_types_.contains(id); } -// static -gin_helper::Handle PowerSaveBlocker::Create( - v8::Isolate* isolate) { - return gin_helper::CreateHandle(isolate, new PowerSaveBlocker(isolate)); -} - -gin::ObjectTemplateBuilder PowerSaveBlocker::GetObjectTemplateBuilder( - v8::Isolate* isolate) { - return gin_helper::DeprecatedWrappable< - PowerSaveBlocker>::GetObjectTemplateBuilder(isolate) - .SetMethod("start", &PowerSaveBlocker::Start) - .SetMethod("stop", &PowerSaveBlocker::Stop) - .SetMethod("isStarted", &PowerSaveBlocker::IsStarted); -} - -const char* PowerSaveBlocker::GetTypeName() { - return "PowerSaveBlocker"; -} - } // namespace electron::api namespace { diff --git a/shell/browser/api/electron_api_power_save_blocker.h b/shell/browser/api/electron_api_power_save_blocker.h index ae7d8c2cbf..d96f614ceb 100644 --- a/shell/browser/api/electron_api_power_save_blocker.h +++ b/shell/browser/api/electron_api_power_save_blocker.h @@ -6,9 +6,9 @@ #define ELECTRON_SHELL_BROWSER_API_ELECTRON_API_POWER_SAVE_BLOCKER_H_ #include "base/containers/flat_map.h" +#include "gin/wrappable.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/wake_lock.mojom.h" -#include "shell/common/gin_helper/wrappable.h" namespace gin { class ObjectTemplateBuilder; @@ -21,25 +21,25 @@ class Handle; namespace electron::api { -class PowerSaveBlocker final - : public gin_helper::DeprecatedWrappable { +class PowerSaveBlocker final : public gin::Wrappable { public: static gin_helper::Handle Create(v8::Isolate* isolate); - // gin_helper::Wrappable - static gin::DeprecatedWrapperInfo kWrapperInfo; + // gin::Wrappable + static const gin::WrapperInfo kWrapperInfo; + const gin::WrapperInfo* wrapper_info() const override; + const char* GetHumanReadableName() const override; gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override; - const char* GetTypeName() override; + + // Make public for cppgc::MakeGarbageCollected. + explicit PowerSaveBlocker(v8::Isolate* isolate); + ~PowerSaveBlocker() override; // disable copy PowerSaveBlocker(const PowerSaveBlocker&) = delete; PowerSaveBlocker& operator=(const PowerSaveBlocker&) = delete; - protected: - explicit PowerSaveBlocker(v8::Isolate* isolate); - ~PowerSaveBlocker() override; - private: void UpdatePowerSaveBlocker(); int Start(device::mojom::WakeLockType type);