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
"use strict";
const {
CONNECT_RUNTIME_CANCEL,
CONNECT_RUNTIME_FAILURE,
CONNECT_RUNTIME_NOT_RESPONDING,
CONNECT_RUNTIME_START,
CONNECT_RUNTIME_SUCCESS,
DISCONNECT_RUNTIME_SUCCESS,
RUNTIMES,
UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS,
REMOTE_RUNTIMES_UPDATED,
SELECTED_RUNTIME_ID_UPDATED,
THIS_FIREFOX_RUNTIME_CREATED,
} = require("resource://devtools/client/aboutdebugging/src/constants.js");
const {
findRuntimeById,
} = require("resource://devtools/client/aboutdebugging/src/modules/runtimes-state-helper.js");
const {
remoteClientManager,
} = require("resource://devtools/client/shared/remote-debugging/remote-client-manager.js");
// Map between known runtime types and nodes in the runtimes state.
const TYPE_TO_RUNTIMES_KEY = {
[RUNTIMES.THIS_FIREFOX]: "thisFirefoxRuntimes",
[RUNTIMES.NETWORK]: "networkRuntimes",
[RUNTIMES.USB]: "usbRuntimes",
};
function RuntimesState() {
return {
networkRuntimes: [],
selectedRuntimeId: null,
// "This Firefox" runtimes is an array for consistency, but it should only contain one
// runtime. This runtime will be added after initializing the application via
// THIS_FIREFOX_RUNTIME_CREATED.
thisFirefoxRuntimes: [],
usbRuntimes: [],
};
}
/**
* Update the runtime matching the provided runtimeId with the content of updatedRuntime,
* and return the new state.
*
* @param {String} runtimeId
* The id of the runtime to update
* @param {Object} updatedRuntime
* Object used to update the runtime matching the idea using Object.assign.
* @param {Object} state
* Current runtimes state.
* @return {Object} The updated state
*/
function _updateRuntimeById(runtimeId, updatedRuntime, state) {
// Find the array of runtimes that contains the updated runtime.
const runtime = findRuntimeById(runtimeId, state);
const key = TYPE_TO_RUNTIMES_KEY[runtime.type];
const runtimesToUpdate = state[key];
// Update the runtime with the provided updatedRuntime.
const updatedRuntimes = runtimesToUpdate.map(r => {
if (r.id === runtimeId) {
return Object.assign({}, r, updatedRuntime);
}
return r;
});
return Object.assign({}, state, { [key]: updatedRuntimes });
}
function runtimesReducer(state = RuntimesState(), action) {
switch (action.type) {
case CONNECT_RUNTIME_START: {
const { id } = action;
const updatedState = {
isConnecting: true,
isConnectionFailed: false,
isConnectionNotResponding: false,
isConnectionTimeout: false,
};
return _updateRuntimeById(id, updatedState, state);
}
case CONNECT_RUNTIME_NOT_RESPONDING: {
const { id } = action;
return _updateRuntimeById(id, { isConnectionNotResponding: true }, state);
}
case CONNECT_RUNTIME_CANCEL: {
const { id } = action;
const updatedState = {
isConnecting: false,
isConnectionFailed: false,
isConnectionNotResponding: false,
isConnectionTimeout: true,
};
return _updateRuntimeById(id, updatedState, state);
}
case CONNECT_RUNTIME_SUCCESS: {
const { id, runtimeDetails, type } = action.runtime;
// Update the remoteClientManager with the connected runtime.
const client = runtimeDetails.clientWrapper.client;
const runtimeInfo = runtimeDetails.info;
remoteClientManager.setClient(id, type, client, runtimeInfo);
const updatedState = {
isConnecting: false,
isConnectionFailed: false,
isConnectionNotResponding: false,
isConnectionTimeout: false,
runtimeDetails,
};
return _updateRuntimeById(id, updatedState, state);
}
case CONNECT_RUNTIME_FAILURE: {
const { id } = action;
const updatedState = {
isConnecting: false,
isConnectionFailed: true,
isConnectionNotResponding: false,
isConnectionTimeout: false,
};
return _updateRuntimeById(id, updatedState, state);
}
case DISCONNECT_RUNTIME_SUCCESS: {
const { id, type } = action.runtime;
remoteClientManager.removeClient(id, type);
return _updateRuntimeById(id, { runtimeDetails: null }, state);
}
case SELECTED_RUNTIME_ID_UPDATED: {
const selectedRuntimeId = action.runtimeId || null;
return Object.assign({}, state, { selectedRuntimeId });
}
case UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS: {
const { connectionPromptEnabled } = action;
const { id: runtimeId } = action.runtime;
const runtime = findRuntimeById(runtimeId, state);
const runtimeDetails = Object.assign({}, runtime.runtimeDetails, {
connectionPromptEnabled,
});
return _updateRuntimeById(runtimeId, { runtimeDetails }, state);
}
case REMOTE_RUNTIMES_UPDATED: {
const { runtimes, runtimeType } = action;
const key = TYPE_TO_RUNTIMES_KEY[runtimeType];
return Object.assign({}, state, {
[key]: runtimes,
});
}
case THIS_FIREFOX_RUNTIME_CREATED: {
const { runtime } = action;
return Object.assign({}, state, {
thisFirefoxRuntimes: [runtime],
});
}
default:
return state;
}
}
module.exports = {
RuntimesState,
runtimesReducer,
};