summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/components/object-inspector/reducer.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/shared/components/object-inspector/reducer.js')
-rw-r--r--devtools/client/shared/components/object-inspector/reducer.js147
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;