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 {
ADB_ADDON_INSTALL_START,
ADB_ADDON_INSTALL_SUCCESS,
ADB_ADDON_INSTALL_FAILURE,
ADB_ADDON_UNINSTALL_START,
ADB_ADDON_UNINSTALL_SUCCESS,
ADB_ADDON_UNINSTALL_FAILURE,
ADB_ADDON_STATUS_UPDATED,
ADB_READY_UPDATED,
DEBUG_TARGET_COLLAPSIBILITY_UPDATED,
HIDE_PROFILER_DIALOG,
NETWORK_LOCATIONS_UPDATE_FAILURE,
NETWORK_LOCATIONS_UPDATE_START,
NETWORK_LOCATIONS_UPDATE_SUCCESS,
PAGE_TYPES,
SELECT_PAGE_FAILURE,
SELECT_PAGE_START,
SELECT_PAGE_SUCCESS,
SELECTED_RUNTIME_ID_UPDATED,
SHOW_PROFILER_DIALOG,
SWITCH_PROFILER_CONTEXT,
USB_RUNTIMES_SCAN_START,
USB_RUNTIMES_SCAN_SUCCESS,
} = require("resource://devtools/client/aboutdebugging/src/constants.js");
const NetworkLocationsModule = require("resource://devtools/client/aboutdebugging/src/modules/network-locations.js");
const {
adbAddon,
} = require("resource://devtools/client/shared/remote-debugging/adb/adb-addon.js");
const {
refreshUSBRuntimes,
} = require("resource://devtools/client/aboutdebugging/src/modules/usb-runtimes.js");
const Actions = require("resource://devtools/client/aboutdebugging/src/actions/index.js");
function selectPage(page, runtimeId) {
return async ({ dispatch, getState }) => {
dispatch({ type: SELECT_PAGE_START });
try {
const isSamePage = (oldPage, newPage) => {
if (newPage === PAGE_TYPES.RUNTIME && oldPage === PAGE_TYPES.RUNTIME) {
return runtimeId === getState().runtimes.selectedRuntimeId;
}
return newPage === oldPage;
};
if (!page) {
throw new Error("No page provided.");
}
const currentPage = getState().ui.selectedPage;
// Nothing to dispatch if the page is the same as the current page
if (isSamePage(currentPage, page)) {
return;
}
// Stop showing the profiler dialog if we are navigating to another page.
if (getState().ui.showProfilerDialog) {
await dispatch({ type: HIDE_PROFILER_DIALOG });
}
// Stop watching current runtime, if currently on a RUNTIME page.
if (currentPage === PAGE_TYPES.RUNTIME) {
const currentRuntimeId = getState().runtimes.selectedRuntimeId;
await dispatch(Actions.unwatchRuntime(currentRuntimeId));
}
// Always update the selected runtime id.
// If we are navigating to a non-runtime page, the Runtime page components are no
// longer rendered so it is safe to nullify the runtimeId.
// If we are navigating to a runtime page, the runtime corresponding to runtimeId
// is already connected, so components can safely get runtimeDetails on this new
// runtime.
dispatch({ type: SELECTED_RUNTIME_ID_UPDATED, runtimeId });
// Start watching current runtime, if moving to a RUNTIME page.
if (page === PAGE_TYPES.RUNTIME) {
await dispatch(Actions.watchRuntime(runtimeId));
}
dispatch({ type: SELECT_PAGE_SUCCESS, page });
} catch (e) {
dispatch({ type: SELECT_PAGE_FAILURE, error: e });
}
};
}
function updateDebugTargetCollapsibility(key, isCollapsed) {
return { type: DEBUG_TARGET_COLLAPSIBILITY_UPDATED, key, isCollapsed };
}
function addNetworkLocation(location) {
return () => {
NetworkLocationsModule.addNetworkLocation(location);
};
}
function removeNetworkLocation(location) {
return () => {
NetworkLocationsModule.removeNetworkLocation(location);
};
}
function showProfilerDialog() {
return { type: SHOW_PROFILER_DIALOG };
}
/**
* The profiler can switch between "devtools-remote" and "aboutprofiling-remote"
* page contexts.
*/
function switchProfilerContext(profilerContext) {
return { type: SWITCH_PROFILER_CONTEXT, profilerContext };
}
function hideProfilerDialog() {
return { type: HIDE_PROFILER_DIALOG };
}
function updateAdbAddonStatus(adbAddonStatus) {
return { type: ADB_ADDON_STATUS_UPDATED, adbAddonStatus };
}
function updateAdbReady(isAdbReady) {
return { type: ADB_READY_UPDATED, isAdbReady };
}
function updateNetworkLocations(locations) {
return async ({ dispatch }) => {
dispatch({ type: NETWORK_LOCATIONS_UPDATE_START });
try {
await dispatch(Actions.updateNetworkRuntimes(locations));
dispatch({ type: NETWORK_LOCATIONS_UPDATE_SUCCESS, locations });
} catch (e) {
dispatch({ type: NETWORK_LOCATIONS_UPDATE_FAILURE, error: e });
}
};
}
function installAdbAddon() {
return async ({ dispatch }) => {
dispatch({ type: ADB_ADDON_INSTALL_START });
try {
// "aboutdebugging" will be forwarded to telemetry as the installation source
// for the addon.
await adbAddon.install("about:debugging");
dispatch({ type: ADB_ADDON_INSTALL_SUCCESS });
} catch (e) {
dispatch({ type: ADB_ADDON_INSTALL_FAILURE, error: e });
}
};
}
function uninstallAdbAddon() {
return async ({ dispatch }) => {
dispatch({ type: ADB_ADDON_UNINSTALL_START });
try {
await adbAddon.uninstall();
dispatch({ type: ADB_ADDON_UNINSTALL_SUCCESS });
} catch (e) {
dispatch({ type: ADB_ADDON_UNINSTALL_FAILURE, error: e });
}
};
}
function scanUSBRuntimes() {
return async ({ dispatch, getState }) => {
// do not re-scan if we are already doing it
if (getState().ui.isScanningUsb) {
return;
}
dispatch({ type: USB_RUNTIMES_SCAN_START });
await refreshUSBRuntimes();
dispatch({ type: USB_RUNTIMES_SCAN_SUCCESS });
};
}
module.exports = {
addNetworkLocation,
hideProfilerDialog,
installAdbAddon,
removeNetworkLocation,
scanUSBRuntimes,
selectPage,
showProfilerDialog,
switchProfilerContext,
uninstallAdbAddon,
updateAdbAddonStatus,
updateAdbReady,
updateDebugTargetCollapsibility,
updateNetworkLocations,
};