commit cd424c8b0a83f530938ae8841bc2fa2fb8061388
parent 5e7c00234438470bc4d8052bb3848e75652e63cb
Author: Alexandre Poirot <poirot.alex@gmail.com>
Date: Tue, 7 Oct 2025 22:22:12 +0000
Bug 1991698 - [devtools] Drop memory actions as soon as the panel starts destroying. r=devtools-reviewers,nchevobbe
Differential Revision: https://phabricator.services.mozilla.com/D267193
Diffstat:
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/devtools/client/memory/actions/filter.js b/devtools/client/memory/actions/filter.js
@@ -8,6 +8,9 @@ const {
refresh,
} = require("resource://devtools/client/memory/actions/refresh.js");
const { debounce } = require("resource://devtools/shared/debounce.js");
+const {
+ isIgnoringActions,
+} = require("resource://devtools/client/shared/redux/middleware/ignore.js");
const setFilterString = (exports.setFilterString = function (filterString) {
return {
@@ -21,13 +24,21 @@ const setFilterString = (exports.setFilterString = function (filterString) {
// the user is still typing.
const FILTER_INPUT_DEBOUNCE_MS = 250;
const debouncedRefreshDispatcher = debounce(
- (dispatch, heapWorker) => dispatch(refresh(heapWorker)),
+ (dispatch, getState, heapWorker) => {
+ // Prevent dispatching the action if the panel is already being destroying.
+ // For some reason, throwing the ignore middle exception introduce a leak.
+ if (isIgnoringActions(getState())) {
+ return;
+ }
+
+ dispatch(refresh(heapWorker));
+ },
FILTER_INPUT_DEBOUNCE_MS
);
exports.setFilterStringAndRefresh = function (filterString, heapWorker) {
- return ({ dispatch }) => {
+ return ({ dispatch, getState }) => {
dispatch(setFilterString(filterString));
- debouncedRefreshDispatcher(dispatch, heapWorker);
+ debouncedRefreshDispatcher(dispatch, getState, heapWorker);
};
};
diff --git a/devtools/client/memory/initializer.js b/devtools/client/memory/initializer.js
@@ -17,6 +17,9 @@ const {
const App = createFactory(require("resource://devtools/client/memory/app.js"));
const Store = require("resource://devtools/client/memory/store.js");
const { assert } = require("resource://devtools/shared/DevToolsUtils.js");
+const {
+ START_IGNORE_ACTION,
+} = require("resource://devtools/client/shared/redux/middleware/ignore.js");
const {
updateMemoryFront,
@@ -49,6 +52,9 @@ const updateFront = front => {
};
const destroy = function () {
+ // Prevents any further action from being dispatched
+ store.dispatch(START_IGNORE_ACTION);
+
const ok = ReactDOM.unmountComponentAtNode(root);
assert(
ok,
diff --git a/devtools/client/shared/redux/middleware/ignore.js b/devtools/client/shared/redux/middleware/ignore.js
@@ -34,5 +34,10 @@ function ignore({ getState }) {
module.exports = {
ignore,
+
+ isIgnoringActions(state) {
+ return state[IGNORING];
+ },
+
START_IGNORE_ACTION: { type: START_IGNORE_ACTION },
};