frames.js 2.83 KB
Newer Older
1
2
3
4
5
6
7
/* @flow */
import type { StackFrame } from '../utils/stack-frame';
import { applyStyles } from '../utils/dom/css';
import { traceStyle, toggleStyle } from '../styles';
import { enableTabClick } from '../utils/dom/enableTabClick';
import { createFrame } from './frame';

8
9
10
11
12
type OmitsObject = {
  value: number,
  bundle: number,
  hasReachedAppCode: boolean,
};
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
type FrameSetting = { compiled: boolean };
export type { OmitsObject, FrameSetting };

function createFrameWrapper(
  document: Document,
  parent: HTMLDivElement,
  factory,
  lIndex: number,
  frameSettings: FrameSetting[],
  contextSize: number
) {
  const fac = factory();
  if (fac == null) {
    return;
  }
  const { hasSource, elem, collapseElement } = fac;

  const elemWrapper = document.createElement('div');
  elemWrapper.appendChild(elem);

  if (hasSource) {
    const compiledDiv = document.createElement('div');
    enableTabClick(compiledDiv);
    applyStyles(compiledDiv, toggleStyle);

    const o = frameSettings[lIndex];
    const compiledText = document.createTextNode(
      'View ' + (o && o.compiled ? 'source' : 'compiled')
    );
    compiledDiv.addEventListener('click', function() {
      if (o) {
        o.compiled = !o.compiled;
      }

      const next = createFrameWrapper(
        document,
        parent,
        factory,
        lIndex,
        frameSettings,
        contextSize
      );
      if (next != null) {
        parent.insertBefore(next, elemWrapper);
        parent.removeChild(elemWrapper);
      }
    });
    compiledDiv.appendChild(compiledText);
    elemWrapper.appendChild(compiledDiv);
  }

  if (collapseElement != null) {
    elemWrapper.appendChild(collapseElement);
  }

  return elemWrapper;
}

function createFrames(
  document: Document,
  resolvedFrames: StackFrame[],
  frameSettings: FrameSetting[],
75
76
  contextSize: number,
  errorName: ?string
77
78
79
80
81
82
83
84
85
86
87
) {
  if (resolvedFrames.length !== frameSettings.length) {
    throw new Error(
      'You must give a frame settings array of identical length to resolved frames.'
    );
  }
  const trace = document.createElement('div');
  applyStyles(trace, traceStyle);

  let index = 0;
  let critical = true;
88
  const omits: OmitsObject = { value: 0, bundle: 1, hasReachedAppCode: false };
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  resolvedFrames.forEach(function(frame) {
    const lIndex = index++;
    const elem = createFrameWrapper(
      document,
      trace,
      createFrame.bind(
        undefined,
        document,
        frameSettings[lIndex],
        frame,
        contextSize,
        critical,
        omits,
        omits.bundle,
        trace,
104
105
        index === resolvedFrames.length,
        errorName
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
      ),
      lIndex,
      frameSettings,
      contextSize
    );
    if (elem == null) {
      return;
    }
    critical = false;
    trace.appendChild(elem);
  });
  //TODO: fix this
  omits.value = 0;

  return trace;
}

export { createFrames };