Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(532)

Side by Side Diff: tracing/tracing/value/ui/breakdown_span.html

Issue 3002973002: Refactor diagnostic spans to share a polymer behavior. (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <!-- 2 <!--
3 Copyright 2016 The Chromium Authors. All rights reserved. 3 Copyright 2016 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be 4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file. 5 found in the LICENSE file.
6 --> 6 -->
7 7
8 <link rel="import" href="/tracing/base/fixed_color_scheme.html"> 8 <link rel="import" href="/tracing/base/fixed_color_scheme.html">
9 <link rel="import" href="/tracing/extras/chrome/chrome_user_friendly_category_dr iver.html"> 9 <link rel="import" href="/tracing/extras/chrome/chrome_user_friendly_category_dr iver.html">
10 <link rel="import" href="/tracing/metrics/all_fixed_color_schemes.html"> 10 <link rel="import" href="/tracing/metrics/all_fixed_color_schemes.html">
11 <link rel="import" href="/tracing/ui/base/column_chart.html"> 11 <link rel="import" href="/tracing/ui/base/column_chart.html">
12 <link rel="import" href="/tracing/ui/base/dom_helpers.html"> 12 <link rel="import" href="/tracing/ui/base/dom_helpers.html">
13 <link rel="import" href="/tracing/ui/base/table.html"> 13 <link rel="import" href="/tracing/ui/base/table.html">
14 <link rel="import" href="/tracing/value/ui/diagnostic_span_behavior.html">
14 15
15 <dom-module id="tr-v-ui-breakdown-span"> 16 <dom-module id="tr-v-ui-breakdown-span">
16 <template> 17 <template>
17 <style> 18 <style>
18 :host { 19 :host {
19 display: flex; 20 display: flex;
20 flex-direction: column; 21 flex-direction: column;
21 } 22 }
22 #table_container { 23 #table_container {
23 display: flex; 24 display: flex;
(...skipping 11 matching lines...) Expand all
35 <span> 36 <span>
36 <tr-ui-b-table id="table"></tr-ui-b-table> 37 <tr-ui-b-table id="table"></tr-ui-b-table>
37 </span> 38 </span>
38 </div> 39 </div>
39 </template> 40 </template>
40 </dom-module> 41 </dom-module>
41 42
42 <script> 43 <script>
43 'use strict'; 44 'use strict';
44 45
45 const DEFAULT_COLOR_SCHEME = new tr.b.SinebowColorGenerator(); 46 tr.exportTo('tr.v.ui', function() {
46 47 const DEFAULT_COLOR_SCHEME = new tr.b.SinebowColorGenerator();
47 class BreakdownTableSummaryRow { 48
48 constructor(displayElement, histogramNames) { 49 class BreakdownTableSummaryRow {
49 this.displayElement_ = displayElement; 50 constructor(displayElement, histogramNames) {
50 this.histogramNames_ = histogramNames; 51 this.displayElement_ = displayElement;
51 this.keySpan_ = undefined; 52 this.histogramNames_ = histogramNames;
53 this.keySpan_ = undefined;
54 }
55
56 get numberValue() {
57 // Prevent this row from appearing in the ColumnChart.
58 return undefined;
59 }
60
61 get keySpan() {
62 if (this.keySpan_ === undefined) {
63 if (this.histogramNames_.length) {
64 this.keySpan_ = document.createElement('tr-ui-a-analysis-link');
65 this.keySpan_.setSelectionAndContent(
66 this.histogramNames_, 'Select All');
67 } else {
68 this.keySpan_ = 'Sum';
69 }
70 }
71 return this.keySpan_;
72 }
73
74 get name() {
75 return 'Sum';
76 }
77
78 get displayElement() {
79 return this.displayElement_;
80 }
81
82 get stringPercent() {
83 return '100%';
84 }
52 } 85 }
53 86
54 get numberValue() { 87 class BreakdownTableRow {
55 // Prevent this row from appearing in the ColumnChart. 88 constructor(name, value, unit, color) {
56 return undefined; 89 this.name_ = name;
90 this.value = value;
91 this.unit = unit;
92
93 if (!this.isHistogram && typeof value !== 'number') {
94 throw new Error('unsupported value ' + value);
95 }
96
97 this.tableSum_ = undefined;
98 this.keySpan_ = undefined;
99
100 this.color_ = color;
101 const hsl = this.color.toHSL();
102 hsl.l *= 0.85;
103 this.highlightedColor_ = tr.b.Color.fromHSL(hsl);
104
105 if (this.isHistogram) {
106 this.displayElement_ = tr.v.ui.createScalarSpan(this.numberValue, {
107 unit: this.value.unit,
108 });
109 } else {
110 this.displayElement_ = tr.ui.b.createSpan({
111 textContent: this.stringValue,
112 });
113 }
114 }
115
116 get isHistogram() {
117 return this.value instanceof tr.v.Histogram;
118 }
119
120 get name() {
121 return this.name_;
122 }
123
124 get color() {
125 return this.color_;
126 }
127
128 get highlightedColor() {
129 return this.highlightedColor_;
130 }
131
132 get keySpan() {
133 if (this.keySpan_ === undefined) {
134 if (this.isHistogram) {
135 this.keySpan_ = document.createElement('tr-ui-a-analysis-link');
136 this.keySpan_.setSelectionAndContent([this.value.name], this.name);
137 this.keySpan_.color = this.color;
138 this.keySpan_.title = this.value.name;
139 } else {
140 this.keySpan_ = document.createElement('span');
141 this.keySpan_.innerText = this.name;
142 this.keySpan_.style.color = this.color;
143 }
144 }
145 return this.keySpan_;
146 }
147
148 /**
149 * @return {number|undefined}
150 */
151 get numberValue() {
152 if (this.isHistogram) return this.value.sum;
153 if (!isNaN(this.value) &&
154 (this.value !== Infinity) &&
155 (this.value !== -Infinity) &&
156 (this.value > 0)) return this.value;
157 // Prevent this row from appearing in the ColumnChart.
158 return undefined;
159 }
160
161 get stringValue() {
162 if (!this.isHistogram &&
163 (isNaN(this.value) ||
164 this.value === Infinity ||
165 this.value === -Infinity)) {
166 return this.value.toString();
167 }
168 if (this.unit !== undefined) return this.unit.format(this.value);
169 if (this.isHistogram) return this.value.sum.toString();
170 return this.value.toString();
171 }
172
173 set tableSum(s) {
174 this.tableSum_ = s;
175 }
176
177 get stringPercent() {
178 if (this.tableSum_ === undefined) return '';
179 const num = this.numberValue;
180 if (num === undefined) return '';
181 return Math.floor(num * 100.0 / this.tableSum_) + '%';
182 }
183
184 get displayElement() {
185 return this.displayElement_;
186 }
187
188 compare(other) {
189 if (this.numberValue === undefined) {
190 if (other.numberValue === undefined) {
191 return this.name.localeCompare(other.name);
192 }
193 return 1;
194 }
195 if (other.numberValue === undefined) {
196 return -1;
197 }
198 if (this.numberValue === other.numberValue) {
199 return this.name.localeCompare(other.name);
200 }
201 return other.numberValue - this.numberValue;
202 }
57 } 203 }
58 204
59 get keySpan() { 205 Polymer({
60 if (this.keySpan_ === undefined) { 206 is: 'tr-v-ui-breakdown-span',
61 if (this.histogramNames_.length) { 207 behaviors: [tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],
62 this.keySpan_ = document.createElement('tr-ui-a-analysis-link'); 208
63 this.keySpan_.setSelectionAndContent( 209 created() {
64 this.histogramNames_, 'Select All'); 210 this.chart_ = new tr.ui.b.ColumnChart();
211 this.chart_.graphHeight = 130;
212 this.chart_.isStacked = true;
213 this.chart_.hideXAxis = true;
214 this.chart_.hideLegend = true;
215 this.chart_.enableHoverBox = false;
216 this.chart_.addEventListener('rect-mouseenter',
217 event => this.onRectMouseEnter_(event));
218 this.chart_.addEventListener('rect-mouseleave',
219 event => this.onRectMouseLeave_(event));
220 },
221
222 onRectMouseEnter_(event) {
223 for (const row of this.$.table.tableRows) {
224 if (row.name === event.rect.key) {
225 row.displayElement.style.background = event.rect.color;
226 row.keySpan.scrollIntoViewIfNeeded();
227 } else {
228 row.displayElement.style.background = '';
229 }
230 }
231 },
232
233 onRectMouseLeave_(event) {
234 for (const row of this.$.table.tableRows) {
235 row.displayElement.style.background = '';
236 }
237 },
238
239 ready() {
240 Polymer.dom(this.$.container).appendChild(this.chart_);
241
242 this.$.table.zebra = true;
243 this.$.table.showHeader = false;
244 this.$.table.tableColumns = [
245 {
246 value: row => row.keySpan,
247 },
248 {
249 value: row => row.displayElement,
250 align: tr.ui.b.TableFormat.ColumnAlignment.RIGHT,
251 },
252 {
253 value: row => row.stringPercent,
254 align: tr.ui.b.TableFormat.ColumnAlignment.RIGHT,
255 },
256 ];
257 },
258
259 updateContents_() {
260 this.$.container.style.display = 'none';
261 this.$.table.style.display = 'none';
262 this.$.empty.style.display = 'block';
263
264 if (!this.diagnostic_) {
265 this.chart_.data = [];
266 return;
267 }
268
269 if (this.histogram_) this.chart_.unit = this.histogram_.unit;
270
271 let colorScheme = undefined;
272 // https://github.com/catapult-project/catapult/issues/2970
273 if (this.diagnostic.colorScheme ===
274 tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER) {
275 colorScheme = (name) => {
276 let cat = name.split(' ');
277 cat = cat[cat.length - 1];
278 return tr.e.chrome.ChromeUserFriendlyCategoryDriver.getColor(cat);
279 };
280 } else if (this.diagnostic.colorScheme !== undefined) {
281 colorScheme = (name) => tr.b.FixedColorSchemeRegistry.lookUp(
282 this.diagnostic.colorScheme).getColor(name);
65 } else { 283 } else {
66 this.keySpan_ = 'Sum'; 284 colorScheme = (name) => DEFAULT_COLOR_SCHEME.colorForKey(name);
67 } 285 }
68 } 286
69 return this.keySpan_; 287 const tableRows = [];
70 } 288 let tableSum = 0;
71 289 const histogramNames = [];
72 get name() { 290 for (const [name, value] of this.diagnostic) {
73 return 'Sum'; 291 const row = new BreakdownTableRow(
74 } 292 name, value, this.chart_.unit, colorScheme(name));
75 293 tableRows.push(row);
76 get displayElement() { 294 if (row.numberValue !== undefined) tableSum += row.numberValue;
77 return this.displayElement_; 295 if (row.isHistogram) {
78 } 296 histogramNames.push(value.name);
79 297 }
80 get stringPercent() { 298 }
81 return '100%'; 299 tableRows.sort((x, y) => x.compare(y));
82 } 300
83 } 301 if (tableSum > 0) {
84 302 let summaryDisplayElement = tableSum;
85 class BreakdownTableRow { 303 if (this.chart_.unit !== undefined) {
86 constructor(name, value, unit, color) { 304 summaryDisplayElement = this.chart_.unit.format(tableSum);
87 this.name_ = name; 305 }
88 this.value = value; 306 summaryDisplayElement = tr.ui.b.createSpan({
89 this.unit = unit; 307 textContent: summaryDisplayElement,
90 308 });
91 if (!this.isHistogram && typeof value !== 'number') { 309 tableRows.unshift(new BreakdownTableSummaryRow(
92 throw new Error('unsupported value ' + value); 310 summaryDisplayElement, histogramNames));
93 } 311 }
94 312
95 this.tableSum_ = undefined; 313 const chartData = {x: 0};
96 this.keySpan_ = undefined; 314 for (const row of tableRows) {
97 315 if (row.numberValue === undefined) continue;
98 this.color_ = color; 316
99 const hsl = this.color.toHSL(); 317 // Let the row compute its percentage.
100 hsl.l *= 0.85; 318 row.tableSum = tableSum;
101 this.highlightedColor_ = tr.b.Color.fromHSL(hsl); 319
102 320 // Add it to the chart.
103 if (this.isHistogram) { 321 chartData[row.name] = row.numberValue;
104 this.displayElement_ = tr.v.ui.createScalarSpan(this.numberValue, { 322
105 unit: this.value.unit, 323 // Configure the colors.
106 }); 324 const dataSeries = this.chart_.getDataSeries(row.name);
107 } else { 325 dataSeries.color = row.color;
108 this.displayElement_ = tr.ui.b.createSpan({ 326 dataSeries.highlightedColor = row.highlightedColor;
109 textContent: this.stringValue, 327 }
110 }); 328
111 } 329 if (tableRows.length > 0) {
112 } 330 this.$.table.style.display = 'block';
113 331 this.$.empty.style.display = 'none';
114 get isHistogram() { 332 this.$.table.tableRows = tableRows;
115 return this.value instanceof tr.v.Histogram; 333 this.$.table.rebuild();
116 } 334 }
117 335
118 get name() { 336 if (Object.keys(chartData).length > 1) {
119 return this.name_; 337 this.$.container.style.display = 'block';
120 } 338 this.$.empty.style.display = 'none';
121 339 this.chart_.data = [chartData];
122 get color() { 340 }
123 return this.color_; 341 }
124 } 342 });
125 343
126 get highlightedColor() { 344 return {};
127 return this.highlightedColor_;
128 }
129
130 get keySpan() {
131 if (this.keySpan_ === undefined) {
132 if (this.isHistogram) {
133 this.keySpan_ = document.createElement('tr-ui-a-analysis-link');
134 this.keySpan_.setSelectionAndContent([this.value.name], this.name);
135 this.keySpan_.color = this.color;
136 this.keySpan_.title = this.value.name;
137 } else {
138 this.keySpan_ = document.createElement('span');
139 this.keySpan_.innerText = this.name;
140 this.keySpan_.style.color = this.color;
141 }
142 }
143 return this.keySpan_;
144 }
145
146 /**
147 * @return {number|undefined}
148 */
149 get numberValue() {
150 if (this.isHistogram) return this.value.sum;
151 if (!isNaN(this.value) &&
152 (this.value !== Infinity) &&
153 (this.value !== -Infinity) &&
154 (this.value > 0)) return this.value;
155 // Prevent this row from appearing in the ColumnChart.
156 return undefined;
157 }
158
159 get stringValue() {
160 if (!this.isHistogram &&
161 (isNaN(this.value) ||
162 this.value === Infinity ||
163 this.value === -Infinity)) {
164 return this.value.toString();
165 }
166 if (this.unit !== undefined) return this.unit.format(this.value);
167 if (this.isHistogram) return this.value.sum.toString();
168 return this.value.toString();
169 }
170
171 set tableSum(s) {
172 this.tableSum_ = s;
173 }
174
175 get stringPercent() {
176 if (this.tableSum_ === undefined) return '';
177 const num = this.numberValue;
178 if (num === undefined) return '';
179 return Math.floor(num * 100.0 / this.tableSum_) + '%';
180 }
181
182 get displayElement() {
183 return this.displayElement_;
184 }
185
186 compare(other) {
187 if (this.numberValue === undefined) {
188 if (other.numberValue === undefined) {
189 return this.name.localeCompare(other.name);
190 }
191 return 1;
192 }
193 if (other.numberValue === undefined) {
194 return -1;
195 }
196 if (this.numberValue === other.numberValue) {
197 return this.name.localeCompare(other.name);
198 }
199 return other.numberValue - this.numberValue;
200 }
201 }
202
203 Polymer({
204 is: 'tr-v-ui-breakdown-span',
205
206 created() {
207 this.histogram_ = undefined;
208 this.diagnostic_ = undefined;
209 this.chart_ = new tr.ui.b.ColumnChart();
210 this.chart_.graphHeight = 130;
211 this.chart_.isStacked = true;
212 this.chart_.hideXAxis = true;
213 this.chart_.hideLegend = true;
214 this.chart_.enableHoverBox = false;
215 this.chart_.addEventListener('rect-mouseenter',
216 event => this.onRectMouseEnter_(event));
217 this.chart_.addEventListener('rect-mouseleave',
218 event => this.onRectMouseLeave_(event));
219 },
220
221 onRectMouseEnter_(event) {
222 for (const row of this.$.table.tableRows) {
223 if (row.name === event.rect.key) {
224 row.displayElement.style.background = event.rect.color;
225 row.keySpan.scrollIntoViewIfNeeded();
226 } else {
227 row.displayElement.style.background = '';
228 }
229 }
230 },
231
232 onRectMouseLeave_(event) {
233 for (const row of this.$.table.tableRows) {
234 row.displayElement.style.background = '';
235 }
236 },
237
238 ready() {
239 Polymer.dom(this.$.container).appendChild(this.chart_);
240
241 this.$.table.zebra = true;
242 this.$.table.showHeader = false;
243 this.$.table.tableColumns = [
244 {
245 value: row => row.keySpan,
246 },
247 {
248 value: row => row.displayElement,
249 align: tr.ui.b.TableFormat.ColumnAlignment.RIGHT,
250 },
251 {
252 value: row => row.stringPercent,
253 align: tr.ui.b.TableFormat.ColumnAlignment.RIGHT,
254 },
255 ];
256 },
257
258 attached() {
259 if (this.diagnostic_) this.updateContents_();
260 },
261
262 set histogram(h) {
263 this.histogram_ = h;
264 },
265
266 get diagnostic() {
267 return this.diagnostic_;
268 },
269
270 set diagnostic(d) {
271 this.diagnostic_ = d;
272 if (this.isAttached) this.updateContents_();
273 },
274
275 updateContents_() {
276 this.$.container.style.display = 'none';
277 this.$.table.style.display = 'none';
278 this.$.empty.style.display = 'block';
279
280 if (!this.diagnostic_) {
281 this.chart_.data = [];
282 return;
283 }
284
285 if (this.histogram_) this.chart_.unit = this.histogram_.unit;
286
287 let colorScheme = undefined;
288 // https://github.com/catapult-project/catapult/issues/2970
289 if (this.diagnostic.colorScheme ===
290 tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER) {
291 colorScheme = (name) => {
292 let cat = name.split(' ');
293 cat = cat[cat.length - 1];
294 return tr.e.chrome.ChromeUserFriendlyCategoryDriver.getColor(cat);
295 };
296 } else if (this.diagnostic.colorScheme !== undefined) {
297 colorScheme = (name) => tr.b.FixedColorSchemeRegistry.lookUp(
298 this.diagnostic.colorScheme).getColor(name);
299 } else {
300 colorScheme = (name) => DEFAULT_COLOR_SCHEME.colorForKey(name);
301 }
302
303 const tableRows = [];
304 let tableSum = 0;
305 const histogramNames = [];
306 for (const [name, value] of this.diagnostic) {
307 const row = new BreakdownTableRow(
308 name, value, this.chart_.unit, colorScheme(name));
309 tableRows.push(row);
310 if (row.numberValue !== undefined) tableSum += row.numberValue;
311 if (row.isHistogram) {
312 histogramNames.push(value.name);
313 }
314 }
315 tableRows.sort((x, y) => x.compare(y));
316
317 if (tableSum > 0) {
318 let summaryDisplayElement = tableSum;
319 if (this.chart_.unit !== undefined) {
320 summaryDisplayElement = this.chart_.unit.format(tableSum);
321 }
322 summaryDisplayElement = tr.ui.b.createSpan({
323 textContent: summaryDisplayElement,
324 });
325 tableRows.unshift(new BreakdownTableSummaryRow(
326 summaryDisplayElement, histogramNames));
327 }
328
329 const chartData = {x: 0};
330 for (const row of tableRows) {
331 if (row.numberValue === undefined) continue;
332
333 // Let the row compute its percentage.
334 row.tableSum = tableSum;
335
336 // Add it to the chart.
337 chartData[row.name] = row.numberValue;
338
339 // Configure the colors.
340 const dataSeries = this.chart_.getDataSeries(row.name);
341 dataSeries.color = row.color;
342 dataSeries.highlightedColor = row.highlightedColor;
343 }
344
345 if (tableRows.length > 0) {
346 this.$.table.style.display = 'block';
347 this.$.empty.style.display = 'none';
348 this.$.table.tableRows = tableRows;
349 this.$.table.rebuild();
350 }
351
352 if (Object.keys(chartData).length > 1) {
353 this.$.container.style.display = 'block';
354 this.$.empty.style.display = 'none';
355 this.chart_.data = [chartData];
356 }
357 }
358 }); 345 });
359 </script> 346 </script>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698