tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdevtools/client/memory/actions/filter.js | 17++++++++++++++---
Mdevtools/client/memory/initializer.js | 6++++++
Mdevtools/client/shared/redux/middleware/ignore.js | 5+++++
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 }, };