Last active
September 26, 2024 01:36
-
-
Save deepak1556/f9682fb1b94aa53d9cf37e83638c226d to your computer and use it in GitHub Desktop.
Crash keys to trace shutdown crash in gin::wrappable
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment