blob: 0fe7047200a25b753a5d51668c1baf7644078093 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2014 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/iteration_helpers.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/ui/analysis/alert_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/analysis_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/container_memory_dump_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/counter_sample_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_async_slice_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_cpu_slice_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_flow_event_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_frame_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/multi_instant_event_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_object_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_power_sample_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_sample_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/multi_thread_slice_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/multi_thread_time_slice_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/multi_user_expectation_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_async_slice_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_cpu_slice_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_flow_event_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_frame_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_instant_event_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_object_instance_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_object_snapshot_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_power_sample_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_sample_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_thread_slice_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_thread_time_slice_sub_view.html">
<link rel="import"
href="/tracing/ui/analysis/single_user_expectation_sub_view.html">
<link rel="import" href="/tracing/ui/base/tab_view.html">
<!--
@fileoverview A component used to display an analysis of a selection,
using custom elements specialized for different event types.
-->
<dom-module id='tr-ui-a-analysis-view'>
<template>
<style>
:host {
background-color: white;
display: flex;
flex-direction: column;
height: 275px;
overflow: auto;
}
:host(.tall-mode) {
height: 525px;
}
</style>
<content></content>
</template>
</dom-module>
<script>
'use strict';
(function() {
var EventRegistry = tr.model.EventRegistry;
/** Returns the label that goes next to the list of tabs. */
function getTabStripLabel(numEvents) {
if (numEvents === 0)
return 'Nothing selected. Tap stuff.';
else if (numEvents === 1)
return '1 item selected.';
return numEvents + ' items selected.';
}
function createSubView(subViewTypeInfo, selection) {
var tagName;
if (selection.length == 1)
tagName = subViewTypeInfo.singleTagName;
else
tagName = subViewTypeInfo.multiTagName;
if (tagName === undefined) {
throw new Error('No view registered for ' +
subViewTypeInfo.eventConstructor.name);
}
var subView = document.createElement(tagName);
var title;
if (selection.length === 1)
title = subViewTypeInfo.singleTitle;
else
title = subViewTypeInfo.multiTitle;
title += ' (' + selection.length + ')';
subView.tabLabel = title;
subView.selection = selection;
return subView;
}
Polymer({
is: 'tr-ui-a-analysis-view',
ready: function() {
this.brushingStateController_ = undefined;
this.lastSelection_ = undefined;
this.tabView_ = document.createElement('tr-ui-b-tab-view');
this.tabView_.addEventListener(
'selected-tab-change', this.onSelectedSubViewChanged_.bind(this));
Polymer.dom(this).appendChild(this.tabView_);
},
set tallMode(value) {
Polymer.dom(this).classList.toggle('tall-mode', value);
},
get tallMode() {
return Polymer.dom(this).classList.contains('tall-mode');
},
get tabView() {
return this.tabView_;
},
get brushingStateController() {
return this.brushingStateController_;
},
set brushingStateController(brushingStateController) {
if (this.brushingStateController_) {
this.brushingStateController_.removeEventListener(
'change', this.onSelectionChanged_.bind(this));
}
this.brushingStateController_ = brushingStateController;
if (this.brushingStateController) {
this.brushingStateController_.addEventListener(
'change', this.onSelectionChanged_.bind(this));
}
// The new brushing controller may have a different selection than the
// last one, so we have to refresh the subview.
this.onSelectionChanged_();
},
get selection() {
return this.brushingStateController_.selection;
},
onSelectionChanged_: function(e) {
if (this.lastSelection_ && this.selection.equals(this.lastSelection_))
return;
this.lastSelection_ = this.selection;
this.tallMode = false;
this.tabView_.label = getTabStripLabel(this.selection.length);
var eventsByBaseTypeName =
this.selection.getEventsOrganizedByBaseType(true);
var ASV = tr.ui.analysis.AnalysisSubView;
var eventsByTagName = ASV.getEventsOrganizedByTypeInfo(this.selection);
var newSubViews = [];
eventsByTagName.forEach(function(events, typeInfo) {
newSubViews.push(createSubView(typeInfo, events));
});
this.tabView_.resetSubViews(newSubViews);
},
onSelectedSubViewChanged_: function() {
var selectedSubView = this.tabView_.selectedSubView;
if (!selectedSubView) {
this.tallMode = false;
this.maybeChangeRelatedEvents_(undefined);
return;
}
this.tallMode = selectedSubView.requiresTallView;
this.maybeChangeRelatedEvents_(selectedSubView.relatedEventsToHighlight);
},
/** Changes the highlighted related events if possible. */
maybeChangeRelatedEvents_: function(events) {
if (this.brushingStateController)
this.brushingStateController.changeAnalysisViewRelatedEvents(events);
}
});
})();
</script>