summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/selectors/exceptions.js
blob: f5a1a3f07468b06a7bb41a007adeb6b5f121651c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* 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 { shallowEqual, arrayShallowEqual } from "../utils/shallow-equal";

import { getSelectedSource, getSourceActorsForSource } from "./index";

export const getSelectedSourceExceptions = createSelector(
  getSelectedSourceActors,
  // Do not retrieve mutableExceptionsMap as it will never change and createSelector would
  // prevent re-running the selector in case of modification. state.exception is the `state`
  // in the reducer, which we take care of cloning in case of new exception.
  state => state.exceptions,
  (sourceActors, exceptionsState) => {
    const { mutableExceptionsMap } = exceptionsState;
    const sourceExceptions = [];

    for (const sourceActor of sourceActors) {
      const exceptions = mutableExceptionsMap.get(sourceActor.id);
      if (exceptions) {
        sourceExceptions.push(...exceptions);
      }
    }

    return sourceExceptions;
  },
  // Shallow compare both input and output because of arrays being possibly always
  // different instance but with same content.
  {
    memoizeOptions: {
      equalityCheck: shallowEqual,
      resultEqualityCheck: arrayShallowEqual,
    },
  }
);

function getSelectedSourceActors(state) {
  const selectedSource = getSelectedSource(state);
  if (!selectedSource) {
    return [];
  }
  return getSourceActorsForSource(state, selectedSource.id);
}

export function getSelectedException(state, line, column) {
  const sourceExceptions = getSelectedSourceExceptions(state);

  if (!sourceExceptions) {
    return undefined;
  }

  return sourceExceptions.find(
    sourceExc =>
      sourceExc.lineNumber === line && sourceExc.columnNumber === column
  );
}