blob: 3a600c00925aaeb51a23a50200afd72c08bdb22b [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2016 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/base/table.html">
<link rel="import" href="/tracing/value/ui/diagnostic_span.html">
<dom-module id="tr-v-ui-diagnostic-map-table">
<template>
<tr-ui-b-table id="table"></tr-ui-b-table>
</template>
</dom-module>
<script>
'use strict';
tr.exportTo('tr.v.ui', function() {
function makeColumn(title, histogram) {
return {
title,
value(map) {
const diagnostic = map.get(title);
if (!diagnostic) return '';
return tr.v.ui.createDiagnosticSpan(diagnostic, title, histogram);
}
};
}
Polymer({
is: 'tr-v-ui-diagnostic-map-table',
created() {
this.diagnosticMaps_ = undefined;
this.histogram_ = undefined;
this.isMetadata_ = false;
},
set histogram(h) {
this.histogram_ = h;
},
set isMetadata(m) {
this.isMetadata_ = m;
this.$.table.showHeader = !this.isMetadata_;
},
/**
* The |title| will be used as the heading for the column containing
* diagnostic-spans for |diagnosticMap|'s Diagnostics.
*
* @param {!Array.<!Object>} maps
* @param {!string} maps[].title
* @param {!tr.v.d.DiagnosticMap} maps[].diagnosticMap
*/
set diagnosticMaps(maps) {
this.diagnosticMaps_ = maps;
this.updateContents_();
},
get diagnosticMaps() {
return this.diagnosticMaps_;
},
updateContents_() {
if (this.isMetadata_ && this.diagnosticMaps_.length !== 1) {
throw new Error(
'Metadata diagnostic-map-tables require exactly 1 DiagnosticMap');
}
if (this.diagnosticMaps_ === undefined ||
this.diagnosticMaps_.length === 0) {
this.$.table.tableRows = [];
this.$.table.tableColumns = [];
return;
}
let names = new Set();
for (const map of this.diagnosticMaps_) {
for (const [name, diagnostic] of map) {
// https://github.com/catapult-project/catapult/issues/2842
if (diagnostic instanceof tr.v.d.UnmergeableDiagnosticSet) continue;
if (diagnostic instanceof tr.v.d.CollectedRelatedEventSet) continue;
names.add(name);
}
}
names = Array.from(names).sort();
const histogram = this.histogram_;
if (this.isMetadata_) {
const diagnosticMap = this.diagnosticMaps_[0];
this.$.table.tableColumns = [
{
value(name) {
return name.name;
}
},
{
value(name) {
const diagnostic = diagnosticMap.get(name.name);
if (!diagnostic) return '';
return tr.v.ui.createDiagnosticSpan(
diagnostic, name.name, histogram);
}
},
];
this.$.table.tableRows = names.map(name => {
// tr-ui-b-table requires rows to be objects.
return {name};
});
} else {
this.$.table.tableColumns = names.map(
name => makeColumn(name, histogram));
this.$.table.tableRows = this.diagnosticMaps_;
}
this.$.table.rebuild();
}
});
return {};
});
</script>