dash: Do not destroy a dash label twice

Dash labels are children of the main uiGroup and so could be destroyed
before their logical-owner DashItemContainer during shutdown.

This implies that we could destroy them twice. To avoid this, unset them
when destroyed.

This is mostly visible when using dash-to-dock, but it's still
technically possible with upstream code:

** Message: 19:57:49.847: Shutting down GNOME Shell

(gnome-shell:2788214): Gjs-CRITICAL **: 19:57:49.933: Object St.Label
 (0x55b33668eab0), has been already disposed — impossible to access it.
 This might be caused by the object having been destroyed from C code using
something such as destroy(), dispose(), or remove() vfuncs.
  == Stack trace for context 0x55b3345fd3d0 ==
     7ffeabd810d0 b   /data/GNOME/gnome-shell/js/ui/dash.js:86
     55b335b62f88 i   /data/GNOME/JHBUILD_HOME/.local/share/gnome-shell/extensions/dash-to-dock@micxgx.gmail.com/docking.js:487
     7ffeabd838f0 b   self-hosted:1121
     55b335b62ec8 i   /data/GNOME/gnome-shell/js/ui/layout.js:240

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2739>
This commit is contained in:
Marco Trevisan (Treviño) 2023-04-17 19:53:34 +02:00 committed by Marge Bot
parent ecb274cee0
commit 8bf06bfc9f

View File

@ -71,6 +71,7 @@ class DashItemContainer extends St.Widget {
this.label = new St.Label({ style_class: 'dash-label' });
this.label.hide();
Main.layoutManager.addChrome(this.label);
this.label.connectObject('destroy', () => (this.label = null), this);
this.label_actor = this.label;
this.child = null;
@ -82,7 +83,7 @@ class DashItemContainer extends St.Widget {
this.connect('destroy', () => {
if (this.child != null)
this.child.destroy();
this.label.destroy();
this.label?.destroy();
});
}