summaryrefslogtreecommitdiffstats
path: root/devtools/client/memory/initializer.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/memory/initializer.js')
-rw-r--r--devtools/client/memory/initializer.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/devtools/client/memory/initializer.js b/devtools/client/memory/initializer.js
new file mode 100644
index 0000000000..541bd224eb
--- /dev/null
+++ b/devtools/client/memory/initializer.js
@@ -0,0 +1,85 @@
+/* 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/. */
+
+/* exported initialize, destroy, Promise */
+
+"use strict";
+
+const {
+ createFactory,
+ createElement,
+} = require("resource://devtools/client/shared/vendor/react.js");
+const ReactDOM = require("resource://devtools/client/shared/vendor/react-dom.js");
+const {
+ Provider,
+} = require("resource://devtools/client/shared/vendor/react-redux.js");
+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 {
+ updateMemoryFront,
+} = require("resource://devtools/client/memory/actions/front.js");
+
+// Shared variables used by several methods of this module.
+let root, store, unsubscribe;
+
+const initialize = async function (commands) {
+ // Exposed by panel.js
+ const { gToolbox, gHeapAnalysesClient } = window;
+
+ root = document.querySelector("#app");
+ store = Store();
+ const app = createElement(App, {
+ toolbox: gToolbox,
+ commands,
+ heapWorker: gHeapAnalysesClient,
+ });
+ const provider = createElement(Provider, { store }, app);
+ ReactDOM.render(provider, root);
+ unsubscribe = store.subscribe(onStateChange);
+
+ // Exposed for tests.
+ window.gStore = store;
+};
+
+const updateFront = front => {
+ store.dispatch(updateMemoryFront(front));
+};
+
+const destroy = function () {
+ const ok = ReactDOM.unmountComponentAtNode(root);
+ assert(
+ ok,
+ "Should successfully unmount the memory tool's top level React component"
+ );
+
+ unsubscribe();
+};
+
+// Current state
+let isHighlighted;
+
+/**
+ * Fired on any state change, currently only handles toggling
+ * the highlighting of the tool when recording allocations.
+ */
+function onStateChange() {
+ const { gToolbox } = window;
+
+ const isRecording = store.getState().allocations.recording;
+ if (isRecording === isHighlighted) {
+ return;
+ }
+
+ if (isRecording) {
+ gToolbox.highlightTool("memory");
+ } else {
+ gToolbox.unhighlightTool("memory");
+ }
+
+ isHighlighted = isRecording;
+}
+
+module.exports = { initialize, updateFront, destroy };