summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/selectors/getCallStackFrames.js
blob: 558e07aa17a7875cb6113acd950e49e528b3807e (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
/* 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 { getSelectedSource } from "./sources";
import { getBlackBoxRanges } from "./source-blackbox";
import { getCurrentThreadFrames } from "./pause";
import { annotateFrames } from "../utils/pause/frames";
import { isFrameBlackBoxed } from "../utils/source";
import { createSelector } from "reselect";

function getLocation(frame, isGeneratedSource) {
  return isGeneratedSource
    ? frame.generatedLocation || frame.location
    : frame.location;
}

function getSourceForFrame(frame, isGeneratedSource) {
  return getLocation(frame, isGeneratedSource).source;
}

function appendSource(frame, selectedSource) {
  const isGeneratedSource = selectedSource && !selectedSource.isOriginal;
  return {
    ...frame,
    location: getLocation(frame, isGeneratedSource),
    source: getSourceForFrame(frame, isGeneratedSource),
  };
}

export function formatCallStackFrames(
  frames,
  selectedSource,
  blackboxedRanges
) {
  if (!frames) {
    return null;
  }

  const formattedFrames = frames
    .filter(frame => getSourceForFrame(frame))
    .map(frame => appendSource(frame, selectedSource))
    .filter(frame => !isFrameBlackBoxed(frame, blackboxedRanges));

  return annotateFrames(formattedFrames);
}

export const getCallStackFrames = createSelector(
  getCurrentThreadFrames,
  getSelectedSource,
  getBlackBoxRanges,
  formatCallStackFrames
);