Source code

Revision control

Copy as Markdown

Other Tools

/* 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 {
applyMiddleware,
createStore,
} = require("resource://devtools/client/shared/vendor/redux.js");
const {
waitUntilService,
} = require("resource://devtools/client/shared/redux/middleware/wait-service.js");
const {
MIN_COLUMN_WIDTH,
DEFAULT_COLUMN_WIDTH,
} = require("resource://devtools/client/netmonitor/src/constants.js");
// Middleware
const batching = require("resource://devtools/client/netmonitor/src/middleware/batching.js");
const prefs = require("resource://devtools/client/netmonitor/src/middleware/prefs.js");
const {
thunk,
} = require("resource://devtools/client/shared/redux/middleware/thunk.js");
const throttling = require("resource://devtools/client/netmonitor/src/middleware/throttling.js");
const eventTelemetry = require("resource://devtools/client/netmonitor/src/middleware/event-telemetry.js");
const requestBlocking = require("resource://devtools/client/netmonitor/src/middleware/request-blocking.js");
// Reducers
const rootReducer = require("resource://devtools/client/netmonitor/src/reducers/index.js");
const {
FilterTypes,
Filters,
} = require("resource://devtools/client/netmonitor/src/reducers/filters.js");
const {
Requests,
} = require("resource://devtools/client/netmonitor/src/reducers/requests.js");
const {
Sort,
} = require("resource://devtools/client/netmonitor/src/reducers/sort.js");
const {
TimingMarkers,
} = require("resource://devtools/client/netmonitor/src/reducers/timing-markers.js");
const {
UI,
Columns,
ColumnsData,
} = require("resource://devtools/client/netmonitor/src/reducers/ui.js");
const {
Messages,
getMessageDefaultColumnsState,
} = require("resource://devtools/client/netmonitor/src/reducers/messages.js");
const {
Search,
} = require("resource://devtools/client/netmonitor/src/reducers/search.js");
/**
* Configure state and middleware for the Network monitor tool.
*/
function configureStore(connector, commands, telemetry) {
// Prepare initial state.
const initialState = {
filters: new Filters({
requestFilterTypes: getFilterState(),
}),
requests: new Requests(),
sort: new Sort(),
timingMarkers: new TimingMarkers(),
ui: UI({
columns: getColumnState(),
columnsData: getColumnsData(),
}),
messages: Messages({
columns: getMessageColumnState(),
}),
search: new Search(),
};
// Prepare middleware.
const middleware = applyMiddleware(
requestBlocking(commands),
thunk({ connector, commands }),
prefs,
batching,
throttling(connector),
eventTelemetry(connector, telemetry),
waitUntilService
);
return createStore(rootReducer, initialState, middleware);
}
// Helpers
/**
* Get column state from preferences.
*/
function getColumnState() {
const columns = Columns();
const visibleColumns = getPref("devtools.netmonitor.visibleColumns");
const state = {};
for (const col in columns) {
state[col] = visibleColumns.includes(col);
}
return state;
}
/**
* Get column state of Messages from preferences.
*/
function getMessageColumnState() {
const columns = getMessageDefaultColumnsState();
const visibleColumns = getPref("devtools.netmonitor.msg.visibleColumns");
const state = {};
for (const col in columns) {
state[col] = visibleColumns.includes(col);
}
return state;
}
/**
* Get columns data (width, min-width)
*/
function getColumnsData() {
const columnsData = getPref("devtools.netmonitor.columnsData");
if (!columnsData.length) {
return ColumnsData();
}
const newMap = new Map();
columnsData.forEach(col => {
if (col.name) {
col.minWidth = col.minWidth ? col.minWidth : MIN_COLUMN_WIDTH;
col.width = col.width ? col.width : DEFAULT_COLUMN_WIDTH;
newMap.set(col.name, col);
}
});
return newMap;
}
/**
* Get filter state from preferences.
*/
function getFilterState() {
const activeFilters = {};
const filters = getPref("devtools.netmonitor.filters");
filters.forEach(filter => {
activeFilters[filter] = true;
});
return new FilterTypes(activeFilters);
}
/**
* Get json data from preferences
*/
function getPref(pref) {
try {
return JSON.parse(Services.prefs.getCharPref(pref));
} catch (_) {
return [];
}
}
exports.configureStore = configureStore;