summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/middleware/history-persistence.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/webconsole/middleware/history-persistence.js')
-rw-r--r--devtools/client/webconsole/middleware/history-persistence.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/devtools/client/webconsole/middleware/history-persistence.js b/devtools/client/webconsole/middleware/history-persistence.js
new file mode 100644
index 0000000000..b6b6ca9f7c
--- /dev/null
+++ b/devtools/client/webconsole/middleware/history-persistence.js
@@ -0,0 +1,71 @@
+/* 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 {
+ APPEND_TO_HISTORY,
+ CLEAR_HISTORY,
+ EVALUATE_EXPRESSION,
+} = require("resource://devtools/client/webconsole/constants.js");
+
+const historyActions = require("resource://devtools/client/webconsole/actions/history.js");
+
+loader.lazyRequireGetter(
+ this,
+ "asyncStorage",
+ "resource://devtools/shared/async-storage.js"
+);
+
+/**
+ * History persistence middleware is responsible for loading
+ * and maintaining history of executed expressions in JSTerm.
+ */
+function historyPersistenceMiddleware(webConsoleUI, store) {
+ let historyLoaded = false;
+ asyncStorage.getItem("webConsoleHistory").then(
+ value => {
+ if (Array.isArray(value)) {
+ store.dispatch(historyActions.historyLoaded(value));
+ }
+ historyLoaded = true;
+ },
+ err => {
+ historyLoaded = true;
+ console.error(err);
+ }
+ );
+
+ return next => action => {
+ const res = next(action);
+
+ const triggerStoreActions = [
+ APPEND_TO_HISTORY,
+ CLEAR_HISTORY,
+ EVALUATE_EXPRESSION,
+ ];
+
+ // Save the current history entries when modified, but wait till
+ // entries from the previous session are loaded.
+ const { isPrivate } =
+ webConsoleUI.hud?.commands?.targetCommand?.targetFront?.targetForm || {};
+
+ if (
+ !isPrivate &&
+ historyLoaded &&
+ triggerStoreActions.includes(action.type)
+ ) {
+ const state = store.getState();
+ asyncStorage
+ .setItem("webConsoleHistory", state.history.entries)
+ .catch(e => {
+ console.error("Error when saving WebConsole input history", e);
+ });
+ }
+
+ return res;
+ };
+}
+
+module.exports = historyPersistenceMiddleware;