| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 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 var g_main_view = null; | |
| 6 | |
| 7 /** | |
| 8 * This class is the root view object of the page. | |
| 9 */ | |
| 10 var MainView = (function() { | |
| 11 'use strict'; | |
| 12 | |
| 13 /** | |
| 14 * @constructor | |
| 15 */ | |
| 16 function MainView() { | |
| 17 $('button-update').onclick = function() { | |
| 18 chrome.send('update'); | |
| 19 }; | |
| 20 }; | |
| 21 | |
| 22 MainView.prototype = { | |
| 23 /** | |
| 24 * Receiving notification to display memory snapshot. | |
| 25 * @param {Object} Information about memory in JSON format. | |
| 26 */ | |
| 27 onSetSnapshot: function(browser) { | |
| 28 $('json').textContent = JSON.stringify(browser); | |
| 29 $('json').style.display = 'block'; | |
| 30 | |
| 31 $('os-value').textContent = browser['os'] + ' (' + | |
| 32 browser['os_version'] + ')'; | |
| 33 $('uptime-value').textContent = | |
| 34 secondsToHMS(Math.floor(browser['uptime'] / 1000)); | |
| 35 | |
| 36 this.updateSnapshot(browser['processes']); | |
| 37 this.updateExtensions(browser['extensions']); | |
| 38 }, | |
| 39 | |
| 40 /** | |
| 41 * Update process information table. | |
| 42 * @param {Object} processes information about memory. | |
| 43 */ | |
| 44 updateSnapshot: function(processes) { | |
| 45 // Remove existing processes. | |
| 46 var size = $('snapshot-view').getElementsByClassName('process').length; | |
| 47 for (var i = 0; i < size; ++i) { | |
| 48 $('snapshot-view').deleteRow(-1); | |
| 49 } | |
| 50 | |
| 51 var template = $('process-template').childNodes; | |
| 52 // Add processes. | |
| 53 for (var p in processes) { | |
| 54 var process = processes[p]; | |
| 55 | |
| 56 var row = $('snapshot-view').insertRow(-1); | |
| 57 // We skip |template[0]|, because it is a (invalid) Text object. | |
| 58 for (var i = 1; i < template.length; ++i) { | |
| 59 var value = '---'; | |
| 60 switch (template[i].className) { | |
| 61 case 'process-id': | |
| 62 value = process['pid']; | |
| 63 break; | |
| 64 case 'process-info': | |
| 65 value = process['type']; | |
| 66 if (process['type'].match(/^Tab/) && 'history' in process) { | |
| 67 // Append each tab's history. | |
| 68 for (var j = 0; j < process['history'].length; ++j) { | |
| 69 value += '<dl><dt>History ' + j + ':' + | |
| 70 JoinLinks(process['history'][j]) + '</dl>'; | |
| 71 } | |
| 72 } else { | |
| 73 value += '<br>' + process['titles'].join('<br>'); | |
| 74 } | |
| 75 break; | |
| 76 case 'process-memory-private': | |
| 77 value = process['memory_private']; | |
| 78 break; | |
| 79 case 'process-memory-v8': | |
| 80 if (process['v8_alloc'] !== undefined) { | |
| 81 value = process['v8_used'] + '<br>/ ' + process['v8_alloc']; | |
| 82 } | |
| 83 break; | |
| 84 } | |
| 85 var col = row.insertCell(-1); | |
| 86 col.innerHTML = value; | |
| 87 col.className = template[i].className; | |
| 88 } | |
| 89 row.setAttribute('class', 'process'); | |
| 90 } | |
| 91 }, | |
| 92 | |
| 93 /** | |
| 94 * Update extension information table. | |
| 95 * @param {Object} extensions information about memory. | |
| 96 */ | |
| 97 updateExtensions: function(extensions) { | |
| 98 // Remove existing information. | |
| 99 var size = | |
| 100 $('extension-view').getElementsByClassName('extension').length; | |
| 101 for (var i = 0; i < size; ++i) { | |
| 102 $('extension-view').deleteRow(-1); | |
| 103 } | |
| 104 | |
| 105 var template = $('extension-template').childNodes; | |
| 106 for (var id in extensions) { | |
| 107 var extension = extensions[id]; | |
| 108 | |
| 109 var row = $('extension-view').insertRow(-1); | |
| 110 // We skip |template[0]|, because it is a (invalid) Text object. | |
| 111 for (var i = 1; i < template.length; ++i) { | |
| 112 var value = '---'; | |
| 113 switch (template[i].className) { | |
| 114 case 'extension-id': | |
| 115 value = extension['pid']; | |
| 116 break; | |
| 117 case 'extension-info': | |
| 118 value = extension['titles'].join('<br>'); | |
| 119 break; | |
| 120 case 'extension-memory': | |
| 121 value = extension['memory_private']; | |
| 122 break; | |
| 123 } | |
| 124 var col = row.insertCell(-1); | |
| 125 col.innerHTML = value; | |
| 126 col.className = template[i].className; | |
| 127 } | |
| 128 row.setAttribute('class', 'extension'); | |
| 129 } | |
| 130 } | |
| 131 }; | |
| 132 | |
| 133 function JoinLinks(tab) { | |
| 134 var line = ''; | |
| 135 for (var l in tab['history']) { | |
| 136 var history = tab['history'][l]; | |
| 137 var title = (history['title'] == '') ? history['url'] : history['title']; | |
| 138 var url = '<a href="' + history['url'] + '">' + HTMLEscape(title) + | |
| 139 '</a> (' + secondsToHMS(history['time']) + ' ago)'; | |
| 140 if (l == tab['index']) { | |
| 141 url = '<strong>' + url + '</strong>'; | |
| 142 } | |
| 143 line += '<dd>' + url; | |
| 144 } | |
| 145 return line; | |
| 146 }; | |
| 147 | |
| 148 /** | |
| 149 * Produces a readable string int the format '<HH> hours <MM> min. <SS> sec.' | |
| 150 * representing the amount of time provided as the number of seconds. | |
| 151 * @param {number} totalSeconds The total amount of seconds. | |
| 152 * @return {string} The formatted HH hours/hours MM min. SS sec. string | |
| 153 */ | |
| 154 function secondsToHMS(totalSeconds) { | |
| 155 totalSeconds = Number(totalSeconds); | |
| 156 var hour = Math.floor(totalSeconds / 3600); | |
| 157 var min = Math.floor(totalSeconds % 3600 / 60); | |
| 158 var sec = Math.floor(totalSeconds % 60); | |
| 159 return (hour > 0 ? (hour + (hour > 1 ? ' hours ' : ' hour ')) : '') + | |
| 160 (min > 0 ? (min + ' min. ') : '') + | |
| 161 (sec + ' sec. '); | |
| 162 } | |
| 163 | |
| 164 return MainView; | |
| 165 })(); | |
| 166 | |
| 167 /** | |
| 168 * Initialize everything once we have access to chrome://memory-internals. | |
| 169 */ | |
| 170 document.addEventListener('DOMContentLoaded', function() { | |
| 171 g_main_view = new MainView(); | |
| 172 }); | |
| OLD | NEW |