diff options
Diffstat (limited to 'devtools/client/memory/actions/io.js')
-rw-r--r-- | devtools/client/memory/actions/io.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/devtools/client/memory/actions/io.js b/devtools/client/memory/actions/io.js new file mode 100644 index 0000000000..c811478df5 --- /dev/null +++ b/devtools/client/memory/actions/io.js @@ -0,0 +1,103 @@ +/* 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("resource://devtools/shared/DevToolsUtils.js"); +const { + snapshotState: states, + actions, +} = require("resource://devtools/client/memory/constants.js"); +const { + L10N, + openFilePicker, + createSnapshot, +} = require("resource://devtools/client/memory/utils.js"); +const { + selectSnapshot, + computeSnapshotData, + readSnapshot, +} = require("resource://devtools/client/memory/actions/snapshot.js"); +const VALID_EXPORT_STATES = [states.SAVED, states.READ]; + +exports.pickFileAndExportSnapshot = function (snapshot) { + return async function ({ dispatch, getState }) { + const outputFile = await openFilePicker({ + title: L10N.getFormatStr("snapshot.io.save.window"), + defaultName: PathUtils.filename(snapshot.path), + filters: [[L10N.getFormatStr("snapshot.io.filter"), "*.fxsnapshot"]], + mode: "save", + }); + + if (!outputFile) { + return; + } + + await dispatch(exportSnapshot(snapshot, outputFile.path)); + }; +}; + +const exportSnapshot = (exports.exportSnapshot = function (snapshot, dest) { + return async function ({ dispatch, getState }) { + dispatch({ type: actions.EXPORT_SNAPSHOT_START, snapshot }); + + assert( + VALID_EXPORT_STATES.includes(snapshot.state), + `Snapshot is in invalid state for exporting: ${snapshot.state}` + ); + + try { + await IOUtils.copy(snapshot.path, dest); + } catch (error) { + reportException("exportSnapshot", error); + dispatch({ type: actions.EXPORT_SNAPSHOT_ERROR, snapshot, error }); + } + + dispatch({ type: actions.EXPORT_SNAPSHOT_END, snapshot }); + }; +}); + +exports.pickFileAndImportSnapshotAndCensus = function (heapWorker) { + return async function ({ dispatch, getState }) { + const input = await openFilePicker({ + title: L10N.getFormatStr("snapshot.io.import.window"), + filters: [[L10N.getFormatStr("snapshot.io.filter"), "*.fxsnapshot"]], + mode: "open", + }); + + if (!input) { + return; + } + + await dispatch(importSnapshotAndCensus(heapWorker, input.path)); + }; +}; + +const importSnapshotAndCensus = function (heapWorker, path) { + return async function ({ dispatch, getState }) { + 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 { + await dispatch(readSnapshot(heapWorker, id)); + await dispatch(computeSnapshotData(heapWorker, id)); + } catch (error) { + reportException("importSnapshot", error); + dispatch({ type: actions.IMPORT_SNAPSHOT_ERROR, error, id }); + } + + dispatch({ type: actions.IMPORT_SNAPSHOT_END, id }); + }; +}; +exports.importSnapshotAndCensus = importSnapshotAndCensus; |