File: memory_internals.ts

package info (click to toggle)
chromium 138.0.7204.157-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,864 kB
  • sloc: cpp: 34,936,859; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,967; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (104 lines) | stat: -rw-r--r-- 2,972 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// 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);
*/