michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: 'use strict'; michael@0: michael@0: const Ci = Components.interfaces; michael@0: const Cc = Components.classes; michael@0: const Cu = Components.utils; michael@0: michael@0: const gDashboard = Cc['@mozilla.org/network/dashboard;1']. michael@0: getService(Ci.nsIDashboard); michael@0: const gPrefs = Cc["@mozilla.org/preferences-service;1"]. michael@0: getService(Ci.nsIPrefService).getBranch("network."); michael@0: const gRequestNetworkingData = { michael@0: "http": gDashboard.requestHttpConnections, michael@0: "sockets": gDashboard.requestSockets, michael@0: "dns": gDashboard.requestDNSInfo, michael@0: "websockets": gDashboard.requestWebsocketConnections michael@0: }; michael@0: const gDashboardCallbacks = { michael@0: "http": displayHttp, michael@0: "sockets": displaySockets, michael@0: "dns": displayDns, michael@0: "websockets": displayWebsockets michael@0: }; michael@0: michael@0: const REFRESH_INTERVAL_MS = 3000; michael@0: michael@0: function col(element) { michael@0: let col = document.createElement('td'); michael@0: let content = document.createTextNode(element); michael@0: col.appendChild(content); michael@0: return col; michael@0: } michael@0: michael@0: function displayHttp(data) { michael@0: let cont = document.getElementById('http_content'); michael@0: let parent = cont.parentNode; michael@0: let new_cont = document.createElement('tbody'); michael@0: new_cont.setAttribute('id', 'http_content'); michael@0: michael@0: for (let i = 0; i < data.connections.length; i++) { michael@0: let row = document.createElement('tr'); michael@0: row.appendChild(col(data.connections[i].host)); michael@0: row.appendChild(col(data.connections[i].port)); michael@0: row.appendChild(col(data.connections[i].spdy)); michael@0: row.appendChild(col(data.connections[i].ssl)); michael@0: row.appendChild(col(data.connections[i].active.length)); michael@0: row.appendChild(col(data.connections[i].idle.length)); michael@0: new_cont.appendChild(row); michael@0: } michael@0: michael@0: parent.replaceChild(new_cont, cont); michael@0: } michael@0: michael@0: function displaySockets(data) { michael@0: let cont = document.getElementById('sockets_content'); michael@0: let parent = cont.parentNode; michael@0: let new_cont = document.createElement('tbody'); michael@0: new_cont.setAttribute('id', 'sockets_content'); michael@0: michael@0: for (let i = 0; i < data.sockets.length; i++) { michael@0: let row = document.createElement('tr'); michael@0: row.appendChild(col(data.sockets[i].host)); michael@0: row.appendChild(col(data.sockets[i].port)); michael@0: row.appendChild(col(data.sockets[i].tcp)); michael@0: row.appendChild(col(data.sockets[i].active)); michael@0: row.appendChild(col(data.sockets[i].sent)); michael@0: row.appendChild(col(data.sockets[i].received)); michael@0: new_cont.appendChild(row); michael@0: } michael@0: michael@0: parent.replaceChild(new_cont, cont); michael@0: } michael@0: michael@0: function displayDns(data) { michael@0: let cont = document.getElementById('dns_content'); michael@0: let parent = cont.parentNode; michael@0: let new_cont = document.createElement('tbody'); michael@0: new_cont.setAttribute('id', 'dns_content'); michael@0: michael@0: for (let i = 0; i < data.entries.length; i++) { michael@0: let row = document.createElement('tr'); michael@0: row.appendChild(col(data.entries[i].hostname)); michael@0: row.appendChild(col(data.entries[i].family)); michael@0: let column = document.createElement('td'); michael@0: michael@0: for (let j = 0; j < data.entries[i].hostaddr.length; j++) { michael@0: column.appendChild(document.createTextNode(data.entries[i].hostaddr[j])); michael@0: column.appendChild(document.createElement('br')); michael@0: } michael@0: michael@0: row.appendChild(column); michael@0: row.appendChild(col(data.entries[i].expiration)); michael@0: new_cont.appendChild(row); michael@0: } michael@0: michael@0: parent.replaceChild(new_cont, cont); michael@0: } michael@0: michael@0: function displayWebsockets(data) { michael@0: let cont = document.getElementById('websockets_content'); michael@0: let parent = cont.parentNode; michael@0: let new_cont = document.createElement('tbody'); michael@0: new_cont.setAttribute('id', 'websockets_content'); michael@0: michael@0: for (let i = 0; i < data.websockets.length; i++) { michael@0: let row = document.createElement('tr'); michael@0: row.appendChild(col(data.websockets[i].hostport)); michael@0: row.appendChild(col(data.websockets[i].encrypted)); michael@0: row.appendChild(col(data.websockets[i].msgsent)); michael@0: row.appendChild(col(data.websockets[i].msgreceived)); michael@0: row.appendChild(col(data.websockets[i].sentsize)); michael@0: row.appendChild(col(data.websockets[i].receivedsize)); michael@0: new_cont.appendChild(row); michael@0: } michael@0: michael@0: parent.replaceChild(new_cont, cont); michael@0: } michael@0: michael@0: function requestAllNetworkingData() { michael@0: for (let id in gRequestNetworkingData) michael@0: requestNetworkingDataForTab(id); michael@0: } michael@0: michael@0: function requestNetworkingDataForTab(id) { michael@0: gRequestNetworkingData[id](gDashboardCallbacks[id]); michael@0: } michael@0: michael@0: function init() { michael@0: gDashboard.enableLogging = true; michael@0: if (gPrefs.getBoolPref("warnOnAboutNetworking")) { michael@0: let div = document.getElementById("warning_message"); michael@0: div.classList.add("active"); michael@0: document.getElementById("confpref").addEventListener("click", confirm); michael@0: } michael@0: michael@0: requestAllNetworkingData(); michael@0: michael@0: let autoRefresh = document.getElementById("autorefcheck"); michael@0: if (autoRefresh.checked) michael@0: setAutoRefreshInterval(autoRefresh); michael@0: michael@0: autoRefresh.addEventListener("click", function() { michael@0: let refrButton = document.getElementById("refreshButton"); michael@0: if (this.checked) { michael@0: setAutoRefreshInterval(this); michael@0: refrButton.disabled = "disabled"; michael@0: } else { michael@0: clearInterval(this.interval); michael@0: refrButton.disabled = null; michael@0: } michael@0: }); michael@0: michael@0: let refr = document.getElementById("refreshButton"); michael@0: refr.addEventListener("click", requestAllNetworkingData); michael@0: if (document.getElementById("autorefcheck").checked) michael@0: refr.disabled = "disabled"; michael@0: michael@0: // Event delegation on #menu element michael@0: let menu = document.getElementById("menu"); michael@0: menu.addEventListener("click", function click(e) { michael@0: if (e.target && e.target.parentNode == menu) michael@0: show(e.target); michael@0: }); michael@0: } michael@0: michael@0: function confirm () { michael@0: let div = document.getElementById("warning_message"); michael@0: div.classList.remove("active"); michael@0: let warnBox = document.getElementById("warncheck"); michael@0: gPrefs.setBoolPref("warnOnAboutNetworking", warnBox.checked); michael@0: } michael@0: michael@0: function show(button) { michael@0: let current_tab = document.querySelector(".active"); michael@0: let content = document.getElementById(button.value); michael@0: if (current_tab == content) michael@0: return; michael@0: current_tab.classList.remove("active"); michael@0: content.classList.add("active"); michael@0: michael@0: let current_button = document.querySelector(".selected"); michael@0: current_button.classList.remove("selected"); michael@0: button.classList.add("selected"); michael@0: michael@0: let autoRefresh = document.getElementById("autorefcheck"); michael@0: if (autoRefresh.checked) { michael@0: clearInterval(autoRefresh.interval); michael@0: setAutoRefreshInterval(autoRefresh); michael@0: } michael@0: } michael@0: michael@0: function setAutoRefreshInterval(checkBox) { michael@0: let active_tab = document.querySelector(".active"); michael@0: checkBox.interval = setInterval(function() { michael@0: requestNetworkingDataForTab(active_tab.id); michael@0: }, REFRESH_INTERVAL_MS); michael@0: } michael@0: michael@0: window.addEventListener("DOMContentLoaded", function load() { michael@0: window.removeEventListener("DOMContentLoaded", load); michael@0: init(); michael@0: });