Skip to content

Instantly share code, notes, and snippets.

@deepak1556
Last active September 26, 2024 01:36
Show Gist options
  • Select an option

  • Save deepak1556/f9682fb1b94aa53d9cf37e83638c226d to your computer and use it in GitHub Desktop.

Select an option

Save deepak1556/f9682fb1b94aa53d9cf37e83638c226d to your computer and use it in GitHub Desktop.

Revisions

  1. deepak1556 revised this gist Sep 26, 2024. 1 changed file with 570 additions and 0 deletions.
    570 changes: 570 additions & 0 deletions electron.patch
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,570 @@
    diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc
    index 6a639e2fab..7bd4be44a6 100644
    --- a/shell/browser/api/electron_api_app.cc
    +++ b/shell/browser/api/electron_api_app.cc
    @@ -356,7 +356,7 @@ struct Converter<net::SecureDnsMode> {

    namespace electron::api {

    -gin::WrapperInfo App::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo App::kWrapperInfo = {gin::kEmbedderNativeGin, "App"};

    namespace {

    diff --git a/shell/browser/api/electron_api_auto_updater.cc b/shell/browser/api/electron_api_auto_updater.cc
    index 18d2b402ff..15cb643aa0 100644
    --- a/shell/browser/api/electron_api_auto_updater.cc
    +++ b/shell/browser/api/electron_api_auto_updater.cc
    @@ -18,7 +18,7 @@

    namespace electron::api {

    -gin::WrapperInfo AutoUpdater::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo AutoUpdater::kWrapperInfo = {gin::kEmbedderNativeGin, "AutoUpdater"};

    AutoUpdater::AutoUpdater() {
    auto_updater::AutoUpdater::SetDelegate(this);
    diff --git a/shell/browser/api/electron_api_cookies.cc b/shell/browser/api/electron_api_cookies.cc
    index 98aa412f23..2a53c05edd 100644
    --- a/shell/browser/api/electron_api_cookies.cc
    +++ b/shell/browser/api/electron_api_cookies.cc
    @@ -287,7 +287,7 @@ std::string StringToCookieSameSite(const std::string* str_ptr,

    } // namespace

    -gin::WrapperInfo Cookies::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Cookies::kWrapperInfo = {gin::kEmbedderNativeGin, "Cookies"};

    Cookies::Cookies(v8::Isolate* isolate, ElectronBrowserContext* browser_context)
    : browser_context_(browser_context) {
    diff --git a/shell/browser/api/electron_api_data_pipe_holder.cc b/shell/browser/api/electron_api_data_pipe_holder.cc
    index 7842211d46..e0ef1c6a8b 100644
    --- a/shell/browser/api/electron_api_data_pipe_holder.cc
    +++ b/shell/browser/api/electron_api_data_pipe_holder.cc
    @@ -140,7 +140,7 @@ class DataPipeReader {

    } // namespace

    -gin::WrapperInfo DataPipeHolder::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo DataPipeHolder::kWrapperInfo = {gin::kEmbedderNativeGin, "DataPipeHolder"};

    DataPipeHolder::DataPipeHolder(const network::DataElement& element)
    : id_(base::NumberToString(++g_next_id)) {
    diff --git a/shell/browser/api/electron_api_debugger.cc b/shell/browser/api/electron_api_debugger.cc
    index fddd8dd36e..7695ee7b64 100755
    --- a/shell/browser/api/electron_api_debugger.cc
    +++ b/shell/browser/api/electron_api_debugger.cc
    @@ -21,7 +21,7 @@ using content::DevToolsAgentHost;

    namespace electron::api {

    -gin::WrapperInfo Debugger::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Debugger::kWrapperInfo = {gin::kEmbedderNativeGin, "Debugger"};

    Debugger::Debugger(v8::Isolate* isolate, content::WebContents* web_contents)
    : content::WebContentsObserver(web_contents), web_contents_(web_contents) {}
    diff --git a/shell/browser/api/electron_api_desktop_capturer.cc b/shell/browser/api/electron_api_desktop_capturer.cc
    index 21760aed38..3a7f663270 100644
    --- a/shell/browser/api/electron_api_desktop_capturer.cc
    +++ b/shell/browser/api/electron_api_desktop_capturer.cc
    @@ -203,7 +203,7 @@ struct Converter<electron::api::DesktopCapturer::Source> {

    namespace electron::api {

    -gin::WrapperInfo DesktopCapturer::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo DesktopCapturer::kWrapperInfo = {gin::kEmbedderNativeGin, "DesktopCapturer"};

    DesktopCapturer::DesktopCapturer(v8::Isolate* isolate) {}

    diff --git a/shell/browser/api/electron_api_download_item.cc b/shell/browser/api/electron_api_download_item.cc
    index 1e526afe93..f728ecea1a 100644
    --- a/shell/browser/api/electron_api_download_item.cc
    +++ b/shell/browser/api/electron_api_download_item.cc
    @@ -68,7 +68,7 @@ const void* kElectronApiDownloadItemKey = &kElectronApiDownloadItemKey;

    } // namespace

    -gin::WrapperInfo DownloadItem::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo DownloadItem::kWrapperInfo = {gin::kEmbedderNativeGin, "DownloadItem"};

    // static
    DownloadItem* DownloadItem::FromDownloadItem(download::DownloadItem* item) {
    diff --git a/shell/browser/api/electron_api_global_shortcut.cc b/shell/browser/api/electron_api_global_shortcut.cc
    index 278cad9529..28849a4d00 100644
    --- a/shell/browser/api/electron_api_global_shortcut.cc
    +++ b/shell/browser/api/electron_api_global_shortcut.cc
    @@ -47,7 +47,7 @@ bool MapHasMediaKeys(

    namespace electron::api {

    -gin::WrapperInfo GlobalShortcut::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo GlobalShortcut::kWrapperInfo = {gin::kEmbedderNativeGin, "GlobalShortcut"};

    GlobalShortcut::GlobalShortcut(v8::Isolate* isolate) {}

    diff --git a/shell/browser/api/electron_api_in_app_purchase.cc b/shell/browser/api/electron_api_in_app_purchase.cc
    index ac78a07f1a..82cff926ec 100644
    --- a/shell/browser/api/electron_api_in_app_purchase.cc
    +++ b/shell/browser/api/electron_api_in_app_purchase.cc
    @@ -129,7 +129,7 @@ struct Converter<in_app_purchase::Product> {

    namespace electron::api {

    -gin::WrapperInfo InAppPurchase::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo InAppPurchase::kWrapperInfo = {gin::kEmbedderNativeGin, "InAppPurchase"};

    #if BUILDFLAG(IS_MAC)
    // static
    diff --git a/shell/browser/api/electron_api_menu.cc b/shell/browser/api/electron_api_menu.cc
    index 257013e63f..ce89b3d149 100644
    --- a/shell/browser/api/electron_api_menu.cc
    +++ b/shell/browser/api/electron_api_menu.cc
    @@ -47,7 +47,7 @@ struct Converter<SharingItem> {

    namespace electron::api {

    -gin::WrapperInfo Menu::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Menu::kWrapperInfo = {gin::kEmbedderNativeGin, "Menu"};

    Menu::Menu(gin::Arguments* args)
    : model_(std::make_unique<ElectronMenuModel>(this)) {
    diff --git a/shell/browser/api/electron_api_native_theme.cc b/shell/browser/api/electron_api_native_theme.cc
    index 32958bf99f..8d52eb4d31 100644
    --- a/shell/browser/api/electron_api_native_theme.cc
    +++ b/shell/browser/api/electron_api_native_theme.cc
    @@ -18,7 +18,7 @@

    namespace electron::api {

    -gin::WrapperInfo NativeTheme::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo NativeTheme::kWrapperInfo = {gin::kEmbedderNativeGin, "NativeTheme"};

    NativeTheme::NativeTheme(v8::Isolate* isolate,
    ui::NativeTheme* ui_theme,
    diff --git a/shell/browser/api/electron_api_net_log.cc b/shell/browser/api/electron_api_net_log.cc
    index 45c21384c1..20a6bc2189 100644
    --- a/shell/browser/api/electron_api_net_log.cc
    +++ b/shell/browser/api/electron_api_net_log.cc
    @@ -80,7 +80,7 @@ void ResolvePromiseWithNetError(gin_helper::Promise<void> promise,

    namespace api {

    -gin::WrapperInfo NetLog::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo NetLog::kWrapperInfo = {gin::kEmbedderNativeGin, "NetLog"};

    NetLog::NetLog(v8::Isolate* isolate, ElectronBrowserContext* browser_context)
    : browser_context_(browser_context) {
    diff --git a/shell/browser/api/electron_api_notification.cc b/shell/browser/api/electron_api_notification.cc
    index 69ab9341d0..f4af32d494 100644
    --- a/shell/browser/api/electron_api_notification.cc
    +++ b/shell/browser/api/electron_api_notification.cc
    @@ -47,7 +47,7 @@ struct Converter<electron::NotificationAction> {

    namespace electron::api {

    -gin::WrapperInfo Notification::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Notification::kWrapperInfo = {gin::kEmbedderNativeGin, "Notification"};

    Notification::Notification(gin::Arguments* args) {
    presenter_ = static_cast<ElectronBrowserClient*>(ElectronBrowserClient::Get())
    diff --git a/shell/browser/api/electron_api_power_monitor.cc b/shell/browser/api/electron_api_power_monitor.cc
    index 93e63c33a6..7b2b57b407 100644
    --- a/shell/browser/api/electron_api_power_monitor.cc
    +++ b/shell/browser/api/electron_api_power_monitor.cc
    @@ -60,7 +60,7 @@ struct Converter<base::PowerThermalObserver::DeviceThermalState> {

    namespace electron::api {

    -gin::WrapperInfo PowerMonitor::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo PowerMonitor::kWrapperInfo = {gin::kEmbedderNativeGin, "PowerMonitor"};

    PowerMonitor::PowerMonitor(v8::Isolate* isolate) {
    #if BUILDFLAG(IS_MAC)
    diff --git a/shell/browser/api/electron_api_power_save_blocker.cc b/shell/browser/api/electron_api_power_save_blocker.cc
    index c34ffe989f..24701da289 100644
    --- a/shell/browser/api/electron_api_power_save_blocker.cc
    +++ b/shell/browser/api/electron_api_power_save_blocker.cc
    @@ -39,7 +39,7 @@ struct Converter<device::mojom::WakeLockType> {

    namespace electron::api {

    -gin::WrapperInfo PowerSaveBlocker::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo PowerSaveBlocker::kWrapperInfo = {gin::kEmbedderNativeGin, "PowerSaveBlocker"};

    PowerSaveBlocker::PowerSaveBlocker(v8::Isolate* isolate)
    : current_lock_type_(device::mojom::WakeLockType::kPreventAppSuspension) {}
    diff --git a/shell/browser/api/electron_api_protocol.cc b/shell/browser/api/electron_api_protocol.cc
    index 8d07bb4cc0..6b62fc032c 100644
    --- a/shell/browser/api/electron_api_protocol.cc
    +++ b/shell/browser/api/electron_api_protocol.cc
    @@ -86,7 +86,7 @@ struct Converter<CustomScheme> {

    namespace electron::api {

    -gin::WrapperInfo Protocol::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Protocol::kWrapperInfo = {gin::kEmbedderNativeGin, "Protocol"};

    const std::vector<std::string>& GetStandardSchemes() {
    return g_standard_schemes;
    diff --git a/shell/browser/api/electron_api_push_notifications.cc b/shell/browser/api/electron_api_push_notifications.cc
    index 797b1c8d0e..7b6e17a4c1 100644
    --- a/shell/browser/api/electron_api_push_notifications.cc
    +++ b/shell/browser/api/electron_api_push_notifications.cc
    @@ -12,7 +12,7 @@ namespace electron::api {

    PushNotifications* g_push_notifications = nullptr;

    -gin::WrapperInfo PushNotifications::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo PushNotifications::kWrapperInfo = {gin::kEmbedderNativeGin, "PushNotifications"};

    PushNotifications::PushNotifications() = default;

    diff --git a/shell/browser/api/electron_api_screen.cc b/shell/browser/api/electron_api_screen.cc
    index ed88274205..ed9ed51468 100644
    --- a/shell/browser/api/electron_api_screen.cc
    +++ b/shell/browser/api/electron_api_screen.cc
    @@ -31,7 +31,7 @@

    namespace electron::api {

    -gin::WrapperInfo Screen::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Screen::kWrapperInfo = {gin::kEmbedderNativeGin, "Screen"};

    namespace {

    diff --git a/shell/browser/api/electron_api_service_worker_context.cc b/shell/browser/api/electron_api_service_worker_context.cc
    index 43d51b7b30..657b1d3c5e 100644
    --- a/shell/browser/api/electron_api_service_worker_context.cc
    +++ b/shell/browser/api/electron_api_service_worker_context.cc
    @@ -70,7 +70,7 @@ v8::Local<v8::Value> ServiceWorkerRunningInfoToDict(

    } // namespace

    -gin::WrapperInfo ServiceWorkerContext::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo ServiceWorkerContext::kWrapperInfo = {gin::kEmbedderNativeGin, "ServiceWorkerContext"};

    ServiceWorkerContext::ServiceWorkerContext(
    v8::Isolate* isolate,
    diff --git a/shell/browser/api/electron_api_session.cc b/shell/browser/api/electron_api_session.cc
    index 1cbead4e25..de214dd595 100644
    --- a/shell/browser/api/electron_api_session.cc
    +++ b/shell/browser/api/electron_api_session.cc
    @@ -337,7 +337,7 @@ const void* kElectronApiSessionKey = &kElectronApiSessionKey;

    } // namespace

    -gin::WrapperInfo Session::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Session::kWrapperInfo = {gin::kEmbedderNativeGin, "Session"};

    Session::Session(v8::Isolate* isolate, ElectronBrowserContext* browser_context)
    : isolate_(isolate),
    diff --git a/shell/browser/api/electron_api_system_preferences.cc b/shell/browser/api/electron_api_system_preferences.cc
    index 14594d9790..ea6ee0650e 100644
    --- a/shell/browser/api/electron_api_system_preferences.cc
    +++ b/shell/browser/api/electron_api_system_preferences.cc
    @@ -15,7 +15,7 @@

    namespace electron::api {

    -gin::WrapperInfo SystemPreferences::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo SystemPreferences::kWrapperInfo = {gin::kEmbedderNativeGin, "SystemPreferences"};

    #if BUILDFLAG(IS_WIN)
    SystemPreferences::SystemPreferences() {
    diff --git a/shell/browser/api/electron_api_tray.cc b/shell/browser/api/electron_api_tray.cc
    index eaadc4b51a..c1d84678da 100644
    --- a/shell/browser/api/electron_api_tray.cc
    +++ b/shell/browser/api/electron_api_tray.cc
    @@ -48,7 +48,7 @@ struct Converter<electron::TrayIcon::IconType> {

    namespace electron::api {

    -gin::WrapperInfo Tray::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Tray::kWrapperInfo = {gin::kEmbedderNativeGin, "Tray"};

    Tray::Tray(v8::Isolate* isolate,
    v8::Local<v8::Value> image,
    diff --git a/shell/browser/api/electron_api_utility_process.cc b/shell/browser/api/electron_api_utility_process.cc
    index 774e821dd1..1a678dbbfd 100644
    --- a/shell/browser/api/electron_api_utility_process.cc
    +++ b/shell/browser/api/electron_api_utility_process.cc
    @@ -56,7 +56,7 @@ GetAllUtilityProcessWrappers() {
    namespace api {

    gin::WrapperInfo UtilityProcessWrapper::kWrapperInfo = {
    - gin::kEmbedderNativeGin};
    + gin::kEmbedderNativeGin, "UtilityProcessWrapper"};

    UtilityProcessWrapper::UtilityProcessWrapper(
    node::mojom::NodeServiceParamsPtr params,
    diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc
    index 9b4ed173c3..25e6a0bbd8 100644
    --- a/shell/browser/api/electron_api_web_contents.cc
    +++ b/shell/browser/api/electron_api_web_contents.cc
    @@ -1941,7 +1941,7 @@ class ReplyChannel : public gin::Wrappable<ReplyChannel> {
    InvokeCallback callback_;
    };

    -gin::WrapperInfo ReplyChannel::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo ReplyChannel::kWrapperInfo = {gin::kEmbedderNativeGin, "ReplyChannel"};

    gin::Handle<gin_helper::internal::Event> WebContents::MakeEventWithSender(
    v8::Isolate* isolate,
    @@ -4510,7 +4510,7 @@ std::list<WebContents*> WebContents::GetWebContentsList() {
    }

    // static
    -gin::WrapperInfo WebContents::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo WebContents::kWrapperInfo = {gin::kEmbedderNativeGin, "WebContents"};

    } // namespace electron::api

    diff --git a/shell/browser/api/electron_api_web_frame_main.cc b/shell/browser/api/electron_api_web_frame_main.cc
    index 3b8dd02557..1d2083c6cc 100644
    --- a/shell/browser/api/electron_api_web_frame_main.cc
    +++ b/shell/browser/api/electron_api_web_frame_main.cc
    @@ -90,7 +90,7 @@ WebFrameMain* WebFrameMain::FromRenderFrameHost(content::RenderFrameHost* rfh) {
    return FromFrameTreeNodeId(rfh->GetFrameTreeNodeId());
    }

    -gin::WrapperInfo WebFrameMain::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo WebFrameMain::kWrapperInfo = {gin::kEmbedderNativeGin, "WebFrameMain"};

    WebFrameMain::WebFrameMain(content::RenderFrameHost* rfh)
    : frame_tree_node_id_(rfh->GetFrameTreeNodeId()), render_frame_(rfh) {
    diff --git a/shell/browser/api/electron_api_web_request.cc b/shell/browser/api/electron_api_web_request.cc
    index 17e99aecc5..84f0c62f53 100644
    --- a/shell/browser/api/electron_api_web_request.cc
    +++ b/shell/browser/api/electron_api_web_request.cc
    @@ -203,7 +203,7 @@ void ReadFromResponse(v8::Isolate* isolate,

    } // namespace

    -gin::WrapperInfo WebRequest::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo WebRequest::kWrapperInfo = {gin::kEmbedderNativeGin, "WebRequest"};

    WebRequest::RequestFilter::RequestFilter(
    std::set<URLPattern> url_patterns,
    diff --git a/shell/browser/api/message_port.cc b/shell/browser/api/message_port.cc
    index 998376eed2..67aab1949b 100644
    --- a/shell/browser/api/message_port.cc
    +++ b/shell/browser/api/message_port.cc
    @@ -47,7 +47,7 @@ bool IsValidWrappable(const v8::Local<v8::Value>& val) {

    } // namespace

    -gin::WrapperInfo MessagePort::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo MessagePort::kWrapperInfo = {gin::kEmbedderNativeGin, "MessagePort"};

    MessagePort::MessagePort() = default;
    MessagePort::~MessagePort() {
    diff --git a/shell/common/api/electron_api_native_image.cc b/shell/common/api/electron_api_native_image.cc
    index ef772bf72f..6441d457ec 100644
    --- a/shell/common/api/electron_api_native_image.cc
    +++ b/shell/common/api/electron_api_native_image.cc
    @@ -629,7 +629,7 @@ const char* NativeImage::GetTypeName() {
    }

    // static
    -gin::WrapperInfo NativeImage::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo NativeImage::kWrapperInfo = {gin::kEmbedderNativeGin, "NativeImage"};

    } // namespace electron::api

    diff --git a/shell/common/api/electron_api_url_loader.cc b/shell/common/api/electron_api_url_loader.cc
    index e2e3b319e8..4e4a9bbcee 100644
    --- a/shell/common/api/electron_api_url_loader.cc
    +++ b/shell/common/api/electron_api_url_loader.cc
    @@ -299,7 +299,7 @@ class JSChunkedDataPipeGetter : public gin::Wrappable<JSChunkedDataPipeGetter>,
    };

    gin::WrapperInfo JSChunkedDataPipeGetter::kWrapperInfo = {
    - gin::kEmbedderNativeGin};
    + gin::kEmbedderNativeGin, "JSChunkedDataPipeGetter"};

    const net::NetworkTrafficAnnotationTag kTrafficAnnotation =
    net::DefineNetworkTrafficAnnotation("electron_net_module", R"(
    @@ -321,7 +321,7 @@ const net::NetworkTrafficAnnotationTag kTrafficAnnotation =
    } // namespace

    gin::WrapperInfo SimpleURLLoaderWrapper::kWrapperInfo = {
    - gin::kEmbedderNativeGin};
    + gin::kEmbedderNativeGin, "SimpleURLLoaderWrapper"};

    SimpleURLLoaderWrapper::SimpleURLLoaderWrapper(
    ElectronBrowserContext* browser_context,
    diff --git a/shell/common/gin_converters/net_converter.cc b/shell/common/gin_converters/net_converter.cc
    index 1f076e82a1..907d256cc7 100644
    --- a/shell/common/gin_converters/net_converter.cc
    +++ b/shell/common/gin_converters/net_converter.cc
    @@ -492,7 +492,7 @@ class ChunkedDataPipeReadableStream
    gin_helper::Promise<int> promise_;
    };
    gin::WrapperInfo ChunkedDataPipeReadableStream::kWrapperInfo = {
    - gin::kEmbedderNativeGin};
    + gin::kEmbedderNativeGin, "ChunkedDataPipeReadableStream"};

    // static
    v8::Local<v8::Value> Converter<network::ResourceRequestBody>::ToV8(
    diff --git a/shell/common/gin_helper/event.cc b/shell/common/gin_helper/event.cc
    index e1ea3fd781..4f6fb4f828 100644
    --- a/shell/common/gin_helper/event.cc
    +++ b/shell/common/gin_helper/event.cc
    @@ -26,7 +26,7 @@ Event::Event() = default;

    Event::~Event() = default;

    -gin::WrapperInfo Event::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Event::kWrapperInfo = {gin::kEmbedderNativeGin, "Event"};

    const char* Event::GetTypeName() {
    return GetClassName();
    diff --git a/shell/common/gin_helper/event_emitter_template.cc b/shell/common/gin_helper/event_emitter_template.cc
    index bf5f7a08d6..f6fa333cec 100644
    --- a/shell/common/gin_helper/event_emitter_template.cc
    +++ b/shell/common/gin_helper/event_emitter_template.cc
    @@ -12,7 +12,7 @@

    namespace gin_helper::internal {

    -gin::WrapperInfo kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo kWrapperInfo = {gin::kEmbedderNativeGin, "EventEmitterTemplate"};

    v8::Local<v8::FunctionTemplate> GetEventEmitterTemplate(v8::Isolate* isolate) {
    gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
    diff --git a/shell/common/gin_helper/function_template.cc b/shell/common/gin_helper/function_template.cc
    index 857c23dc19..230bffd41b 100644
    --- a/shell/common/gin_helper/function_template.cc
    +++ b/shell/common/gin_helper/function_template.cc
    @@ -4,8 +4,13 @@

    #include "shell/common/gin_helper/function_template.h"

    +#include "base/location.h"
    +#include "base/debug/crash_logging.h"
    +#include "base/debug/stack_trace.h"
    #include "base/observer_list.h"
    #include "base/strings/strcat.h"
    +#include "components/crash/core/app/crashpad.h"
    +#include "components/crash/core/common/crash_key.h"

    namespace gin_helper {

    @@ -25,6 +30,7 @@ void CallbackHolderBase::DisposeObserver::OnBeforeDispose(
    holder_->v8_ref_.Reset();
    }
    void CallbackHolderBase::DisposeObserver::OnDisposed() {
    + holder_->did_dispose_ = true;
    // The holder contains the observer, so the observer is destroyed here also.
    delete &holder_.get();
    }
    @@ -38,6 +44,26 @@ CallbackHolderBase::CallbackHolderBase(v8::Isolate* isolate)

    CallbackHolderBase::~CallbackHolderBase() {
    DCHECK(v8_ref_.IsEmpty());
    + if (!v8_ref_.IsEmpty()) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Unexpected V8 empty reference");
    + crash_reporter::DumpWithoutCrashing();
    + }
    + if (did_dispose_ && did_invoke_weak_callback_) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Weak callbacks running after disposed");
    + crash_reporter::DumpWithoutCrashing();
    + }
    }

    v8::Local<v8::External> CallbackHolderBase::GetHandle(v8::Isolate* isolate) {
    @@ -47,6 +73,17 @@ v8::Local<v8::External> CallbackHolderBase::GetHandle(v8::Isolate* isolate) {
    // static
    void CallbackHolderBase::FirstWeakCallback(
    const v8::WeakCallbackInfo<CallbackHolderBase>& data) {
    + if (data.GetParameter()->did_dispose_) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "FirstWeakCallback",
    + "Called after isolate data dispose");
    + crash_reporter::DumpWithoutCrashing();
    + }
    + data.GetParameter()->did_invoke_weak_callback_ = true;
    data.GetParameter()->v8_ref_.Reset();
    data.SetSecondPassCallback(SecondWeakCallback);
    }
    diff --git a/shell/common/gin_helper/function_template.h b/shell/common/gin_helper/function_template.h
    index 8aa4859f57..ff0ee31253 100644
    --- a/shell/common/gin_helper/function_template.h
    +++ b/shell/common/gin_helper/function_template.h
    @@ -91,6 +91,8 @@ class CallbackHolderBase {
    static void SecondWeakCallback(
    const v8::WeakCallbackInfo<CallbackHolderBase>& data);

    + bool did_dispose_ = false;
    + bool did_invoke_weak_callback_ = false;
    v8::Global<v8::External> v8_ref_;
    DisposeObserver dispose_observer_;
    };
    diff --git a/shell/common/gin_helper/wrappable.h b/shell/common/gin_helper/wrappable.h
    index 531d446f76..8c26afb45e 100644
    --- a/shell/common/gin_helper/wrappable.h
    +++ b/shell/common/gin_helper/wrappable.h
    @@ -71,7 +71,7 @@ class Wrappable : public WrappableBase {

    // static
    template <typename T>
    -gin::WrapperInfo Wrappable<T>::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo Wrappable<T>::kWrapperInfo = {gin::kEmbedderNativeGin, "DefaultWrapper"};

    } // namespace gin_helper

    diff --git a/shell/renderer/api/electron_api_ipc_renderer.cc b/shell/renderer/api/electron_api_ipc_renderer.cc
    index 317b933687..86904557b1 100644
    --- a/shell/renderer/api/electron_api_ipc_renderer.cc
    +++ b/shell/renderer/api/electron_api_ipc_renderer.cc
    @@ -207,7 +207,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
    mojo::AssociatedRemote<electron::mojom::ElectronApiIPC> electron_ipc_remote_;
    };

    -gin::WrapperInfo IPCRenderer::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo IPCRenderer::kWrapperInfo = {gin::kEmbedderNativeGin, "IPCRenderer"};

    void Initialize(v8::Local<v8::Object> exports,
    v8::Local<v8::Value> unused,
    diff --git a/shell/renderer/api/electron_api_web_frame.cc b/shell/renderer/api/electron_api_web_frame.cc
    index 0ee5caf4b8..cbe12e080d 100644
    --- a/shell/renderer/api/electron_api_web_frame.cc
    +++ b/shell/renderer/api/electron_api_web_frame.cc
    @@ -904,7 +904,7 @@ class WebFrameRenderer : public gin::Wrappable<WebFrameRenderer>,
    }
    };

    -gin::WrapperInfo WebFrameRenderer::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo WebFrameRenderer::kWrapperInfo = {gin::kEmbedderNativeGin, "WebFrameRenderer"};

    // static
    std::set<SpellCheckerHolder*> SpellCheckerHolder::instances_;
    diff --git a/shell/services/node/parent_port.cc b/shell/services/node/parent_port.cc
    index 13d9433f30..e4a9dd3f00 100644
    --- a/shell/services/node/parent_port.cc
    +++ b/shell/services/node/parent_port.cc
    @@ -18,7 +18,7 @@

    namespace electron {

    -gin::WrapperInfo ParentPort::kWrapperInfo = {gin::kEmbedderNativeGin};
    +gin::WrapperInfo ParentPort::kWrapperInfo = {gin::kEmbedderNativeGin, "ParentPort"};

    ParentPort* ParentPort::GetInstance() {
    static base::NoDestructor<ParentPort> instance;
  2. deepak1556 created this gist Sep 26, 2024.
    205 changes: 205 additions & 0 deletions gin.patch
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,205 @@
    diff --git a/gin/BUILD.gn b/gin/BUILD.gn
    index ac6404a0f9bc08..72f2e93689f089 100755
    --- a/gin/BUILD.gn
    +++ b/gin/BUILD.gn
    @@ -107,6 +107,7 @@ component("gin") {
    deps = [
    "//base/third_party/dynamic_annotations",
    "//third_party/abseil-cpp:absl",
    + "//third_party/crashpad/crashpad/client",
    "//tools/v8_context_snapshot:buildflags",
    ]

    diff --git a/gin/function_template.cc b/gin/function_template.cc
    index d4c615cbd6c276..0d89c24fd54de0 100755
    --- a/gin/function_template.cc
    +++ b/gin/function_template.cc
    @@ -4,8 +4,13 @@

    #include "gin/function_template.h"

    +#include "base/location.h"
    +#include "base/debug/crash_logging.h"
    +#include "base/debug/stack_trace.h"
    #include "base/observer_list.h"
    #include "base/strings/strcat.h"
    +#include "components/crash/core/app/crashpad.h"
    +#include "components/crash/core/common/crash_key.h"

    namespace gin {

    @@ -25,6 +30,7 @@ void CallbackHolderBase::DisposeObserver::OnBeforeDispose(
    holder_->v8_ref_.Reset();
    }
    void CallbackHolderBase::DisposeObserver::OnDisposed() {
    + holder_->did_dispose_ = true;
    // The holder contains the observer, so the observer is destroyed here also.
    delete &holder_.get();
    }
    @@ -38,6 +44,26 @@ CallbackHolderBase::CallbackHolderBase(v8::Isolate* isolate)

    CallbackHolderBase::~CallbackHolderBase() {
    DCHECK(v8_ref_.IsEmpty());
    + if (!v8_ref_.IsEmpty()) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Unexpected V8 empty reference");
    + crash_reporter::DumpWithoutCrashing();
    + }
    + if (did_dispose_ && did_invoke_weak_callback_) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Weak callbacks running after disposed");
    + crash_reporter::DumpWithoutCrashing();
    + }
    }

    v8::Local<v8::External> CallbackHolderBase::GetHandle(v8::Isolate* isolate) {
    @@ -47,6 +73,17 @@ v8::Local<v8::External> CallbackHolderBase::GetHandle(v8::Isolate* isolate) {
    // static
    void CallbackHolderBase::FirstWeakCallback(
    const v8::WeakCallbackInfo<CallbackHolderBase>& data) {
    + if (data.GetParameter()->did_dispose_) {
    + const base::Location& location = base::Location::Current();
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "file",
    + location.file_name());
    + SCOPED_CRASH_KEY_NUMBER("DumpWithoutCrashing", "line",
    + location.line_number());
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "FirstWeakCallback",
    + "Weak callback called after isolate data dispose");
    + crash_reporter::DumpWithoutCrashing();
    + }
    + data.GetParameter()->did_invoke_weak_callback_ = true;
    data.GetParameter()->v8_ref_.Reset();
    data.SetSecondPassCallback(SecondWeakCallback);
    }
    diff --git a/gin/function_template.h b/gin/function_template.h
    index cc6b966485958e..5848d26a032484 100755
    --- a/gin/function_template.h
    +++ b/gin/function_template.h
    @@ -89,6 +89,8 @@ class GIN_EXPORT CallbackHolderBase {
    static void SecondWeakCallback(
    const v8::WeakCallbackInfo<CallbackHolderBase>& data);

    + bool did_dispose_ = false;
    + bool did_invoke_weak_callback_ = false;
    v8::Global<v8::External> v8_ref_;
    DisposeObserver dispose_observer_;
    };
    diff --git a/gin/public/wrapper_info.h b/gin/public/wrapper_info.h
    index 8a847fadecaf9d..4461c373af81df 100755
    --- a/gin/public/wrapper_info.h
    +++ b/gin/public/wrapper_info.h
    @@ -25,6 +25,8 @@ enum InternalFields {
    struct GIN_EXPORT WrapperInfo {
    static WrapperInfo* From(v8::Local<v8::Object> object);
    const GinEmbedder embedder;
    + const char* name;
    + bool disposed = false;
    };

    } // namespace gin
    diff --git a/gin/wrappable.cc b/gin/wrappable.cc
    index 402355cb836cea..7e5e1ab3776b9a 100755
    --- a/gin/wrappable.cc
    +++ b/gin/wrappable.cc
    @@ -4,9 +4,14 @@

    #include "gin/wrappable.h"

    +#include <set>
    +
    #include "base/check_op.h"
    +#include "base/debug/crash_logging.h"
    +#include "base/location.h"
    #include "gin/object_template_builder.h"
    #include "gin/per_isolate_data.h"
    +#include "components/crash/core/app/crashpad.h"

    namespace gin {

    @@ -28,6 +33,14 @@ const char* WrappableBase::GetTypeName() {
    void WrappableBase::FirstWeakCallback(
    const v8::WeakCallbackInfo<WrappableBase>& data) {
    WrappableBase* wrappable = data.GetParameter();
    + WrapperInfo* wrapper_info = static_cast<WrapperInfo*>(data.GetInternalField(0));
    + if (wrapper_info && wrapper_info->disposed) {
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Weak callback in gin::Wrappable called after destruction");
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "WrapperInfo",
    + wrapper_info->name);
    + crash_reporter::DumpWithoutCrashing();
    + }
    wrappable->dead_ = true;
    wrappable->wrapper_.Reset();
    data.SetSecondPassCallback(SecondWeakCallback);
    @@ -35,7 +48,16 @@ void WrappableBase::FirstWeakCallback(

    void WrappableBase::SecondWeakCallback(
    const v8::WeakCallbackInfo<WrappableBase>& data) {
    + WrapperInfo* wrapper_info = static_cast<WrapperInfo*>(data.GetInternalField(0));
    + if (wrapper_info && wrapper_info->disposed) {
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "Secondweak callback in gin::Wrappable called after destruction");
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "WrapperInfo",
    + wrapper_info->name);
    + crash_reporter::DumpWithoutCrashing();
    + }
    WrappableBase* wrappable = data.GetParameter();
    + wrappable->second_weak_callback_called_ = true;
    delete wrappable;
    }

    diff --git a/gin/wrappable.h b/gin/wrappable.h
    index 4e7115685a5bf6..6440388b36636b 100755
    --- a/gin/wrappable.h
    +++ b/gin/wrappable.h
    @@ -7,9 +7,11 @@

    #include <type_traits>

    +#include "base/debug/crash_logging.h"
    #include "gin/converter.h"
    #include "gin/gin_export.h"
    #include "gin/public/wrapper_info.h"
    +#include "components/crash/core/app/crashpad.h"

    namespace gin {

    @@ -86,7 +88,9 @@ class GIN_EXPORT WrappableBase {
    static void SecondWeakCallback(
    const v8::WeakCallbackInfo<WrappableBase>& data);

    + public:
    bool dead_ = false;
    + bool second_weak_callback_called_ = false;
    v8::Global<v8::Object> wrapper_; // Weak
    };

    @@ -104,7 +108,17 @@ class Wrappable : public WrappableBase {

    protected:
    Wrappable() = default;
    - ~Wrappable() override = default;
    + ~Wrappable() override {
    + WrapperInfo* wrapper_info = static_cast<WrapperInfo*>(&T::kWrapperInfo);
    + wrapper_info->disposed = true;
    + if (dead_ && !second_weak_callback_called_) {
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "reason",
    + "gin::Wrappable incorrect dispose!!!");
    + SCOPED_CRASH_KEY_STRING256("DumpWithoutCrashing", "WrapperInfo",
    + wrapper_info->name);
    + crash_reporter::DumpWithoutCrashing();
    + }
    + }
    };

    // This converter handles any subclass of Wrappable.