summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/src/selectors/ui.js
blob: d9d8995a71cbc7623a725cd25460eb2727118bb8 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* 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 {
  createSelector,
} = require("resource://devtools/client/shared/vendor/reselect.js");
const {
  REQUESTS_WATERFALL,
} = require("resource://devtools/client/netmonitor/src/constants.js");

const EPSILON = 0.001;

const getWaterfallScale = createSelector(
  state => state.requests.firstStartedMs,
  state => state.requests.lastEndedMs,
  state => state.timingMarkers.firstDocumentDOMContentLoadedTimestamp,
  state => state.timingMarkers.firstDocumentLoadTimestamp,
  state => state.ui.waterfallWidth,
  (
    firstStartedMs,
    lastEndedMs,
    firstDocumentDOMContentLoadedTimestamp,
    firstDocumentLoadTimestamp,
    waterfallWidth
  ) => {
    if (firstStartedMs === +Infinity || waterfallWidth === null) {
      return null;
    }

    const lastEventMs = Math.max(
      lastEndedMs,
      firstDocumentDOMContentLoadedTimestamp,
      firstDocumentLoadTimestamp
    );
    const longestWidth = lastEventMs - firstStartedMs;

    // Reduce 20px for the last request's requests-list-timings-total
    return Math.min(
      Math.max(
        (waterfallWidth - REQUESTS_WATERFALL.LABEL_WIDTH - 20) / longestWidth,
        EPSILON
      ),
      1
    );
  }
);

function getVisibleColumns(columns) {
  return Object.entries(columns).filter(([_, shown]) => shown);
}

const getColumns = createSelector(
  state => state.ui,
  state => state.search,
  (ui, search) => {
    if (
      ((ui.networkDetailsOpen || search.panelOpen) &&
        getVisibleColumns(ui.columns).length === 1 &&
        ui.columns.waterfall) ||
      (!ui.networkDetailsOpen && !search.panelOpen)
    ) {
      return ui.columns;
    }

    // Remove the Waterfall/Timeline column from the list of available
    // columns if the details side-bar is opened and more than one column is
    // visible.
    const columns = { ...ui.columns };
    delete columns.waterfall;
    return columns;
  }
);

module.exports = {
  getColumns,
  getVisibleColumns,
  getWaterfallScale,
};