diff options
Diffstat (limited to 'devtools/client/memory/actions/io.js')
-rw-r--r-- | devtools/client/memory/actions/io.js | 97 |
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 }); + }; +}; |