| Index: tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
|
| diff --git a/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html b/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c98f9840ee6e07d44c90be1491817464f85eeeb9
|
| --- /dev/null
|
| +++ b/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
|
| @@ -0,0 +1,236 @@
|
| +<!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/base/color_scheme.html">
|
| +<link rel="import" href="/tracing/base/event.html">
|
| +<link rel="import" href="/tracing/ui/analysis/memory_dump_heap_details_util.html">
|
| +<link rel="import" href="/tracing/ui/analysis/memory_dump_sub_view_util.html">
|
| +<link rel="import" href="/tracing/ui/analysis/rebuildable_behavior.html">
|
| +<link rel="import" href="/tracing/ui/base/dom_helpers.html">
|
| +<link rel="import" href="/tracing/ui/base/tab_view.html">
|
| +<link rel="import" href="/tracing/ui/base/table.html">
|
| +<link rel="import" href="/tracing/value/ui/scalar_context_controller.html">
|
| +
|
| +<dom-module id='tr-ui-a-memory-dump-heap-details-breakdown-view'>
|
| + <template>
|
| + <tr-ui-b-tab-view id="tabs"></tr-ui-b-tab-view>
|
| + </template>
|
| +</dom-module>
|
| +
|
| +<dom-module id='tr-ui-a-memory-dump-heap-details-breakdown-view-tab'>
|
| + <template>
|
| + <style>
|
| + #info_text {
|
| + padding: 8px;
|
| + color: #666;
|
| + font-style: italic;
|
| + text-align: center;
|
| + }
|
| + </style>
|
| + <tr-v-ui-scalar-context-controller></tr-v-ui-scalar-context-controller>
|
| + <tr-ui-b-table id="table"></tr-ui-b-table>
|
| + <div id="info_text"></div>
|
| + </template>
|
| +</dom-module>
|
| +
|
| +<script>
|
| +'use strict';
|
| +
|
| +tr.exportTo('tr.ui.analysis', function() {
|
| +
|
| + Polymer({
|
| + is: 'tr-ui-a-memory-dump-heap-details-breakdown-view',
|
| + behaviors: [tr.ui.analysis.RebuildableBehavior],
|
| +
|
| + created: function() {
|
| + this.displayedNode_ = undefined;
|
| + },
|
| +
|
| + ready: function() {
|
| + this.scheduleRebuild_();
|
| + },
|
| +
|
| + get displayedNode() {
|
| + return this.displayedNode_;
|
| + },
|
| +
|
| + set displayedNode(node) {
|
| + this.displayedNode_ = node;
|
| + this.scheduleRebuild_();
|
| + },
|
| +
|
| + get aggregationMode() {
|
| + return this.aggregationMode_;
|
| + },
|
| +
|
| + set aggregationMode(aggregationMode) {
|
| + this.aggregationMode_ = aggregationMode;
|
| + for (var tab of this.$.tabs.tabs)
|
| + tab.aggregationMode = aggregationMode;
|
| + },
|
| +
|
| + onRebuild_: function() {
|
| + var previouslySelectedTab = this.$.tabs.selectedSubView;
|
| + var previouslySelectedTabFocused = false;
|
| + var previouslySelectedDimension = undefined;
|
| + if (previouslySelectedTab) {
|
| + previouslySelectedTabFocused = previouslySelectedTab.isFocused;
|
| + previouslySelectedDimension = previouslySelectedTab.dimension;
|
| + }
|
| +
|
| + this.$.tabs.clearSubViews();
|
| +
|
| + if (this.displayedNode_ === undefined) {
|
| + this.$.tabs.label = 'No heap node provided.';
|
| + return;
|
| + }
|
| +
|
| + for (var [dimension, children] of this.displayedNode_.childNodes) {
|
| + var tab = document.createElement(
|
| + 'tr-ui-a-memory-dump-heap-details-breakdown-view-tab');
|
| + tab.aggregationMode = this.aggregationMode_;
|
| + tab.dimension = dimension;
|
| + tab.nodes = children;
|
| + this.$.tabs.addSubView(tab);
|
| + tab.rebuild();
|
| + if (dimension === previouslySelectedDimension) {
|
| + this.$.tabs.selectedSubView = tab;
|
| + if (previouslySelectedTabFocused)
|
| + tab.focus();
|
| + }
|
| + }
|
| +
|
| + if (this.$.tabs.tabs.length > 0)
|
| + this.$.tabs.label = 'Break selected node further by:';
|
| + else
|
| + this.$.tabs.label = 'Selected node cannot be broken down any further.';
|
| + }
|
| + });
|
| +
|
| + Polymer({
|
| + is: 'tr-ui-a-memory-dump-heap-details-breakdown-view-tab',
|
| + behaviors: [tr.ui.analysis.RebuildableBehavior],
|
| +
|
| + created: function() {
|
| + this.dimension_ = undefined;
|
| + this.nodes_ = undefined;
|
| + this.aggregationMode_ = undefined;
|
| + },
|
| +
|
| + ready: function() {
|
| + this.$.table.addEventListener('step-into', function(tableEvent) {
|
| + var viewEvent = new tr.b.Event('enter-node');
|
| + viewEvent.node = tableEvent.tableRow;
|
| + this.dispatchEvent(viewEvent);
|
| + }.bind(this));
|
| + },
|
| +
|
| + get dimension() {
|
| + return this.dimension_;
|
| + },
|
| +
|
| + set dimension(dimension) {
|
| + this.dimension_ = dimension;
|
| + this.scheduleRebuild_();
|
| + },
|
| +
|
| + get nodes() {
|
| + return this.nodes_;
|
| + },
|
| +
|
| + set nodes(nodes) {
|
| + this.nodes_ = nodes;
|
| + this.scheduleRebuild_();
|
| + },
|
| +
|
| + get dimensionLabel_() {
|
| + if (this.dimension_ === undefined)
|
| + return '(undefined)'
|
| + return this.dimension_.label;
|
| + },
|
| +
|
| + get tabLabel() {
|
| + var nodeCount = 0;
|
| + if (this.nodes_)
|
| + nodeCount = this.nodes_.length;
|
| + return this.dimensionLabel_ + ' (' + nodeCount + ')';
|
| + },
|
| +
|
| + get tabIcon() {
|
| + if (this.dimension_ === undefined ||
|
| + this.dimension_ === tr.ui.analysis.HeapDetailsRowDimension.ROOT) {
|
| + return undefined;
|
| + }
|
| + return {
|
| + text: this.dimension_.symbol,
|
| + style: 'color: ' + tr.b.ColorScheme.getColorForReservedNameAsString(
|
| + this.dimension_.color) + ';'
|
| + };
|
| + },
|
| +
|
| + get aggregationMode() {
|
| + return this.aggregationMode_;
|
| + },
|
| +
|
| + set aggregationMode(aggregationMode) {
|
| + this.aggregationMode_ = aggregationMode;
|
| + this.scheduleRebuild_();
|
| + },
|
| +
|
| + focus: function() {
|
| + this.$.table.focus();
|
| + },
|
| +
|
| + blur: function() {
|
| + this.$.table.blur();
|
| + },
|
| +
|
| + get isFocused() {
|
| + return this.$.table.isFocused;
|
| + },
|
| +
|
| + onRebuild_: function() {
|
| + if (this.nodes_ === undefined || this.nodes_.length === 0) {
|
| + this.$.table.clear();
|
| + this.$.table.style.display = 'none';
|
| + this.$.info_text.style.display = 'block';
|
| + this.$.info_text.textContent = 'Cannot break down by ' +
|
| + this.dimensionLabel_.toLowerCase() + ' any further.';
|
| + return;
|
| + }
|
| +
|
| + this.$.table.style.display = 'block';
|
| + this.$.info_text.style.display = 'none';
|
| + this.$.info_text.textContent = '';
|
| +
|
| + this.$.table.selectionMode = tr.ui.b.TableFormat.SelectionMode.ROW;
|
| + this.$.table.tableRows = this.nodes_;
|
| + this.$.table.tableColumns = this.createColumns_(this.nodes_);
|
| + this.$.table.rebuild();
|
| + },
|
| +
|
| + createColumns_: function(rows) {
|
| + var titleColumn = new tr.ui.analysis.HeapDetailsTitleColumn(
|
| + this.tabLabel);
|
| + titleColumn.width = '200px';
|
| +
|
| + var numericColumns = tr.ui.analysis.MemoryColumn.fromRows(rows, {
|
| + cellKey: 'cells',
|
| + aggregationMode: this.aggregationMode_,
|
| + rules: tr.ui.analysis.HEAP_DETAILS_COLUMN_RULES,
|
| + shouldSetContextGroup: true
|
| + });
|
| + tr.ui.analysis.MemoryColumn.spaceEqually(numericColumns);
|
| +
|
| + var columns = [titleColumn].concat(numericColumns);
|
| + return columns;
|
| + }
|
| + });
|
| +
|
| + return {};
|
| +});
|
| +</script>
|
|
|