Skip to content

Commit e6f7702

Browse files
bomsyjasonLaster
authored andcommitted
Persist scopes (firefox-devtools#2064)
* Persist variable expand state * add expanded cache * add basic caching for the scopes across loads
1 parent 478c567 commit e6f7702

File tree

3 files changed

+62
-14
lines changed

3 files changed

+62
-14
lines changed

src/components/SecondaryPanes/Scopes.js

+11
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ function getScopes(pauseInfo, selectedFrame) {
136136
return scopes;
137137
}
138138

139+
let expandedCache = new Set();
140+
let actorsCache = [];
141+
139142
const Scopes = createClass({
140143
propTypes: {
141144
pauseInfo: ImPropTypes.map,
@@ -180,6 +183,14 @@ const Scopes = createClass({
180183
roots: scopes,
181184
getObjectProperties: id => loadedObjects.get(id),
182185
loadObjectProperties: loadObjectProperties,
186+
setExpanded: expanded => {
187+
expandedCache = expanded;
188+
},
189+
getExpanded: () => expandedCache,
190+
setActors: actors => {
191+
actorsCache = actors;
192+
},
193+
getActors: () => actorsCache,
183194
onLabelClick: (item, { expanded, setExpanded }) => {
184195
setExpanded(item, !expanded);
185196
}

src/components/shared/ManagedTree.js

+25-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// @flow
2-
const React = require("react");
3-
const Tree = React.createFactory(require("devtools-sham-modules").Tree);
2+
import { createClass, PropTypes, createFactory } from "react";
3+
const Tree = createFactory(require("devtools-sham-modules").Tree);
44
require("./ManagedTree.css");
55

66
type ManagedTreeItem = {
@@ -13,8 +13,8 @@ type NextProps = {
1313
autoExpandAll: boolean,
1414
autoExpandDepth: number,
1515
getChildren: () => any,
16-
getKey: (ManagedTreeItem, number) => string,
17-
getParent: (ManagedTreeItem) => any,
16+
getKey: () => string,
17+
getParent: () => any,
1818
getRoots: () => any,
1919
highlightItems: Array<ManagedTreeItem>,
2020
itemHeight: number,
@@ -28,8 +28,14 @@ type InitialState = {
2828
focusedItem: ?ManagedTreeItem
2929
};
3030

31-
let ManagedTree = React.createClass({
32-
propTypes: Tree.propTypes,
31+
let ManagedTree = createClass({
32+
propTypes: Object.assign({},
33+
Tree.propTypes,
34+
{
35+
getExpanded: PropTypes.func,
36+
setExpanded: PropTypes.func
37+
}
38+
),
3339

3440
displayName: "ManagedTree",
3541

@@ -53,6 +59,19 @@ let ManagedTree = React.createClass({
5359
}
5460
},
5561

62+
componentWillMount() {
63+
if (this.props.getExpanded) {
64+
const expanded = this.props.getExpanded();
65+
this.setState({ expanded });
66+
}
67+
},
68+
69+
componentWillUnmount() {
70+
if (this.props.setExpanded) {
71+
this.props.setExpanded(this.state.expanded);
72+
}
73+
},
74+
5675
setExpanded(item: ManagedTreeItem, isExpanded: boolean) {
5776
const expanded = this.state.expanded;
5877
const key = this.props.getKey(item);

src/components/shared/ObjectInspector.js

+26-8
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ const ObjectInspector = React.createClass({
5454
getObjectProperties: PropTypes.func.isRequired,
5555
loadObjectProperties: PropTypes.func.isRequired,
5656
onLabelClick: PropTypes.func,
57-
onDoubleClick: PropTypes.func
57+
onDoubleClick: PropTypes.func,
58+
getExpanded: PropTypes.func,
59+
setExpanded: PropTypes.func,
60+
getActors: PropTypes.func,
61+
setActors: PropTypes.func
5862
},
5963

6064
displayName: "ObjectInspector",
@@ -63,7 +67,6 @@ const ObjectInspector = React.createClass({
6367
// Cache of dynamically built nodes. We shouldn't need to clear
6468
// this out ever, since we don't ever "switch out" the object
6569
// being inspected.
66-
this.actorCache = {};
6770
return {};
6871
},
6972

@@ -75,6 +78,18 @@ const ObjectInspector = React.createClass({
7578
};
7679
},
7780

81+
componentWillMount() {
82+
if (this.props.getActors) {
83+
this.actors = this.props.getActors();
84+
}
85+
},
86+
87+
componentWillUnmount() {
88+
if (this.props.setActors) {
89+
this.props.setActors(this.actors);
90+
}
91+
},
92+
7893
getChildren(item) {
7994
const { getObjectProperties } = this.props;
8095
const obj = item.contents;
@@ -95,8 +110,8 @@ const ObjectInspector = React.createClass({
95110
// being the same across renders. If we didn't do this, each
96111
// node would be a new instance every render.
97112
const key = item.path;
98-
if (this.actorCache[key]) {
99-
return this.actorCache[key];
113+
if (this.actors[key]) {
114+
return this.actors[key];
100115
}
101116

102117
const loadedProps = getObjectProperties(actor);
@@ -106,7 +121,7 @@ const ObjectInspector = React.createClass({
106121
}
107122

108123
const children = makeNodesForProperties(loadedProps, item.path);
109-
this.actorCache[actor] = children;
124+
this.actors[key] = children;
110125
return children;
111126
}
112127

@@ -167,8 +182,10 @@ const ObjectInspector = React.createClass({
167182
},
168183

169184
render() {
170-
const { name, desc, loadObjectProperties,
171-
autoExpandDepth } = this.props;
185+
const {
186+
name, desc, loadObjectProperties,
187+
autoExpandDepth, getExpanded, setExpanded
188+
} = this.props;
172189

173190
let roots = this.props.roots;
174191
if (!roots) {
@@ -190,7 +207,8 @@ const ObjectInspector = React.createClass({
190207
loadObjectProperties(item.contents.value);
191208
}
192209
},
193-
210+
getExpanded,
211+
setExpanded,
194212
renderItem: this.renderItem
195213
});
196214
}

0 commit comments

Comments
 (0)