blob: 4d9ce13d94f99d2ae076aebc2536954c5686673e [file] [log] [blame]
Chris Craik44c28202015-05-12 17:25:16 -07001<!DOCTYPE html>
2<!--
3Copyright (c) 2015 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7
8<link rel="import" href="/base/ui/color_legend.html">
9<link rel="import" href="/core/analysis/memory_dump_sub_view_util.html">
10<link rel="import" href="/core/analysis/size_span.html">
11<link rel="import" href="/core/analysis/table_builder.html">
12<link rel="import" href="/core/trace_model/attribute.html">
13
14<polymer-element name="tv-c-memory-dump-overview-pane">
15 <template>
16 <style>
17 :host {
18 display: flex;
19 flex-direction: column;
20 }
21
22 #label {
23 flex: 0 0 auto;
24 padding: 8px;
25
26 background-color: #eee;
27 border-bottom: 1px solid #8e8e8e;
28 border-top: 1px solid white;
29
30 font-size: 15px;
31 font-weight: bold;
32 }
33
34 #table {
35 flex: 1 1 auto;
36 align-self: stretch;
37 }
38 </style>
39 <div id="label">Overview</div>
40 <tracing-analysis-nested-table id="table">
41 </tracing-analysis-nested-table>
42 </template>
43 <script>
44 'use strict';
45
46 Polymer({
47 // TODO(petrcermak): Consider sharing more code between
48 // tv-c-memory-dump-overview-pane and tv-c-memory-dump-process pane
49 // (e.g. by defining a common base class tv-c-memory-dump-pane).
50
51 created: function() {
52 this.processMemoryDumps_ = undefined;
53 },
54
55 ready: function() {
56 this.$.table.supportsSelection = true;
57 this.$.table.cellSelectionMode = true;
58 this.$.table.addEventListener('selection-changed', function(tableEvent) {
59 tableEvent.stopPropagation();
60 var paneEvent = new Event('selected-memory-dump-changed', false, false);
61 this.dispatchEvent(paneEvent);
62 }.bind(this));
63 },
64
65 set processMemoryDumps(processMemoryDumps) {
66 this.processMemoryDumps_ = processMemoryDumps;
67 this.updateContents_();
68 },
69
70 get processMemoryDumps() {
71 return this.processMemoryDumps_;
72 },
73
74 get selectedMemoryDump() {
75 var selectedTableRow = this.$.table.selectedTableRow;
76 if (!selectedTableRow)
77 return undefined;
78
79 var selectedColumnIndex = this.$.table.selectedColumnIndex;
80 if (selectedColumnIndex === undefined)
81 return undefined;
82
83 var selectedColumn = this.$.table.tableColumns[selectedColumnIndex];
84 var selectedCell = selectedColumn.cell(selectedTableRow);
85 if (!selectedCell)
86 return undefined;
87
88 return selectedCell.dump;
89 },
90
91 updateContents_: function() {
92 var processMemoryDumps = this.processMemoryDumps_ || [];
93
94 var rows = processMemoryDumps.map(function(processMemoryDump) {
95 // Used memory (proportional, private, and shared resident)
96 var usedMemorySizes = {};
97 function addUsedMemorySize(columnKey, dumpKey) {
98 var value = processMemoryDump[dumpKey];
99 if (value !== undefined) {
100 usedMemorySizes[columnKey] = new tv.c.analysis.MemoryCell(
101 new tv.c.trace_model.ScalarAttribute('bytes', value));
102 }
103 }
104 addUsedMemorySize('proportional_resident',
105 'mostRecentTotalProportionalResidentSizeInBytes');
106 addUsedMemorySize('private_resident',
107 'mostRecentTotalPrivateResidentSizeInBytes');
108 addUsedMemorySize('shared_resident',
109 'mostRecentTotalSharedResidentSizeInBytes');
110
111 // Allocator memory (v8, oilpan, ...).
112 var allocatorSizes = {};
113 if (processMemoryDump.memoryAllocatorDumps !== undefined) {
114 processMemoryDump.memoryAllocatorDumps.forEach(function(dump) {
115 var cell = new tv.c.analysis.MemoryCell(
116 dump.attributes['outer_size']);
117 cell.dump = dump;
118 allocatorSizes[dump.fullName] = cell;
119 }, this);
120 }
121
122 return {
123 title: processMemoryDump.process.userFriendlyName,
124 usedMemorySizes: usedMemorySizes,
125 allocatorSizes: allocatorSizes
126 };
127 }, this);
128 this.$.table.tableRows = rows;
129
130 this.updateColumns_(rows);
131
132 this.$.table.rebuild();
133 },
134
135 updateColumns_: function(rows) {
136 var titleColumn = {
137 title: 'Process',
138 value: function(row) {
139 var titleEl = document.createElement('tv-b-color-legend');
140 titleEl.label = row.title;
141 return titleEl;
142 },
143 width: '200px',
144 cmp: function(rowA, rowB) {
145 return rowA.title.localeCompare(rowB.title);
146 },
147 supportsCellSelection: false
148 };
149
150 var usedMemorySizeColumns = tv.c.analysis.MemoryColumn.fromRows(
151 rows, 'usedMemorySizes');
152 var allocatorSizeColumns = tv.c.analysis.MemoryColumn.fromRows(
153 rows, 'allocatorSizes');
154
155 var sizeColumns = usedMemorySizeColumns.concat(allocatorSizeColumns);
156 tv.c.analysis.MemoryColumn.spaceEqually(sizeColumns);
157
158 var columns = [titleColumn].concat(sizeColumns);
159 this.$.table.tableColumns = columns;
160 }
161 });
162 </script>
163</polymer-element>