1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * This view displays a summary of the state of each SPDY sessions, and
7 * has links to display them in the events tab.
8 *
9 * @constructor
10 */
11function SpdyView(mainBoxId, spdyEnabledSpanId,
12                  spdyUseAlternateProtocolSpanId,
13                  spdyForceAlwaysSpanId, spdyForceOverSslSpanId,
14                  spdyNextProtocolsSpanId, spdyAlternateProtocolMappingsDivId,
15                  spdySessionNoneSpanId, spdySessionLinkSpanId,
16                  spdySessionDivId) {
17  DivView.call(this, mainBoxId);
18  g_browser.addSpdySessionInfoObserver(this);
19  g_browser.addSpdyStatusObserver(this);
20  g_browser.addSpdyAlternateProtocolMappingsObserver(this);
21
22  this.spdyEnabledSpan_ = document.getElementById(spdyEnabledSpanId);
23  this.spdyUseAlternateProtocolSpan_ =
24      document.getElementById(spdyUseAlternateProtocolSpanId);
25  this.spdyForceAlwaysSpan_ = document.getElementById(spdyForceAlwaysSpanId);
26  this.spdyForceOverSslSpan_ = document.getElementById(spdyForceOverSslSpanId);
27  this.spdyNextProtocolsSpan_ =
28      document.getElementById(spdyNextProtocolsSpanId);
29
30  this.spdyAlternateProtocolMappingsDiv_ =
31      document.getElementById(spdyAlternateProtocolMappingsDivId);
32  this.spdySessionNoneSpan_ = document.getElementById(spdySessionNoneSpanId);
33  this.spdySessionLinkSpan_ = document.getElementById(spdySessionLinkSpanId);
34  this.spdySessionDiv_ = document.getElementById(spdySessionDivId);
35}
36
37inherits(SpdyView, DivView);
38
39/**
40 * If |spdySessionInfo| is not null, displays a single table with information
41 * on each SPDY session.  Otherwise, displays "None".
42 */
43SpdyView.prototype.onSpdySessionInfoChanged = function(spdySessionInfo) {
44  this.spdySessionDiv_.innerHTML = '';
45
46  var hasNoSession = (spdySessionInfo == null || spdySessionInfo.length == 0);
47  setNodeDisplay(this.spdySessionNoneSpan_, hasNoSession);
48  setNodeDisplay(this.spdySessionLinkSpan_, !hasNoSession);
49
50  if (hasNoSession)
51    return;
52
53  var tablePrinter = SpdyView.createSessionTablePrinter(spdySessionInfo);
54  tablePrinter.toHTML(this.spdySessionDiv_, 'styledTable');
55
56};
57
58/**
59 * Displays information on the global SPDY status.
60 */
61SpdyView.prototype.onSpdyStatusChanged = function(spdyStatus) {
62  this.spdyEnabledSpan_.innerText = spdyStatus.spdy_enabled;
63  this.spdyUseAlternateProtocolSpan_.innerText =
64      spdyStatus.use_alternate_protocols;
65  this.spdyForceAlwaysSpan_.innerText = spdyStatus.force_spdy_always;
66  this.spdyForceOverSslSpan_.innerText = spdyStatus.force_spdy_over_ssl;
67  this.spdyNextProtocolsSpan_.innerText = spdyStatus.next_protos;
68}
69
70/**
71 * If |spdyAlternateProtocolMappings| is not empty, displays a single table
72 * with information on each alternate protocol enabled server.  Otherwise,
73 * displays "None".
74 */
75SpdyView.prototype.onSpdyAlternateProtocolMappingsChanged =
76    function(spdyAlternateProtocolMappings) {
77
78  this.spdyAlternateProtocolMappingsDiv_.innerHTML = '';
79
80  if (spdyAlternateProtocolMappings != null &&
81      spdyAlternateProtocolMappings.length > 0) {
82    var tabPrinter = SpdyView.createAlternateProtocolMappingsTablePrinter(
83            spdyAlternateProtocolMappings);
84    tabPrinter.toHTML(this.spdyAlternateProtocolMappingsDiv_, 'styledTable');
85  } else {
86    this.spdyAlternateProtocolMappingsDiv_.innerHTML = 'None';
87  }
88};
89
90/**
91 * Creates a table printer to print out the state of list of SPDY sessions.
92 */
93SpdyView.createSessionTablePrinter = function(spdySessions) {
94  var tablePrinter = new TablePrinter();
95  tablePrinter.addHeaderCell('Host');
96  tablePrinter.addHeaderCell('Proxy');
97  tablePrinter.addHeaderCell('ID');
98  tablePrinter.addHeaderCell('Active streams');
99  tablePrinter.addHeaderCell('Unclaimed pushed');
100  tablePrinter.addHeaderCell('Max');
101  tablePrinter.addHeaderCell('Initiated');
102  tablePrinter.addHeaderCell('Pushed');
103  tablePrinter.addHeaderCell('Pushed and claimed');
104  tablePrinter.addHeaderCell('Abandoned');
105  tablePrinter.addHeaderCell('Received frames');
106  tablePrinter.addHeaderCell('Secure');
107  tablePrinter.addHeaderCell('Sent settings');
108  tablePrinter.addHeaderCell('Received settings');
109  tablePrinter.addHeaderCell('Error');
110
111  for (var i = 0; i < spdySessions.length; i++) {
112    var session = spdySessions[i];
113    tablePrinter.addRow();
114
115    tablePrinter.addCell(session.host_port_pair);
116    tablePrinter.addCell(session.proxy);
117
118    var idCell = tablePrinter.addCell(session.source_id);
119    idCell.link = '#events&q=id:' + session.source_id;
120
121    tablePrinter.addCell(session.active_streams);
122    tablePrinter.addCell(session.unclaimed_pushed_streams);
123    tablePrinter.addCell(session.max_concurrent_streams);
124    tablePrinter.addCell(session.streams_initiated_count);
125    tablePrinter.addCell(session.streams_pushed_count);
126    tablePrinter.addCell(session.streams_pushed_and_claimed_count);
127    tablePrinter.addCell(session.streams_abandoned_count);
128    tablePrinter.addCell(session.frames_received);
129    tablePrinter.addCell(session.is_secure);
130    tablePrinter.addCell(session.sent_settings);
131    tablePrinter.addCell(session.received_settings);
132    tablePrinter.addCell(session.error);
133  }
134  return tablePrinter;
135};
136
137
138/**
139 * Creates a table printer to print out the list of alternate protocol
140 * mappings.
141 */
142SpdyView.createAlternateProtocolMappingsTablePrinter =
143    function(spdyAlternateProtocolMappings) {
144  var tablePrinter = new TablePrinter();
145  tablePrinter.addHeaderCell('Host');
146  tablePrinter.addHeaderCell('Alternate Protocol');
147
148  for (var i = 0; i < spdyAlternateProtocolMappings.length; i++) {
149    var entry = spdyAlternateProtocolMappings[i];
150    tablePrinter.addRow();
151
152    tablePrinter.addCell(entry.host_port_pair);
153    tablePrinter.addCell(entry.alternate_protocol);
154  }
155  return tablePrinter;
156};
157
158