diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /devtools/client/webconsole/store.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/webconsole/store.js')
-rw-r--r-- | devtools/client/webconsole/store.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/devtools/client/webconsole/store.js b/devtools/client/webconsole/store.js new file mode 100644 index 0000000000..029d46f439 --- /dev/null +++ b/devtools/client/webconsole/store.js @@ -0,0 +1,160 @@ +/* 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"; + +// State +const { + FilterState, +} = require("resource://devtools/client/webconsole/reducers/filters.js"); +const { + PrefState, +} = require("resource://devtools/client/webconsole/reducers/prefs.js"); +const { + UiState, +} = require("resource://devtools/client/webconsole/reducers/ui.js"); + +// Redux +const { + applyMiddleware, + compose, + createStore, +} = require("resource://devtools/client/shared/vendor/redux.js"); + +// Prefs +const { PREFS } = require("resource://devtools/client/webconsole/constants.js"); +const { + getPrefsService, +} = require("resource://devtools/client/webconsole/utils/prefs.js"); + +// Reducers +const { + reducers, +} = require("resource://devtools/client/webconsole/reducers/index.js"); + +// Middlewares +const { + ignore, +} = require("resource://devtools/client/shared/redux/middleware/ignore.js"); +const eventTelemetry = require("resource://devtools/client/webconsole/middleware/event-telemetry.js"); +const historyPersistence = require("resource://devtools/client/webconsole/middleware/history-persistence.js"); +const performanceMarker = require("resource://devtools/client/webconsole/middleware/performance-marker.js"); +const { + thunk, +} = require("resource://devtools/client/shared/redux/middleware/thunk.js"); + +// Enhancers +const enableBatching = require("resource://devtools/client/webconsole/enhancers/batching.js"); +const enableActorReleaser = require("resource://devtools/client/webconsole/enhancers/actor-releaser.js"); +const ensureCSSErrorReportingEnabled = require("resource://devtools/client/webconsole/enhancers/css-error-reporting.js"); +const enableMessagesCacheClearing = require("resource://devtools/client/webconsole/enhancers/message-cache-clearing.js"); + +/** + * Create and configure store for the Console panel. This is the place + * where various enhancers and middleware can be registered. + */ +function configureStore(webConsoleUI, options = {}) { + const prefsService = getPrefsService(webConsoleUI); + const { getBoolPref, getIntPref } = prefsService; + + const logLimit = + options.logLimit || Math.max(getIntPref("devtools.hud.loglimit"), 1); + const sidebarToggle = getBoolPref(PREFS.FEATURES.SIDEBAR_TOGGLE); + const autocomplete = getBoolPref(PREFS.FEATURES.AUTOCOMPLETE); + const eagerEvaluation = getBoolPref(PREFS.FEATURES.EAGER_EVALUATION); + const groupWarnings = getBoolPref(PREFS.FEATURES.GROUP_WARNINGS); + const historyCount = getIntPref(PREFS.UI.INPUT_HISTORY_COUNT); + + const initialState = { + prefs: PrefState({ + logLimit, + sidebarToggle, + autocomplete, + eagerEvaluation, + historyCount, + groupWarnings, + }), + filters: FilterState({ + error: getBoolPref(PREFS.FILTER.ERROR), + warn: getBoolPref(PREFS.FILTER.WARN), + info: getBoolPref(PREFS.FILTER.INFO), + debug: getBoolPref(PREFS.FILTER.DEBUG), + log: getBoolPref(PREFS.FILTER.LOG), + css: getBoolPref(PREFS.FILTER.CSS), + net: getBoolPref(PREFS.FILTER.NET), + netxhr: getBoolPref(PREFS.FILTER.NETXHR), + }), + ui: UiState({ + networkMessageActiveTabId: "headers", + persistLogs: getBoolPref(PREFS.UI.PERSIST), + editor: getBoolPref(PREFS.UI.EDITOR), + editorWidth: getIntPref(PREFS.UI.EDITOR_WIDTH), + showEditorOnboarding: getBoolPref(PREFS.UI.EDITOR_ONBOARDING), + timestampsVisible: getBoolPref(PREFS.UI.MESSAGE_TIMESTAMP), + showEvaluationContextSelector: getBoolPref(PREFS.UI.CONTEXT_SELECTOR), + enableNetworkMonitoring: + webConsoleUI.isBrowserConsole || webConsoleUI.isBrowserToolboxConsole + ? getBoolPref(PREFS.UI.ENABLE_NETWORK_MONITORING) + : true, + }), + }; + + const { toolbox } = options.thunkArgs; + const sessionId = (toolbox && toolbox.sessionId) || -1; + const middleware = applyMiddleware( + performanceMarker(sessionId), + ignore, + thunk({ + prefsService, + ...options.thunkArgs, + }), + historyPersistence.bind(null, webConsoleUI), + eventTelemetry.bind(null, options.telemetry) + ); + + return createStore( + createRootReducer(), + initialState, + compose( + middleware, + enableActorReleaser(webConsoleUI), + enableMessagesCacheClearing(webConsoleUI), + ensureCSSErrorReportingEnabled(webConsoleUI), + // ⚠️ Keep this one last so it will be executed before all the other ones. This is + // needed so batched actions can be "unbatched" and handled in the other enhancers. + enableBatching() + ) + ); +} + +function createRootReducer() { + return function rootReducer(state, action) { + // We want to compute the new state for all properties except + // "messages" and "history". These two reducers are handled + // separately since they are receiving additional arguments. + const newState = Object.entries(reducers).reduce((res, [key, reducer]) => { + if (key !== "messages" && key !== "history") { + res[key] = reducer(state[key], action); + } + return res; + }, {}); + + // Pass prefs state as additional argument to the history reducer. + newState.history = reducers.history(state.history, action, newState.prefs); + + // Specifically pass the updated filters, prefs and ui states as additional arguments. + newState.messages = reducers.messages( + state.messages, + action, + newState.filters, + newState.prefs, + newState.ui + ); + + return newState; + }; +} + +// Provide the store factory for test code so that each test is working with +// its own instance. +module.exports.configureStore = configureStore; |