1// Copyright (c) 2012 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 information on the state of all socket pools.
7 *
8 *   - Shows a summary of the state of each socket pool at the top.
9 *   - For each pool with allocated sockets or connect jobs, shows all its
10 *     groups with any allocated sockets.
11 */
12var SocketsView = (function() {
13  'use strict';
14
15  // We inherit from DivView.
16  var superClass = DivView;
17
18  /**
19   * @constructor
20   */
21  function SocketsView() {
22    assertFirstConstructorCall(SocketsView);
23
24    // Call superclass's constructor.
25    superClass.call(this, SocketsView.MAIN_BOX_ID);
26
27    g_browser.addSocketPoolInfoObserver(this, true);
28    this.socketPoolDiv_ = $(SocketsView.SOCKET_POOL_DIV_ID);
29    this.socketPoolGroupsDiv_ = $(SocketsView.SOCKET_POOL_GROUPS_DIV_ID);
30
31    var closeIdleButton = $(SocketsView.CLOSE_IDLE_SOCKETS_BUTTON_ID);
32    closeIdleButton.onclick = this.closeIdleSockets.bind(this);
33
34    var flushSocketsButton = $(SocketsView.SOCKET_POOL_FLUSH_BUTTON_ID);
35    flushSocketsButton.onclick = this.flushSocketPools.bind(this);
36  }
37
38  SocketsView.TAB_ID = 'tab-handle-sockets';
39  SocketsView.TAB_NAME = 'Sockets';
40  SocketsView.TAB_HASH = '#sockets';
41
42  // IDs for special HTML elements in sockets_view.html
43  SocketsView.MAIN_BOX_ID = 'sockets-view-tab-content';
44  SocketsView.SOCKET_POOL_DIV_ID = 'sockets-view-pool-div';
45  SocketsView.SOCKET_POOL_GROUPS_DIV_ID = 'sockets-view-pool-groups-div';
46  SocketsView.CLOSE_IDLE_SOCKETS_BUTTON_ID = 'sockets-view-close-idle-button';
47  SocketsView.SOCKET_POOL_FLUSH_BUTTON_ID = 'sockets-view-flush-button';
48
49  cr.addSingletonGetter(SocketsView);
50
51  SocketsView.prototype = {
52    // Inherit the superclass's methods.
53    __proto__: superClass.prototype,
54
55    onLoadLogFinish: function(data) {
56      return this.onSocketPoolInfoChanged(data.socketPoolInfo);
57    },
58
59    onSocketPoolInfoChanged: function(socketPoolInfo) {
60      this.socketPoolDiv_.innerHTML = '';
61      this.socketPoolGroupsDiv_.innerHTML = '';
62
63      if (!socketPoolInfo)
64        return false;
65
66      var socketPools = SocketPoolWrapper.createArrayFrom(socketPoolInfo);
67      var tablePrinter = SocketPoolWrapper.createTablePrinter(socketPools);
68      tablePrinter.toHTML(this.socketPoolDiv_, 'styled-table');
69
70      // Add table for each socket pool with information on each of its groups.
71      for (var i = 0; i < socketPools.length; ++i) {
72        if (socketPools[i].origPool.groups != undefined) {
73          var p = addNode(this.socketPoolGroupsDiv_, 'p');
74          var br = addNode(p, 'br');
75          var groupTablePrinter = socketPools[i].createGroupTablePrinter();
76          groupTablePrinter.toHTML(p, 'styled-table');
77        }
78      }
79      return true;
80    },
81
82    closeIdleSockets: function() {
83      g_browser.sendCloseIdleSockets();
84      g_browser.checkForUpdatedInfo(false);
85    },
86
87    flushSocketPools: function() {
88      g_browser.sendFlushSocketPools();
89      g_browser.checkForUpdatedInfo(false);
90    }
91  };
92
93  return SocketsView;
94})();
95