summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/selectors/tabs.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/selectors/tabs.js')
-rw-r--r--devtools/client/debugger/src/selectors/tabs.js89
1 files changed, 89 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/selectors/tabs.js b/devtools/client/debugger/src/selectors/tabs.js
new file mode 100644
index 0000000000..822bb7f49a
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/tabs.js
@@ -0,0 +1,89 @@
+/* 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/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import { getPrettySourceURL } from "../utils/source";
+
+import { getSpecificSourceByURL } from "./sources";
+import { isSimilarTab } from "../utils/tabs";
+
+export const getTabs = state => state.tabs.tabs;
+
+// Return the list of tabs which relates to an active source
+export const getSourceTabs = createSelector(getTabs, tabs =>
+ tabs.filter(tab => tab.source)
+);
+
+export const getSourcesForTabs = createSelector(getSourceTabs, sourceTabs => {
+ return sourceTabs.map(tab => tab.source);
+});
+
+export function tabExists(state, sourceId) {
+ return !!getSourceTabs(state).find(tab => tab.source.id == sourceId);
+}
+
+export function hasPrettyTab(state, source) {
+ const prettyUrl = getPrettySourceURL(source.url);
+ return getTabs(state).some(tab => tab.url === prettyUrl);
+}
+
+/**
+ * Gets the next tab to select when a tab closes. Heuristics:
+ * 1. if the selected tab is available, it remains selected
+ * 2. if it is gone, the next available tab to the left should be active
+ * 3. if the first tab is active and closed, select the second tab
+ */
+export function getNewSelectedSource(state, tabList) {
+ const { selectedLocation } = state.sources;
+ const availableTabs = getTabs(state);
+ if (!selectedLocation) {
+ return null;
+ }
+
+ const selectedSource = selectedLocation.source;
+ if (!selectedSource) {
+ return null;
+ }
+
+ const matchingTab = availableTabs.find(tab =>
+ isSimilarTab(tab, selectedSource.url, selectedSource.isOriginal)
+ );
+
+ if (matchingTab) {
+ const specificSelectedSource = getSpecificSourceByURL(
+ state,
+ selectedSource.url,
+ selectedSource.isOriginal
+ );
+
+ if (specificSelectedSource) {
+ return specificSelectedSource;
+ }
+
+ return null;
+ }
+
+ const tabUrls = tabList.map(tab => tab.url);
+ const leftNeighborIndex = Math.max(
+ tabUrls.indexOf(selectedSource.url) - 1,
+ 0
+ );
+ const lastAvailbleTabIndex = availableTabs.length - 1;
+ const newSelectedTabIndex = Math.min(leftNeighborIndex, lastAvailbleTabIndex);
+ const availableTab = availableTabs[newSelectedTabIndex];
+
+ if (availableTab) {
+ const tabSource = getSpecificSourceByURL(
+ state,
+ availableTab.url,
+ availableTab.isOriginal
+ );
+
+ if (tabSource) {
+ return tabSource;
+ }
+ }
+
+ return null;
+}