Skip to content

Instantly share code, notes, and snippets.

@deepak1556
Last active September 26, 2024 01:36
Show Gist options
  • Save deepak1556/f9682fb1b94aa53d9cf37e83638c226d to your computer and use it in GitHub Desktop.
Save deepak1556/f9682fb1b94aa53d9cf37e83638c226d to your computer and use it in GitHub Desktop.
Crash keys to trace shutdown crash in gin::wrappable
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;
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