blob: 7b9ea7ce06e285dfa568e81fbbc8cf360b261d86 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/tracing/ui/analysis/memory_dump_overview_pane.html">
<link rel="import" href="/tracing/ui/analysis/memory_dump_sub_view_util.html">
<link rel="import" href="/tracing/ui/analysis/stacked_pane.html">
<link rel="import" href="/tracing/ui/base/dom_helpers.html">
<link rel="import" href="/tracing/value/unit.html">
<polymer-element name="tr-ui-a-memory-dump-header-pane"
extends="tr-ui-a-stacked-pane">
<template>
<style>
:host {
display: flex;
flex-direction: row;
align-items: center;
background-color: #d0d0d0;
border-bottom: 1px solid #8e8e8e;
border-top: 1px solid white;
}
#label {
flex: 1 1 auto;
padding: 6px;
font-size: 15px;
}
#aggregation_mode_container {
display: none;
flex: 0 0 auto;
padding: 5px;
font-size: 15px;
}
</style>
</tr-ui-b-view-specific-brushing-state>
<div id="label"></div>
<div id="aggregation_mode_container">
<span>Metric aggregation:</span>
<!-- Aggregation mode selector (added in Polymer.ready()) -->
</div>
</template>
</polymer-element>
<script>
'use strict';
tr.exportTo('tr.ui.analysis', function() {
Polymer('tr-ui-a-memory-dump-header-pane', {
created: function() {
this.containerMemoryDumps_ = undefined;
},
ready: function() {
this.$.aggregation_mode_container.appendChild(tr.ui.b.createSelector(
this, 'aggregationMode', 'memoryDumpHeaderPane.aggregationMode',
tr.ui.analysis.MemoryColumn.AggregationMode.DIFF,
[
{
label: 'Diff',
value: tr.ui.analysis.MemoryColumn.AggregationMode.DIFF
},
{
label: 'Max',
value: tr.ui.analysis.MemoryColumn.AggregationMode.MAX
}
]));
},
/**
* Sets the container memory dumps and schedules rebuilding the pane.
*
* The provided value should be a chronologically sorted list of
* ContainerMemoryDump objects. All of the dumps must be associated with
* the same container (i.e. containerMemoryDumps must be either a list of
* ProcessMemoryDump(s) belonging to the same process, or a list of
* GlobalMemoryDump(s)). Example:
*
* [
* tr.model.ProcessMemoryDump {}, // PMD at timestamp 1.
* tr.model.ProcessMemoryDump {}, // PMD at timestamp 2.
* tr.model.ProcessMemoryDump {} // PMD at timestamp 3.
* ]
*/
set containerMemoryDumps(containerMemoryDumps) {
this.containerMemoryDumps_ = containerMemoryDumps;
this.scheduleRebuildPane_();
},
get containerMemoryDumps() {
return this.containerMemoryDumps_;
},
set aggregationMode(aggregationMode) {
this.aggregationMode_ = aggregationMode;
this.scheduleRebuildPane_();
},
get aggregationMode() {
return this.aggregationMode_;
},
rebuildPane_: function() {
this.updateLabel_();
this.updateAggregationModeSelector_();
this.changeChildPane_();
},
updateLabel_: function() {
this.$.label.textContent = '';
if (this.containerMemoryDumps_ === undefined ||
this.containerMemoryDumps_.length <= 0) {
this.$.label.textContent = 'No memory dumps selected';
return;
}
var containerDumpCount = this.containerMemoryDumps_.length;
var isMultiSelection = containerDumpCount > 1;
this.$.label.appendChild(document.createTextNode(
'Selected ' + containerDumpCount + ' memory dump' +
(isMultiSelection ? 's' : '') +
' in ' + this.containerMemoryDumps_[0].containerName + ' at '));
// TODO(petrcermak): Use <tr-v-ui-scalar-span> once it can be displayed
// inline. See https://github.com/catapult-project/catapult/issues/1371.
this.$.label.appendChild(document.createTextNode(
tr.v.Unit.byName.timeStampInMs.format(
this.containerMemoryDumps_[0].start)));
if (isMultiSelection) {
var ELLIPSIS = String.fromCharCode(8230);
this.$.label.appendChild(document.createTextNode(ELLIPSIS));
this.$.label.appendChild(document.createTextNode(
tr.v.Unit.byName.timeStampInMs.format(
this.containerMemoryDumps_[containerDumpCount - 1].start)));
}
},
updateAggregationModeSelector_: function() {
var displayStyle;
if (this.containerMemoryDumps_ === undefined ||
this.containerMemoryDumps_.length <= 1)
displayStyle = 'none';
else
displayStyle = 'initial';
this.$.aggregation_mode_container.style.display = displayStyle;
},
changeChildPane_: function() {
this.childPaneBuilder = function() {
if (this.containerMemoryDumps_ === undefined ||
this.containerMemoryDumps_.length <= 0)
return undefined;
var overviewPane = document.createElement(
'tr-ui-a-memory-dump-overview-pane');
overviewPane.processMemoryDumps = this.containerMemoryDumps_.map(
function(containerDump) {
return containerDump.processMemoryDumps;
});
overviewPane.aggregationMode = this.aggregationMode;
return overviewPane;
}.bind(this);
}
});
return {};
});
</script>