// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {addWebUiListener, sendWithPromise} from 'chrome://resources/js/cr.js';
import {getRequiredElement} from 'chrome://resources/js/util.js';
type Process = [number, string, boolean];
interface ProcessList {
message: string;
processes: Process[];
}
function requestProcessList() {
sendWithPromise('requestProcessList').then(onProcessListReceived);
}
function saveDump() {
chrome.send('saveDump');
}
function startProfiling(pid: number) {
// After profiling starts, the browser will send an updated process list.
sendWithPromise('startProfiling', pid).then(onProcessListReceived);
}
// celltype should either be "td" or "th". The contents of the |cols| will be
// added as children of each table cell if they are non-null.
function addListRow(
table: HTMLElement, celltype: string, cols: Array<Text|HTMLElement|null>) {
const tr = document.createElement('tr');
for (const col of cols) {
const cell = document.createElement(celltype);
if (col) {
cell.appendChild(col);
}
tr.appendChild(cell);
}
table.appendChild(tr);
}
function onProcessListReceived(data: ProcessList) {
getRequiredElement('message').innerText = data['message'];
const proclist = getRequiredElement('proclist');
proclist.innerText = ''; // Clear existing contents.
const processes = data['processes'];
if (processes.length === 0) {
return;
} // No processes to dump, don't make the table.
const table = document.createElement('table');
// Heading.
addListRow(table, 'th', [
null,
document.createTextNode('Process ID'),
document.createTextNode('Name'),
]);
for (const proc of processes) {
const procId = proc[0];
const procIdText = document.createTextNode(procId.toString());
const description = document.createTextNode(proc[1]);
const profiled = proc[2];
const button = document.createElement('button');
if (profiled) {
button.innerText = 'Profiling...';
} else {
button.innerText = '\u2600 Start profiling';
button.onclick = () => startProfiling(procId);
}
addListRow(table, 'td', [button, procIdText, description]);
}
proclist.appendChild(table);
}
// Get data and have it displayed upon loading.
document.addEventListener('DOMContentLoaded', () => {
getRequiredElement('refresh').onclick = requestProcessList;
getRequiredElement('save').onclick = saveDump;
addWebUiListener('save-dump-progress', (progress: string) => {
getRequiredElement('save-dump-text').innerText = progress;
});
requestProcessList();
});
/* For manual testing.
function fakeResults() {
onProcessListReceived([
[ 11234, "Process 11234 [Browser]" ],
[ 11235, "Process 11235 [Renderer]" ],
[ 11236, "Process 11236 [Renderer]" ]]);
}
document.addEventListener('DOMContentLoaded', fakeResults);
*/