summaryrefslogtreecommitdiffstats
path: root/devtools/client/jsonview/components/Headers.js
blob: 01b6160718170231ed826f4e82482e3d1d2d5c85 (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* 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";

define(function (require, exports) {
  const {
    createFactory,
    Component,
  } = require("devtools/client/shared/vendor/react");
  const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
  const dom = require("devtools/client/shared/vendor/react-dom-factories");

  const { div, span, table, tbody, tr, td } = dom;

  /**
   * This template is responsible for rendering basic layout
   * of the 'Headers' panel. It displays HTTP headers groups such as
   * received or response headers.
   */
  class Headers extends Component {
    static get propTypes() {
      return {
        data: PropTypes.object,
      };
    }

    constructor(props) {
      super(props);
      this.state = {};
    }

    render() {
      const data = this.props.data;

      return div(
        { className: "netInfoHeadersTable" },
        div(
          { className: "netHeadersGroup" },
          div(
            { className: "netInfoHeadersGroup" },
            JSONView.Locale["jsonViewer.responseHeaders"]
          ),
          table(
            { cellPadding: 0, cellSpacing: 0 },
            HeaderListFactory({ headers: data.response })
          )
        ),
        div(
          { className: "netHeadersGroup" },
          div(
            { className: "netInfoHeadersGroup" },
            JSONView.Locale["jsonViewer.requestHeaders"]
          ),
          table(
            { cellPadding: 0, cellSpacing: 0 },
            HeaderListFactory({ headers: data.request })
          )
        )
      );
    }
  }

  /**
   * This template renders headers list,
   * name + value pairs.
   */
  class HeaderList extends Component {
    static get propTypes() {
      return {
        headers: PropTypes.arrayOf(
          PropTypes.shape({
            name: PropTypes.string,
            value: PropTypes.string,
          })
        ),
      };
    }

    constructor(props) {
      super(props);

      this.state = {
        headers: [],
      };
    }

    render() {
      const headers = this.props.headers;

      headers.sort(function (a, b) {
        return a.name > b.name ? 1 : -1;
      });

      const rows = [];
      headers.forEach(header => {
        rows.push(
          tr(
            { key: header.name },
            td(
              { className: "netInfoParamName" },
              span({ title: header.name }, header.name)
            ),
            td({ className: "netInfoParamValue" }, header.value)
          )
        );
      });

      return tbody({}, rows);
    }
  }

  const HeaderListFactory = createFactory(HeaderList);

  // Exports from this module
  exports.Headers = Headers;
});