summaryrefslogtreecommitdiffstats
path: root/devtools/client/memory/actions/io.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/memory/actions/io.js')
-rw-r--r--devtools/client/memory/actions/io.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/devtools/client/memory/actions/io.js b/devtools/client/memory/actions/io.js
new file mode 100644
index 000000000..10b45aee5
--- /dev/null
+++ b/devtools/client/memory/actions/io.js
@@ -0,0 +1,97 @@
+/* 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/. */
+"use strict";
+
+const { immutableUpdate, reportException, assert } = require("devtools/shared/DevToolsUtils");
+const { snapshotState: states, actions, viewState } = require("../constants");
+const { L10N, openFilePicker, createSnapshot } = require("../utils");
+const telemetry = require("../telemetry");
+const { OS } = require("resource://gre/modules/osfile.jsm");
+const {
+ selectSnapshot,
+ computeSnapshotData,
+ readSnapshot,
+ takeCensus,
+ takeTreeMap
+} = require("./snapshot");
+const VALID_EXPORT_STATES = [states.SAVED, states.READ];
+
+exports.pickFileAndExportSnapshot = function (snapshot) {
+ return function* (dispatch, getState) {
+ let outputFile = yield openFilePicker({
+ title: L10N.getFormatStr("snapshot.io.save.window"),
+ defaultName: OS.Path.basename(snapshot.path),
+ filters: [[L10N.getFormatStr("snapshot.io.filter"), "*.fxsnapshot"]],
+ mode: "save",
+ });
+
+ if (!outputFile) {
+ return;
+ }
+
+ yield dispatch(exportSnapshot(snapshot, outputFile.path));
+ };
+};
+
+const exportSnapshot = exports.exportSnapshot = function (snapshot, dest) {
+ return function* (dispatch, getState) {
+ telemetry.countExportSnapshot();
+
+ dispatch({ type: actions.EXPORT_SNAPSHOT_START, snapshot });
+
+ assert(VALID_EXPORT_STATES.includes(snapshot.state),
+ `Snapshot is in invalid state for exporting: ${snapshot.state}`);
+
+ try {
+ yield OS.File.copy(snapshot.path, dest);
+ } catch (error) {
+ reportException("exportSnapshot", error);
+ dispatch({ type: actions.EXPORT_SNAPSHOT_ERROR, snapshot, error });
+ }
+
+ dispatch({ type: actions.EXPORT_SNAPSHOT_END, snapshot });
+ };
+};
+
+const pickFileAndImportSnapshotAndCensus = exports.pickFileAndImportSnapshotAndCensus = function (heapWorker) {
+ return function* (dispatch, getState) {
+ let input = yield openFilePicker({
+ title: L10N.getFormatStr("snapshot.io.import.window"),
+ filters: [[L10N.getFormatStr("snapshot.io.filter"), "*.fxsnapshot"]],
+ mode: "open",
+ });
+
+ if (!input) {
+ return;
+ }
+
+ yield dispatch(importSnapshotAndCensus(heapWorker, input.path));
+ };
+};
+
+const importSnapshotAndCensus = exports.importSnapshotAndCensus = function (heapWorker, path) {
+ return function* (dispatch, getState) {
+ telemetry.countImportSnapshot();
+
+ const snapshot = immutableUpdate(createSnapshot(getState()), {
+ path,
+ state: states.IMPORTING,
+ imported: true,
+ });
+ const id = snapshot.id;
+
+ dispatch({ type: actions.IMPORT_SNAPSHOT_START, snapshot });
+ dispatch(selectSnapshot(snapshot.id));
+
+ try {
+ yield dispatch(readSnapshot(heapWorker, id));
+ yield dispatch(computeSnapshotData(heapWorker, id));
+ } catch (error) {
+ reportException("importSnapshot", error);
+ dispatch({ type: actions.IMPORT_SNAPSHOT_ERROR, error, id });
+ }
+
+ dispatch({ type: actions.IMPORT_SNAPSHOT_END, id });
+ };
+};