diff options
Diffstat (limited to 'devtools/client/shared/components/object-inspector/reducer.js')
-rw-r--r-- | devtools/client/shared/components/object-inspector/reducer.js | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/devtools/client/shared/components/object-inspector/reducer.js b/devtools/client/shared/components/object-inspector/reducer.js new file mode 100644 index 0000000000..aa8af2b529 --- /dev/null +++ b/devtools/client/shared/components/object-inspector/reducer.js @@ -0,0 +1,147 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +function initialOIState(overrides) { + return { + expandedPaths: new Set(), + loadedProperties: new Map(), + evaluations: new Map(), + watchpoints: new Map(), + ...overrides, + }; +} + +function reducer(state = initialOIState(), action = {}) { + const { type, data } = action; + + const cloneState = overrides => ({ ...state, ...overrides }); + + if (type === "NODE_EXPAND") { + return cloneState({ + expandedPaths: new Set(state.expandedPaths).add(data.node.path), + }); + } + + if (type === "NODE_COLLAPSE") { + const expandedPaths = new Set(state.expandedPaths); + expandedPaths.delete(data.node.path); + return cloneState({ expandedPaths }); + } + + if (type == "SET_WATCHPOINT") { + const { watchpoint, property, path } = data; + const obj = state.loadedProperties.get(path); + + return cloneState({ + loadedProperties: new Map(state.loadedProperties).set( + path, + updateObject(obj, property, watchpoint) + ), + watchpoints: new Map(state.watchpoints).set(data.actor, data.watchpoint), + }); + } + + if (type === "REMOVE_WATCHPOINT") { + const { path, property, actor } = data; + const obj = state.loadedProperties.get(path); + const watchpoints = new Map(state.watchpoints); + watchpoints.delete(actor); + + return cloneState({ + loadedProperties: new Map(state.loadedProperties).set( + path, + updateObject(obj, property, null) + ), + watchpoints: watchpoints, + }); + } + + if (type === "NODE_PROPERTIES_LOADED") { + return cloneState({ + loadedProperties: new Map(state.loadedProperties).set( + data.node.path, + action.data.properties + ), + }); + } + + if (type === "ROOTS_CHANGED") { + return cloneState(); + } + + if (type === "GETTER_INVOKED") { + return cloneState({ + evaluations: new Map(state.evaluations).set(data.node.path, { + getterValue: + data.result && + data.result.value && + (data.result.value.throw || data.result.value.return), + }), + }); + } + + // NOTE: we clear the state on resume because otherwise the scopes pane + // would be out of date. Bug 1514760 + if (type === "RESUME" || type == "NAVIGATE") { + return initialOIState({ watchpoints: state.watchpoints }); + } + + return state; +} + +function updateObject(obj, property, watchpoint) { + return { + ...obj, + ownProperties: { + ...obj.ownProperties, + [property]: { + ...obj.ownProperties[property], + watchpoint, + }, + }, + }; +} + +function getObjectInspectorState(state) { + return state.objectInspector || state; +} + +function getExpandedPaths(state) { + return getObjectInspectorState(state).expandedPaths; +} + +function getExpandedPathKeys(state) { + return [...getExpandedPaths(state).keys()]; +} + +function getWatchpoints(state) { + return getObjectInspectorState(state).watchpoints; +} + +function getLoadedProperties(state) { + return getObjectInspectorState(state).loadedProperties; +} + +function getLoadedPropertyKeys(state) { + return [...getLoadedProperties(state).keys()]; +} + +function getEvaluations(state) { + return getObjectInspectorState(state).evaluations; +} + +const selectors = { + getWatchpoints, + getEvaluations, + getExpandedPathKeys, + getExpandedPaths, + getLoadedProperties, + getLoadedPropertyKeys, +}; + +Object.defineProperty(module.exports, "__esModule", { + value: true, +}); +module.exports = { ...selectors, initialOIState }; +module.exports.default = reducer; |