Memory leak fixes for several views (#7057)

* Change the mount utility to use Vue's createApp and defineComponent methods

* Fix display layout memory leaks caused by `getSelectionContext`

* fix some display layout leaks due to use of slots

* Fix imagery memory leak (removed span tag). NOTE: CompassRose svg leaks memory - must test on firefox to see if this is a Chrome leak.

* Fix ActionsAPI action collection and applicable actions leak.

* Fix flexible layout memory leaks - remove listeners on unmount. NOTE: One type of overlay plot (Rover Yaw) is still leaking.

* pass in the el on mount

* e2e test config and spec changes

* Remove mounting of limit lines. Use components directly

* test: remove `.only()`

* Fix display layout memory leaks

* Enable passing tests

* e2e README and appActions should be what master has.

* lint: add word to cspell list

* lint: fixes

* lint:fix

* fix: revert `el` change

* fix: remove empty span

* fix: creating shapes in displayLayout

* fix: avoid `splice` as it loses reactivity

* test: reduce timeout time

* quick fixes

* add prod mode and convert the test config to select the correct mode

* Fix webpack prod config

* Add launch flag for exposing window.gc

* never worked

* explicit naming

* rename

* We don't need to destroy view providers

* test: increase timeout time

* test: unskip all mem tests

* fix(vue-loader): disable static hoisting

* chore: run `test:perf:memory`

* Don't destroy view providers

* Move context menu once listener to beforeUnmount instead.

* Disconnect all resize observers on unmount

* Delete Test vue component

* Use beforeUnmount and remove splice(0) in favor of [] for emptying arrays

* re-structure

* fix: unregister listener in pane.vue

* test: tweak timeouts

* chore: lint:fix

* test: unskip perf tests

* fix: unregister events properly

* fix: unregister listener

* fix: unregister listener

* fix: unregister listener

* fix: use `unmounted()`

* fix: unregister listeners

* fix: unregister listener properly

* chore: lint:fix

* test: fix imagery layer toggle test

* test: increase timeout

* Don't use anonymous functions for listeners

* Destroy objects and event listeners properly

* Delete config stores that are created by components

* Use the right unmount hook. Destroy mounted view on unmount.

* Use unmounted, not beforeUnmounted

* Lint fixes

* Fix time strip memory leak

* Undo unneeded change for memory leaks.

* chore: combine common webpack configs

---------

Co-authored-by: Jesse Mazzella <jesse.d.mazzella@nasa.gov>
Co-authored-by: John Hill <john.c.hill@nasa.gov>
This commit is contained in:
Shefali Joshi
2023-09-20 10:34:05 -07:00
committed by GitHub
parent 61e7050391
commit b8949db767
65 changed files with 887 additions and 393 deletions

View File

@ -170,7 +170,7 @@ define(['lodash'], function (_) {
if (form) {
showForm(form, name, selectionPath);
} else {
selectionPath[0].context.addElement(name);
openmct.objectViews.emit('contextAction', 'addElement', name);
}
},
key: 'add',
@ -236,7 +236,6 @@ define(['lodash'], function (_) {
icon: 'icon-trash',
title: 'Delete the selected object',
method: function () {
let removeItem = selectionPath[1].context.removeItem;
let prompt = openmct.overlays.dialog({
iconClass: 'alert',
message: `Warning! This action will remove this item from the Display Layout. Do you want to continue?`,
@ -245,7 +244,11 @@ define(['lodash'], function (_) {
label: 'OK',
emphasis: 'true',
callback: function () {
removeItem(getAllTypes(selection));
openmct.objectViews.emit(
'contextAction',
'removeItem',
getAllTypes(selection)
);
prompt.dismiss();
}
},
@ -290,7 +293,12 @@ define(['lodash'], function (_) {
}
],
method: function (option) {
selectionPath[1].context.orderItem(option.value, getAllTypes(selectedObjects));
openmct.objectViews.emit(
'contextAction',
'orderItem',
option.value,
getAllTypes(selectedObjects)
);
}
};
}
@ -474,9 +482,7 @@ define(['lodash'], function (_) {
icon: 'icon-duplicate',
title: 'Duplicate the selected object',
method: function () {
let duplicateItem = selectionPath[1].context.duplicateItem;
duplicateItem(selection);
openmct.objectViews.emit('contextAction', 'duplicateItem', selection);
}
};
}
@ -555,6 +561,7 @@ define(['lodash'], function (_) {
function getViewSwitcherMenu(selectedParent, selectionPath, selection) {
if (selection.length === 1) {
// eslint-disable-next-line no-unused-vars
let displayLayoutContext = selectionPath[1].context;
let selectedItemContext = selectionPath[0].context;
let selectedItemType = selectedItemContext.item.type;
@ -574,14 +581,18 @@ define(['lodash'], function (_) {
label: 'View type',
options: viewOptions,
method: function (option) {
displayLayoutContext.switchViewType(selectedItemContext, option.value, selection);
openmct.objectViews.emit(
'contextAction',
'switchViewType',
selectedItemContext,
option.value,
selection
);
}
};
}
} else if (selection.length > 1) {
if (areAllViews('telemetry-view', 'layoutItem.type', selection)) {
let displayLayoutContext = selectionPath[1].context;
return {
control: 'menu',
domainObject: selectedParent,
@ -590,12 +601,15 @@ define(['lodash'], function (_) {
label: 'View type',
options: APPLICABLE_VIEWS['telemetry-view-multi'],
method: function (option) {
displayLayoutContext.mergeMultipleTelemetryViews(selection, option.value);
openmct.objectViews.emit(
'contextAction',
'mergeMultipleTelemetryViews',
selection,
option.value
);
}
};
} else if (areAllViews('telemetry.plot.overlay', 'item.type', selection)) {
let displayLayoutContext = selectionPath[1].context;
return {
control: 'menu',
domainObject: selectedParent,
@ -603,7 +617,12 @@ define(['lodash'], function (_) {
title: 'Merge into a stacked plot',
options: APPLICABLE_VIEWS['telemetry.plot.overlay-multi'],
method: function (option) {
displayLayoutContext.mergeMultipleOverlayPlots(selection, option.value);
openmct.objectViews.emit(
'contextAction',
'mergeMultipleOverlayPlots',
selection,
option.value
);
}
};
}
@ -627,7 +646,7 @@ define(['lodash'], function (_) {
domainObject: displayLayoutContext.item,
icon: ICON_GRID_SHOW,
method: function () {
displayLayoutContext.toggleGrid();
openmct.objectViews.emit('contextAction', 'toggleGrid');
this.icon = this.icon === ICON_GRID_SHOW ? ICON_GRID_HIDE : ICON_GRID_SHOW;
},
@ -653,7 +672,7 @@ define(['lodash'], function (_) {
function showForm(formStructure, name, selectionPath) {
openmct.forms.showForm(formStructure).then((changes) => {
selectionPath[0].context.addElement(name, changes);
openmct.objectViews.emit('contextAction', 'addElement', name, changes);
});
}