diff --git a/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch b/patches/chromium/chore_add_electron_objects_to_wrappablepointertag.patch index 621ea1532a..c88a6e9ea7 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..16145e466cd560784b89681aa642e350d5b28f12 100644 +index 573bcb2e56068a2ade6d8ab28964b077487874fd..41759b87e1aec4ec125560b9a52828fb44bc5999 100644 --- a/gin/public/wrappable_pointer_tags.h +++ b/gin/public/wrappable_pointer_tags.h -@@ -74,7 +74,17 @@ enum WrappablePointerTag : uint16_t { +@@ -74,7 +74,18 @@ enum WrappablePointerTag : uint16_t { kTextInputControllerBindings, // content::TextInputControllerBindings kWebAXObjectProxy, // content::WebAXObjectProxy kWrappedExceptionHandler, // extensions::WrappedExceptionHandler @@ -24,6 +24,7 @@ index 573bcb2e56068a2ade6d8ab28964b077487874fd..16145e466cd560784b89681aa642e350 + kElectronNetLog, // electron::api::NetLog + kElectronPowerSaveBlocker, // electron::api::PowerSaveBlocker + kElectronReplyChannel, // gin_helper::internal::ReplyChannel ++ kElectronScreen, // electron::api::Screen + kElectronSession, // electron::api::Session + kElectronWebRequest, // electron::api::WebRequest + kLastPointerTag = kElectronWebRequest, diff --git a/shell/browser/api/electron_api_screen.cc b/shell/browser/api/electron_api_screen.cc index 3b4cb6f7df..7652cb631d 100644 --- a/shell/browser/api/electron_api_screen.cc +++ b/shell/browser/api/electron_api_screen.cc @@ -9,12 +9,10 @@ #include "base/functional/bind.h" #include "shell/browser/browser.h" -#include "shell/common/gin_converters/callback_converter.h" #include "shell/common/gin_converters/gfx_converter.h" #include "shell/common/gin_converters/native_window_converter.h" #include "shell/common/gin_helper/dictionary.h" #include "shell/common/gin_helper/error_thrower.h" -#include "shell/common/gin_helper/handle.h" #include "shell/common/gin_helper/object_template_builder.h" #include "shell/common/node_includes.h" #include "ui/display/display.h" @@ -23,6 +21,8 @@ #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/vector2d_conversions.h" +#include "v8/include/cppgc/allocation.h" +#include "v8/include/v8-cppgc.h" #if BUILDFLAG(IS_WIN) #include "ui/display/win/screen_win.h" @@ -38,7 +38,8 @@ namespace electron::api { -gin::DeprecatedWrapperInfo Screen::kWrapperInfo = {gin::kEmbedderNativeGin}; +const gin::WrapperInfo Screen::kWrapperInfo = {{gin::kEmbedderNativeGin}, + gin::kElectronScreen}; namespace { @@ -71,13 +72,15 @@ void DelayEmitWithMetrics(Screen* screen, } // namespace -Screen::Screen(v8::Isolate* isolate, display::Screen* screen) - : screen_(screen) { +Screen::Screen(display::Screen* screen) : screen_{screen} { screen_->AddObserver(this); } Screen::~Screen() { - screen_->RemoveObserver(this); + // Use `display::Screen::Get()` here, not our cached `screen_`: + // during shutdown, it can get torn down before us. + if (auto* screen = display::Screen::Get()) + screen->RemoveObserver(this); } gfx::Point Screen::GetCursorScreenPoint(v8::Isolate* isolate) { @@ -172,22 +175,21 @@ gfx::Point Screen::DIPToScreenPoint(const gfx::Point& point_dip) { } // static -v8::Local Screen::Create(gin_helper::ErrorThrower error_thrower) { +Screen* Screen::Create(gin_helper::ErrorThrower error_thrower) { if (!Browser::Get()->is_ready()) { error_thrower.ThrowError( "The 'screen' module can't be used before the app 'ready' event"); - return v8::Null(error_thrower.isolate()); + return {}; } display::Screen* screen = display::Screen::Get(); if (!screen) { error_thrower.ThrowError("Failed to get screen information"); - return v8::Null(error_thrower.isolate()); + return {}; } - return gin_helper::CreateHandle(error_thrower.isolate(), - new Screen(error_thrower.isolate(), screen)) - .ToV8(); + return cppgc::MakeGarbageCollected( + error_thrower.isolate()->GetCppHeap()->GetAllocationHandle(), screen); } gin::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder( @@ -209,8 +211,12 @@ gin::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder( .SetMethod("getDisplayMatching", &Screen::GetDisplayMatching); } -const char* Screen::GetTypeName() { - return "Screen"; +const gin::WrapperInfo* Screen::wrapper_info() const { + return &kWrapperInfo; +} + +const char* Screen::GetHumanReadableName() const { + return "Electron / Screen"; } } // namespace electron::api diff --git a/shell/browser/api/electron_api_screen.h b/shell/browser/api/electron_api_screen.h index d3372efb5b..19e910e05f 100644 --- a/shell/browser/api/electron_api_screen.h +++ b/shell/browser/api/electron_api_screen.h @@ -8,8 +8,8 @@ #include #include "base/memory/raw_ptr.h" +#include "gin/wrappable.h" #include "shell/browser/event_emitter_mixin.h" -#include "shell/common/gin_helper/wrappable.h" #include "ui/display/display_observer.h" #include "ui/display/screen.h" @@ -17,7 +17,6 @@ namespace gfx { class Point; class PointF; class Rect; -class Screen; } // namespace gfx namespace gin_helper { @@ -26,23 +25,25 @@ class ErrorThrower; namespace electron::api { -class Screen final : public gin_helper::DeprecatedWrappable, +class Screen final : public gin::Wrappable, public gin_helper::EventEmitterMixin, private display::DisplayObserver { public: - static v8::Local Create(gin_helper::ErrorThrower error_thrower); + static Screen* Create(gin_helper::ErrorThrower error_thrower); - static gin::DeprecatedWrapperInfo kWrapperInfo; + static const gin::WrapperInfo kWrapperInfo; gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override; - const char* GetTypeName() override; + const gin::WrapperInfo* wrapper_info() const override; + const char* GetHumanReadableName() const override; + const char* GetClassName() const { return "Screen"; } // disable copy Screen(const Screen&) = delete; Screen& operator=(const Screen&) = delete; - protected: - Screen(v8::Isolate* isolate, display::Screen* screen); + // Make public for cppgc::MakeGarbageCollected. + explicit Screen(display::Screen* screen); ~Screen() override; gfx::Point GetCursorScreenPoint(v8::Isolate* isolate);