diff options
Diffstat (limited to 'chromium/third_party/catapult/tracing/tracing/ui/tracks')
77 files changed, 0 insertions, 10512 deletions
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track.html deleted file mode 100644 index a6082f9d040..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track.html +++ /dev/null @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/tracks/letter_dot_track.html"> -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays an array of alert objects. - * @constructor - * @extends {LetterDotTrack} - */ - var AlertTrack = tr.ui.b.define( - 'alert-track', tr.ui.tracks.LetterDotTrack); - - AlertTrack.prototype = { - __proto__: tr.ui.tracks.LetterDotTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this, viewport); - this.heading = 'Alerts'; - this.alerts_ = undefined; - }, - - get alerts() { - return this.alerts_; - }, - - set alerts(alerts) { - this.alerts_ = alerts; - if (alerts === undefined) { - this.items = undefined; - return; - } - this.items = this.alerts_.map(function(alert) { - return new tr.ui.tracks.LetterDot( - alert, String.fromCharCode(9888), alert.colorId, alert.start); - }); - } - }; - - return { - AlertTrack: AlertTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track_test.html deleted file mode 100644 index 48d488e3e48..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/alert_track_test.html +++ /dev/null @@ -1,76 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/global_memory_dump.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/alert_track.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var AlertTrack = tr.ui.tracks.AlertTrack; - var SelectionState = tr.model.SelectionState; - var Viewport = tr.ui.TimelineViewport; - - var ALERT_INFO_1 = new tr.model.EventInfo( - 'Alert 1', 'One alert'); - var ALERT_INFO_2 = new tr.model.EventInfo( - 'Alert 2', 'Another alert'); - - var createAlerts = function() { - var alerts = [ - new tr.model.Alert(ALERT_INFO_1, 5), - new tr.model.Alert(ALERT_INFO_1, 20), - new tr.model.Alert(ALERT_INFO_2, 35), - new tr.model.Alert(ALERT_INFO_2, 50) - ]; - return alerts; - }; - - test('instantiate', function() { - var alerts = createAlerts(); - alerts[1].selectionState = SelectionState.SELECTED; - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = AlertTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.alerts = alerts; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 50, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - - - assert.equal(5, track.items[0].start); - }); - - test('modelMapping', function() { - var alerts = createAlerts(); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var track = AlertTrack(viewport); - track.alerts = alerts; - - var a0 = track.items[0].modelItem; - assert.equal(a0, alerts[0]); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html deleted file mode 100644 index 56971486083..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html +++ /dev/null @@ -1,136 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/ui.html"> -<link rel="import" href="/tracing/ui/tracks/multi_row_track.html"> -<link rel="import" href="/tracing/ui/tracks/slice_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays a AsyncSliceGroup. - * @constructor - * @extends {MultiRowTrack} - */ - var AsyncSliceGroupTrack = tr.ui.b.define( - 'async-slice-group-track', - tr.ui.tracks.MultiRowTrack); - - AsyncSliceGroupTrack.prototype = { - - __proto__: tr.ui.tracks.MultiRowTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this, viewport); - this.classList.add('async-slice-group-track'); - this.group_ = undefined; - }, - - addSubTrack_: function(slices) { - var track = new tr.ui.tracks.SliceTrack(this.viewport); - track.slices = slices; - this.appendChild(track); - track.asyncStyle = true; - return track; - }, - - get group() { - return this.group_; - }, - - set group(group) { - this.group_ = group; - this.setItemsToGroup(this.group_.slices, this.group_); - }, - - get eventContainer() { - return this.group; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply( - this, arguments); - containerToTrackMap.addContainer(this.group, this); - }, - - /** - * Breaks up the list of slices into N rows, each of which is a list of - * slices that are non overlapping. - * - * It uses a very simple approach: walk through the slices in sorted order - * by start time. For each slice, try to fit it in an existing subRow. If - * it doesn't fit in any subrow, make another subRow. It then fits nested - * subSlices recursively into rows below parent slice according to which - * nested level the child is in. - */ - buildSubRows_: function(slices, opt_skipSort) { - if (!opt_skipSort) { - slices.sort(function(x, y) { - return x.start - y.start; - }); - } - - // Helper function that returns true if it can put the slice on row n. - var findLevel = function(sliceToPut, rows, n) { - if (n >= rows.length) - return true; // We always can make empty rows to put the slice. - var subRow = rows[n]; - var lastSliceInSubRow = subRow[subRow.length - 1]; - if (sliceToPut.start >= lastSliceInSubRow.end) { - if (sliceToPut.subSlices === undefined || - sliceToPut.subSlices.length === 0) { - return true; - } - // Make sure nested sub slices can be fitted in as well. - for (var subSlice of sliceToPut.subSlices) { - if (!findLevel(subSlice, rows, n + 1)) - return false; - } - return true; - } - return false; - }; - - var subRows = []; - for (var slice of slices) { - var found = false; - var index = subRows.length; - for (var j = 0; j < subRows.length; j++) { - if (findLevel(slice, subRows, j)) { - found = true; - index = j; - break; - } - } - if (!found) - subRows.push([]); - subRows[index].push(slice); - - // Fit subSlices recursively into rows below parent. - var fitSubSlicesRecursively = function(subSlices, level, rows) { - if (subSlices === undefined || subSlices.length === 0) - return; - if (level === rows.length) - rows.push([]); - for (var subSlice of subSlices) { - rows[level].push(subSlice); - fitSubSlicesRecursively(subSlice.subSlices, level + 1, rows); - } - }; - fitSubSlicesRecursively(slice.subSlices, index + 1, subRows); - } - return subRows; - } - }; - - return { - AsyncSliceGroupTrack: AsyncSliceGroupTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track_test.html deleted file mode 100644 index cb924f42113..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track_test.html +++ /dev/null @@ -1,252 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/model/model.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var AsyncSliceGroup = tr.model.AsyncSliceGroup; - var AsyncSliceGroupTrack = tr.ui.tracks.AsyncSliceGroupTrack; - var Process = tr.model.Process; - var ProcessTrack = tr.ui.tracks.ProcessTrack; - var Thread = tr.model.Thread; - var ThreadTrack = tr.ui.tracks.ThreadTrack; - var newAsyncSlice = tr.c.TestUtils.newAsyncSlice; - var newAsyncSliceNamed = tr.c.TestUtils.newAsyncSliceNamed; - - test('filterSubRows', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - g.push(newAsyncSlice(0, 1, t1, t1)); - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - - assert.equal(track.children.length, 1); - assert.isTrue(track.hasVisibleContent); - }); - - test('rebuildSubRows_twoNonOverlappingSlices', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - var s1 = newAsyncSlice(0, 1, t1, t1); - var subs1 = newAsyncSliceNamed('b', 0, 1, t1, t1); - s1.subSlices = [subs1]; - g.push(s1); - g.push(newAsyncSlice(1, 1, t1, t1)); - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - var subRows = track.subRows; - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 2); - assert.equal(subRows[1].length, 1); - assert.equal(subRows[1][0], g.slices[0].subSlices[0]); - assert.sameMembers(g.slices[1].subSlices, []); - }); - - test('rebuildSubRows_twoOverlappingSlices', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - - var s1 = newAsyncSlice(0, 1, t1, t1); - var subs1 = newAsyncSliceNamed('b', 0, 1, t1, t1); - s1.subSlices = [subs1]; - var s2 = newAsyncSlice(0, 1.5, t1, t1); - var subs2 = newAsyncSliceNamed('b', 0, 1, t1, t1); - s2.subSlices = [subs2]; - g.push(s1); - g.push(s2); - - g.updateBounds(); - - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - - var subRows = track.subRows; - - assert.equal(subRows.length, 4); - assert.equal(subRows[0].length, 1); - assert.equal(subRows[1].length, 1); - assert.equal(subRows[2].length, 1); - assert.equal(subRows[3].length, 1); - assert.equal(subRows[1][0], g.slices[0].subSlices[0]); - assert.equal(subRows[3][0], g.slices[1].subSlices[0]); - }); - - test('rebuildSubRows_threePartlyOverlappingSlices', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - g.push(newAsyncSlice(0, 1, t1, t1)); - g.push(newAsyncSlice(0, 1.5, t1, t1)); - g.push(newAsyncSlice(1, 1.5, t1, t1)); - g.updateBounds(); - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - var subRows = track.subRows; - - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 2); - assert.equal(subRows[0][0], g.slices[0]); - assert.equal(subRows[0][1], g.slices[2]); - assert.equal(subRows[1][0], g.slices[1]); - assert.equal(subRows[1].length, 1); - assert.sameMembers(g.slices[0].subSlices, []); - assert.sameMembers(g.slices[1].subSlices, []); - assert.sameMembers(g.slices[2].subSlices, []); - }); - - test('rebuildSubRows_threeOverlappingSlices', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - - g.push(newAsyncSlice(0, 1, t1, t1)); - g.push(newAsyncSlice(0, 1.5, t1, t1)); - g.push(newAsyncSlice(2, 1, t1, t1)); - g.updateBounds(); - - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - - var subRows = track.subRows; - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 2); - assert.equal(subRows[1].length, 1); - assert.equal(subRows[0][0], g.slices[0]); - assert.equal(subRows[1][0], g.slices[1]); - assert.equal(subRows[0][1], g.slices[2]); - }); - - // Tests that no slices and their sub slices overlap. - test('rebuildSubRows_NonOverlappingSubSlices', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - - var slice1 = newAsyncSlice(0, 5, t1, t1); - var slice1Child = newAsyncSlice(1, 2, t1, t1); - slice1.subSlices = [slice1Child]; - var slice2 = newAsyncSlice(3, 5, t1, t1); - var slice3 = newAsyncSlice(5, 4, t1, t1); - var slice3Child = newAsyncSlice(6, 2, t1, t1); - slice3.subSlices = [slice3Child]; - g.push(slice1); - g.push(slice2); - g.push(slice3); - g.updateBounds(); - - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - - var subRows = track.subRows; - // Checks each sub row to see that we don't have any overlapping slices. - for (var i = 0; i < subRows.length; i++) { - var row = subRows[i]; - for (var j = 0; j < row.length; j++) { - for (var k = j + 1; k < row.length; k++) { - assert.isTrue(row[j].end <= row[k].start); - } - } - } - }); - - test('rebuildSubRows_NonOverlappingSubSlicesThreeNestedLevels', function() { - var model = new tr.Model(); - var p1 = new Process(model, 1); - var t1 = new Thread(p1, 1); - var g = new AsyncSliceGroup(t1); - - var slice1 = newAsyncSlice(0, 4, t1, t1); - var slice1Child = newAsyncSlice(1, 2, t1, t1); - slice1.subSlices = [slice1Child]; - var slice2 = newAsyncSlice(2, 7, t1, t1); - var slice3 = newAsyncSlice(5, 5, t1, t1); - var slice3Child = newAsyncSlice(6, 3, t1, t1); - var slice3Child2 = newAsyncSlice(7, 1, t1, t1); - slice3.subSlices = [slice3Child]; - slice3Child.subSlices = [slice3Child2]; - g.push(slice1); - g.push(slice2); - g.push(slice3); - g.updateBounds(); - - var track = new AsyncSliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = g; - - var subRows = track.subRows; - // Checks each sub row to see that we don't have any overlapping slices. - for (var i = 0; i < subRows.length; i++) { - var row = subRows[i]; - for (var j = 0; j < row.length; j++) { - for (var k = j + 1; k < row.length; k++) { - assert.isTrue(row[j].end <= row[k].start); - } - } - } - }); - - test('asyncSliceGroupContainerMap', function() { - var vp = new tr.ui.TimelineViewport(); - var containerToTrack = vp.containerToTrackMap; - var model = new tr.Model(); - var process = model.getOrCreateProcess(123); - var thread = process.getOrCreateThread(456); - var group = new AsyncSliceGroup(thread); - - var processTrack = new ProcessTrack(vp); - var threadTrack = new ThreadTrack(vp); - var groupTrack = new AsyncSliceGroupTrack(vp); - processTrack.process = process; - threadTrack.thread = thread; - groupTrack.group = group; - processTrack.appendChild(threadTrack); - threadTrack.appendChild(groupTrack); - - assert.equal(processTrack.eventContainer, process); - assert.equal(threadTrack.eventContainer, thread); - assert.equal(groupTrack.eventContainer, group); - - assert.isUndefined(containerToTrack.getTrackByStableId('123')); - assert.isUndefined(containerToTrack.getTrackByStableId('123.456')); - assert.isUndefined( - containerToTrack.getTrackByStableId('123.456.AsyncSliceGroup')); - - vp.modelTrackContainer = { - addContainersToTrackMap: function(containerToTrackMap) { - processTrack.addContainersToTrackMap(containerToTrackMap); - }, - addEventListener: function() {} - }; - vp.rebuildContainerToTrackMap(); - - // Check that all tracks call childs' addContainersToTrackMap() - // by checking the resulting map. - assert.equal(containerToTrack.getTrackByStableId('123'), processTrack); - assert.equal(containerToTrack.getTrackByStableId('123.456'), threadTrack); - assert.equal(containerToTrack.getTrackByStableId('123.456.AsyncSliceGroup'), - groupTrack); - - // Check the track's eventContainer getter. - assert.equal(processTrack.eventContainer, process); - assert.equal(threadTrack.eventContainer, thread); - assert.equal(groupTrack.eventContainer, group); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis.html deleted file mode 100644 index f91733ced9e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis.html +++ /dev/null @@ -1,127 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/range.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A vertical axis for a (set of) chart series which maps an arbitrary range - * of values [min, max] to the unit range [0, 1]. - * - * @constructor - */ - function ChartAxis(opt_min, opt_max) { - this.guid_ = tr.b.GUID.allocateSimple(); - this.bounds = new tr.b.Range(); - if (opt_min !== undefined) - this.bounds.addValue(opt_min); - if (opt_max !== undefined) - this.bounds.addValue(opt_max); - }; - - ChartAxis.prototype = { - get guid() { - return this.guid_; - }, - - valueToUnitRange: function(value) { - if (this.bounds.isEmpty) - throw new Error('Chart axis bounds are empty'); - var bounds = this.bounds; - if (bounds.range === 0) - return 0; - return (value - bounds.min) / bounds.range; - }, - - /** - * Automatically set the axis bounds from the range of values of all series - * in a list. - * - * See the description of autoSetFromRange for the optional configuration - * argument flags. - */ - autoSetFromSeries: function(series, opt_config) { - var range = new tr.b.Range(); - series.forEach(function(s) { - range.addRange(s.range); - }, this); - this.autoSetFromRange(range, opt_config); - }, - - /** - * Automatically set the axis bound from a range of values. - * - * The following four flags, which affect the behavior of this method with - * respect to already defined bounds, can be present in the optional - * configuration (a flag is assumed to be false if it is not provided or if - * the configuration is not provided): - * - * - expandMin: allow decreasing the min bound (if range.min < this.min) - * - shrinkMin: allow increasing the min bound (if range.min > this.min) - * - expandMax: allow increasing the max bound (if range.max > this.max) - * - shrinkMax: allow decreasing the max bound (if range.max < this.max) - * - * This method will ensure that the resulting bounds are defined and valid - * (i.e. min <= max) provided that they were valid or empty before and the - * value range is non-empty and valid. - * - * Note that unless expanding/shrinking a bound is explicitly enabled in - * the configuration, non-empty bounds will not be changed under any - * circumstances. - * - * Observe that if no configuration is provided (or all flags are set to - * false), this method will only modify the axis bounds if they are empty. - */ - autoSetFromRange: function(range, opt_config) { - if (range.isEmpty) - return; - - var bounds = this.bounds; - if (bounds.isEmpty) { - bounds.addRange(range); - return; - } - - if (!opt_config) - return; - - var useRangeMin = (opt_config.expandMin && range.min < bounds.min || - opt_config.shrinkMin && range.min > bounds.min); - var useRangeMax = (opt_config.expandMax && range.max > bounds.max || - opt_config.shrinkMax && range.max < bounds.max); - - // Neither bound is modified. - if (!useRangeMin && !useRangeMax) - return; - - // Both bounds are modified. Assuming the range argument is a valid - // range, no extra checks are necessary. - if (useRangeMin && useRangeMax) { - bounds.min = range.min; - bounds.max = range.max; - return; - } - - // Only one bound is modified. We must ensure that it doesn't go - // over/under the other (unmodified) bound. - if (useRangeMin) { - bounds.min = Math.min(range.min, bounds.max); - } else { - bounds.max = Math.max(range.max, bounds.min); - } - } - }; - - return { - ChartAxis: ChartAxis - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis_test.html deleted file mode 100644 index a5f83fd56f8..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_axis_test.html +++ /dev/null @@ -1,312 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/range.html"> -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ChartAxis = tr.ui.tracks.ChartAxis; - var ChartPoint = tr.ui.tracks.ChartPoint; - var ChartSeries = tr.ui.tracks.ChartSeries; - var Range = tr.b.Range; - - function buildRange() { - var range = new Range(); - for (var i = 0; i < arguments.length; i++) - range.addValue(arguments[i]); - return range; - } - - function buildSeries() { - var points = []; - for (var i = 0; i < arguments.length; i++) { - points.push(new ChartPoint(undefined, i, arguments[i])); - } - return new ChartSeries(points, new ChartAxis()); - } - - test('instantiate_emptyBounds', function() { - var axis = new ChartAxis(); - assert.isTrue(axis.bounds.isEmpty); - }); - - test('instantiate_nonEmptyBounds', function() { - var axis = new ChartAxis(-2, 12); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, -2); - assert.equal(axis.bounds.max, 12); - }); - - test('instantiate_equalBounds', function() { - var axis = new ChartAxis(2.72); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 2.72); - assert.equal(axis.bounds.max, 2.72); - }); - - test('checkValueToUnitRange_emptyBounds', function() { - var axis = new ChartAxis(); - assert.throws(function() { axis.valueToUnitRange(42); }); - }); - - test('checkValueToUnitRange_nonEmptyBounds', function() { - var axis = new ChartAxis(10, 20); - - assert.equal(axis.valueToUnitRange(0), -1); - assert.equal(axis.valueToUnitRange(10), 0); - assert.equal(axis.valueToUnitRange(15), 0.5); - assert.equal(axis.valueToUnitRange(20), 1); - assert.equal(axis.valueToUnitRange(30), 2); - }); - - test('checkValueToUnitRange_equalBounds', function() { - var axis = new ChartAxis(3.14); - - assert.equal(axis.valueToUnitRange(0), 0); - assert.equal(axis.valueToUnitRange(3.14), 0); - assert.equal(axis.valueToUnitRange(6.28), 0); - }); - - test('checkAutoSetFromRange_emptyBounds', function() { - // Empty range. - var axis = new ChartAxis(); - axis.autoSetFromRange(buildRange()); - assert.isTrue(axis.bounds.isEmpty); - - // Non-empty range. - var axis = new ChartAxis(); - axis.autoSetFromRange(buildRange(-1, 3)); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, -1); - assert.equal(axis.bounds.max, 3); - }); - - test('checkAutoSetFromRange_nonEmptyBounds', function() { - // Empty range. - var axis = new ChartAxis(0, 1); - axis.autoSetFromRange(buildRange()); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 0); - assert.equal(axis.bounds.max, 1); - - // No configuration. - var axis = new ChartAxis(2, 3); - axis.autoSetFromRange(buildRange(1, 4)); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 2); - assert.equal(axis.bounds.max, 3); - - // Allow expanding min. - var axis = new ChartAxis(-2, -1); - axis.autoSetFromRange(buildRange(-3, 0), {expandMin: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, -3); - assert.equal(axis.bounds.max, -1); - - // Allow shrinking min. - var axis = new ChartAxis(-2, -1); - axis.autoSetFromRange(buildRange(-1.5, 0.5), {shrinkMin: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, -1.5); - assert.equal(axis.bounds.max, -1); - - var axis = new ChartAxis(7, 8); - axis.autoSetFromRange(buildRange(9, 10), {shrinkMin: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 8); - assert.equal(axis.bounds.max, 8); - - // Allow expanding max. - var axis = new ChartAxis(19, 20); - axis.autoSetFromRange(buildRange(18, 21), {expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 19); - assert.equal(axis.bounds.max, 21); - - // Allow shrinking max. - var axis = new ChartAxis(30, 32); - axis.autoSetFromRange(buildRange(29, 31), {shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 30); - assert.equal(axis.bounds.max, 31); - - var axis = new ChartAxis(41, 42); - axis.autoSetFromRange(buildRange(39, 40), {shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 41); - assert.equal(axis.bounds.max, 41); - - // Allow shrinking both bounds. - var axis = new ChartAxis(50, 53); - axis.autoSetFromRange(buildRange(51, 52), - {shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 51); - assert.equal(axis.bounds.max, 52); - - var axis = new ChartAxis(50, 53); - axis.autoSetFromRange(buildRange(49, 52), - {shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 50); - assert.equal(axis.bounds.max, 52); - - var axis = new ChartAxis(50, 53); - axis.autoSetFromRange(buildRange(51, 54), - {shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 51); - assert.equal(axis.bounds.max, 53); - - var axis = new ChartAxis(50, 53); - axis.autoSetFromRange(buildRange(49, 54), - {shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 50); - assert.equal(axis.bounds.max, 53); - - // Allow expanding both bounds. - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(0, 100), - {expandMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 0); - assert.equal(axis.bounds.max, 100); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(60.5, 100), - {expandMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 100); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(0, 60.5), - {expandMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 0); - assert.equal(axis.bounds.max, 61); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(60.2, 60.8), - {expandMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 61); - - // Allow shrinking min and expanding max. - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(62, 63), - {shrinkMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 62); - assert.equal(axis.bounds.max, 63); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(59, 63), - {shrinkMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 63); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(60.2, 60.8), - {shrinkMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60.2); - assert.equal(axis.bounds.max, 61); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(59, 60.5), - {shrinkMin: true, expandMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 61); - - // Allow expanding min and shrinking max. - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(62, 63), - {expandMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 61); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(59, 63), - {expandMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 59); - assert.equal(axis.bounds.max, 61); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(60.2, 60.8), - {expandMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 60); - assert.equal(axis.bounds.max, 60.8); - - var axis = new ChartAxis(60, 61); - axis.autoSetFromRange(buildRange(59, 60.5), - {expandMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 59); - assert.equal(axis.bounds.max, 60.5); - - // Allow everything. - var axis = new ChartAxis(200, 250); - axis.autoSetFromRange(buildRange(150, 175), - {expandMin: true, expandMax: true, shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 150); - assert.equal(axis.bounds.max, 175); - - var axis = new ChartAxis(0, 0.1); - axis.autoSetFromRange(buildRange(0.2, 0.3), - {expandMin: true, expandMax: true, shrinkMin: true, shrinkMax: true}); - assert.isFalse(axis.bounds.isEmpty); - assert.equal(axis.bounds.min, 0.2); - assert.equal(axis.bounds.max, 0.3); - }); - - test('checkAutoSetFromSeries_noSeries', function() { - var axis = new ChartAxis(-100, 100); - var series = []; - - axis.autoSetFromSeries(series); - assert.equal(axis.bounds.min, -100); - assert.equal(axis.bounds.max, 100); - }); - - test('checkAutoSetFromSeries_oneSeries', function() { - var axis = new ChartAxis(-100, 100); - var series = [buildSeries(-80, 100, -40, 200)]; - - axis.autoSetFromSeries(series, {shrinkMin: true, expandMax: true}); - assert.equal(axis.bounds.min, -80); - assert.equal(axis.bounds.max, 200); - }); - - test('checkAutoSetFromSeries_multipleSeries', function() { - var axis = new ChartAxis(-100, 100); - var series = [ - buildSeries(0, 20, 10, 30), - buildSeries(), - buildSeries(-500) - ]; - - axis.autoSetFromSeries(series, {expandMin: true, shrinkMax: true}); - assert.equal(axis.bounds.min, -500); - assert.equal(axis.bounds.max, 30); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point.html deleted file mode 100644 index f5b5587dcde..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/model/proxy_selectable_item.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A point in a chart series with x (timestamp) and y (value) coordinates - * and an associated model item. The point can optionally also have a base - * y coordinate (which for example corresponds to the bottom edge of the - * associated bar in a bar chart). - * - * @constructor - * @extends {ProxySelectableItem} - */ - function ChartPoint(modelItem, x, y, opt_yBase) { - tr.model.ProxySelectableItem.call(this, modelItem); - this.x = x; - this.y = y; - - // If the base y-coordinate is undefined, the bottom edge of the associated - // bar in a bar chart will start at the outer bottom edge (which is most - // likely slightly below zero). - this.yBase = opt_yBase; - }; - - ChartPoint.prototype = { - __proto__: tr.model.ProxySelectableItem.prototype - }; - - return { - ChartPoint: ChartPoint - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point_test.html deleted file mode 100644 index 491784dbe51..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_point_test.html +++ /dev/null @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ChartPoint = tr.ui.tracks.ChartPoint; - - test('checkFields_withoutYBase', function() { - var event = {}; - var point = new ChartPoint(event, 42, -7); - - assert.equal(point.modelItem, event); - assert.equal(point.x, 42); - assert.equal(point.y, -7); - assert.isUndefined(point.yBase); - }); - - test('checkFields_withYBase', function() { - var event = {}; - var point = new ChartPoint(event, 111, 222, 333); - - assert.equal(point.modelItem, event); - assert.equal(point.x, 111); - assert.equal(point.y, 222); - assert.equal(point.yBase, 333); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series.html deleted file mode 100644 index 05cd5a03a6e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series.html +++ /dev/null @@ -1,494 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/range.html"> -<link rel="import" href="/tracing/ui/base/event_presenter.html"> -<link rel="import" href="/tracing/model/proxy_selectable_item.html"> -<link rel="import" href="/tracing/model/selection_state.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var EventPresenter = tr.ui.b.EventPresenter; - var SelectionState = tr.model.SelectionState; - - /** - * The type of a chart series. - * @enum - */ - var ChartSeriesType = { - LINE: 0, - AREA: 1 - }; - - // The default rendering configuration for ChartSeries. - var DEFAULT_RENDERING_CONFIG = { - // The type of the chart series. - chartType: ChartSeriesType.LINE, - - // The size of a selected point dot in device-independent pixels (circle - // diameter). - selectedPointSize: 4, - - // The size of an unselected point dot in device-independent pixels (square - // width/height). - unselectedPointSize: 3, - - // The color of the chart. - colorId: 0, - - // The width of the top line in device-independent pixels. - lineWidth: 1, - - // Minimum distance between points in physical pixels. Points which are - // closer than this distance will be skipped. - skipDistance: 1, - - // Density in points per physical pixel at which unselected point dots - // become transparent. - unselectedPointDensityTransparent: 0.10, - - // Density in points per physical pixel at which unselected point dots - // become fully opaque. - unselectedPointDensityOpaque: 0.05, - - // Opacity of area chart background. - backgroundOpacity: 0.5 - }; - - // The virtual width of the last point in a series (whose rectangle has zero - // width) in world timestamps difference for the purposes of selection. - var LAST_POINT_WIDTH = 16; - - /** - * Visual components of a ChartSeries. - * @enum - */ - var ChartSeriesComponent = { - BACKGROUND: 0, - LINE: 1, - DOTS: 2 - }; - - /** - * A series of points corresponding to a single chart on a chart track. - * This class is responsible for drawing the actual chart onto canvas. - * - * @constructor - */ - function ChartSeries(points, axis, opt_renderingConfig) { - this.points = points; - this.axis = axis; - - this.useRenderingConfig_(opt_renderingConfig); - } - - ChartSeries.prototype = { - useRenderingConfig_: function(opt_renderingConfig) { - var config = opt_renderingConfig || {}; - - // Store all configuration flags as private properties. - tr.b.iterItems(DEFAULT_RENDERING_CONFIG, function(key, defaultValue) { - var value = config[key]; - if (value === undefined) - value = defaultValue; - this[key + '_'] = value; - }, this); - - // Avoid unnecessary recomputation in getters. - this.topPadding = this.bottomPadding = Math.max( - this.selectedPointSize_, this.unselectedPointSize_) / 2; - }, - - get range() { - var range = new tr.b.Range(); - this.points.forEach(function(point) { - range.addValue(point.y); - }, this); - return range; - }, - - draw: function(ctx, transform, highDetails) { - if (this.points === undefined || this.points.length === 0) - return; - - // Draw the background. - if (this.chartType_ === ChartSeriesType.AREA) { - this.drawComponent_(ctx, transform, ChartSeriesComponent.BACKGROUND, - highDetails); - } - - // Draw the line at the top. - if (this.chartType_ === ChartSeriesType.LINE || highDetails) { - this.drawComponent_(ctx, transform, ChartSeriesComponent.LINE, - highDetails); - } - - // Draw the points. - this.drawComponent_(ctx, transform, ChartSeriesComponent.DOTS, - highDetails); - }, - - drawComponent_: function(ctx, transform, component, highDetails) { - // We need to consider extra pixels outside the visible area to avoid - // visual glitches due to non-zero width of dots. - var extraPixels = 0; - if (component === ChartSeriesComponent.DOTS) { - extraPixels = Math.max( - this.selectedPointSize_, this.unselectedPointSize_); - } - var leftViewX = transform.leftViewX - extraPixels * transform.pixelRatio; - var rightViewX = transform.rightViewX + - extraPixels * transform.pixelRatio; - var leftTimestamp = transform.leftTimestamp - extraPixels; - var rightTimestamp = transform.rightTimestamp + extraPixels; - - // Find the index of the first and last (partially) visible points. - var firstVisibleIndex = tr.b.findLowIndexInSortedArray( - this.points, - function(point) { return point.x; }, - leftTimestamp); - var lastVisibleIndex = tr.b.findLowIndexInSortedArray( - this.points, - function(point) { return point.x; }, - rightTimestamp); - if (lastVisibleIndex >= this.points.length || - this.points[lastVisibleIndex].x > rightTimestamp) { - lastVisibleIndex--; - } - - // Pre-calculate component style which does not depend on individual - // points: - // * Skip distance between points, - // * Selected (circle) and unselected (square) dot size, - // * Unselected dot opacity, - // * Selected dot edge color and width, and - // * Line component color and width. - var viewSkipDistance = this.skipDistance_ * transform.pixelRatio; - var circleRadius; - var squareSize; - var squareHalfSize; - var squareOpacity; - - switch (component) { - case ChartSeriesComponent.DOTS: - // Selected dot edge color and width. - ctx.strokeStyle = EventPresenter.getCounterSeriesColor( - this.colorId_, SelectionState.NONE); - ctx.lineWidth = transform.pixelRatio; - - // Selected (circle) and unselected (square) dot size. - circleRadius = (this.selectedPointSize_ / 2) * transform.pixelRatio; - squareSize = this.unselectedPointSize_ * transform.pixelRatio; - squareHalfSize = squareSize / 2; - - // Unselected dot opacity. - if (!highDetails) { - // Unselected dots are not displayed in 'low details' mode. - squareOpacity = 0; - break; - } - var visibleIndexRange = lastVisibleIndex - firstVisibleIndex; - if (visibleIndexRange <= 0) { - // There is at most one visible point. - squareOpacity = 1; - break; - } - var visibleViewXRange = - transform.worldXToViewX(this.points[lastVisibleIndex].x) - - transform.worldXToViewX(this.points[firstVisibleIndex].x); - if (visibleViewXRange === 0) { - // Multiple visible points which all have the same timestamp. - squareOpacity = 1; - break; - } - var density = visibleIndexRange / visibleViewXRange; - var clampedDensity = tr.b.clamp(density, - this.unselectedPointDensityOpaque_, - this.unselectedPointDensityTransparent_); - var densityRange = this.unselectedPointDensityTransparent_ - - this.unselectedPointDensityOpaque_; - squareOpacity = - (this.unselectedPointDensityTransparent_ - clampedDensity) / - densityRange; - break; - - case ChartSeriesComponent.LINE: - // Line component color and width. - ctx.strokeStyle = EventPresenter.getCounterSeriesColor( - this.colorId_, SelectionState.NONE); - ctx.lineWidth = this.lineWidth_ * transform.pixelRatio; - break; - - case ChartSeriesComponent.BACKGROUND: - // Style depends on the selection state of individual points. - break; - - default: - throw new Error('Invalid component: ' + component); - } - - // The main loop which draws the given component of visible points from - // left to right. Given the potentially large number of points to draw, - // it should be considered performance-critical and function calls should - // be avoided when possible. - // - // Note that the background and line components are drawn in a delayed - // fashion: the rectangle/line that we draw in an iteration corresponds - // to the *previous* point. This does not apply to the dots, whose - // position is independent of the surrounding dots. - var previousViewX = undefined; - var previousViewY = undefined; - var previousViewYBase = undefined; - var lastSelectionState = undefined; - var baseSteps = undefined; - var startIndex = Math.max(firstVisibleIndex - 1, 0); - - for (var i = startIndex; i < this.points.length; i++) { - var currentPoint = this.points[i]; - var currentViewX = transform.worldXToViewX(currentPoint.x); - - // Stop drawing the points once we are to the right of the visible area. - if (currentViewX > rightViewX) { - if (previousViewX !== undefined) { - previousViewX = currentViewX = rightViewX; - if (component === ChartSeriesComponent.BACKGROUND || - component === ChartSeriesComponent.LINE) { - ctx.lineTo(currentViewX, previousViewY); - } - } - break; - } - - if (i + 1 < this.points.length) { - var nextPoint = this.points[i + 1]; - var nextViewX = transform.worldXToViewX(nextPoint.x); - - // Skip points that are too close to each other. - if (previousViewX !== undefined && - nextViewX - previousViewX <= viewSkipDistance && - nextViewX < rightViewX) { - continue; - } - - // Start drawing right at the left side of the visible are (instead - // of potentially very far to the left). - if (currentViewX < leftViewX) { - currentViewX = leftViewX; - } - } - - if (previousViewX !== undefined && - currentViewX - previousViewX < viewSkipDistance) { - // We know that nextViewX > previousViewX + viewSkipDistance, so we - // can safely move this points's x over that much without passing - // nextViewX. This ensures that the previous point is visible when - // zoomed out very far. - currentViewX = previousViewX + viewSkipDistance; - } - - var currentViewY = Math.round(transform.worldYToViewY(currentPoint.y)); - var currentViewYBase; - if (currentPoint.yBase === undefined) { - currentViewYBase = transform.outerBottomViewY; - } else { - currentViewYBase = Math.round( - transform.worldYToViewY(currentPoint.yBase)); - } - var currentSelectionState = currentPoint.selectionState; - - // Actually draw the given component of the point. - switch (component) { - case ChartSeriesComponent.DOTS: - // Change dot style when the selection state changes (and at the - // beginning). - if (currentSelectionState !== lastSelectionState) { - if (currentSelectionState === SelectionState.SELECTED) { - ctx.fillStyle = EventPresenter.getCounterSeriesColor( - this.colorId_, currentSelectionState); - } else if (squareOpacity > 0) { - ctx.fillStyle = EventPresenter.getCounterSeriesColor( - this.colorId_, currentSelectionState, squareOpacity); - } - } - - // Draw the dot for the current point. - if (currentSelectionState === SelectionState.SELECTED) { - ctx.beginPath(); - ctx.arc(currentViewX, currentViewY, circleRadius, 0, 2 * Math.PI); - ctx.fill(); - ctx.stroke(); - } else if (squareOpacity > 0) { - ctx.fillRect(currentViewX - squareHalfSize, - currentViewY - squareHalfSize, squareSize, squareSize); - } - break; - - case ChartSeriesComponent.LINE: - // Draw the top line for the previous point (if applicable), or - // prepare for drawing the top line of the current point in the next - // iteration. - if (previousViewX === undefined) { - ctx.beginPath(); - ctx.moveTo(currentViewX, currentViewY); - } else { - ctx.lineTo(currentViewX, previousViewY); - } - - // Move to the current point coordinate. - ctx.lineTo(currentViewX, currentViewY); - break; - - case ChartSeriesComponent.BACKGROUND: - // Draw the background for the previous point (if applicable). - if (previousViewX !== undefined) - ctx.lineTo(currentViewX, previousViewY); - - // Finish the bottom part of the backgound polygon, change - // background color and start a new polygon when the selection state - // changes (and at the beginning). - if (currentSelectionState !== lastSelectionState) { - if (previousViewX !== undefined) { - var previousBaseStepViewX = currentViewX; - for (var j = baseSteps.length - 1; j >= 0; j--) { - var baseStep = baseSteps[j]; - var baseStepViewX = baseStep.viewX; - var baseStepViewY = baseStep.viewY; - ctx.lineTo(previousBaseStepViewX, baseStepViewY); - ctx.lineTo(baseStepViewX, baseStepViewY); - previousBaseStepViewX = baseStepViewX; - } - ctx.closePath(); - ctx.fill(); - } - ctx.beginPath(); - ctx.fillStyle = EventPresenter.getCounterSeriesColor( - this.colorId_, currentSelectionState, - this.backgroundOpacity_); - ctx.moveTo(currentViewX, currentViewYBase); - baseSteps = []; - } - - if (currentViewYBase !== previousViewYBase || - currentSelectionState !== lastSelectionState) { - baseSteps.push({viewX: currentViewX, viewY: currentViewYBase}); - } - - // Move to the current point coordinate. - ctx.lineTo(currentViewX, currentViewY); - break; - - default: - throw new Error('Not reachable'); - } - - previousViewX = currentViewX; - previousViewY = currentViewY; - previousViewYBase = currentViewYBase; - lastSelectionState = currentSelectionState; - } - - // If we still have an open background or top line polygon (which is - // always the case once we have started drawing due to the delayed fashion - // of drawing), we must close it. - if (previousViewX !== undefined) { - switch (component) { - case ChartSeriesComponent.DOTS: - // All dots were drawn in the main loop. - break; - - case ChartSeriesComponent.LINE: - ctx.stroke(); - break; - - case ChartSeriesComponent.BACKGROUND: - var previousBaseStepViewX = currentViewX; - for (var j = baseSteps.length - 1; j >= 0; j--) { - var baseStep = baseSteps[j]; - var baseStepViewX = baseStep.viewX; - var baseStepViewY = baseStep.viewY; - ctx.lineTo(previousBaseStepViewX, baseStepViewY); - ctx.lineTo(baseStepViewX, baseStepViewY); - previousBaseStepViewX = baseStepViewX; - } - ctx.closePath(); - ctx.fill(); - break; - - default: - throw new Error('Not reachable'); - } - } - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - var points = this.points; - - function getPointWidth(point, i) { - if (i === points.length - 1) - return LAST_POINT_WIDTH * viewPixWidthWorld; - var nextPoint = points[i + 1]; - return nextPoint.x - point.x; - } - - function selectPoint(point) { - point.addToSelection(selection); - } - - tr.b.iterateOverIntersectingIntervals( - this.points, - function(point) { return point.x }, - getPointWidth, - loWX, - hiWX, - selectPoint); - }, - - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - if (this.points === undefined) - return false; - - var index = tr.b.findFirstIndexInArray(this.points, function(point) { - return point.modelItem === event; - }, this); - if (index === -1) - return false; - - var newIndex = index + offset; - if (newIndex < 0 || newIndex >= this.points.length) - return false; - - this.points[newIndex].addToSelection(selection); - return true; - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - if (this.points === undefined) - return; - - var item = tr.b.findClosestElementInSortedArray( - this.points, - function(point) { return point.x }, - worldX, - worldMaxDist); - - if (!item) - return; - - item.addToSelection(selection); - } - }; - - return { - ChartSeries: ChartSeries, - ChartSeriesType: ChartSeriesType - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series_test.html deleted file mode 100644 index bf84ef56c6a..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_series_test.html +++ /dev/null @@ -1,294 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/ui/timeline_display_transform.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_transform.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var EventSet = tr.model.EventSet; - var TimelineDisplayTransform = tr.ui.TimelineDisplayTransform; - var Event = tr.model.Event; - var ChartAxis = tr.ui.tracks.ChartAxis; - var ChartPoint = tr.ui.tracks.ChartPoint; - var ChartSeries = tr.ui.tracks.ChartSeries; - var ChartTransform = tr.ui.tracks.ChartTransform; - var ChartSeriesType = tr.ui.tracks.ChartSeriesType; - - var CANVAS_WIDTH = 800; - var CANVAS_HEIGHT = 80; - - function buildSeries(renderingConfig) { - var points = []; - for (var i = 0; i < 60; i++) { - var event = new Event(); - event.index = i; - var phase = i * Math.PI / 15; - var value = Math.sin(phase); - var peakIndex = Math.floor((phase + Math.PI / 2) / (2 * Math.PI)); - var base = peakIndex % 2 === 0 ? undefined : -1 + value / 1.5; - var point = new ChartPoint(event, i - 30, value, base); - points.push(point); - } - var axis = new ChartAxis(-1, 1); - return new ChartSeries(points, axis, renderingConfig); - } - - function drawSeriesWithDetails(test, series, highDetails) { - var div = document.createElement('div'); - var canvas = document.createElement('canvas'); - div.appendChild(canvas); - - var pixelRatio = window.devicePixelRatio || 1; - - canvas.width = CANVAS_WIDTH * pixelRatio; - canvas.style.width = CANVAS_WIDTH + 'px'; - canvas.height = CANVAS_HEIGHT * pixelRatio; - canvas.style.height = CANVAS_HEIGHT + 'px'; - - var displayTransform = new TimelineDisplayTransform(); - displayTransform.scaleX = CANVAS_WIDTH * pixelRatio / 60; - displayTransform.panX = 30; - - var transform = new ChartTransform( - displayTransform, - series.axis, - CANVAS_WIDTH * pixelRatio, - CANVAS_HEIGHT * pixelRatio, - 10 * pixelRatio, - 10 * pixelRatio, - pixelRatio); - - series.draw(canvas.getContext('2d'), transform, highDetails); - - test.addHTMLOutput(div); - } - - function drawSeries(test, series) { - drawSeriesWithDetails(test, series, false); - drawSeriesWithDetails(test, series, true); - } - - test('instantiate_defaultConfig', function() { - var series = buildSeries(undefined); - drawSeries(this, series); - }); - - test('instantiate_lineChart', function() { - var series = buildSeries({ - chartType: ChartSeriesType.LINE, - colorId: 4, - unselectedPointSize: 6, - lineWidth: 2, - unselectedPointDensityOpaque: 0.08 - }); - drawSeries(this, series); - }); - - test('instantiate_areaChart', function() { - var series = buildSeries({ - chartType: ChartSeriesType.AREA, - colorId: 2, - backgroundOpacity: 0.2 - }); - drawSeries(this, series); - }); - - test('instantiate_largeSkipDistance', function() { - var series = buildSeries({ - chartType: ChartSeriesType.AREA, - colorId: 1, - skipDistance: 40, - unselectedPointDensityTransparent: 0.07 - }); - drawSeries(this, series); - }); - - test('instantiate_selection', function() { - var series = buildSeries({ - chartType: ChartSeriesType.AREA, - colorId: 10 - }); - series.points.forEach(function(point, index) { - point.modelItem.selectionState = index % 4; - }); - drawSeries(this, series); - }); - - test('instantiate_selectionWithAllConfigFlags', function() { - var series = buildSeries({ - chartType: ChartSeriesType.AREA, - selectedPointSize: 10, - unselectedPointSize: 6, - colorId: 15, - lineWidth: 2, - skipDistance: 25, - unselectedPointDensityOpaque: 0.07, - unselectedPointDensityTransparent: 0.09, - backgroundOpacity: 0.8 - }); - series.points.forEach(function(point, index) { - point.modelItem.selectionState = index % 4; - }); - drawSeries(this, series); - }); - - test('checkRange', function() { - var series = buildSeries(); - var range = series.range; - assert.isFalse(range.isEmpty); - assert.closeTo(range.min, -1, 0.05); - assert.closeTo(range.max, 1, 0.05); - }); - - test('checkaddIntersectingEventsInRangeToSelectionInWorldSpace', function() { - var series = buildSeries(); - - // Too far left. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - -1000, -30.5, 40, sel); - assert.lengthOf(sel, 0); - - // Select first point. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - -30.5, -29.5, 40, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 0); - - // Select second point. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - -28.8, -28.2, 40, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 1); - - // Select points in the middle. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - -0.99, 1.01, 40, sel); - assert.lengthOf(sel, 3); - assert.equal(sel[0].index, 29); - assert.equal(sel[1].index, 30); - assert.equal(sel[2].index, 31); - - // Select the last point. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - 668.99, 668.99, 40, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 59); - - // Too far right. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - 669.01, 2000, 40, sel); - assert.lengthOf(sel, 0); - - // Select everything. - var sel = new EventSet(); - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - -29.01, 669.01, 40, sel); - assert.lengthOf(sel, 60); - }); - - test('checkaddEventNearToProvidedEventToSelection', function() { - var series = buildSeries(); - - // Invalid event. - var sel = new EventSet(); - assert.isFalse(series.addEventNearToProvidedEventToSelection( - new Event(), 1, sel)); - assert.lengthOf(sel, 0); - - var sel = new EventSet(); - assert.isFalse(series.addEventNearToProvidedEventToSelection( - new Event(), -1, sel)); - assert.lengthOf(sel, 0); - - // First point. - var sel = new EventSet(); - assert.isTrue(series.addEventNearToProvidedEventToSelection( - series.points[0].modelItem, 1, sel)); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 1); - - var sel = new EventSet(); - assert.isFalse(series.addEventNearToProvidedEventToSelection( - series.points[0].modelItem, -1, sel)); - assert.lengthOf(sel, 0); - - // Middle point. - var sel = new EventSet(); - assert.isTrue(series.addEventNearToProvidedEventToSelection( - series.points[30].modelItem, 1, sel)); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 31); - - var sel = new EventSet(); - assert.isTrue(series.addEventNearToProvidedEventToSelection( - series.points[30].modelItem, -1, sel)); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 29); - - // Last point. - var sel = new EventSet(); - assert.isFalse(series.addEventNearToProvidedEventToSelection( - series.points[59].modelItem, 1, sel)); - assert.lengthOf(sel, 0); - - var sel = new EventSet(); - assert.isTrue(series.addEventNearToProvidedEventToSelection( - series.points[59].modelItem, -1, sel)); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 58); - }); - - test('checkAddClosestEventToSelection', function() { - var series = buildSeries(); - - // Left of first point. - var sel = new EventSet(); - series.addClosestEventToSelection(-40, 9, -0.5, 0.5, sel); - assert.lengthOf(sel, 0); - - var sel = new EventSet(); - series.addClosestEventToSelection(-40, 11, -0.5, 0.5, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 0); - - // Between two points. - var sel = new EventSet(); - series.addClosestEventToSelection(0.4, 0.3, -0.5, 0.5, sel); - assert.lengthOf(sel, 0); - - var sel = new EventSet(); - series.addClosestEventToSelection(0.4, 0.4, -0.5, 0.5, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 30); - - // Right of last point. - var sel = new EventSet(); - series.addClosestEventToSelection(40, 10, -0.5, 0.5, sel); - assert.lengthOf(sel, 0); - - var sel = new EventSet(); - series.addClosestEventToSelection(40, 12, -0.5, 0.5, sel); - assert.lengthOf(sel, 1); - assert.equal(sel[0].index, 59); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track.html deleted file mode 100644 index 86e80ae1cde..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track.html +++ /dev/null @@ -1,241 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/tracks/chart_transform.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<style> -.chart-track { - height: 30px; - position: relative; -} -</style> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A track that displays a chart. - * - * @constructor - * @extends {Track} - */ - var ChartTrack = - tr.ui.b.define('chart-track', tr.ui.tracks.Track); - - ChartTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('chart-track'); - this.series_ = undefined; - - // GUID -> {axis: ChartAxis, series: [ChartSeries]}. - this.axisGuidToAxisData_ = undefined; - - // The maximum top and bottom padding of all series. - this.topPadding_ = undefined; - this.bottomPadding_ = undefined; - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - set heading(heading) { - this.heading_.heading = heading; - }, - - get heading() { - return this.heading_.heading; - }, - - set tooltip(tooltip) { - this.heading_.tooltip = tooltip; - }, - - get series() { - return this.series_; - }, - - /** - * Set the list of chart series to be displayed on this track. The list - * is assumed to be sorted in increasing z-order (i.e. the last series in - * the list will be drawn at the top). - */ - set series(series) { - this.series_ = series; - this.calculateAxisDataAndPadding_(); - this.invalidateDrawingContainer(); - }, - - get height() { - return window.getComputedStyle(this).height; - }, - - set height(height) { - this.style.height = height; - this.invalidateDrawingContainer(); - }, - - get hasVisibleContent() { - return !!this.series && this.series.length > 0; - }, - - calculateAxisDataAndPadding_: function() { - if (!this.series_) { - this.axisGuidToAxisData_ = undefined; - this.topPadding_ = undefined; - this.bottomPadding_ = undefined; - return; - } - - var axisGuidToAxisData = {}; - var topPadding = 0; - var bottomPadding = 0; - - this.series_.forEach(function(series) { - var axis = series.axis; - var axisGuid = axis.guid; - if (!(axisGuid in axisGuidToAxisData)) { - axisGuidToAxisData[axisGuid] = { - axis: axis, - series: [] - }; - } - axisGuidToAxisData[axisGuid].series.push(series); - topPadding = Math.max(topPadding, series.topPadding); - bottomPadding = Math.max(bottomPadding, series.bottomPadding); - }, this); - - this.axisGuidToAxisData_ = axisGuidToAxisData; - this.topPadding_ = topPadding; - this.bottomPadding_ = bottomPadding; - }, - - draw: function(type, viewLWorld, viewRWorld) { - switch (type) { - case tr.ui.tracks.DrawType.GENERAL_EVENT: - this.drawChart_(viewLWorld, viewRWorld); - break; - } - }, - - drawChart_: function(viewLWorld, viewRWorld) { - if (!this.series_) - return; - - var ctx = this.context(); - - // Get track drawing parameters. - var displayTransform = this.viewport.currentDisplayTransform; - var pixelRatio = window.devicePixelRatio || 1; - var bounds = this.getBoundingClientRect(); - var highDetails = this.viewport.highDetails; - - // Pre-multiply all device-independent pixel parameters with the pixel - // ratio to avoid unnecessary recomputation in the performance-critical - // drawing code. - var width = bounds.width * pixelRatio; - var height = bounds.height * pixelRatio; - var topPadding = this.topPadding_ * pixelRatio; - var bottomPadding = this.bottomPadding_ * pixelRatio; - - // Set up clipping. - ctx.save(); - ctx.beginPath(); - ctx.rect(0, 0, width, height); - ctx.clip(); - - // Draw all series in the increasing z-order. - this.series_.forEach(function(series) { - var chartTransform = new tr.ui.tracks.ChartTransform( - displayTransform, series.axis, width, height, topPadding, - bottomPadding, pixelRatio); - series.draw(ctx, chartTransform, highDetails); - }, this); - - // Stop clipping. - ctx.restore(); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - // TODO(petrcermak): Consider adding the series to the track map instead - // of the track (a potential performance optimization). - this.series_.forEach(function(series) { - series.points.forEach(function(point) { - point.addToTrackMap(eventToTrackMap, this); - }, this); - }, this); - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - this.series_.forEach(function(series) { - series.addIntersectingEventsInRangeToSelectionInWorldSpace( - loWX, hiWX, viewPixWidthWorld, selection); - }, this); - }, - - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - var foundItem = false; - this.series_.forEach(function(series) { - foundItem = foundItem || series.addEventNearToProvidedEventToSelection( - event, offset, selection); - }, this); - return foundItem; - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - // Do nothing. - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - this.series_.forEach(function(series) { - series.addClosestEventToSelection( - worldX, worldMaxDist, loY, hiY, selection); - }, this); - }, - - /** - * Automatically set the bounds of all axes on this track from the range of - * values of all series (in this track) associated with each of them. - * - * See the description of ChartAxis.autoSetFromRange for the optional - * configuration argument flags. - */ - autoSetAllAxes: function(opt_config) { - tr.b.iterItems(this.axisGuidToAxisData_, function(axisGuid, axisData) { - var axis = axisData.axis; - var series = axisData.series; - axis.autoSetFromSeries(series, opt_config); - }, this); - }, - - /** - * Automatically set the bounds of the provided axis from the range of - * values of all series (in this track) associated with it. - * - * See the description of ChartAxis.autoSetFromRange for the optional - * configuration argument flags. - */ - autoSetAxis: function(axis, opt_config) { - var series = this.axisGuidToAxisData_[axis.guid].series; - axis.autoSetFromSeries(series, opt_config); - } - }; - - return { - ChartTrack: ChartTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track_test.html deleted file mode 100644 index 7595a2e2cd7..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_track_test.html +++ /dev/null @@ -1,236 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_track.html"> -<link rel="import" href="/tracing/ui/tracks/event_to_track_map.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ChartAxis = tr.ui.tracks.ChartAxis; - var ChartPoint = tr.ui.tracks.ChartPoint; - var ChartSeries = tr.ui.tracks.ChartSeries; - var ChartSeriesType = tr.ui.tracks.ChartSeriesType; - var ChartTrack = tr.ui.tracks.ChartTrack; - var Event = tr.model.Event; - var EventSet = tr.model.EventSet; - var EventToTrackMap = tr.ui.tracks.EventToTrackMap; - var SelectionState = tr.model.SelectionState; - var Viewport = tr.ui.TimelineViewport; - - function buildPoint(x, y) { - var event = new Event(); - return new ChartPoint(event, x, y); - } - - function buildTrack(opt_viewport) { - var viewport = opt_viewport || new Viewport(document.createElement('div')); - - var axis1 = new ChartAxis(0, 2); - var axis2 = new ChartAxis(-100, 100); - - var points1 = [ - buildPoint(-2.5, 2), - buildPoint(-1.5, 1), - buildPoint(-0.5, 0), - buildPoint(0.5, 1), - buildPoint(1.5, 2), - buildPoint(2.5, 0) - ]; - var renderingConfig1 = { - chartType: ChartSeriesType.AREA, - colorId: 6, - selectedPointSize: 7 - }; - var series1 = new ChartSeries(points1, axis1, renderingConfig1); - - var points2 = [ - buildPoint(-2.3, 0.2), - buildPoint(-1.3, 1.2), - buildPoint(-0.3, 2.2), - buildPoint(0.3, 1.2), - buildPoint(1.3, 0.2), - buildPoint(2.3, 0) - ]; - var renderingConfig2 = { - chartType: ChartSeriesType.AREA, - colorId: 4, - selectedPointSize: 10 - }; - var series2 = new ChartSeries(points2, axis1, renderingConfig2); - - var points3 = [ - buildPoint(-3, -50), - buildPoint(-2.4, -40), - buildPoint(-1.8, -30), - buildPoint(-1.2, -20), - buildPoint(-0.6, -10), - buildPoint(0, 0), - buildPoint(0.6, 10), - buildPoint(1.2, 20), - buildPoint(1.8, 30), - buildPoint(2.4, 40), - buildPoint(3, 50) - ]; - var renderingConfig3 = { - chartType: ChartSeriesType.LINE, - lineWidth: 2 - }; - var series3 = new ChartSeries(points3, axis2, renderingConfig3); - - var track = new ChartTrack(viewport); - track.series = [series1, series2, series3]; - - return track; - } - - test('instantiate_lowDetailsWithoutSelection', function() { - var div = document.createElement('div'); - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = buildTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - var dt = new tr.ui.TimelineDisplayTransform(); - var pixelRatio = window.devicePixelRatio || 1; - dt.xSetWorldBounds(-3, 3, track.clientWidth * pixelRatio); - track.viewport.setDisplayTransformImmediately(dt); - - track.height = '100px'; - }); - - test('instantiate_highDetailsWithSelection', function() { - var div = document.createElement('div'); - var viewport = new Viewport(div); - viewport.highDetails = true; - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = buildTrack(viewport); - drawingContainer.appendChild(track); - - track.series[0].points[1].modelItem.selectionState = - SelectionState.SELECTED; - track.series[1].points[1].modelItem.selectionState = - SelectionState.SELECTED; - track.series[2].points[3].modelItem.selectionState = - SelectionState.SELECTED; - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - var dt = new tr.ui.TimelineDisplayTransform(); - var pixelRatio = window.devicePixelRatio || 1; - dt.xSetWorldBounds(-3, 3, track.clientWidth * pixelRatio); - track.viewport.setDisplayTransformImmediately(dt); - - track.height = '100px'; - }); - - test('checkPadding', function() { - var track = buildTrack(); - - // Padding should be equal to half maximum point size. - assert.equal(track.topPadding_, 5); - assert.equal(track.bottomPadding_, 5); - }); - - test('checkAddEventsToTrackMap', function() { - var track = buildTrack(); - var eventToTrackMap = new EventToTrackMap(); - track.addEventsToTrackMap(eventToTrackMap); - assert.lengthOf(Object.keys(eventToTrackMap), 23); - }); - - test('checkaddIntersectingEventsInRangeToSelectionInWorldSpace', function() { - var track = buildTrack(); - - var sel = new EventSet(); - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - -1.1, -0.7, 0.01, sel); - assert.lengthOf(sel, 3); - assert.equal(sel[0], track.series[0].points[1].modelItem); - assert.equal(sel[1], track.series[1].points[1].modelItem); - assert.equal(sel[2], track.series[2].points[3].modelItem); - }); - - test('checkaddEventNearToProvidedEventToSelection', function() { - var track = buildTrack(); - - // Fail to find a near item to the left in any series. - var sel = new EventSet(); - assert.isFalse(track.addEventNearToProvidedEventToSelection( - track.series[0].points[0].modelItem, -1, sel)); - assert.lengthOf(sel, 0); - - // Succeed at finding a near item to the right of one series. - var sel = new EventSet(); - assert.isTrue(track.addEventNearToProvidedEventToSelection( - track.series[1].points[1].modelItem, 1, sel)); - assert.lengthOf(sel, 1); - assert.equal(sel[0], track.series[1].points[2].modelItem); - }); - - test('checkAddClosestEventToSelection', function() { - var track = buildTrack(); - - var sel = new EventSet(); - track.addClosestEventToSelection(-0.8, 0.4, 0.5, 1.5, sel); - assert.lengthOf(sel, 2); - assert.equal(sel[0], track.series[0].points[2].modelItem); - assert.equal(sel[1], track.series[2].points[4].modelItem); - }); - - test('checkAutoSetAllAxes', function() { - var track = buildTrack(); - var axis1 = track.series[0].axis; - var axis2 = track.series[2].axis; - - track.autoSetAllAxes({expandMax: true, shrinkMax: true}); - - // Min bounds of both axes should not have been modified. - assert.equal(axis1.bounds.min, 0); - assert.equal(axis2.bounds.min, -100); - - // Max bounds of both axes should have been modified. - assert.equal(axis1.bounds.max, 2.2); - assert.equal(axis2.bounds.max, 50); - }); - - test('checkAutoSetAxis', function() { - var track = buildTrack(); - var axis1 = track.series[0].axis; - var axis2 = track.series[2].axis; - - track.autoSetAxis(axis2, - {expandMin: true, shrinkMin: true, expandMax: true, shrinkMax: true}); - - // First axis should not have been modified. - assert.equal(axis1.bounds.min, 0); - assert.equal(axis1.bounds.max, 2); - - // Second axis should have been modified. - assert.equal(axis2.bounds.min, -50); - assert.equal(axis2.bounds.max, 50); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform.html deleted file mode 100644 index ff98f4057e0..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform.html +++ /dev/null @@ -1,84 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/base.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A helper object encapsulating all parameters necessary to draw a chart - * series and provides conversion between world coordinates and physical - * pixels. - * - * All parameters (except for pixelRatio) are assumed to be in physical pixels - * (i.e. already pre-multiplied with pixelRatio). - * - * The diagram below explains the meaning of the resulting fields with - * respect to a chart track: - * - * outerTopViewY -> +--------------------/-\-------+ <- Top padding - * innerTopViewY -> + - - - - - - - - - -| |- - - -+ <- Axis max - * | .. ==\-/== | - * | == Series == | - * | ==/-\== .. | - * innerBottomViewY -> + - - -Point- - - - - - - - - -+ <- Axis min - * outerBottomViewY -> +-------\-/--------------------+ <- Bottom padding - * ^ ^ - * leftViewX rightViewX - * leftTimeStamp rightTimestamp - * - * Labels starting with a lower case letter are the resulting fields of the - * transform object. Labels starting with an upper case letter correspond - * to the relevant chart track concepts. - * - * @constructor - */ - function ChartTransform(displayTransform, axis, trackWidth, - trackHeight, topPadding, bottomPadding, pixelRatio) { - this.pixelRatio = pixelRatio; - - // X axis. - this.leftViewX = 0; - this.rightViewX = trackWidth; - this.leftTimestamp = displayTransform.xViewToWorld(this.leftViewX); - this.rightTimestamp = displayTransform.xViewToWorld(this.rightViewX); - - this.displayTransform_ = displayTransform; - - // Y axis. - this.outerTopViewY = 0; - this.innerTopViewY = topPadding; - this.innerBottomViewY = trackHeight - bottomPadding; - this.outerBottomViewY = trackHeight; - - this.axis_ = axis; - this.innerHeight_ = this.innerBottomViewY - this.innerTopViewY; - }; - - ChartTransform.prototype = { - worldXToViewX: function(worldX) { - return this.displayTransform_.xWorldToView(worldX); - }, - - viewXToWorldX: function(viewX) { - return this.displayTransform_.xViewToWorld(viewX); - }, - - worldYToViewY: function(worldY) { - var innerHeightCoefficient = 1 - this.axis_.valueToUnitRange(worldY); - return innerHeightCoefficient * this.innerHeight_ + this.innerTopViewY; - } - }; - - return { - ChartTransform: ChartTransform - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform_test.html deleted file mode 100644 index d7652260e09..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/chart_transform_test.html +++ /dev/null @@ -1,86 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_display_transform.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_transform.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var TimelineDisplayTransform = tr.ui.TimelineDisplayTransform; - var ChartTransform = tr.ui.tracks.ChartTransform; - var ChartAxis = tr.ui.tracks.ChartAxis; - - function buildChartTransform() { - var displayTransform = new TimelineDisplayTransform(); - displayTransform.panX = -20; - displayTransform.scaleX = 0.5; - - var axis = new ChartAxis(-100, 100); - - var chartTransform = new ChartTransform( - displayTransform, - axis, - 500, /* trackWidth */ - 80, /* trackHeight */ - 15, /* topPadding */ - 5, /* bottomPadding */ - 3 /* pixelRatio */); - - return chartTransform; - } - - test('checkFields', function() { - var t = buildChartTransform(); - - assert.equal(t.pixelRatio, 3); - - assert.equal(t.leftViewX, 0); - assert.equal(t.rightViewX, 500); - assert.equal(t.leftTimestamp, 20); - assert.equal(t.rightTimestamp, 1020); - - assert.equal(t.outerTopViewY, 0); - assert.equal(t.innerTopViewY, 15); - assert.equal(t.innerBottomViewY, 75); - assert.equal(t.outerBottomViewY, 80); - }); - - test('checkWorldXToViewX', function() { - var t = buildChartTransform(); - - assert.equal(t.worldXToViewX(-100), -60); - assert.equal(t.worldXToViewX(0), -10); - assert.equal(t.worldXToViewX(520), 250); - assert.equal(t.worldXToViewX(1020), 500); - assert.equal(t.worldXToViewX(1200), 590); - }); - - test('checkViewXToWorldX', function() { - var t = buildChartTransform(); - - assert.equal(t.viewXToWorldX(-60), -100); - assert.equal(t.viewXToWorldX(-10), 0); - assert.equal(t.viewXToWorldX(250), 520); - assert.equal(t.viewXToWorldX(500), 1020); - assert.equal(t.viewXToWorldX(590), 1200); - }); - - test('checkWorldYToViewY', function() { - var t = buildChartTransform(); - - assert.equal(t.worldYToViewY(-200), 105); - assert.equal(t.worldYToViewY(-100), 75); - assert.equal(t.worldYToViewY(0), 45); - assert.equal(t.worldYToViewY(100), 15); - assert.equal(t.worldYToViewY(200), -15); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_to_track_map.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_to_track_map.html deleted file mode 100644 index bb4b549ae08..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_to_track_map.html +++ /dev/null @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/base.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * ContainerToTrackMap is a class to handle building and accessing a map - * between an EventContainer's stableId and its handling track. - * - * @constructor - */ - function ContainerToTrackMap() { - this.stableIdToTrackMap_ = {}; - } - - ContainerToTrackMap.prototype = { - addContainer: function(container, track) { - if (!track) - throw new Error('Must provide a track.'); - this.stableIdToTrackMap_[container.stableId] = track; - }, - - clear: function() { - this.stableIdToTrackMap_ = {}; - }, - - getTrackByStableId: function(stableId) { - return this.stableIdToTrackMap_[stableId]; - } - }; - - return { - ContainerToTrackMap: ContainerToTrackMap - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_track.html deleted file mode 100644 index cdad43bef5c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/container_track.html +++ /dev/null @@ -1,132 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/task.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> -<link rel="import" href="/tracing/core/filter.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var Task = tr.b.Task; - - /** - * A generic track that contains other tracks as its children. - * @constructor - */ - var ContainerTrack = tr.ui.b.define('container-track', tr.ui.tracks.Track); - ContainerTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - }, - - detach: function() { - this.textContent = ''; - }, - - get tracks_() { - var tracks = []; - for (var i = 0; i < this.children.length; i++) { - if (this.children[i] instanceof tr.ui.tracks.Track) - tracks.push(this.children[i]); - } - return tracks; - }, - - drawTrack: function(type) { - this.tracks_.forEach(function(track) { - track.drawTrack(type); - }); - }, - - /** - * Adds items intersecting the given range to a selection. - * @param {number} loVX Lower X bound of the interval to search, in - * viewspace. - * @param {number} hiVX Upper X bound of the interval to search, in - * viewspace. - * @param {number} loY Lower Y bound of the interval to search, in - * viewspace space. - * @param {number} hiY Upper Y bound of the interval to search, in - * viewspace space. - * @param {Selection} selection Selection to which to add results. - */ - addIntersectingEventsInRangeToSelection: function( - loVX, hiVX, loY, hiY, selection) { - for (var i = 0; i < this.tracks_.length; i++) { - var trackClientRect = this.tracks_[i].getBoundingClientRect(); - var a = Math.max(loY, trackClientRect.top); - var b = Math.min(hiY, trackClientRect.bottom); - if (a <= b) - this.tracks_[i].addIntersectingEventsInRangeToSelection( - loVX, hiVX, loY, hiY, selection); - } - - tr.ui.tracks.Track.prototype.addIntersectingEventsInRangeToSelection. - apply(this, arguments); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - for (var i = 0; i < this.children.length; ++i) - this.children[i].addEventsToTrackMap(eventToTrackMap); - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - for (var i = 0; i < this.tracks_.length; i++) - this.tracks_[i].addAllEventsMatchingFilterToSelection( - filter, selection); - }, - - addAllEventsMatchingFilterToSelectionAsTask: function(filter, selection) { - var task = new Task(); - for (var i = 0; i < this.tracks_.length; i++) { - task.subTask(function(i) { return function() { - this.tracks_[i].addAllEventsMatchingFilterToSelection( - filter, selection); - } }(i), this); - } - return task; - }, - - addClosestEventToSelection: function( - worldX, worldMaxDist, loY, hiY, selection) { - for (var i = 0; i < this.tracks_.length; i++) { - var trackClientRect = this.tracks_[i].getBoundingClientRect(); - var a = Math.max(loY, trackClientRect.top); - var b = Math.min(hiY, trackClientRect.bottom); - if (a <= b) { - this.tracks_[i].addClosestEventToSelection( - worldX, worldMaxDist, loY, hiY, selection); - } - } - - tr.ui.tracks.Track.prototype.addClosestEventToSelection. - apply(this, arguments); - }, - - addContainersToTrackMap: function(containerToTrackMap) { - this.tracks_.forEach(function(track) { - track.addContainersToTrackMap(containerToTrackMap); - }); - }, - - clearTracks_: function() { - this.tracks_.forEach(function(track) { - this.removeChild(track); - }, this); - } - }; - - return { - ContainerTrack: ContainerTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track.html deleted file mode 100644 index 759b2433596..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track.html +++ /dev/null @@ -1,80 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_track.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A track that displays a Counter object. - * @constructor - * @extends {ChartTrack} - */ - var CounterTrack = tr.ui.b.define('counter-track', tr.ui.tracks.ChartTrack); - - CounterTrack.prototype = { - __proto__: tr.ui.tracks.ChartTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ChartTrack.prototype.decorate.call(this, viewport); - this.classList.add('counter-track'); - }, - - get counter() { - return this.chart; - }, - - set counter(counter) { - this.heading = counter.name + ': '; - this.series = CounterTrack.buildChartSeriesFromCounter(counter); - this.autoSetAllAxes({expandMax: true}); - }, - - getModelEventFromItem: function(chartValue) { - return chartValue; - } - }; - - CounterTrack.buildChartSeriesFromCounter = function(counter) { - var numSeries = counter.series.length; - var totals = counter.totals; - - // Create one common axis for all series. - var chartAxis = new tr.ui.tracks.ChartAxis(0, undefined); - - // Build one chart series for each counter series. - var chartSeries = counter.series.map(function(series, seriesIndex) { - var chartPoints = series.samples.map(function(sample, sampleIndex) { - var total = totals[sampleIndex * numSeries + seriesIndex]; - return new tr.ui.tracks.ChartPoint(sample, sample.timestamp, total); - }); - var renderingConfig = { - chartType: tr.ui.tracks.ChartSeriesType.AREA, - colorId: series.color - }; - return new tr.ui.tracks.ChartSeries( - chartPoints, chartAxis, renderingConfig); - }); - - // Show the first series (with the smallest cumulative value) at the top. - chartSeries.reverse(); - - return chartSeries; - }; - - return { - CounterTrack: CounterTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_perf_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_perf_test.html deleted file mode 100644 index afa3ad3f967..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_perf_test.html +++ /dev/null @@ -1,129 +0,0 @@ -<!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/core/test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/ui/extras/full_config.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - function getSynchronous(url) { - var req = new XMLHttpRequest(); - req.open('GET', url, false); - // Without the mime type specified like this, the file's bytes are not - // retrieved correctly. - req.overrideMimeType('text/plain; charset=x-user-defined'); - req.send(null); - return req.responseText; - } - - var ZOOM_STEPS = 10; - var ZOOM_COEFFICIENT = 1.2; - - var model = undefined; - - var drawingContainer; - var viewportDiv; - - var viewportWidth; - var worldMid; - - var startScale = undefined; - - function timedCounterTrackPerfTest(name, testFn, iterations) { - - function setUpOnce() { - if (model !== undefined) - return; - var fileUrl = '/test_data/counter_tracks.html'; - var events = getSynchronous(fileUrl); - model = tr.c.TestUtils.newModelWithEvents([events]); - } - - function setUp() { - setUpOnce(); - viewportDiv = document.createElement('div'); - - var viewport = new tr.ui.TimelineViewport(viewportDiv); - - drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - viewport.modelTrackContainer = drawingContainer; - - var modelTrack = new tr.ui.tracks.ModelTrack(viewport); - drawingContainer.appendChild(modelTrack); - - modelTrack.model = model; - - viewportDiv.appendChild(drawingContainer); - - this.addHTMLOutput(viewportDiv); - - // Size the canvas. - drawingContainer.updateCanvasSizeIfNeeded_(); - - // Size the viewport. - viewportWidth = drawingContainer.canvas.width; - var min = model.bounds.min; - var range = model.bounds.range; - worldMid = min + range / 2; - - var boost = range * 0.15; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(min - boost, min + range + boost, viewportWidth); - modelTrack.viewport.setDisplayTransformImmediately(dt); - startScale = dt.scaleX; - - // Select half of the counter samples. - for (var pid in model.processes) { - var counters = model.processes[pid].counters; - for (var cid in counters) { - var series = counters[cid].series; - for (var i = 0; i < series.length; i++) { - var samples = series[i].samples; - for (var j = Math.floor(samples.length / 2); j < samples.length; - j++) { - samples[j].selectionState = - tr.model.SelectionState.SELECTED; - } - } - } - } - }; - - function tearDown() { - viewportDiv.innerText = ''; - drawingContainer = undefined; - } - - timedPerfTest(name, testFn, { - setUp: setUp, - tearDown: tearDown, - iterations: iterations - }); - } - - var n110100 = [1, 10, 100]; - n110100.forEach(function(val) { - timedCounterTrackPerfTest( - 'draw_softwareCanvas_' + val, - function() { - var scale = startScale; - for (var i = 0; i < ZOOM_STEPS; i++) { - var dt = drawingContainer.viewport.currentDisplayTransform.clone(); - scale *= ZOOM_COEFFICIENT; - dt.scaleX = scale; - dt.xPanWorldPosToViewPos(worldMid, 'center', viewportWidth); - drawingContainer.viewport.setDisplayTransformImmediately(dt); - drawingContainer.draw_(); - } - }, val); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_test.html deleted file mode 100644 index 8cf6dcdfa00..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/counter_track_test.html +++ /dev/null @@ -1,201 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ColorScheme = tr.b.ColorScheme; - var Counter = tr.model.Counter; - var Viewport = tr.ui.TimelineViewport; - var CounterTrack = tr.ui.tracks.CounterTrack; - - var runTest = function(timestamps, samples, testFn) { - var testEl = document.createElement('div'); - - var ctr = new Counter(undefined, 'foo', '', 'foo'); - var n = samples.length; - - for (var i = 0; i < n; ++i) { - ctr.addSeries(new tr.model.CounterSeries('value' + i, - ColorScheme.getColorIdForGeneralPurposeString('value' + i))); - } - - for (var i = 0; i < samples.length; ++i) { - for (var k = 0; k < timestamps.length; ++k) { - ctr.series[i].addCounterSample(timestamps[k], samples[i][k]); - } - } - - ctr.updateBounds(); - - var viewport = new Viewport(testEl); - - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - testEl.appendChild(drawingContainer); - - var track = new CounterTrack(viewport); - drawingContainer.appendChild(track); - this.addHTMLOutput(testEl); - - // Force the container to update sizes so the test can use coordinates that - // make sense. This has to be after the adding of the track as we need to - // use the track header to figure out our positioning. - drawingContainer.updateCanvasSizeIfNeeded_(); - - var pixelRatio = window.devicePixelRatio || 1; - - track.heading = ctr.name; - track.counter = ctr; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 10, track.clientWidth * pixelRatio); - track.viewport.setDisplayTransformImmediately(dt); - - testFn(ctr, drawingContainer, track); - }; - - test('instantiate', function() { - var ctr = new Counter(undefined, 'testBasicCounter', '', - 'testBasicCounter'); - ctr.addSeries(new tr.model.CounterSeries('value1', - ColorScheme.getColorIdForGeneralPurposeString( - 'testBasicCounter.value1'))); - ctr.addSeries(new tr.model.CounterSeries('value2', - ColorScheme.getColorIdForGeneralPurposeString( - 'testBasicCounter.value2'))); - - var timestamps = [0, 1, 2, 3, 4, 5, 6, 7]; - var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1], - [5, 3, 1, 1.1, 0, 7, 0, 0.5]]; - for (var i = 0; i < samples.length; ++i) { - for (var k = 0; k < timestamps.length; ++k) { - ctr.series[i].addCounterSample(timestamps[k], samples[i][k]); - } - } - - ctr.updateBounds(); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = new CounterTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.heading = ctr.name; - track.counter = ctr; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 7.7, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('basicCounterXPointPicking', function() { - var timestamps = [0, 1, 2, 3, 4, 5, 6, 7]; - var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1], - [5, 3, 1, 1.1, 0, 7, 0, 0.5]]; - - runTest.call(this, timestamps, samples, function(ctr, container, track) { - var clientRect = track.getBoundingClientRect(); - var y75 = clientRect.top + (0.75 * clientRect.height); - - // In bounds. - var sel = new tr.model.EventSet(); - var x = 0.15 * clientRect.width; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y75, y75 + 1, sel); - - var nextSeriesIndex = 1; - assert.equal(sel.length, 2); - for (var event of sel) { - assert.equal(event.series.counter, ctr); - assert.equal(event.getSampleIndex(), 1); - assert.equal(event.series.seriesIndex, nextSeriesIndex--); - } - - // Outside bounds. - sel = new tr.model.EventSet(); - var x = -0.5 * clientRect.width; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y75, y75 + 1, sel); - assert.equal(sel.length, 0); - - sel = new tr.model.EventSet(); - var x = 0.8 * clientRect.width; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y75, y75 + 1, sel); - assert.equal(sel.length, 0); - }); - }); - - test('counterTrackAddClosestEventToSelection', function() { - var timestamps = [0, 1, 2, 3, 4, 5, 6, 7]; - var samples = [[0, 4, 1, 2, 3, 1, 3, 3.1], - [5, 3, 1, 1.1, 0, 7, 0, 0.5]]; - - runTest.call(this, timestamps, samples, function(ctr, container, track) { - // Before with not range. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(-1, 0, 0, 0, sel); - assert.equal(sel.length, 0); - - // Before with negative range. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(-1, -10, 0, 0, sel); - assert.equal(sel.length, 0); - - // Before first sample. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(-1, 1, 0, 0, sel); - assert.equal(sel.length, 2); - for (var event of sel) - assert.equal(event.getSampleIndex(), 0); - - // Between and closer to sample before. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(1.3, 1, 0, 0, sel); - assert.equal(sel.length, 2); - for (var event of sel) - assert.equal(event.getSampleIndex(), 1); - - // Between samples with bad range. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(1.45, 0.25, 0, 0, sel); - assert.equal(sel.length, 0); - - // Between and closer to next sample. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(4.7, 6, 0, 0, sel); - assert.equal(sel.length, 2); - for (var event of sel) - assert.equal(event.getSampleIndex(), 5); - - // After last sample with good range. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(8.5, 2, 0, 0, sel); - assert.equal(sel.length, 2); - for (var event of sel) - assert.equal(event.getSampleIndex(), 7); - - // After last sample with bad range. - var sel = new tr.model.EventSet(); - track.addClosestEventToSelection(10, 1, 0, 0, sel); - assert.equal(sel.length, 0); - }); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track.html deleted file mode 100644 index 84b7afe6582..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track.html +++ /dev/null @@ -1,139 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/filter.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/slice_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * Visualizes a Cpu using a series of SliceTracks. - * @constructor - */ - var CpuTrack = - tr.ui.b.define('cpu-track', tr.ui.tracks.ContainerTrack); - CpuTrack.prototype = { - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.classList.add('cpu-track'); - this.detailedMode_ = true; - }, - - get cpu() { - return this.cpu_; - }, - - set cpu(cpu) { - this.cpu_ = cpu; - this.updateContents_(); - }, - - get detailedMode() { - return this.detailedMode_; - }, - - set detailedMode(detailedMode) { - this.detailedMode_ = detailedMode; - this.updateContents_(); - }, - - get tooltip() { - return this.tooltip_; - }, - - set tooltip(value) { - this.tooltip_ = value; - this.updateContents_(); - }, - - get hasVisibleContent() { - if (this.cpu_ === undefined) - return false; - var cpu = this.cpu_; - if (cpu.slices.length) - return true; - if (cpu.samples && cpu.samples.length) - return true; - if (tr.b.dictionaryLength(cpu.counters) > 0) - return true; - return false; - }, - - updateContents_: function() { - this.detach(); - if (!this.cpu_) - return; - var slices = this.cpu_.slices; - if (slices.length) { - var track = new tr.ui.tracks.SliceTrack(this.viewport); - track.slices = slices; - track.heading = this.cpu_.userFriendlyName + ':'; - this.appendChild(track); - } - - if (this.detailedMode_) { - this.appendSamplesTracks_(); - - for (var counterName in this.cpu_.counters) { - var counter = this.cpu_.counters[counterName]; - track = new tr.ui.tracks.CounterTrack(this.viewport); - track.heading = this.cpu_.userFriendlyName + ' ' + - counter.name + ':'; - track.counter = counter; - this.appendChild(track); - } - } - }, - - appendSamplesTracks_: function() { - var samples = this.cpu_.samples; - if (samples === undefined || samples.length === 0) - return; - var samplesByTitle = {}; - samples.forEach(function(sample) { - if (samplesByTitle[sample.title] === undefined) - samplesByTitle[sample.title] = []; - samplesByTitle[sample.title].push(sample); - }); - - var sampleTitles = tr.b.dictionaryKeys(samplesByTitle); - sampleTitles.sort(); - - sampleTitles.forEach(function(sampleTitle) { - var samples = samplesByTitle[sampleTitle]; - var samplesTrack = new tr.ui.tracks.SliceTrack(this.viewport); - samplesTrack.group = this.cpu_; - samplesTrack.slices = samples; - samplesTrack.heading = this.cpu_.userFriendlyName + ': ' + - sampleTitle; - samplesTrack.tooltip = this.cpu_.userFriendlyDetails; - samplesTrack.selectionGenerator = function() { - var selection = new tr.model.EventSet(); - for (var i = 0; i < samplesTrack.slices.length; i++) { - selection.push(samplesTrack.slices[i]); - } - return selection; - }; - this.appendChild(samplesTrack); - }, this); - } - }; - - return { - CpuTrack: CpuTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track_test.html deleted file mode 100644 index 61108d514fc..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_track_test.html +++ /dev/null @@ -1,99 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/model/model.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var Cpu = tr.model.Cpu; - var CpuTrack = tr.ui.tracks.CpuTrack; - var Slice = tr.model.Slice; - var StackFrame = tr.model.StackFrame; - var Sample = tr.model.Sample; - var Thread = tr.model.Thread; - var Viewport = tr.ui.TimelineViewport; - - test('basicCpu', function() { - var cpu = new Cpu({}, 7); - cpu.slices = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 2.1, {}, 4.8) - ]; - cpu.updateBounds(); - - var testEl = document.createElement('div'); - var viewport = new Viewport(testEl); - - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - - var track = new CpuTrack(viewport); - drawingContainer.appendChild(track); - - track.heading = 'CPU ' + cpu.cpuNumber; - track.cpu = cpu; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 11.1, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - - test('withSamples', function() { - var thread; - var cpu; - var model = tr.c.TestUtils.newModelWithEvents([], { - shiftWorldToZero: false, - pruneContainers: false, - customizeModelCallback: function(model) { - cpu = model.kernel.getOrCreateCpu(1); - thread = model.getOrCreateProcess(1).getOrCreateThread(2); - - var fA = model.addStackFrame(new StackFrame( - undefined, 1, 'cat', 'a', 7)); - var fAB = model.addStackFrame(new StackFrame( - fA, 2, 'cat', 'b', 7)); - var fABC = model.addStackFrame(new StackFrame( - fAB, 3, 'cat', 'c', 7)); - var fAD = model.addStackFrame(new StackFrame( - fA, 4, 'cat', 'd', 7)); - - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 10, fABC, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 20, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 30, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 40, fAD, 10)); - - model.samples.push(new Sample(undefined, thread, 'page_fault', - 25, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'page_fault', - 35, fAD, 10)); - } - }); - - var testEl = document.createElement('div'); - var viewport = new Viewport(testEl); - - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - - var track = new CpuTrack(viewport); - drawingContainer.appendChild(track); - - track.heading = 'CPU ' + cpu.cpuNumber; - track.cpu = cpu; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 11.1, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track.html deleted file mode 100644 index 5845b546984..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track.html +++ /dev/null @@ -1,187 +0,0 @@ -<!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/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_track.html"> - -<style> -.cpu-usage-track { - height: 90px; -} -</style> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var ColorScheme = tr.b.ColorScheme; - var ChartTrack = tr.ui.tracks.ChartTrack; - var MAX_CPU_TRACK_INTERVAL_COUNT = 100000; - - /** - * A track that displays the cpu usage of a process. - * - * @constructor - * @extends {tr.ui.tracks.ChartTrack} - */ - var CpuUsageTrack = tr.ui.b.define('cpu-usage-track', ChartTrack); - - CpuUsageTrack.prototype = { - __proto__: ChartTrack.prototype, - - DEFAULT_INTERVAL: 5, // in ms. - - decorate: function(viewport) { - ChartTrack.prototype.decorate.call(this, viewport); - this.classList.add('cpu-usage-track'); - this.heading = 'CPU usage'; - this.cpuUsageSeries_ = undefined; - }, - - // Given a tr.Model, it creates a cpu usage series and a graph. - initialize: function(model, interval) { - if (interval !== undefined) - this.interval_ = interval; - else - this.interval_ = this.DEFAULT_INTERVAL; - if (model !== undefined) - this.cpuUsageSeries_ = this.computeCpuUsage_(model); - else - this.cpuUsageSeries_ = undefined; - this.series = this.buildChartSeries_(); - this.autoSetAllAxes({expandMax: true}); - }, - - // Given a tr.Model, it returns the computation of cpu usage of all the - // processes. - computeCpuUsage_: function(model) { - var intervalCount = Math.ceil(model.bounds.max / this.interval_); - // Rather than attempting a huge allocation and having the tab crash with - // an out-of-memory error, throw an error here if there are too many - // CPU intervals to handle. - if (intervalCount > MAX_CPU_TRACK_INTERVAL_COUNT) { - throw new Error('The trace is too long or the CPU usage counter ' + - 'interval is too small, leading to too many CPU usage intervals.'); - } - var cpuUsage = undefined; - if (intervalCount > 0) { - tr.b.iterItems(model.processes, function(pid, process) { - // Iterate slices, find all the CPU samples which overlap. For each - // such CPU sample, increment it of the "average CPU usage" of the - // slice. - for (var e of process.getDescendantEvents()) { - if (!(e instanceof tr.model.ThreadSlice) || e.duration === 0 || - e.cpuDuration === undefined) { - continue; - } - - // This slice contains the most fine-grained CPU usage information - // for the area of the trace that it covers but that is not covered - // by its subslices. - // The math goes this way: - // s.selfTime : duration of slice s not spent in its subslices. - // s.cpuSelfTime : cpuDuration over slice s but not its subslices. - // - // We're looking for - // s.cpuSelfTimeRatio: average cpu usage over the area covered by - // s but not any of its subslices. - // = s.cpuSelfTime / s.selfTime - if (e.selfTime === 0 || e.selfTime === undefined || - e.cpuSelfTime === undefined) { - continue; - } - - var cpuSelfTimeRatio = e.cpuSelfTime / e.selfTime; - cpuSelfTimeRatio = Math.max(0, cpuSelfTimeRatio); - cpuSelfTimeRatio = Math.min(1, cpuSelfTimeRatio); - // We have found at least one valid thread slice. - if (cpuUsage === undefined) - cpuUsage = new Array(intervalCount).fill(0); - - // Go through the area covered by this slice but not its subslices - // and add the cpuSelfTimeRatio contribution over this area. - var lastTime = e.start; - e.subSlices.forEach(function(slice) { - this.addCPUUsageOverInterval_(cpuUsage, cpuSelfTimeRatio, - lastTime, slice.start); - lastTime = slice.end; - }, this); - this.addCPUUsageOverInterval_(cpuUsage, cpuSelfTimeRatio, lastTime, - e.end); - } - }, this); - } - return cpuUsage || []; - }, - - addCPUUsageOverInterval_: function(cpuUsageArray, cpuUsage, start, end) { - if (start >= end) - return; - - // Simple arithmetic to find the indexes that overlap the current - // slice. - var interval = this.interval_; - var startIndex = Math.floor(start / interval); - // If the slice stops on an interval, endIndex will be too high. - // E.g.: start = 5, end = 10, endIndex = floor( 10 / 5 ) = 2. - // However, the slice is active for only one interval : [5, 10[ . - var endIndex = Math.ceil(end / interval) - 1; - var cpuUsagePerTime = cpuUsage / interval; - - // Add [startIndex * interval, endIndex * interval] duration. - for (var i = startIndex; i < endIndex; i++) - cpuUsageArray[i] += cpuUsage; - - // Subtract [startIndex * interval, start] duration. - cpuUsageArray[startIndex] -= cpuUsagePerTime * - (start - startIndex * interval); - - // Add [endIndex * interval, end] duration. - cpuUsageArray[endIndex] += cpuUsagePerTime * (end - endIndex * interval); - }, - - get hasVisibleContent() { - return !!this.cpuUsageSeries_ && this.cpuUsageSeries_.length > 0; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - containerToTrackMap.addContainer(this.series_, this); - }, - - buildChartSeries_: function() { - if (!this.hasVisibleContent) - return []; - - var axis = new tr.ui.tracks.ChartAxis(0, undefined); - var pts = new Array(this.cpuUsageSeries_.length + 1); - - // Add all points and an extra one at the end, otherwise the last - // interval doesn't show up. - for (var i = 0; i <= this.cpuUsageSeries_.length; i++) { - pts[i] = new tr.ui.tracks.ChartPoint(undefined, this.interval_ * i, - this.cpuUsageSeries_[i] || 0); - } - - var renderingConfig = { - chartType: tr.ui.tracks.ChartSeriesType.AREA, - colorId: ColorScheme.getColorIdForGeneralPurposeString(this.heading) - }; - - return [new tr.ui.tracks.ChartSeries(pts, axis, renderingConfig)]; - } - }; - - return { - CpuUsageTrack: CpuUsageTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track_test.html deleted file mode 100644 index 0ef7005dcae..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/cpu_usage_track_test.html +++ /dev/null @@ -1,240 +0,0 @@ -<!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/core/test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/model/thread_slice.html"> -<link rel='import' href='/tracing/ui/base/constants.html'> -<link rel='import' href='/tracing/ui/timeline_viewport.html'> -<link rel="import" href="/tracing/ui/tracks/cpu_usage_track.html"> -<link rel='import' href='/tracing/ui/tracks/drawing_container.html'> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var Model = tr.Model; - var ThreadSlice = tr.model.ThreadSlice; - var DIFF_EPSILON = 0.0001; - - // Input : slices is an array-of-array-of slices. Each top level array - // represents a process. So, each slice in one of the top level array - // will be placed in the same process. - function buildModel(slices) { - var model = tr.c.TestUtils.newModel(function(model) { - var process = model.getOrCreateProcess(1); - for (var i = 0; i < slices.length; i++) { - var thread = process.getOrCreateThread(i); - slices[i].forEach(s => thread.sliceGroup.pushSlice(s)); - } - }); - return model; - } - - // Compare float arrays based on an epsilon since floating point arithmetic - // is not always 100% accurate. - function assertArrayValuesCloseTo(actualValue, expectedValue) { - assert.lengthOf(actualValue, expectedValue.length); - for (var i = 0; i < expectedValue.length; i++) - assert.closeTo(actualValue[i], expectedValue[i], DIFF_EPSILON); - } - - function createCpuUsageTrack(model, interval) { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - var track = new tr.ui.tracks.CpuUsageTrack(drawingContainer.viewport); - if (model !== undefined) - setDisplayTransformFromBounds(viewport, model.bounds); - track.initialize(model, interval); - drawingContainer.appendChild(track); - this.addHTMLOutput(drawingContainer); - return track; - } - - /** - * Sets the mapping between the input range of timestamps and the output range - * of horizontal pixels. - */ - function setDisplayTransformFromBounds(viewport, bounds) { - var dt = new tr.ui.TimelineDisplayTransform(); - var pixelRatio = window.devicePixelRatio || 1; - var chartPixelWidth = - (window.innerWidth - tr.ui.b.constants.HEADING_WIDTH) * pixelRatio; - dt.xSetWorldBounds(bounds.min, bounds.max, chartPixelWidth); - viewport.setDisplayTransformImmediately(dt); - }; - - test('computeCpuUsage_simpleOnBoundaries', function() { - // First thread. - // 0 5 10 15 20 25 30 35 40 45 50 55 - // [ sliceA ] - // [ sliceB ] [C] - var sliceA = new tr.model.ThreadSlice('', title, 0, 5, {}, 50); - sliceA.cpuDuration = 25; - var sliceB = new tr.model.ThreadSlice('', title, 0, 10, {}, 30); - sliceB.cpuDuration = 15; - // The slice completely fits into an interval and is the last. - var sliceC = new tr.model.ThreadSlice('', title, 0, 52, {}, 3); - sliceC.cpuDuration = 3; - - // Second thread. - // 0 5 10 15 20 25 30 35 40 45 50 55 - // [ sliceE ][ sliceD ] - var sliceD = new tr.model.ThreadSlice('', title, 0, 15, {}, 20); - sliceD.cpuDuration = 17; - var sliceE = new tr.model.ThreadSlice('', title, 0, 5, {}, 10); - sliceE.cpuDuration = 9; - - var model = buildModel([[sliceA, sliceB, sliceC], [sliceD, sliceE]]); - - // Compute average CPU usage over A (but not over B and C). - var avgCpuUsageA = sliceA.cpuSelfTime / sliceA.selfTime; - // Compute average CPU usage over B, C, D, E. They don't have subslices. - var avgCpuUsageB = sliceB.cpuDuration / sliceB.duration; - var avgCpuUsageC = sliceC.cpuDuration / sliceC.duration; - var avgCpuUsageD = sliceD.cpuDuration / sliceD.duration; - var avgCpuUsageE = sliceE.cpuDuration / sliceE.duration; - - var expectedValue = [ - 0, - avgCpuUsageA + avgCpuUsageE, - avgCpuUsageB + avgCpuUsageE, - avgCpuUsageB + avgCpuUsageD, - avgCpuUsageB + avgCpuUsageD, - avgCpuUsageB + avgCpuUsageD, - avgCpuUsageB + avgCpuUsageD, - avgCpuUsageB, - avgCpuUsageA, - avgCpuUsageA, - avgCpuUsageA * 2.0 / 5 + avgCpuUsageC * 3.0 / 5.0, - 0 // Extra point added to make the last interval show up. - ]; - var track = createCpuUsageTrack.call(this, model, 5); - var actualValue = track.series[0].points.map(point => point.y); - assertArrayValuesCloseTo(actualValue, expectedValue); - }); - - test('computeCpuUsage_tooManyIntervals', function() { - var sliceA = new tr.model.ThreadSlice('', title, 0, 5, {}, 50); - sliceA.cpuDuration = 25; - var sliceB = new tr.model.ThreadSlice( - '', title, 0, 50000010, {}, 50000030); - sliceB.cpuDuration = 15; - - var model = buildModel([[sliceA, sliceB]]); - - assert.throws(() => createCpuUsageTrack.call(this, model, 5)); - }); - - test('computeCpuUsage_floatAndComplexIntervals', function() { - // First thread. - // 0 5 10 15 20 25 30 35 40 45 50 55 - // [ sliceA ] - // [B] - var sliceA = new tr.model.ThreadSlice('', title, 0, 5.5111, {}, 47.1023); - sliceA.cpuDuration = 25; - var sliceB = new tr.model.ThreadSlice('', title, 0, 11.2384, {}, 1.8769); - sliceB.cpuDuration = 1.5; - - // Second thread. - // 0 5 10 15 20 25 30 35 40 45 50 55 - // [ C ] [ D ] - var sliceC = new tr.model.ThreadSlice('', title, 0, 11.239, {}, 5.8769); - sliceC.cpuDuration = 5; - var sliceD = new tr.model.ThreadSlice('', title, 0, 48.012, {}, 5.01); - sliceD.cpuDuration = 4; - - var model = buildModel([[sliceA, sliceB], [sliceC, sliceD]]); - - // Compute average CPU usage over A (but not over B and C). - var avgCpuUsageA = sliceA.cpuSelfTime / sliceA.selfTime; - // Compute average CPU usage over B, C, D. They don't have subslices. - var avgCpuUsageB = sliceB.cpuDuration / sliceB.duration; - var avgCpuUsageC = sliceC.cpuDuration / sliceC.duration; - var avgCpuUsageD = sliceD.cpuDuration / sliceD.duration; - - var expectedValue = [ - 0, - avgCpuUsageA * (10 - 5.5111) / 5.0, - avgCpuUsageA * (11.2384 - 10 + 15 - (11.2384 + 1.8769)) / 5.0 + - avgCpuUsageB * 1.8769 / 5.0 + - avgCpuUsageC * (15 - 11.239) / 5.0, - avgCpuUsageA + - avgCpuUsageC * ((11.239 + 5.8769) - 15) / 5.0, - avgCpuUsageA, - avgCpuUsageA, - avgCpuUsageA, - avgCpuUsageA, - avgCpuUsageA, - avgCpuUsageA + - avgCpuUsageD * (50 - 48.012) / 5.0, - avgCpuUsageA * (5.5111 + 47.1023 - 50) / 5.0 + - avgCpuUsageD * (48.012 + 5.01 - 50) / 5.0, - 0 // Extra point added to make the last interval show up. - ]; - var track = createCpuUsageTrack.call(this, model, 5); - var actualValue = track.series[0].points.map(point => point.y); - assertArrayValuesCloseTo(actualValue, expectedValue); - }); - - test('instantiate', function() { - var sliceA = new tr.model.ThreadSlice('', title, 0, 5.5111, {}, 47.1023); - sliceA.cpuDuration = 25; - var sliceB = new tr.model.ThreadSlice('', title, 0, 11.2384, {}, 1.8769); - sliceB.cpuDuration = 1.5; - var sliceC = new tr.model.ThreadSlice('', title, 0, 11.239, {}, 5.8769); - sliceC.cpuDuration = 5; - var sliceD = new tr.model.ThreadSlice('', title, 0, 48.012, {}, 5.01); - sliceD.cpuDuration = 4; - - var model = buildModel([[sliceA, sliceB, sliceC, sliceD]]); - createCpuUsageTrack.call(this, model); - }); - - test('hasVisibleContent_trueWithThreadSlicePresent', function() { - var sliceA = new tr.model.ThreadSlice('', title, 0, 48.012, {}, 5.01); - sliceA.cpuDuration = 4; - var model = buildModel([[sliceA]]); - var track = createCpuUsageTrack.call(this, model); - - assert.isTrue(track.hasVisibleContent); - }); - - test('hasVisibleContent_falseWithUndefinedProcessModel', function() { - var track = createCpuUsageTrack.call(this, undefined); - - assert.isFalse(track.hasVisibleContent); - }); - - test('hasVisibleContent_falseWithNoThreadSlice', function() { - // model with a CPU and a thread but no ThreadSlice. - var model = buildModel([]); - var track = createCpuUsageTrack.call(this, model); - - assert.isFalse(track.hasVisibleContent); - }); - - test('hasVisibleContent_trueWithSubSlices', function() { - var sliceA = new tr.model.ThreadSlice('', title, 0, 5.5111, {}, 47.1023); - sliceA.cpuDuration = 25; - var sliceB = new tr.model.ThreadSlice('', title, 0, 11.2384, {}, 1.8769); - sliceB.cpuDuration = 1.5; - - var model = buildModel([[sliceA, sliceB]]); - var process = model.getProcess(1); - // B will become lowest level slices of A. - process.getThread(0).sliceGroup.createSubSlices(); - assert.equal(sliceA.cpuSelfTime, (sliceA.cpuDuration - sliceB.cpuDuration)); - var track = createCpuUsageTrack.call(this, model); - - assert.isTrue(track.hasVisibleContent); - }); - -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track.html deleted file mode 100644 index dfc6c364eea..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track.html +++ /dev/null @@ -1,90 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/power_series_track.html"> -<link rel="import" href="/tracing/ui/tracks/spacing_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var ContainerTrack = tr.ui.tracks.ContainerTrack; - - // TODO(charliea): Make this track collapsible. - /** - * Track to visualize the device model. - * - * @constructor - * @extends {ContainerTrack} - */ - var DeviceTrack = tr.ui.b.define('device-track', ContainerTrack); - - DeviceTrack.prototype = { - - __proto__: ContainerTrack.prototype, - - decorate: function(viewport) { - ContainerTrack.prototype.decorate.call(this, viewport); - - this.classList.add('device-track'); - this.device_ = undefined; - this.powerSeriesTrack_ = undefined; - }, - - get device() { - return this.device_; - }, - - set device(device) { - this.device_ = device; - this.updateContents_(); - }, - - get powerSeriesTrack() { - return this.powerSeriesTrack_; - }, - - get hasVisibleContent() { - return (this.powerSeriesTrack_ && - this.powerSeriesTrack_.hasVisibleContent); - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.call( - this, containerToTrackMap); - containerToTrackMap.addContainer(this.device, this); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - this.tracks_.forEach(function(track) { - track.addEventsToTrackMap(eventToTrackMap); - }); - }, - - appendPowerSeriesTrack_: function() { - this.powerSeriesTrack_ = new tr.ui.tracks.PowerSeriesTrack(this.viewport); - this.powerSeriesTrack_.powerSeries = this.device.powerSeries; - - if (this.powerSeriesTrack_.hasVisibleContent) { - this.appendChild(this.powerSeriesTrack_); - this.appendChild(new tr.ui.tracks.SpacingTrack(this.viewport)); - } - }, - - updateContents_: function() { - this.clearTracks_(); - this.appendPowerSeriesTrack_(); - } - }; - - return { - DeviceTrack: DeviceTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track_test.html deleted file mode 100644 index ce849355882..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/device_track_test.html +++ /dev/null @@ -1,146 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/model/device.html'> -<link rel='import' href='/tracing/model/model.html'> -<link rel="import" href="/tracing/ui/base/constants.html"> -<link rel='import' href='/tracing/ui/timeline_display_transform.html'> -<link rel='import' href='/tracing/ui/timeline_viewport.html'> -<link rel='import' href='/tracing/ui/tracks/device_track.html'> -<link rel='import' href='/tracing/ui/tracks/drawing_container.html'> -<link rel='import' href='/tracing/ui/tracks/event_to_track_map.html'> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - - var Device = tr.model.Device; - var DeviceTrack = tr.ui.tracks.DeviceTrack; - var Model = tr.Model; - var PowerSeries = tr.model.PowerSeries; - - var createDrawingContainer = function(series) { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - if (series) { - series.updateBounds(); - setDisplayTransformFromBounds(viewport, series.bounds); - } - - return drawingContainer; - }; - - /** - * Sets the mapping between the input range of timestamps and the output range - * of horizontal pixels. - */ - var setDisplayTransformFromBounds = function(viewport, bounds) { - var dt = new tr.ui.TimelineDisplayTransform(); - var pixelRatio = window.devicePixelRatio || 1; - var chartPixelWidth = - (window.innerWidth - tr.ui.b.constants.HEADING_WIDTH) * pixelRatio; - dt.xSetWorldBounds(bounds.min, bounds.max, chartPixelWidth); - viewport.setDisplayTransformImmediately(dt); - }; - - test('instantiate', function() { - var device = new Device(new Model()); - device.powerSeries = new PowerSeries(device); - device.powerSeries.addPowerSample(0, 1); - device.powerSeries.addPowerSample(0.5, 2); - device.powerSeries.addPowerSample(1, 3); - device.powerSeries.addPowerSample(1.5, 4); - - var drawingContainer = createDrawingContainer(device.powerSeries); - var track = new DeviceTrack(drawingContainer.viewport); - track.device = device; - drawingContainer.appendChild(track); - - this.addHTMLOutput(drawingContainer); - }); - - test('instantiate_noPowerSeries', function() { - var device = new Device(new Model()); - - var drawingContainer = createDrawingContainer(device.powerSeries); - var track = new DeviceTrack(drawingContainer.viewport); - track.device = device; - drawingContainer.appendChild(track); - - // Adding output should throw due to no visible content. - assert.throw(function() { this.addHTMLOutput(drawingContainer); }); - }); - - test('setDevice_clearsTrackBeforeUpdating', function() { - var device = new Device(new Model()); - device.powerSeries = new PowerSeries(device); - device.powerSeries.addPowerSample(0, 1); - device.powerSeries.addPowerSample(0.5, 2); - device.powerSeries.addPowerSample(1, 3); - device.powerSeries.addPowerSample(1.5, 4); - - var drawingContainer = createDrawingContainer(device.powerSeries); - - // Set the device twice and make sure that this doesn't result in - // the track appearing twice. - var track = new DeviceTrack(drawingContainer.viewport); - track.device = device; - track.device = device; - drawingContainer.appendChild(track); - - this.addHTMLOutput(drawingContainer); - - // The device track should still have two subtracks: one counter track and - // one spacing track. - assert.equal(track.tracks_.length, 2); - }); - - test('addContainersToTrackMap', function() { - var device = new Device(new Model()); - device.powerSeries = new PowerSeries(device); - device.powerSeries.addPowerSample(0, 1); - - var drawingContainer = createDrawingContainer(device.series); - var track = new DeviceTrack(drawingContainer.viewport); - track.device = device; - - var containerToTrackMap = new tr.ui.tracks.ContainerToTrackMap(); - track.addContainersToTrackMap(containerToTrackMap); - - assert.equal(containerToTrackMap.getTrackByStableId('Device'), track); - assert.equal( - containerToTrackMap.getTrackByStableId('Device.PowerSeries'), - track.powerSeriesTrack); - }); - - test('addEventsToTrackMap', function() { - var device = new Device(new Model()); - device.powerSeries = new PowerSeries(device); - device.powerSeries.addPowerSample(0, 1); - device.powerSeries.addPowerSample(0.5, 2); - - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - - var track = new DeviceTrack(viewport); - track.device = device; - - var eventToTrackMap = new tr.ui.tracks.EventToTrackMap(); - track.addEventsToTrackMap(eventToTrackMap); - - var expected = new tr.ui.tracks.EventToTrackMap(); - expected[device.powerSeries.samples[0].guid] = track.powerSeriesTrack; - expected[device.powerSeries.samples[1].guid] = track.powerSeriesTrack; - - assert.deepEqual(eventToTrackMap, expected); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.css deleted file mode 100644 index a4a8cdb5b89..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.css +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2012 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. - */ - -.drawing-container { - -webkit-box-flex: 1; - display: inline; - overflow: auto; - overflow-x: hidden; - position: relative; -} - -.drawing-container-canvas { - -webkit-box-flex: 1; - display: block; - pointer-events: none; - position: absolute; - top: 0; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.html deleted file mode 100644 index 69a8ca43026..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container.html +++ /dev/null @@ -1,176 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/drawing_container.css"> - -<link rel="import" href="/tracing/base/raf.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> -<link rel="import" href="/tracing/ui/base/constants.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var DrawType = { - GENERAL_EVENT: 1, - INSTANT_EVENT: 2, - BACKGROUND: 3, - GRID: 4, - FLOW_ARROWS: 5, - MARKERS: 6, - HIGHLIGHTS: 7, - ANNOTATIONS: 8 - }; - - var DrawingContainer = tr.ui.b.define('drawing-container', - tr.ui.tracks.Track); - - DrawingContainer.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('drawing-container'); - - this.canvas_ = document.createElement('canvas'); - this.canvas_.className = 'drawing-container-canvas'; - this.canvas_.style.left = tr.ui.b.constants.HEADING_WIDTH + 'px'; - this.appendChild(this.canvas_); - - this.ctx_ = this.canvas_.getContext('2d'); - - this.viewportChange_ = this.viewportChange_.bind(this); - this.viewport.addEventListener('change', this.viewportChange_); - }, - - // Needed to support the calls in TimelineTrackView. - get canvas() { - return this.canvas_; - }, - - context: function() { - return this.ctx_; - }, - - viewportChange_: function() { - this.invalidate(); - }, - - invalidate: function() { - if (this.rafPending_) - return; - this.rafPending_ = true; - - tr.b.requestPreAnimationFrame(this.preDraw_, this); - }, - - preDraw_: function() { - this.rafPending_ = false; - this.updateCanvasSizeIfNeeded_(); - - tr.b.requestAnimationFrameInThisFrameIfPossible(this.draw_, this); - }, - - draw_: function() { - this.ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height); - - var typesToDraw = [ - DrawType.BACKGROUND, - DrawType.HIGHLIGHTS, - DrawType.GRID, - DrawType.INSTANT_EVENT, - DrawType.GENERAL_EVENT, - DrawType.MARKERS, - DrawType.ANNOTATIONS, - DrawType.FLOW_ARROWS - ]; - - for (var idx in typesToDraw) { - for (var i = 0; i < this.children.length; ++i) { - if (!(this.children[i] instanceof tr.ui.tracks.Track)) - continue; - this.children[i].drawTrack(typesToDraw[idx]); - } - } - - var pixelRatio = window.devicePixelRatio || 1; - var bounds = this.canvas_.getBoundingClientRect(); - var dt = this.viewport.currentDisplayTransform; - var viewLWorld = dt.xViewToWorld(0); - var viewRWorld = dt.xViewToWorld( - bounds.width * pixelRatio); - - this.viewport.drawGridLines(this.ctx_, viewLWorld, viewRWorld); - }, - - updateCanvasSizeIfNeeded_: function() { - var visibleChildTracks = - tr.b.asArray(this.children).filter(this.visibleFilter_); - - var thisBounds = this.getBoundingClientRect(); - - var firstChildTrackBounds = visibleChildTracks[0].getBoundingClientRect(); - var lastChildTrackBounds = - visibleChildTracks[visibleChildTracks.length - 1]. - getBoundingClientRect(); - - var innerWidth = firstChildTrackBounds.width - - tr.ui.b.constants.HEADING_WIDTH; - var innerHeight = lastChildTrackBounds.bottom - firstChildTrackBounds.top; - - var pixelRatio = window.devicePixelRatio || 1; - if (this.canvas_.width != innerWidth * pixelRatio) { - this.canvas_.width = innerWidth * pixelRatio; - this.canvas_.style.width = innerWidth + 'px'; - } - - if (this.canvas_.height != innerHeight * pixelRatio) { - this.canvas_.height = innerHeight * pixelRatio; - this.canvas_.style.height = innerHeight + 'px'; - } - }, - - visibleFilter_: function(element) { - if (!(element instanceof tr.ui.tracks.Track)) - return false; - return window.getComputedStyle(element).display !== 'none'; - }, - - addClosestEventToSelection: function( - worldX, worldMaxDist, loY, hiY, selection) { - for (var i = 0; i < this.children.length; ++i) { - if (!(this.children[i] instanceof tr.ui.tracks.Track)) - continue; - var trackClientRect = this.children[i].getBoundingClientRect(); - var a = Math.max(loY, trackClientRect.top); - var b = Math.min(hiY, trackClientRect.bottom); - if (a <= b) { - this.children[i].addClosestEventToSelection( - worldX, worldMaxDist, loY, hiY, selection); - } - } - - tr.ui.tracks.Track.prototype.addClosestEventToSelection. - apply(this, arguments); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - for (var i = 0; i < this.children.length; ++i) { - if (!(this.children[i] instanceof tr.ui.tracks.Track)) - continue; - this.children[i].addEventsToTrackMap(eventToTrackMap); - } - } - }; - - return { - DrawingContainer: DrawingContainer, - DrawType: DrawType - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container_perf_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container_perf_test.html deleted file mode 100644 index 9cb3d727c66..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/drawing_container_perf_test.html +++ /dev/null @@ -1,136 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/xhr.html"> -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/ui/extras/full_config.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var generalModel; - function getOrCreateGeneralModel() { - if (generalModel !== undefined) - generalModel; - var fileUrl = '/test_data/thread_time_visualisation.json.gz'; - var events = tr.b.getSync(fileUrl); - generalModel = tr.c.TestUtils.newModelWithEvents([events]); - return generalModel; - } - - function DCPerfTestCase(testName, opt_options) { - tr.b.unittest.PerfTestCase.call(this, testName, undefined, opt_options); - this.viewportDiv = undefined; - this.drawingContainer = undefined; - this.viewport = undefined; - } - DCPerfTestCase.prototype = { - __proto__: tr.b.unittest.PerfTestCase.prototype, - - setUp: function(model) { - this.viewportDiv = document.createElement('div'); - - this.viewport = new tr.ui.TimelineViewport(this.viewportDiv); - - this.drawingContainer = new tr.ui.tracks.DrawingContainer(this.viewport); - this.viewport.modelTrackContainer = this.drawingContainer; - - var modelTrack = new tr.ui.tracks.ModelTrack(this.viewport); - this.drawingContainer.appendChild(modelTrack); - - modelTrack.model = model; - - this.viewportDiv.appendChild(this.drawingContainer); - - this.addHTMLOutput(this.viewportDiv); - - // Size the canvas. - this.drawingContainer.updateCanvasSizeIfNeeded_(); - - // Size the viewport. - var w = this.drawingContainer.canvas.width; - var min = model.bounds.min; - var range = model.bounds.range; - - var boost = range * 0.15; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(min - boost, min + range + boost, w); - this.viewport.setDisplayTransformImmediately(dt); - }, - - runOneIteration: function() { - this.drawingContainer.draw_(); - } - }; - - - function GeneralDCPerfTestCase(testName, opt_options) { - DCPerfTestCase.call(this, testName, opt_options); - } - - GeneralDCPerfTestCase.prototype = { - __proto__: DCPerfTestCase.prototype, - - setUp: function() { - var model = getOrCreateGeneralModel(); - DCPerfTestCase.prototype.setUp.call(this, model); - } - }; - - // Failing on Chrome canary, see - // https://github.com/catapult-project/catapult/issues/1826 - flakyTest(new GeneralDCPerfTestCase('draw_softwareCanvas_One', - {iterations: 1})); - // Failing on Chrome stable on Windows, see - // https://github.com/catapult-project/catapult/issues/1908 - flakyTest(new GeneralDCPerfTestCase('draw_softwareCanvas_Ten', - {iterations: 10})); - test(new GeneralDCPerfTestCase('draw_softwareCanvas_AHundred', - {iterations: 100})); - - function AsyncDCPerfTestCase(testName, opt_options) { - DCPerfTestCase.call(this, testName, opt_options); - } - - AsyncDCPerfTestCase.prototype = { - __proto__: DCPerfTestCase.prototype, - - setUp: function() { - var model = tr.c.TestUtils.newModel(function(m) { - var proc = m.getOrCreateProcess(1); - for (var tid = 1; tid <= 5; tid++) { - var thread = proc.getOrCreateThread(tid); - for (var i = 0; i < 5000; i++) { - var mod = Math.floor(i / 100) % 4; - var slice = tr.c.TestUtils.newAsyncSliceEx({ - name: 'Test' + i, - colorId: tid + mod, - id: tr.b.GUID.allocateSimple(), - start: i * 10, - duration: 9, - isTopLevel: true - }); - thread.asyncSliceGroup.push(slice); - } - } - }); - DCPerfTestCase.prototype.setUp.call(this, model); - - var w = this.drawingContainer.canvas.width; - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(-2000, 54000, w); - this.viewport.setDisplayTransformImmediately(dt); - } - }; - test(new AsyncDCPerfTestCase('draw_asyncSliceHeavy_Twenty', - {iterations: 20})); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/event_to_track_map.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/event_to_track_map.html deleted file mode 100644 index 27da2820c61..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/event_to_track_map.html +++ /dev/null @@ -1,34 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/base.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * EventToTrackMap provides a mapping mechanism between events and the - * tracks those events belong on. - * @constructor - */ - function EventToTrackMap() {} - - EventToTrackMap.prototype = { - addEvent: function(event, track) { - if (!track) - throw new Error('Must provide a track.'); - this[event.guid] = track; - } - }; - - return { - EventToTrackMap: EventToTrackMap - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track.html deleted file mode 100644 index c3d6bc6830c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track.html +++ /dev/null @@ -1,72 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/color_scheme.html"> -<link rel="import" href="/tracing/ui/base/event_presenter.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/letter_dot_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var startCompare = function(x, y) { return x.start - y.start; } - - /** - * Track enabling quick selection of frame slices/events. - * @constructor - */ - var FrameTrack = tr.ui.b.define( - 'frame-track', tr.ui.tracks.LetterDotTrack); - - FrameTrack.prototype = { - __proto__: tr.ui.tracks.LetterDotTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this, viewport); - this.heading = 'Frames'; - - this.frames_ = undefined; - this.items = undefined; - }, - - get frames() { - return this.frames_; - }, - - set frames(frames) { - this.frames_ = frames; - if (frames === undefined) - return; - - this.frames_ = this.frames_.slice(); - this.frames_.sort(startCompare); - - // letter dots - this.items = this.frames_.map(function(frame) { - return new FrameDot(frame); - }); - } - }; - - /** - * @constructor - * @extends {LetterDot} - */ - function FrameDot(frame) { - tr.ui.tracks.LetterDot.call(this, frame, 'F', frame.colorId, frame.start); - } - - FrameDot.prototype = { - __proto__: tr.ui.tracks.LetterDot.prototype - }; - - return { - FrameTrack: FrameTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track_test.html deleted file mode 100644 index 943e245b37c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/frame_track_test.html +++ /dev/null @@ -1,106 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/frame.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/frame_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var Frame = tr.model.Frame; - var FrameTrack = tr.ui.tracks.FrameTrack; - var EventSet = tr.model.EventSet; - var SelectionState = tr.model.SelectionState; - var Viewport = tr.ui.TimelineViewport; - - var createFrames = function() { - var frames = undefined; - var model = tr.c.TestUtils.newModel(function(model) { - var process = model.getOrCreateProcess(1); - var thread = process.getOrCreateThread(1); - for (var i = 1; i < 5; i++) { - var slice = tr.c.TestUtils.newSliceEx( - {title: 'work for frame', start: i * 20, duration: 10}); - thread.sliceGroup.pushSlice(slice); - var events = [slice]; - var threadTimeRanges = - [{thread: thread, start: slice.start, end: slice.end}]; - process.frames.push(new Frame(events, threadTimeRanges)); - } - frames = process.frames; - }); - return frames; - }; - - test('instantiate', function() { - var frames = createFrames(); - frames[1].selectionState = SelectionState.SELECTED; - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = FrameTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.frames = frames; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 50, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - - assert.equal(track.items[0].start, 20); - }); - - test('modelMapping', function() { - var frames = createFrames(); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var track = FrameTrack(viewport); - track.frames = frames; - - var a0 = track.items[0].modelItem; - assert.equal(a0, frames[0]); - }); - - test('selectionMapping', function() { - var frames = createFrames(); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var track = FrameTrack(viewport); - track.frames = frames; - - var selection = new EventSet(); - track.items[0].addToSelection(selection); - - // select both frame, but not its component slice - assert.equal(selection.length, 1); - - var frameCount = 0; - var eventCount = 0; - selection.forEach(function(event) { - if (event instanceof Frame) { - assert.equal(event, frames[0]); - frameCount++; - } else - eventCount++; - }); - assert.equal(frameCount, 1); - assert.equal(eventCount, 0); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track.html deleted file mode 100644 index 0e2e4d54c24..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track.html +++ /dev/null @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/tracks/chart_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/letter_dot_track.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_util.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var USED_MEMORY_TRACK_HEIGHT = 50; - var ALLOCATED_MEMORY_TRACK_HEIGHT = 50; - - /** - * A track that displays an array of GlobalMemoryDump objects. - * @constructor - * @extends {ContainerTrack} - */ - var GlobalMemoryDumpTrack = tr.ui.b.define( - 'global-memory-dump-track', tr.ui.tracks.ContainerTrack); - - GlobalMemoryDumpTrack.prototype = { - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.memoryDumps_ = undefined; - }, - - get memoryDumps() { - return this.memoryDumps_; - }, - - set memoryDumps(memoryDumps) { - this.memoryDumps_ = memoryDumps; - this.updateContents_(); - }, - - updateContents_: function() { - this.clearTracks_(); - - // Show no tracks if there are no dumps. - if (!this.memoryDumps_ || !this.memoryDumps_.length) - return; - - this.appendDumpDotsTrack_(); - this.appendUsedMemoryTrack_(); - this.appendAllocatedMemoryTrack_(); - }, - - appendDumpDotsTrack_: function() { - var items = tr.ui.tracks.buildMemoryLetterDots(this.memoryDumps_); - if (!items) - return; - - var track = new tr.ui.tracks.LetterDotTrack(this.viewport); - track.heading = 'Memory Dumps'; - track.items = items; - this.appendChild(track); - }, - - appendUsedMemoryTrack_: function() { - var series = tr.ui.tracks.buildGlobalUsedMemoryChartSeries( - this.memoryDumps_); - if (!series) - return; - - var track = new tr.ui.tracks.ChartTrack(this.viewport); - track.heading = 'Memory per process'; - track.height = USED_MEMORY_TRACK_HEIGHT + 'px'; - track.series = series; - track.autoSetAllAxes({expandMax: true}); - this.appendChild(track); - }, - - appendAllocatedMemoryTrack_: function() { - var series = tr.ui.tracks.buildGlobalAllocatedMemoryChartSeries( - this.memoryDumps_); - if (!series) - return; - - var track = new tr.ui.tracks.ChartTrack(this.viewport); - track.heading = 'Memory per component'; - track.height = ALLOCATED_MEMORY_TRACK_HEIGHT + 'px'; - track.series = series; - track.autoSetAllAxes({expandMax: true}); - this.appendChild(track); - } - }; - - return { - GlobalMemoryDumpTrack: GlobalMemoryDumpTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track_test.html deleted file mode 100644 index 268da37bcf7..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/global_memory_dump_track_test.html +++ /dev/null @@ -1,61 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/global_memory_dump_track.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_test_utils.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var Viewport = tr.ui.TimelineViewport; - var GlobalMemoryDumpTrack = tr.ui.tracks.GlobalMemoryDumpTrack; - var createTestGlobalMemoryDumps = tr.ui.tracks.createTestGlobalMemoryDumps; - - function instantiateTrack(withVMRegions, withAllocatorDumps, - expectedTrackCount) { - var dumps = createTestGlobalMemoryDumps(withVMRegions, withAllocatorDumps); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = new GlobalMemoryDumpTrack(viewport); - drawingContainer.appendChild(track); - drawingContainer.invalidate(); - - track.memoryDumps = dumps; - this.addHTMLOutput(div); - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 50, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - - assert.lengthOf(track.tracks_, expectedTrackCount); - }; - - test('instantiate_dotsOnly', function() { - instantiateTrack.call(this, false, false, 1); - }); - - test('instantiate_withVMRegions', function() { - instantiateTrack.call(this, true, false, 2); - }); - - test('instantiate_withMemoryAllocatorDumps', function() { - instantiateTrack.call(this, false, true, 2); - }); - - test('instantiate_withBoth', function() { - instantiateTrack.call(this, true, true, 3); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/highlighter.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/highlighter.html deleted file mode 100644 index 6b3a7e69c70..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/highlighter.html +++ /dev/null @@ -1,53 +0,0 @@ -<!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/base.html"> -<link rel="import" href="/tracing/base/extension_registry.html"> - -<script> -'use strict'; - -/** - * @fileoverview Allows custom highlighting to be added to the full model track. - */ -tr.exportTo('tr.ui.tracks', function() { - - /** - * Highlights cetrain features of the model. - * @constructor - */ - function Highlighter(viewport) { - if (viewport === undefined) { - throw new Error('viewport must be provided'); - } - this.viewport_ = viewport; - }; - - Highlighter.prototype = { - __proto__: Object.prototype, - - processModel: function(model) { - throw new Error('processModel implementation missing'); - }, - - drawHighlight: function(ctx, dt, viewLWorld, viewRWorld, viewHeight) { - throw new Error('drawHighlight implementation missing'); - } - }; - - - var options = new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE); - options.defaultMetadata = {}; - options.mandatoryBaseClass = Highlighter; - tr.b.decorateExtensionRegistry(Highlighter, options); - - return { - Highlighter: Highlighter - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track.html deleted file mode 100644 index 8e8f181ff90..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track.html +++ /dev/null @@ -1,68 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/draw_helpers.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/alert_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/highlighter.html"> -<link rel="import" href="/tracing/ui/tracks/kernel_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays an array of interaction records. - * @constructor - * @extends {MultiRowTrack} - */ - var InteractionTrack = tr.ui.b.define( - 'interaction-track', tr.ui.tracks.MultiRowTrack); - - InteractionTrack.prototype = { - __proto__: tr.ui.tracks.MultiRowTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this, viewport); - this.heading = 'Interactions'; - this.subRows_ = []; - }, - - set model(model) { - this.setItemsToGroup(model.userModel.expectations, { - guid: tr.b.GUID.allocateSimple(), - model: model, - getSettingsKey: function() { - return undefined; - } - }); - }, - - buildSubRows_: function(slices) { - if (this.subRows_.length) - return this.subRows_; - this.subRows_.push.apply(this.subRows_, - tr.ui.tracks.AsyncSliceGroupTrack.prototype.buildSubRows_.call( - {}, slices, true)); - return this.subRows_; - }, - - addSubTrack_: function(slices) { - var track = new tr.ui.tracks.SliceTrack(this.viewport); - track.slices = slices; - this.appendChild(track); - return track; - } - }; - - return { - InteractionTrack: InteractionTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track_test.html deleted file mode 100644 index 1b2c1346a16..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/interaction_track_test.html +++ /dev/null @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/model/user_model/stub_expectation.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/interaction_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - // UserExpectations should be sorted by start time, not title, so that - // AsyncSliceGroupTrack.buildSubRows_ can lay them out in as few tracks as - // possible, so that they mesh instead of stacking unnecessarily. - test('instantiate', function() { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - var track = new tr.ui.tracks.InteractionTrack(viewport); - track.model = tr.c.TestUtils.newModel(function(model) { - var process = model.getOrCreateProcess(1); - var thread = process.getOrCreateThread(1); - thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 0, duration: 200})); - model.userModel.expectations.push(new tr.model.um.StubExpectation( - {parentModel: model, start: 100, duration: 100})); - model.userModel.expectations.push(new tr.model.um.StubExpectation( - {parentModel: model, start: 0, duration: 100})); - model.userModel.expectations.push(new tr.model.um.StubExpectation( - {parentModel: model, start: 150, duration: 50})); - model.userModel.expectations.push(new tr.model.um.StubExpectation( - {parentModel: model, start: 50, duration: 100})); - model.userModel.expectations.push(new tr.model.um.StubExpectation( - {parentModel: model, start: 0, duration: 50})); - // Model.createImportTracesTask() automatically sorts IRs by start time. - }); - assert.equal(2, track.subRows_.length); - assert.equal(2, track.subRows_[0].length); - assert.equal(3, track.subRows_[1].length); - drawingContainer.appendChild(track); - this.addHTMLOutput(div); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/kernel_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/kernel_track.html deleted file mode 100644 index 20ffea84d05..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/kernel_track.html +++ /dev/null @@ -1,83 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/process_track_base.html"> -<link rel="import" href="/tracing/ui/tracks/cpu_track.html"> -<link rel="import" href="/tracing/ui/tracks/spacing_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var Cpu = tr.model.Cpu; - var CpuTrack = tr.ui.tracks.cpu_track; - var ProcessTrackBase = tr.ui.tracks.ProcessTrackBase; - var SpacingTrack = tr.ui.tracks.SpacingTrack; - - /** - * @constructor - */ - var KernelTrack = tr.ui.b.define('kernel-track', ProcessTrackBase); - - KernelTrack.prototype = { - __proto__: ProcessTrackBase.prototype, - - decorate: function(viewport) { - ProcessTrackBase.prototype.decorate.call(this, viewport); - }, - - - // Kernel maps to processBase because we derive from ProcessTrackBase. - set kernel(kernel) { - this.processBase = kernel; - }, - - get kernel() { - return this.processBase; - }, - - get eventContainer() { - return this.kernel; - }, - - get hasVisibleContent() { - return this.children.length > 1; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.call( - this, containerToTrackMap); - containerToTrackMap.addContainer(this.kernel, this); - }, - - willAppendTracks_: function() { - var cpus = tr.b.dictionaryValues(this.kernel.cpus); - cpus.sort(tr.model.Cpu.compare); - - var didAppendAtLeastOneTrack = false; - for (var i = 0; i < cpus.length; ++i) { - var cpu = cpus[i]; - var track = new tr.ui.tracks.CpuTrack(this.viewport); - track.detailedMode = this.expanded; - track.cpu = cpu; - if (!track.hasVisibleContent) - continue; - this.appendChild(track); - didAppendAtLeastOneTrack = true; - } - if (didAppendAtLeastOneTrack) - this.appendChild(new SpacingTrack(this.viewport)); - } - }; - - - return { - KernelTrack: KernelTrack - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track.html deleted file mode 100644 index 64f26e4fb4f..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track.html +++ /dev/null @@ -1,260 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/color_scheme.html"> -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/model/proxy_selectable_item.html"> -<link rel="import" href="/tracing/ui/base/event_presenter.html"> -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<style> -.letter-dot-track { - height: 18px; -} -</style> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var EventPresenter = tr.ui.b.EventPresenter; - var SelectionState = tr.model.SelectionState; - - /** - * A track that displays an array of dots with filled letters inside them. - * @constructor - * @extends {Track} - */ - var LetterDotTrack = tr.ui.b.define( - 'letter-dot-track', tr.ui.tracks.Track); - - LetterDotTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('letter-dot-track'); - this.items_ = undefined; - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - set heading(heading) { - this.heading_.heading = heading; - }, - - get heading() { - return this.heading_.heading; - }, - - set tooltip(tooltip) { - this.heading_.tooltip = tooltip; - }, - - get items() { - return this.items_; - }, - - set items(items) { - this.items_ = items; - this.invalidateDrawingContainer(); - }, - - get height() { - return window.getComputedStyle(this).height; - }, - - set height(height) { - this.style.height = height; - }, - - get dumpRadiusView() { - return 7 * (window.devicePixelRatio || 1); - }, - - draw: function(type, viewLWorld, viewRWorld) { - if (this.items_ === undefined) - return; - switch (type) { - case tr.ui.tracks.DrawType.GENERAL_EVENT: - this.drawLetterDots_(viewLWorld, viewRWorld); - break; - } - }, - - drawLetterDots_: function(viewLWorld, viewRWorld) { - var ctx = this.context(); - var pixelRatio = window.devicePixelRatio || 1; - - var bounds = this.getBoundingClientRect(); - var height = bounds.height * pixelRatio; - var halfHeight = height * 0.5; - var twoPi = Math.PI * 2; - - // Culling parameters. - var dt = this.viewport.currentDisplayTransform; - var dumpRadiusView = this.dumpRadiusView; - var itemRadiusWorld = dt.xViewVectorToWorld(height); - - // Draw the memory dumps. - var items = this.items_; - var loI = tr.b.findLowIndexInSortedArray( - items, - function(item) { return item.start; }, - viewLWorld); - - var oldFont = ctx.font; - ctx.font = '400 ' + Math.floor(9 * pixelRatio) + 'px Arial'; - ctx.strokeStyle = 'rgb(0,0,0)'; - ctx.textBaseline = 'middle'; - ctx.textAlign = 'center'; - - var drawItems = function(selected) { - for (var i = loI; i < items.length; ++i) { - var item = items[i]; - var x = item.start; - if (x - itemRadiusWorld > viewRWorld) - break; - if (item.selected !== selected) - continue; - var xView = dt.xWorldToView(x); - - ctx.fillStyle = EventPresenter.getSelectableItemColorAsString(item); - ctx.beginPath(); - ctx.arc(xView, halfHeight, dumpRadiusView + 0.5, 0, twoPi); - ctx.fill(); - if (item.selected) { - ctx.lineWidth = 3; - ctx.strokeStyle = 'rgb(100,100,0)'; - ctx.stroke(); - - ctx.beginPath(); - ctx.arc(xView, halfHeight, dumpRadiusView, 0, twoPi); - ctx.lineWidth = 1.5; - ctx.strokeStyle = 'rgb(255,255,0)'; - ctx.stroke(); - } else { - ctx.lineWidth = 1; - ctx.strokeStyle = 'rgb(0,0,0)'; - ctx.stroke(); - } - - ctx.fillStyle = 'rgb(255, 255, 255)'; - ctx.fillText(item.dotLetter, xView, halfHeight); - } - }; - - // Draw unselected items first to make sure they don't occlude selected - // items. - drawItems(false); - drawItems(true); - - ctx.lineWidth = 1; - ctx.font = oldFont; - }, - - addEventsToTrackMap: function(eventToTrackMap) { - if (this.items_ === undefined) - return; - - this.items_.forEach(function(item) { - item.addToTrackMap(eventToTrackMap, this); - }, this); - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - if (this.items_ === undefined) - return; - - var itemRadiusWorld = viewPixWidthWorld * this.dumpRadiusView; - tr.b.iterateOverIntersectingIntervals( - this.items_, - function(x) { return x.start - itemRadiusWorld; }, - function(x) { return 2 * itemRadiusWorld; }, - loWX, hiWX, - function(item) { - item.addToSelection(selection); - }.bind(this)); - }, - - /** - * Add the item to the left or right of the provided event, if any, to the - * selection. - * @param {event} The current event item. - * @param {Number} offset Number of slices away from the event to look. - * @param {Selection} selection The selection to add an event to, - * if found. - * @return {boolean} Whether an event was found. - * @private - */ - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - if (this.items_ === undefined) - return; - - var items = this.items_; - var index = tr.b.findFirstIndexInArray(items, function(item) { - return item.modelItem === event; - }); - if (index === -1) - return false; - - var newIndex = index + offset; - if (newIndex >= 0 && newIndex < items.length) { - items[newIndex].addToSelection(selection); - return true; - } - return false; - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - if (this.items_ === undefined) - return; - - var item = tr.b.findClosestElementInSortedArray( - this.items_, - function(x) { return x.start; }, - worldX, - worldMaxDist); - - if (!item) - return; - - item.addToSelection(selection); - } - }; - - /** - * A filled dot with a letter inside it. - * - * @constructor - * @extends {ProxySelectableItem} - */ - function LetterDot(modelItem, dotLetter, colorId, start) { - tr.model.ProxySelectableItem.call(this, modelItem); - this.dotLetter = dotLetter; - this.colorId = colorId; - this.start = start; - }; - - LetterDot.prototype = { - __proto__: tr.model.ProxySelectableItem.prototype - }; - - return { - LetterDotTrack: LetterDotTrack, - LetterDot: LetterDot - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track_test.html deleted file mode 100644 index 93c2bcfbb9a..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/letter_dot_track_test.html +++ /dev/null @@ -1,121 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/letter_dot_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var LetterDotTrack = tr.ui.tracks.LetterDotTrack; - var LetterDot = tr.ui.tracks.LetterDot; - var SelectionState = tr.model.SelectionState; - var Viewport = tr.ui.TimelineViewport; - - var createItems = function() { - var items = [ - new LetterDot({selectionState: SelectionState.SELECTED}, 'a', 7, 5), - new LetterDot({selectionState: SelectionState.SELECTED}, 'b', 2, 20), - new LetterDot({selectionState: SelectionState.NONE}, 'c', 4, 35), - new LetterDot({selectionState: SelectionState.NONE}, 'd', 4, 50) - ]; - return items; - }; - - test('instantiate', function() { - var items = createItems(); - - var div = document.createElement('div'); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = LetterDotTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.items = items; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 60, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('selectionHitTesting', function() { - var items = createItems(); - - var track = new LetterDotTrack(new Viewport()); - track.items = items; - - // Fake a view pixel size. - var devicePixelRatio = window.devicePixelRatio || 1; - var viewPixWidthWorld = 0.1 / devicePixelRatio; - - // Hit outside range - var selection = []; - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 3, 4, viewPixWidthWorld, selection); - assert.equal(selection.length, 0); - - // Hit the first item, via pixel-nearness. - selection = []; - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 19.98, 19.99, viewPixWidthWorld, selection); - assert.equal(selection.length, 1); - assert.equal(selection[0], items[1].modelItem); - - // Hit the instance, between the 1st and 2nd snapshots - selection = []; - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 30, 50, viewPixWidthWorld, selection); - assert.equal(selection.length, 2); - assert.equal(selection[0], items[2].modelItem); - assert.equal(selection[1], items[3].modelItem); - }); - - test('addEventNearToProvidedEventToSelection', function() { - var items = createItems(); - - var track = new LetterDotTrack(new Viewport()); - track.items = items; - - // Right from the middle of items. - var selection1 = []; - assert.isTrue(track.addEventNearToProvidedEventToSelection( - items[2].modelItem, 1, selection1)); - assert.equal(selection1.length, 1); - assert.equal(selection1[0], items[3].modelItem); - - // Left from the middle of items. - var selection2 = []; - assert.isTrue(track.addEventNearToProvidedEventToSelection( - items[2].modelItem, -1, selection2)); - assert.equal(selection2.length, 1); - assert.equal(selection2[0], items[1].modelItem); - - // Right from the right edge of items. - var selection3 = []; - assert.isFalse(track.addEventNearToProvidedEventToSelection( - items[3].modelItem, 1, selection3)); - assert.equal(selection3.length, 0); - - // Left from the left edge of items. - var selection4 = []; - assert.isFalse(track.addEventNearToProvidedEventToSelection( - items[0].modelItem, -1, selection4)); - assert.equal(selection4.length, 0); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_test_utils.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_test_utils.html deleted file mode 100644 index 2d13a901ba8..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_test_utils.html +++ /dev/null @@ -1,143 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/model/container_memory_dump.html"> -<link rel="import" href="/tracing/model/global_memory_dump.html"> -<link rel="import" href="/tracing/model/memory_dump_test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/model/process_memory_dump.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/model/vm_region.html"> - -<script> -'use strict'; - -/** - * @fileoverview Helper functions for memory dump track tests. - */ -tr.exportTo('tr.ui.tracks', function() { - var ProcessMemoryDump = tr.model.ProcessMemoryDump; - var GlobalMemoryDump = tr.model.GlobalMemoryDump; - var VMRegion = tr.model.VMRegion; - var VMRegionClassificationNode = tr.model.VMRegionClassificationNode; - var SelectionState = tr.model.SelectionState; - var addGlobalMemoryDump = tr.model.MemoryDumpTestUtils.addGlobalMemoryDump; - var addProcessMemoryDump = tr.model.MemoryDumpTestUtils.addProcessMemoryDump; - var newAllocatorDump = tr.model.MemoryDumpTestUtils.newAllocatorDump; - var addOwnershipLink = tr.model.MemoryDumpTestUtils.addOwnershipLink; - var LIGHT = tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT; - var DETAILED = tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED; - - function createVMRegions(pssValues) { - return VMRegionClassificationNode.fromRegions( - pssValues.map(function(pssValue, i) { - return VMRegion.fromDict({ - startAddress: 1000 * i, - sizeInBytes: 1000, - protectionFlags: VMRegion.PROTECTION_FLAG_READ, - mappedFile: '[stack' + i + ']', - byteStats: { - privateDirtyResident: pssValue / 3, - swapped: pssValue * 3, - proportionalResident: pssValue - } - }); - })); - } - - function createAllocatorDumps(memoryDump, dumpData) { - // Create the individual allocator dumps. - var allocatorDumps = tr.b.mapItems(dumpData, function(allocatorName, data) { - var size = data.size; - assert.typeOf(size, 'number'); // Sanity check. - return newAllocatorDump(memoryDump, allocatorName, { size: size }); - }); - - // Add ownership links between them. - tr.b.iterItems(dumpData, function(allocatorName, data) { - var owns = data.owns; - if (owns === undefined) - return; - - var ownerDump = allocatorDumps[allocatorName]; - assert.isDefined(ownerDump); // Sanity check. - var ownedDump = allocatorDumps[owns]; - assert.isDefined(ownedDump); // Sanity check. - - addOwnershipLink(ownerDump, ownedDump); - }); - - return tr.b.dictionaryValues(allocatorDumps); - } - - function addProcessMemoryDumpWithFields(globalMemoryDump, process, start, - opt_pssValues, opt_dumpData) { - var pmd = addProcessMemoryDump(globalMemoryDump, process, start); - if (opt_pssValues !== undefined) - pmd.vmRegions = createVMRegions(opt_pssValues); - if (opt_dumpData !== undefined) - pmd.memoryAllocatorDumps = createAllocatorDumps(pmd, opt_dumpData); - } - - function createModelWithDumps(withVMRegions, withAllocatorDumps) { - var maybePssValues = function(pssValues) { - return withVMRegions ? pssValues : undefined; - }; - var maybeDumpData = function(dumpData) { - return withAllocatorDumps ? dumpData : undefined; - }; - return tr.c.TestUtils.newModel(function(model) { - // Construct a model with three processes. - var pa = model.getOrCreateProcess(3); - var pb = model.getOrCreateProcess(6); - var pc = model.getOrCreateProcess(9); - - var gmd1 = addGlobalMemoryDump(model, 0, LIGHT); - addProcessMemoryDumpWithFields(gmd1, pa, 0, maybePssValues([111])); - addProcessMemoryDumpWithFields(gmd1, pb, 0.2, undefined, - maybeDumpData({oilpan: {size: 1024}})); - - var gmd2 = addGlobalMemoryDump(model, 5, DETAILED); - addProcessMemoryDumpWithFields(gmd2, pa, 0); - addProcessMemoryDumpWithFields(gmd2, pb, 4.99, maybePssValues([100, 50]), - maybeDumpData({v8: {size: 512}})); - addProcessMemoryDumpWithFields(gmd2, pc, 5.12, undefined, - maybeDumpData({oilpan: {size: 128, owns: 'v8'}, - v8: {size: 384, owns: 'tracing'}, tracing: {size: 65920}})); - - var gmd3 = addGlobalMemoryDump(model, 15, DETAILED); - addProcessMemoryDumpWithFields(gmd3, pa, 15.5, maybePssValues([]), - maybeDumpData({v8: {size: 768}})); - addProcessMemoryDumpWithFields(gmd3, pc, 14.5, - maybePssValues([70, 70, 70]), maybeDumpData({oilpan: {size: 512}})); - - var gmd4 = addGlobalMemoryDump(model, 18, LIGHT); - }); - } - - function createTestGlobalMemoryDumps(withVMRegions, withAllocatorDumps) { - var model = createModelWithDumps(withVMRegions, withAllocatorDumps); - var dumps = model.globalMemoryDumps; - dumps[1].selectionState = SelectionState.HIGHLIGHTED; - dumps[2].selectionState = SelectionState.SELECTED; - return dumps; - } - - function createTestProcessMemoryDumps(withVMRegions, withAllocatorDumps) { - var model = createModelWithDumps(withVMRegions, withAllocatorDumps); - var dumps = model.getProcess(9).memoryDumps; - dumps[0].selectionState = SelectionState.SELECTED; - dumps[1].selectionState = SelectionState.HIGHLIGHTED; - return dumps; - } - - return { - createTestGlobalMemoryDumps: createTestGlobalMemoryDumps, - createTestProcessMemoryDumps: createTestProcessMemoryDumps - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util.html deleted file mode 100644 index 821186182b4..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util.html +++ /dev/null @@ -1,262 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/model/container_memory_dump.html"> -<link rel="import" href="/tracing/model/memory_allocator_dump.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/letter_dot_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var ColorScheme = tr.b.ColorScheme; - - var DISPLAYED_SIZE_NUMERIC_NAME = - tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME; - var LIGHT = tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT; - var DETAILED = tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED; - - /** - * Add numeric values from a source dictionary to the numeric values in - * a destination dictionary. Undefined values are treated as zeros. Note that - * this method modifies the destination dictionary in place. - * - * Example: addDictionary({a: 1, b: 2}, {b: 3, c: 4}) will update the - * destination dictionary (first argument) to {a: 1, b: 5, c: 4}. - */ - function addDictionary(dstDict, srcDict) { - tr.b.iterItems(srcDict, function(key, value) { - var existingValue = dstDict[key]; - if (existingValue === undefined) - existingValue = 0; - dstDict[key] = existingValue + value; - }); - } - - /** - * Get a dictionary mapping root allocator names (e.g. 'v8') to the - * corresponding sizes (e.g. 1024) in a process memory dump. - */ - function getProcessMemoryDumpAllocatorSizes(processMemoryDump) { - var allocatorDumps = processMemoryDump.memoryAllocatorDumps; - if (allocatorDumps === undefined) - return {}; - var allocatorSizes = {}; - allocatorDumps.forEach(function(allocatorDump) { - // Don't show tracing overhead in the charts. - // TODO(petrcermak): Find a less hacky way to do this. - if (allocatorDump.fullName === 'tracing') - return; - var allocatorSize = allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME]; - if (allocatorSize === undefined) - return; - var allocatorSizeValue = allocatorSize.value; - if (allocatorSizeValue === undefined) - return; - allocatorSizes[allocatorDump.fullName] = allocatorSizeValue; - }); - return allocatorSizes; - }; - - /** - * Get a dictionary mapping root allocator names (e.g. 'v8') to the - * corresponding sizes (e.g. 1024) in a global memory dump (i.e. summed over - * all simultaneous process memory dumps). - */ - function getGlobalMemoryDumpAllocatorSizes(globalMemoryDump) { - var globalAllocatorSizes = {}; - tr.b.iterItems(globalMemoryDump.processMemoryDumps, - function(pid, processMemoryDump) { - addDictionary(globalAllocatorSizes, - getProcessMemoryDumpAllocatorSizes(processMemoryDump)); - }); - return globalAllocatorSizes; - } - - /** - * A generic function which converts a list of memory dumps to a list of chart - * series (one per root allocator). Each series represents the evolution of - * the size of a the corresponding root allocator (e.g. 'v8') over time. - */ - function buildAllocatedMemoryChartSeries(memoryDumps, - memoryDumpToAllocatorSizesFn) { - var allocatorNameToPoints = {}; - var dumpsData = memoryDumps.map(function(memoryDump) { - var allocatorSizes = memoryDumpToAllocatorSizesFn(memoryDump); - tr.b.iterItems(allocatorSizes, function(allocatorName) { - allocatorNameToPoints[allocatorName] = []; - }); - return {dump: memoryDump, sizes: allocatorSizes}; - }); - - // Do not generate any chart series if no process memory dump contains any - // allocator dumps. - if (Object.keys(allocatorNameToPoints).length === 0) - return undefined; - - dumpsData.forEach(function(dumpData) { - var memoryDump = dumpData.dump; - var allocatorSizes = dumpData.sizes; - tr.b.iterItems(allocatorNameToPoints, function(allocatorName, points) { - var allocatorSize = allocatorSizes[allocatorName] || 0; - points.push(new tr.ui.tracks.ChartPoint( - memoryDump, memoryDump.start, allocatorSize)); - }); - }); - - // Create one common axis for all allocated memory chart series. - var axis = new tr.ui.tracks.ChartAxis(0); - - // Build a chart series for each allocator. - var series = []; - tr.b.iterItems(allocatorNameToPoints, function(allocatorName, points) { - var colorId = ColorScheme.getColorIdForGeneralPurposeString( - allocatorName); - var renderingConfig = { - chartType: tr.ui.tracks.ChartSeriesType.LINE, - colorId: colorId - }; - series.push(new tr.ui.tracks.ChartSeries(points, axis, renderingConfig)); - }); - - return series; - } - - /** - * Transform a list of memory dumps to a list of letter dots (with letter 'M' - * inside). - */ - function buildMemoryLetterDots(memoryDumps) { - var lightMemoryColorId = - ColorScheme.getColorIdForReservedName('light_memory_dump'); - var detailedMemoryColorId = - ColorScheme.getColorIdForReservedName('detailed_memory_dump'); - return memoryDumps.map(function(memoryDump) { - var memoryColorId; - switch (memoryDump.levelOfDetail) { - case DETAILED: - memoryColorId = detailedMemoryColorId; - break; - case LIGHT: - default: - memoryColorId = lightMemoryColorId; - } - return new tr.ui.tracks.LetterDot( - memoryDump, 'M', memoryColorId, memoryDump.start); - }); - } - - /** - * Convert a list of global memory dumps to a list of chart series (one per - * process). Each series represents the evolution of the memory used by the - * process over time. - */ - function buildGlobalUsedMemoryChartSeries(globalMemoryDumps) { - // Do not generate the chart if no process memory dump contains VM regions. - var containsVmRegions = globalMemoryDumps.some(function(globalDump) { - for (var pid in globalDump.processMemoryDumps) - if (globalDump.processMemoryDumps[pid].mostRecentVmRegions) - return true; - return false; - }); - if (!containsVmRegions) - return undefined; - - // Find all processes that dump memory at least once. - var pidToProcess = {}; - globalMemoryDumps.forEach(function(globalDump) { - tr.b.iterItems(globalDump.processMemoryDumps, function(pid, processDump) { - pidToProcess[pid] = processDump.process; - }); - }); - - // Build one list of points for each instrumented process. - var pidToPoints = {}; - tr.b.iterItems(pidToProcess, function(pid, process) { - pidToPoints[pid] = []; - }); - - // For every timestamp, calculate the total PSS (proportional set size) of - // each process and append it to the corresponding list of points. - globalMemoryDumps.forEach(function(globalDump) { - var pssBase = 0; - tr.b.iterItems(pidToPoints, function(pid, points) { - var processMemoryDump = globalDump.processMemoryDumps[pid]; - var cumulativePss = pssBase; - // If no dump was found (probably dead) or it does not provide the - // necessary information (namely most recent VM regions), assume zero. - if (processMemoryDump !== undefined) { - var vmRegions = processMemoryDump.mostRecentVmRegions; - if (vmRegions !== undefined) - cumulativePss += vmRegions.byteStats.proportionalResident || 0; - } - points.push(new tr.ui.tracks.ChartPoint( - globalDump, globalDump.start, cumulativePss, pssBase)); - pssBase = cumulativePss; - }); - }); - - // Create one common axis for all used memory chart series. - var axis = new tr.ui.tracks.ChartAxis(0); - - // Build a chart series for each instrumented process. - var series = []; - tr.b.iterItems(pidToPoints, function(pid, points) { - var process = pidToProcess[pid]; - var colorId = ColorScheme.getColorIdForGeneralPurposeString( - process.userFriendlyName); - var renderingConfig = { - chartType: tr.ui.tracks.ChartSeriesType.AREA, - colorId: colorId, - backgroundOpacity: 0.8 - }; - series.push(new tr.ui.tracks.ChartSeries(points, axis, renderingConfig)); - }); - - // Show the first series (with the smallest cumulative value) at the top. - series.reverse(); - - return series; - } - - /** - * Convert a list of process memory dumps to a list of chart series (one per - * root allocator). Each series represents the evolution of the size of a the - * corresponding root allocator (e.g. 'v8') over time. - */ - function buildProcessAllocatedMemoryChartSeries(processMemoryDumps) { - return buildAllocatedMemoryChartSeries(processMemoryDumps, - getProcessMemoryDumpAllocatorSizes); - } - - /** - * Convert a list of global memory dumps to a list of chart series (one per - * root allocator). Each series represents the evolution of the size of a the - * corresponding root allocator (e.g. 'v8') over time. - */ - function buildGlobalAllocatedMemoryChartSeries(globalMemoryDumps) { - return buildAllocatedMemoryChartSeries(globalMemoryDumps, - getGlobalMemoryDumpAllocatorSizes); - } - - return { - buildMemoryLetterDots: - buildMemoryLetterDots, - buildGlobalUsedMemoryChartSeries: - buildGlobalUsedMemoryChartSeries, - buildProcessAllocatedMemoryChartSeries: - buildProcessAllocatedMemoryChartSeries, - buildGlobalAllocatedMemoryChartSeries: - buildGlobalAllocatedMemoryChartSeries - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util_test.html deleted file mode 100644 index 58e46078245..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/memory_dump_track_util_test.html +++ /dev/null @@ -1,228 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_test_utils.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_util.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var SelectionState = tr.model.SelectionState; - var createTestGlobalMemoryDumps = tr.ui.tracks.createTestGlobalMemoryDumps; - var createTestProcessMemoryDumps = tr.ui.tracks.createTestProcessMemoryDumps; - - test('buildMemoryLetterDots_withoutVMRegions', function() { - var dumps = createTestGlobalMemoryDumps(false, false); - var items = tr.ui.tracks.buildMemoryLetterDots(dumps); - - assert.lengthOf(items, 4); - assert.equal(items[0].start, 0); - assert.equal(items[1].start, 5); - assert.equal(items[2].start, 15); - assert.equal(items[3].start, 18); - - // Check model mapping. - assert.equal(items[1].selectionState, SelectionState.HIGHLIGHTED); - assert.isTrue(items[2].selected); - assert.equal(items[3].modelItem, dumps[3]); - }); - - test('buildMemoryLetterDots_withVMRegions', function() { - var dumps = createTestGlobalMemoryDumps(false, false); - var items = tr.ui.tracks.buildMemoryLetterDots(dumps); - - assert.lengthOf(items, 4); - assert.equal(items[0].start, 0); - assert.equal(items[1].start, 5); - assert.equal(items[2].start, 15); - assert.equal(items[3].start, 18); - - // Check model mapping. - assert.equal(items[1].selectionState, SelectionState.HIGHLIGHTED); - assert.isTrue(items[2].selected); - assert.equal(items[3].modelItem, dumps[3]); - }); - - test('buildGlobalUsedMemoryChartSeries_withoutVMRegions', function() { - var dumps = createTestGlobalMemoryDumps(false, false); - var series = tr.ui.tracks.buildGlobalUsedMemoryChartSeries(dumps); - - assert.isUndefined(series); - }); - - test('buildGlobalUsedMemoryChartSeries_withVMRegions', function() { - var dumps = createTestGlobalMemoryDumps(true, false); - var series = tr.ui.tracks.buildGlobalUsedMemoryChartSeries(dumps); - - assert.lengthOf(series, 3); - - var sa = series[2]; - var sb = series[1]; - var sc = series[0]; - - assert.lengthOf(sa.points, 4); - assert.lengthOf(sb.points, 4); - assert.lengthOf(sc.points, 4); - - // Process A: VM regions defined -> sum their PSS values (111). - // Process B: VM regions undefined and no previous value -> assume zero. - // Process C: Memory dump not present -> assume process not alive (0). - assert.equal(sa.points[0].x, 0); - assert.equal(sb.points[0].x, 0); - assert.equal(sc.points[0].x, 0); - assert.equal(sa.points[0].y, 111); - assert.equal(sb.points[0].y, 111); - assert.equal(sc.points[0].y, 111); - assert.equal(sa.points[0].yBase, 0); - assert.equal(sb.points[0].yBase, 111); - assert.equal(sc.points[0].yBase, 111); - - // Process A: VM regions undefined -> assume previous value (111). - // Process B: VM regions defined -> sum their PSS values (555). - // Process C: VM regions undefined -> assume previous value (0). - assert.equal(sa.points[1].x, 5); - assert.equal(sb.points[1].x, 5); - assert.equal(sc.points[1].x, 5); - assert.equal(sa.points[1].y, 111); - assert.equal(sb.points[1].y, 261); - assert.equal(sc.points[1].y, 261); - assert.equal(sa.points[1].yBase, 0); - assert.equal(sb.points[1].yBase, 111); - assert.equal(sc.points[1].yBase, 261); - - // Process A: VM regions defined -> sum their PSS values (0). - // Process B: Memory dump not present -> assume process not alive (0). - // Process C: VM regions defined -> sum their PSS values (999). - assert.equal(sa.points[2].x, 15); - assert.equal(sb.points[2].x, 15); - assert.equal(sc.points[2].x, 15); - assert.equal(sa.points[2].y, 0); - assert.equal(sb.points[2].y, 0); - assert.equal(sc.points[2].y, 210); - assert.equal(sa.points[2].yBase, 0); - assert.equal(sb.points[2].yBase, 0); - assert.equal(sc.points[2].yBase, 0); - - // All processes: Memory dump not present -> assume process not alive (0). - assert.equal(sa.points[3].x, 18); - assert.equal(sb.points[3].x, 18); - assert.equal(sc.points[3].x, 18); - assert.equal(sa.points[3].y, 0); - assert.equal(sb.points[3].y, 0); - assert.equal(sc.points[3].y, 0); - assert.equal(sc.points[3].yBase, 0); - assert.equal(sc.points[3].yBase, 0); - assert.equal(sc.points[3].yBase, 0); - - // Check model mapping. - assert.equal(sa.points[1].selectionState, SelectionState.HIGHLIGHTED); - assert.isTrue(sb.points[2].selected); - assert.equal(sc.points[3].modelItem, dumps[3]); - }); - - test('buildGlobalAllocatedMemoryChartSeries_withoutMemoryAllocatorDumps', - function() { - var dumps = createTestGlobalMemoryDumps(false, false); - var series = tr.ui.tracks.buildGlobalAllocatedMemoryChartSeries(dumps); - - assert.isUndefined(series); - }); - - test('buildGlobalAllocatedMemoryChartSeries_withMemoryAllocatorDumps', - function() { - var dumps = createTestGlobalMemoryDumps(false, true); - var series = tr.ui.tracks.buildGlobalAllocatedMemoryChartSeries(dumps); - - assert.lengthOf(series, 2); - - var so = series[0]; - var sv = series[1]; - - assert.lengthOf(so.points, 4); - assert.lengthOf(sv.points, 4); - - // Oilpan: Only process B dumps allocated objects size (1024). - // V8: No process dumps allocated objects size (0). - assert.equal(so.points[0].x, 0); - assert.equal(sv.points[0].x, 0); - assert.equal(so.points[0].y, 1024); - assert.equal(sv.points[0].y, 0); - - // Oilpan: Process B did not provide a value and process C dumps (128). - // V8: Processes B and C dump (512 + 256). - assert.equal(so.points[1].x, 5); - assert.equal(sv.points[1].x, 5); - assert.equal(so.points[1].y, 128); - assert.equal(sv.points[1].y, 768); - - // Oilpan: Process B assumed not alive and process C dumps (512) - // V8: Process A dumps now, process B assumed not alive, process C did not - // provide a value (768). - assert.equal(so.points[2].x, 15); - assert.equal(sv.points[2].x, 15); - assert.equal(so.points[2].y, 512); - assert.equal(sv.points[2].y, 768); - - // All processes: Memory dump not present -> assume process not alive (0). - assert.equal(so.points[3].x, 18); - assert.equal(sv.points[3].x, 18); - assert.equal(so.points[3].y, 0); - assert.equal(sv.points[3].y, 0); - - // Check model mapping. - assert.equal(so.points[1].selectionState, SelectionState.HIGHLIGHTED); - assert.isTrue(sv.points[2].selected); - assert.equal(so.points[3].modelItem, dumps[3]); - }); - - test('buildProcessAllocatedMemoryChartSeries_withoutMemoryAllocatorDumps', - function() { - var dumps = createTestProcessMemoryDumps(false, false); - var series = tr.ui.tracks.buildProcessAllocatedMemoryChartSeries(dumps); - - assert.isUndefined(series); - }); - - test('buildProcessAllocatedMemoryChartSeries_withMemoryAllocatorDumps', - function() { - var dumps = createTestProcessMemoryDumps(false, true); - var series = tr.ui.tracks.buildProcessAllocatedMemoryChartSeries(dumps); - - // There should be only 2 series (because 'tracing' is not shown in the - // charts). - assert.lengthOf(series, 2); - - var so = series[0]; - var sv = series[1]; - - assert.lengthOf(so.points, 2); - assert.lengthOf(sv.points, 2); - - // Oilpan: Process dumps (128). - // V8: Process dumps (256). - assert.equal(so.points[0].x, 5.12); - assert.equal(sv.points[0].x, 5.12); - assert.equal(so.points[0].y, 128); - assert.equal(sv.points[0].y, 256); - - // Oilpan: Process dumps (512). - // V8: Process did not provide a value (0). - assert.equal(so.points[1].x, 14.5); - assert.equal(sv.points[1].x, 14.5); - assert.equal(so.points[1].y, 512); - assert.equal(sv.points[1].y, 0); - - // Check model mapping. - assert.equal(so.points[1].selectionState, SelectionState.HIGHLIGHTED); - assert.isTrue(sv.points[0].selected); - assert.equal(so.points[1].modelItem, dumps[1]); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/model_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/model_track.html deleted file mode 100644 index 29e8b94c85e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/model_track.html +++ /dev/null @@ -1,432 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/draw_helpers.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/alert_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/cpu_usage_track.html"> -<link rel="import" href="/tracing/ui/tracks/device_track.html"> -<link rel="import" href="/tracing/ui/tracks/global_memory_dump_track.html"> -<link rel="import" href="/tracing/ui/tracks/highlighter.html"> -<link rel="import" href="/tracing/ui/tracks/interaction_track.html"> -<link rel="import" href="/tracing/ui/tracks/kernel_track.html"> -<link rel="import" href="/tracing/ui/tracks/process_track.html"> - -<style> -.model-track { - -webkit-box-flex: 1; -} -</style> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var SelectionState = tr.model.SelectionState; - var EventPresenter = tr.ui.b.EventPresenter; - - /** - * Visualizes a Model by building ProcessTracks and CpuTracks. - * @constructor - */ - var ModelTrack = tr.ui.b.define('model-track', tr.ui.tracks.ContainerTrack); - - - ModelTrack.prototype = { - - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.classList.add('model-track'); - - var typeInfos = tr.ui.tracks.Highlighter.getAllRegisteredTypeInfos(); - this.highlighters_ = typeInfos.map( - function(typeInfo) { - return new typeInfo.constructor(viewport); - }); - - this.upperMode_ = false; - this.annotationViews_ = []; - }, - - // upperMode is true if the track is being used on the ruler. - get upperMode() { - return this.upperMode_; - }, - - set upperMode(upperMode) { - this.upperMode_ = upperMode; - this.updateContents_(); - }, - - detach: function() { - tr.ui.tracks.ContainerTrack.prototype.detach.call(this); - }, - - get model() { - return this.model_; - }, - - set model(model) { - this.model_ = model; - this.updateContents_(); - - this.model_.addEventListener('annotationChange', - this.updateAnnotations_.bind(this)); - }, - - get hasVisibleContent() { - return this.children.length > 0; - }, - - updateContents_: function() { - this.textContent = ''; - if (!this.model_) - return; - - if (this.upperMode_) - this.updateContentsForUpperMode_(); - else - this.updateContentsForLowerMode_(); - }, - - updateContentsForUpperMode_: function() { - }, - - updateContentsForLowerMode_: function() { - if (this.model_.userModel.expectations.length) { - var mrt = new tr.ui.tracks.InteractionTrack(this.viewport_); - mrt.model = this.model_; - this.appendChild(mrt); - } - - if (this.model_.alerts.length) { - var at = new tr.ui.tracks.AlertTrack(this.viewport_); - at.alerts = this.model_.alerts; - this.appendChild(at); - } - - if (this.model_.globalMemoryDumps.length) { - var gmdt = new tr.ui.tracks.GlobalMemoryDumpTrack(this.viewport_); - gmdt.memoryDumps = this.model_.globalMemoryDumps; - this.appendChild(gmdt); - } - - this.appendDeviceTrack_(); - this.appendCpuUsageTrack_(); - this.appendKernelTrack_(); - - // Get a sorted list of processes. - var processes = this.model_.getAllProcesses(); - processes.sort(tr.model.Process.compare); - - for (var i = 0; i < processes.length; ++i) { - var process = processes[i]; - - var track = new tr.ui.tracks.ProcessTrack(this.viewport); - track.process = process; - if (!track.hasVisibleContent) - continue; - - this.appendChild(track); - } - this.viewport_.rebuildEventToTrackMap(); - this.viewport_.rebuildContainerToTrackMap(); - - for (var i = 0; i < this.highlighters_.length; i++) { - this.highlighters_[i].processModel(this.model_); - } - - this.updateAnnotations_(); - }, - - updateAnnotations_: function() { - this.annotationViews_ = []; - var annotations = this.model_.getAllAnnotations(); - for (var i = 0; i < annotations.length; i++) { - this.annotationViews_.push( - annotations[i].getOrCreateView(this.viewport_)); - } - this.invalidateDrawingContainer(); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - if (!this.model_) - return; - - var tracks = this.children; - for (var i = 0; i < tracks.length; ++i) - tracks[i].addEventsToTrackMap(eventToTrackMap); - - if (this.instantEvents === undefined) - return; - - var vp = this.viewport_; - this.instantEvents.forEach(function(ev) { - eventToTrackMap.addEvent(ev, this); - }.bind(this)); - }, - - appendDeviceTrack_: function() { - var device = this.model.device; - var track = new tr.ui.tracks.DeviceTrack(this.viewport); - track.device = this.model.device; - if (!track.hasVisibleContent) - return; - this.appendChild(track); - }, - - appendKernelTrack_: function() { - var kernel = this.model.kernel; - var track = new tr.ui.tracks.KernelTrack(this.viewport); - track.kernel = this.model.kernel; - if (!track.hasVisibleContent) - return; - this.appendChild(track); - }, - - appendCpuUsageTrack_: function() { - var track = new tr.ui.tracks.CpuUsageTrack(this.viewport); - track.initialize(this.model); - if (!track.hasVisibleContent) - return; - this.appendChild(track); - }, - - drawTrack: function(type) { - var ctx = this.context(); - if (!this.model_) - return; - - var pixelRatio = window.devicePixelRatio || 1; - var bounds = this.getBoundingClientRect(); - var canvasBounds = ctx.canvas.getBoundingClientRect(); - - ctx.save(); - ctx.translate(0, pixelRatio * (bounds.top - canvasBounds.top)); - - var dt = this.viewport.currentDisplayTransform; - var viewLWorld = dt.xViewToWorld(0); - var viewRWorld = dt.xViewToWorld(bounds.width * pixelRatio); - - switch (type) { - case tr.ui.tracks.DrawType.GRID: - this.viewport.drawMajorMarkLines(ctx); - // The model is the only thing that draws grid lines. - ctx.restore(); - return; - - case tr.ui.tracks.DrawType.FLOW_ARROWS: - if (this.model_.flowIntervalTree.size === 0) { - ctx.restore(); - return; - } - - this.drawFlowArrows_(viewLWorld, viewRWorld); - ctx.restore(); - return; - - case tr.ui.tracks.DrawType.INSTANT_EVENT: - if (!this.model_.instantEvents || - this.model_.instantEvents.length === 0) - break; - - tr.ui.b.drawInstantSlicesAsLines( - ctx, - this.viewport.currentDisplayTransform, - viewLWorld, - viewRWorld, - bounds.height, - this.model_.instantEvents, - 4); - - break; - - case tr.ui.tracks.DrawType.MARKERS: - if (!this.viewport.interestRange.isEmpty) { - this.viewport.interestRange.draw(ctx, viewLWorld, viewRWorld); - this.viewport.interestRange.drawIndicators( - ctx, viewLWorld, viewRWorld); - } - ctx.restore(); - return; - - case tr.ui.tracks.DrawType.HIGHLIGHTS: - for (var i = 0; i < this.highlighters_.length; i++) { - this.highlighters_[i].drawHighlight(ctx, dt, viewLWorld, viewRWorld, - bounds.height); - } - ctx.restore(); - return; - - case tr.ui.tracks.DrawType.ANNOTATIONS: - for (var i = 0; i < this.annotationViews_.length; i++) { - this.annotationViews_[i].draw(ctx); - } - ctx.restore(); - return; - } - ctx.restore(); - - tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this, type); - }, - - drawFlowArrows_: function(viewLWorld, viewRWorld) { - var ctx = this.context(); - var dt = this.viewport.currentDisplayTransform; - dt.applyTransformToCanvas(ctx); - - var pixWidth = dt.xViewVectorToWorld(1); - - ctx.strokeStyle = 'rgba(0, 0, 0, 0.4)'; - ctx.fillStyle = 'rgba(0, 0, 0, 0.4)'; - ctx.lineWidth = pixWidth > 1.0 ? 1 : pixWidth; - - var events = - this.model_.flowIntervalTree.findIntersection(viewLWorld, viewRWorld); - - // When not showing flow events, show only highlighted/selected ones. - var onlyHighlighted = !this.viewport.showFlowEvents; - var canvasBounds = ctx.canvas.getBoundingClientRect(); - for (var i = 0; i < events.length; ++i) { - if (onlyHighlighted && - events[i].selectionState !== SelectionState.SELECTED && - events[i].selectionState !== SelectionState.HIGHLIGHTED) - continue; - this.drawFlowArrow_(ctx, events[i], canvasBounds, pixWidth); - } - }, - - drawFlowArrow_: function(ctx, flowEvent, - canvasBounds, pixWidth) { - var pixelRatio = window.devicePixelRatio || 1; - - var startTrack = this.viewport.trackForEvent(flowEvent.startSlice); - var endTrack = this.viewport.trackForEvent(flowEvent.endSlice); - - // TODO(nduca): Figure out how to draw flow arrows even when - // processes are collapsed, bug #931. - if (startTrack === undefined || endTrack === undefined) - return; - - var startBounds = startTrack.getBoundingClientRect(); - var endBounds = endTrack.getBoundingClientRect(); - - if (flowEvent.selectionState == SelectionState.SELECTED) { - ctx.shadowBlur = 1; - ctx.shadowColor = 'red'; - ctx.shadowOffsety = 2; - ctx.strokeStyle = 'red'; - } else if (flowEvent.selectionState == SelectionState.HIGHLIGHTED) { - ctx.shadowBlur = 1; - ctx.shadowColor = 'red'; - ctx.shadowOffsety = 2; - ctx.strokeStyle = 'red'; - } else if (flowEvent.selectionState == SelectionState.DIMMED) { - ctx.shadowBlur = 0; - ctx.shadowOffsetX = 0; - ctx.strokeStyle = 'rgba(0, 0, 0, 0.2)'; - } else { - var hasBoost = false; - var startSlice = flowEvent.startSlice; - hasBoost |= startSlice.selectionState === SelectionState.SELECTED; - hasBoost |= startSlice.selectionState === SelectionState.HIGHLIGHTED; - var endSlice = flowEvent.endSlice; - hasBoost |= endSlice.selectionState === SelectionState.SELECTED; - hasBoost |= endSlice.selectionState === SelectionState.HIGHLIGHTED; - if (hasBoost) { - ctx.shadowBlur = 1; - ctx.shadowColor = 'rgba(255, 0, 0, 0.4)'; - ctx.shadowOffsety = 2; - ctx.strokeStyle = 'rgba(255, 0, 0, 0.4)'; - } else { - ctx.shadowBlur = 0; - ctx.shadowOffsetX = 0; - ctx.strokeStyle = 'rgba(0, 0, 0, 0.4)'; - } - } - - var startSize = startBounds.left + startBounds.top + - startBounds.bottom + startBounds.right; - var endSize = endBounds.left + endBounds.top + - endBounds.bottom + endBounds.right; - // Nothing to do if both ends of the track are collapsed. - if (startSize === 0 && endSize === 0) - return; - - var startY = this.calculateTrackY_(startTrack, canvasBounds); - var endY = this.calculateTrackY_(endTrack, canvasBounds); - - var pixelStartY = pixelRatio * startY; - var pixelEndY = pixelRatio * endY; - var half = (flowEvent.end - flowEvent.start) / 2; - - ctx.beginPath(); - ctx.moveTo(flowEvent.start, pixelStartY); - ctx.bezierCurveTo( - flowEvent.start + half, pixelStartY, - flowEvent.start + half, pixelEndY, - flowEvent.end, pixelEndY); - ctx.stroke(); - - var arrowWidth = 5 * pixWidth * pixelRatio; - var distance = flowEvent.end - flowEvent.start; - if (distance <= (2 * arrowWidth)) - return; - - var tipX = flowEvent.end; - var tipY = pixelEndY; - var arrowHeight = (endBounds.height / 4) * pixelRatio; - tr.ui.b.drawTriangle(ctx, - tipX, tipY, - tipX - arrowWidth, tipY - arrowHeight, - tipX - arrowWidth, tipY + arrowHeight); - ctx.fill(); - }, - - calculateTrackY_: function(track, canvasBounds) { - var bounds = track.getBoundingClientRect(); - var size = bounds.left + bounds.top + bounds.bottom + bounds.right; - if (size === 0) - return this.calculateTrackY_(track.parentNode, canvasBounds); - - return bounds.top - canvasBounds.top + (bounds.height / 2); - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - function onPickHit(instantEvent) { - selection.push(instantEvent); - } - var instantEventWidth = 3 * viewPixWidthWorld; - tr.b.iterateOverIntersectingIntervals(this.model_.instantEvents, - function(x) { return x.start; }, - function(x) { return x.duration + instantEventWidth; }, - loWX, hiWX, - onPickHit.bind(this)); - - tr.ui.tracks.ContainerTrack.prototype. - addIntersectingEventsInRangeToSelectionInWorldSpace. - apply(this, arguments); - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - this.addClosestInstantEventToSelection(this.model_.instantEvents, - worldX, worldMaxDist, selection); - tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection. - apply(this, arguments); - } - }; - - return { - ModelTrack: ModelTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/multi_row_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/multi_row_track.html deleted file mode 100644 index 04637ef2d2a..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/multi_row_track.html +++ /dev/null @@ -1,218 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/container_track.html"> -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/model/model_settings.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays a group of objects in multiple rows. - * @constructor - * @extends {ContainerTrack} - */ - var MultiRowTrack = tr.ui.b.define( - 'multi-row-track', tr.ui.tracks.ContainerTrack); - - MultiRowTrack.prototype = { - - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.tooltip_ = ''; - this.heading_ = ''; - - this.groupingSource_ = undefined; - this.itemsToGroup_ = undefined; - - this.defaultToCollapsedWhenSubRowCountMoreThan = 1; - - this.itemsGroupedOnLastUpdateContents_ = undefined; - - this.currentSubRows_ = []; - this.expanded_ = true; - }, - - get itemsToGroup() { - return this.itemsToGroup_; - }, - - setItemsToGroup: function(itemsToGroup, opt_groupingSource) { - this.itemsToGroup_ = itemsToGroup; - this.groupingSource_ = opt_groupingSource; - this.updateContents_(); - this.updateExpandedStateFromGroupingSource_(); - }, - - get heading() { - return this.heading_; - }, - - set heading(h) { - this.heading_ = h; - this.updateContents_(); - }, - - get tooltip() { - return this.tooltip_; - }, - - set tooltip(t) { - this.tooltip_ = t; - this.updateContents_(); - }, - - get subRows() { - return this.currentSubRows_; - }, - - get hasVisibleContent() { - return this.children.length > 0; - }, - - get expanded() { - return this.expanded_; - }, - - set expanded(expanded) { - if (this.expanded_ == expanded) - return; - this.expanded_ = expanded; - this.expandedStateChanged_(); - }, - - onHeadingClicked_: function(e) { - if (this.subRows.length <= 1) - return; - this.expanded = !this.expanded; - - if (this.groupingSource_) { - var modelSettings = new tr.model.ModelSettings( - this.groupingSource_.model); - modelSettings.setSettingFor(this.groupingSource_, 'expanded', - this.expanded); - } - - e.stopPropagation(); - }, - - updateExpandedStateFromGroupingSource_: function() { - if (this.groupingSource_) { - var numSubRows = this.subRows.length; - var modelSettings = new tr.model.ModelSettings( - this.groupingSource_.model); - if (numSubRows > 1) { - var defaultExpanded; - if (numSubRows > this.defaultToCollapsedWhenSubRowCountMoreThan) { - defaultExpanded = false; - } else { - defaultExpanded = true; - } - this.expanded = modelSettings.getSettingFor( - this.groupingSource_, 'expanded', defaultExpanded); - } else { - this.expanded = undefined; - } - } - }, - - expandedStateChanged_: function() { - var minH = Math.max(2, Math.ceil(18 / this.children.length)); - var h = (this.expanded_ ? 18 : minH) + 'px'; - - for (var i = 0; i < this.children.length; i++) { - this.children[i].height = h; - if (i === 0) - this.children[i].arrowVisible = true; - this.children[i].expanded = this.expanded; - } - - if (this.children.length === 1) { - this.children[0].expanded = true; - this.children[0].arrowVisible = false; - } - }, - - updateContents_: function() { - tr.ui.tracks.ContainerTrack.prototype.updateContents_.call(this); - if (!this.itemsToGroup_) { - this.updateHeadingAndTooltip_(); - this.currentSubRows_ = []; - return; - } - - if (this.areArrayContentsSame_(this.itemsGroupedOnLastUpdateContents_, - this.itemsToGroup_)) { - this.updateHeadingAndTooltip_(); - return; - } - - this.itemsGroupedOnLastUpdateContents_ = this.itemsToGroup_; - - this.detach(); - if (!this.itemsToGroup_.length) { - this.currentSubRows_ = []; - return; - } - var subRows = this.buildSubRows_(this.itemsToGroup_); - this.currentSubRows_ = subRows; - for (var srI = 0; srI < subRows.length; srI++) { - var subRow = subRows[srI]; - if (!subRow.length) - continue; - var track = this.addSubTrack_(subRow); - track.addEventListener( - 'heading-clicked', this.onHeadingClicked_.bind(this)); - } - this.updateHeadingAndTooltip_(); - this.expandedStateChanged_(); - }, - - updateHeadingAndTooltip_: function() { - if (!this.firstChild) - return; - this.firstChild.heading = this.heading_; - this.firstChild.tooltip = this.tooltip_; - }, - - /** - * Breaks up the list of slices into N rows, each of which is a list of - * slices that are non overlapping. - */ - buildSubRows_: function(itemsToGroup) { - throw new Error('Not implemented'); - }, - - addSubTrack_: function(subRowItems) { - throw new Error('Not implemented'); - }, - - areArrayContentsSame_: function(a, b) { - if (!a || !b) - return false; - if (!a.length || !b.length) - return false; - if (a.length != b.length) - return false; - for (var i = 0; i < a.length; ++i) { - if (a[i] != b[i]) - return false; - } - return true; - } - }; - - return { - MultiRowTrack: MultiRowTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_group_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_group_track.html deleted file mode 100644 index 6bb39093015..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_group_track.html +++ /dev/null @@ -1,87 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/object_snapshot_view.html"> -<link rel="import" href="/tracing/ui/analysis/object_instance_view.html"> -<link rel="import" href="/tracing/ui/tracks/multi_row_track.html"> -<link rel="import" href="/tracing/ui/tracks/object_instance_track.html"> -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays a ObjectInstanceGroup. - * @constructor - * @extends {ContainerTrack} - */ - var ObjectInstanceGroupTrack = tr.ui.b.define( - 'object-instance-group-track', tr.ui.tracks.MultiRowTrack); - - ObjectInstanceGroupTrack.prototype = { - - __proto__: tr.ui.tracks.MultiRowTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this, viewport); - this.classList.add('object-instance-group-track'); - this.objectInstances_ = undefined; - }, - - get objectInstances() { - return this.itemsToGroup; - }, - - set objectInstances(objectInstances) { - this.setItemsToGroup(objectInstances); - }, - - addSubTrack_: function(objectInstances) { - var hasMultipleRows = this.subRows.length > 1; - var track = new tr.ui.tracks.ObjectInstanceTrack(this.viewport); - track.objectInstances = objectInstances; - this.appendChild(track); - return track; - }, - - buildSubRows_: function(objectInstances) { - objectInstances.sort(function(x, y) { - return x.creationTs - y.creationTs; - }); - - var subRows = []; - for (var i = 0; i < objectInstances.length; i++) { - var objectInstance = objectInstances[i]; - - var found = false; - for (var j = 0; j < subRows.length; j++) { - var subRow = subRows[j]; - var lastItemInSubRow = subRow[subRow.length - 1]; - if (objectInstance.creationTs >= lastItemInSubRow.deletionTs) { - found = true; - subRow.push(objectInstance); - break; - } - } - if (!found) { - var subRow = [objectInstance]; - subRows.push(subRow); - } - } - return subRows; - }, - updateHeadingAndTooltip_: function() { - } - }; - - return { - ObjectInstanceGroupTrack: ObjectInstanceGroupTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.css deleted file mode 100644 index 0919e85524e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.css +++ /dev/null @@ -1,8 +0,0 @@ -/* Copyright (c) 2012 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. - */ - -.object-instance-track { - height: 18px; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.html deleted file mode 100644 index 4b6d3cacf11..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track.html +++ /dev/null @@ -1,299 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/object_instance_track.css"> - -<link rel="import" href="/tracing/base/extension_registry.html"> -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/model/event.html"> -<link rel="import" href="/tracing/ui/base/event_presenter.html"> -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var SelectionState = tr.model.SelectionState; - var EventPresenter = tr.ui.b.EventPresenter; - - /** - * A track that displays an array of Slice objects. - * @constructor - * @extends {Track} - */ - var ObjectInstanceTrack = tr.ui.b.define( - 'object-instance-track', tr.ui.tracks.Track); - - ObjectInstanceTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('object-instance-track'); - this.objectInstances_ = []; - this.objectSnapshots_ = []; - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - set heading(heading) { - this.heading_.heading = heading; - }, - - get heading() { - return this.heading_.heading; - }, - - set tooltip(tooltip) { - this.heading_.tooltip = tooltip; - }, - - get objectInstances() { - return this.objectInstances_; - }, - - set objectInstances(objectInstances) { - if (!objectInstances || objectInstances.length == 0) { - this.heading = ''; - this.objectInstances_ = []; - this.objectSnapshots_ = []; - return; - } - this.heading = objectInstances[0].typeName; - this.objectInstances_ = objectInstances; - this.objectSnapshots_ = []; - this.objectInstances_.forEach(function(instance) { - this.objectSnapshots_.push.apply( - this.objectSnapshots_, instance.snapshots); - }, this); - this.objectSnapshots_.sort(function(a, b) { - return a.ts - b.ts; - }); - }, - - get height() { - return window.getComputedStyle(this).height; - }, - - set height(height) { - this.style.height = height; - }, - - get snapshotRadiusView() { - return 7 * (window.devicePixelRatio || 1); - }, - - draw: function(type, viewLWorld, viewRWorld) { - switch (type) { - case tr.ui.tracks.DrawType.GENERAL_EVENT: - this.drawLetterDots_(viewLWorld, viewRWorld); - break; - } - }, - - drawLetterDots_: function(viewLWorld, viewRWorld) { - var ctx = this.context(); - var pixelRatio = window.devicePixelRatio || 1; - - var bounds = this.getBoundingClientRect(); - var height = bounds.height * pixelRatio; - var halfHeight = height * 0.5; - var twoPi = Math.PI * 2; - - // Culling parameters. - var dt = this.viewport.currentDisplayTransform; - var snapshotRadiusView = this.snapshotRadiusView; - var snapshotRadiusWorld = dt.xViewVectorToWorld(height); - var loI; - - // Begin rendering in world space. - ctx.save(); - dt.applyTransformToCanvas(ctx); - - // Instances - var objectInstances = this.objectInstances_; - var loI = tr.b.findLowIndexInSortedArray( - objectInstances, - function(instance) { - return instance.deletionTs; - }, - viewLWorld); - ctx.strokeStyle = 'rgb(0,0,0)'; - for (var i = loI; i < objectInstances.length; ++i) { - var instance = objectInstances[i]; - var x = instance.creationTs; - if (x > viewRWorld) - break; - - var right = instance.deletionTs == Number.MAX_VALUE ? - viewRWorld : instance.deletionTs; - ctx.fillStyle = EventPresenter.getObjectInstanceColor(instance); - ctx.fillRect(x, pixelRatio, right - x, height - 2 * pixelRatio); - } - ctx.restore(); - - // Snapshots. Has to run in worldspace because ctx.arc gets transformed. - var objectSnapshots = this.objectSnapshots_; - loI = tr.b.findLowIndexInSortedArray( - objectSnapshots, - function(snapshot) { - return snapshot.ts + snapshotRadiusWorld; - }, - viewLWorld); - for (var i = loI; i < objectSnapshots.length; ++i) { - var snapshot = objectSnapshots[i]; - var x = snapshot.ts; - if (x - snapshotRadiusWorld > viewRWorld) - break; - var xView = dt.xWorldToView(x); - - ctx.fillStyle = EventPresenter.getObjectSnapshotColor(snapshot); - ctx.beginPath(); - ctx.arc(xView, halfHeight, snapshotRadiusView, 0, twoPi); - ctx.fill(); - if (snapshot.selected) { - ctx.lineWidth = 5; - ctx.strokeStyle = 'rgb(100,100,0)'; - ctx.stroke(); - - ctx.beginPath(); - ctx.arc(xView, halfHeight, snapshotRadiusView - 1, 0, twoPi); - ctx.lineWidth = 2; - ctx.strokeStyle = 'rgb(255,255,0)'; - ctx.stroke(); - } else { - ctx.lineWidth = 1; - ctx.strokeStyle = 'rgb(0,0,0)'; - ctx.stroke(); - } - } - ctx.lineWidth = 1; - - // For performance reasons we only check the SelectionState of the first - // instance. If it's DIMMED we assume that all are DIMMED. - // TODO(egraether): Allow partial highlight. - var selectionState = SelectionState.NONE; - if (objectInstances.length && - objectInstances[0].selectionState === SelectionState.DIMMED) { - selectionState = SelectionState.DIMMED; - } - - // Dim the track when there is an active highlight. - if (selectionState === SelectionState.DIMMED) { - var width = bounds.width * pixelRatio; - ctx.fillStyle = 'rgba(255,255,255,0.5)'; - ctx.fillRect(0, 0, width, height); - ctx.restore(); - } - }, - - addEventsToTrackMap: function(eventToTrackMap) { - if (this.objectInstance_ !== undefined) { - this.objectInstance_.forEach(function(obj) { - eventToTrackMap.addEvent(obj, this); - }, this); - } - - if (this.objectSnapshots_ !== undefined) { - this.objectSnapshots_.forEach(function(obj) { - eventToTrackMap.addEvent(obj, this); - }, this); - } - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - // Pick snapshots first. - var foundSnapshot = false; - function onSnapshot(snapshot) { - selection.push(snapshot); - foundSnapshot = true; - } - var snapshotRadiusView = this.snapshotRadiusView; - var snapshotRadiusWorld = viewPixWidthWorld * snapshotRadiusView; - tr.b.iterateOverIntersectingIntervals( - this.objectSnapshots_, - function(x) { return x.ts - snapshotRadiusWorld; }, - function(x) { return 2 * snapshotRadiusWorld; }, - loWX, hiWX, - onSnapshot); - if (foundSnapshot) - return; - - // Try picking instances. - tr.b.iterateOverIntersectingIntervals( - this.objectInstances_, - function(x) { return x.creationTs; }, - function(x) { return x.deletionTs - x.creationTs; }, - loWX, hiWX, - selection.push.bind(selection)); - }, - - /** - * Add the item to the left or right of the provided event, if any, to the - * selection. - * @param {event} The current event item. - * @param {Number} offset Number of slices away from the event to look. - * @param {Selection} selection The selection to add an event to, - * if found. - * @return {boolean} Whether an event was found. - * @private - */ - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - var events; - if (event instanceof tr.model.ObjectSnapshot) - events = this.objectSnapshots_; - else if (event instanceof tr.model.ObjectInstance) - events = this.objectInstances_; - else - throw new Error('Unrecognized event'); - - var index = events.indexOf(event); - var newIndex = index + offset; - if (newIndex >= 0 && newIndex < events.length) { - selection.push(events[newIndex]); - return true; - } - return false; - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - var snapshot = tr.b.findClosestElementInSortedArray( - this.objectSnapshots_, - function(x) { return x.ts; }, - worldX, - worldMaxDist); - - if (!snapshot) - return; - - selection.push(snapshot); - - // TODO(egraether): Search for object instances as well, which was not - // implemented because it makes little sense with the current visual and - // needs to take care of overlapping intervals. - } - }; - - - var options = new tr.b.ExtensionRegistryOptions( - tr.b.TYPE_BASED_REGISTRY_MODE); - tr.b.decorateExtensionRegistry(ObjectInstanceTrack, options); - - return { - ObjectInstanceTrack: ObjectInstanceTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track_test.html deleted file mode 100644 index 1ba79b9db6c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/object_instance_track_test.html +++ /dev/null @@ -1,111 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/object_collection.html"> -<link rel="import" href="/tracing/model/scoped_id.html"> -<link rel="import" href="/tracing/model/selection_state.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/object_instance_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var EventSet = tr.model.EventSet; - var ObjectInstanceTrack = tr.ui.tracks.ObjectInstanceTrack; - var Viewport = tr.ui.TimelineViewport; - - var createObjects = function() { - var objects = new tr.model.ObjectCollection({}); - var scopedId1 = new tr.model.ScopedId('ptr', '0x1000'); - objects.idWasCreated(scopedId1, 'tr.e.cc', 'Frame', 10); - objects.addSnapshot(scopedId1, 'tr.e.cc', 'Frame', 10, 'snapshot-1'); - objects.addSnapshot(scopedId1, 'tr.e.cc', 'Frame', 25, 'snapshot-2'); - objects.addSnapshot(scopedId1, 'tr.e.cc', 'Frame', 40, 'snapshot-3'); - objects.idWasDeleted(scopedId1, 'tr.e.cc', 'Frame', 45); - - var scopedId2 = new tr.model.ScopedId('ptr', '0x1001'); - objects.idWasCreated(scopedId2, 'skia', 'Picture', 20); - objects.addSnapshot(scopedId2, 'skia', 'Picture', 20, 'snapshot-1'); - objects.idWasDeleted(scopedId2, 'skia', 'Picture', 25); - return objects; - }; - - test('instantiate', function() { - var objects = createObjects(); - var frames = objects.getAllInstancesByTypeName()['Frame']; - frames[0].snapshots[1].selectionState = - tr.model.SelectionState.SELECTED; - - var div = document.createElement('div'); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = ObjectInstanceTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.heading = 'testBasic'; - track.objectInstances = frames; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 50, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('selectionHitTestingWithThreadTrack', function() { - var objects = createObjects(); - var frames = objects.getAllInstancesByTypeName()['Frame']; - - var track = ObjectInstanceTrack(new Viewport()); - track.objectInstances = frames; - - // Hit outside range - var selection = new EventSet(); - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 8, 8.1, 0.1, selection); - assert.equal(selection.length, 0); - - // Hit the first snapshot, via pixel-nearness. - selection = new EventSet(); - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 9.98, 9.99, 0.1, selection); - assert.equal(selection.length, 1); - assert.instanceOf(tr.b.getOnlyElement(selection), tr.model.ObjectSnapshot); - - // Hit the instance, between the 1st and 2nd snapshots - selection = new EventSet(); - track.addIntersectingEventsInRangeToSelectionInWorldSpace( - 20, 20.1, 0.1, selection); - assert.equal(selection.length, 1); - assert.instanceOf(tr.b.getOnlyElement(selection), tr.model.ObjectInstance); - }); - - test('addEventNearToProvidedEventToSelection', function() { - var objects = createObjects(); - var frames = objects.getAllInstancesByTypeName()['Frame']; - - var track = ObjectInstanceTrack(new Viewport()); - track.objectInstances = frames; - - var instance = new tr.model.ObjectInstance( - {}, new tr.model.ScopedId('ptr', '0x1000'), 'cat', 'n', 10); - - assert.doesNotThrow(function() { - track.addEventNearToProvidedEventToSelection(instance, 0, undefined); - }); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track.html deleted file mode 100644 index 5905882acff..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track.html +++ /dev/null @@ -1,83 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/color_scheme.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/chart_axis.html"> -<link rel="import" href="/tracing/ui/tracks/chart_point.html"> -<link rel="import" href="/tracing/ui/tracks/chart_series.html"> -<link rel="import" href="/tracing/ui/tracks/chart_track.html"> - -<style> -.power-series-track { - height: 90px; -} -</style> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var ColorScheme = tr.b.ColorScheme; - var ChartTrack = tr.ui.tracks.ChartTrack; - - /** - * A track that displays a PowerSeries. - * - * @constructor - * @extends {ChartTrack} - */ - var PowerSeriesTrack = tr.ui.b.define('power-series-track', ChartTrack); - - PowerSeriesTrack.prototype = { - __proto__: ChartTrack.prototype, - - decorate: function(viewport) { - ChartTrack.prototype.decorate.call(this, viewport); - this.classList.add('power-series-track'); - this.heading = 'Power'; - this.powerSeries_ = undefined; - }, - - set powerSeries(powerSeries) { - this.powerSeries_ = powerSeries; - - this.series = this.buildChartSeries_(); - this.autoSetAllAxes({expandMax: true}); - }, - - get hasVisibleContent() { - return (this.powerSeries_ && this.powerSeries_.samples.length > 0); - }, - - addContainersToTrackMap: function(containerToTrackMap) { - containerToTrackMap.addContainer(this.powerSeries_, this); - }, - - buildChartSeries_: function() { - if (!this.hasVisibleContent) - return []; - - var axis = new tr.ui.tracks.ChartAxis(0, undefined); - var pts = this.powerSeries_.samples.map(function(smpl) { - return new tr.ui.tracks.ChartPoint(smpl, smpl.start, smpl.power); - }); - var renderingConfig = { - chartType: tr.ui.tracks.ChartSeriesType.AREA, - colorId: ColorScheme.getColorIdForGeneralPurposeString(this.heading) - }; - - return [new tr.ui.tracks.ChartSeries(pts, axis, renderingConfig)]; - } - }; - - return { - PowerSeriesTrack: PowerSeriesTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track_test.html deleted file mode 100644 index 29997361918..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/power_series_track_test.html +++ /dev/null @@ -1,122 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/model/device.html'> -<link rel='import' href='/tracing/model/model.html'> -<link rel='import' href='/tracing/model/power_series.html'> -<link rel='import' href='/tracing/ui/base/constants.html'> -<link rel='import' href='/tracing/ui/timeline_viewport.html'> -<link rel='import' href='/tracing/ui/tracks/container_to_track_map.html'> -<link rel='import' href='/tracing/ui/tracks/drawing_container.html'> -<link rel="import" href="/tracing/ui/tracks/power_series_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - - var Device = tr.model.Device; - var Model = tr.Model; - var PowerSeries = tr.model.PowerSeries; - var PowerSeriesTrack = tr.ui.tracks.PowerSeriesTrack; - - var createDrawingContainer = function(series) { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - if (series) { - series.updateBounds(); - setDisplayTransformFromBounds(viewport, series.bounds); - } - - return drawingContainer; - }; - - /** - * Sets the mapping between the input range of timestamps and the output range - * of horizontal pixels. - */ - var setDisplayTransformFromBounds = function(viewport, bounds) { - var dt = new tr.ui.TimelineDisplayTransform(); - var pixelRatio = window.devicePixelRatio || 1; - var chartPixelWidth = - (window.innerWidth - tr.ui.b.constants.HEADING_WIDTH) * pixelRatio; - dt.xSetWorldBounds(bounds.min, bounds.max, chartPixelWidth); - viewport.setDisplayTransformImmediately(dt); - }; - - test('instantiate', function() { - var series = new PowerSeries(new Model().device); - series.addPowerSample(0, 1); - series.addPowerSample(0.5, 2); - series.addPowerSample(1, 3); - series.addPowerSample(1.5, 4); - - var drawingContainer = createDrawingContainer(series); - var track = new PowerSeriesTrack(drawingContainer.viewport); - track.powerSeries = series; - drawingContainer.appendChild(track); - - this.addHTMLOutput(drawingContainer); - }); - - test('hasVisibleContent_trueWithPowerSamplesPresent', function() { - var series = new PowerSeries(new Model().device); - series.addPowerSample(0, 1); - series.addPowerSample(0.5, 2); - series.addPowerSample(1, 3); - series.addPowerSample(1.5, 4); - - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - - var track = new PowerSeriesTrack(viewport); - track.powerSeries = series; - - assert.isTrue(track.hasVisibleContent); - }); - - test('hasVisibleContent_falseWithUndefinedPowerSeries', function() { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - - var track = new PowerSeriesTrack(viewport); - track.powerSeries = undefined; - - assert.notOk(track.hasVisibleContent); - }); - - test('hasVisibleContent_falseWithEmptyPowerSeries', function() { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - - var track = new PowerSeriesTrack(viewport); - var series = new PowerSeries(new Model().device); - track.powerSeries = series; - - assert.notOk(track.hasVisibleContent); - }); - - test('addContainersToTrackMap', function() { - var div = document.createElement('div'); - var viewport = new tr.ui.TimelineViewport(div); - - var powerSeriesTrack = new PowerSeriesTrack(viewport); - var series = new PowerSeries(new Model().device); - powerSeriesTrack.powerSeries = series; - - var containerToTrackMap = new tr.ui.tracks.ContainerToTrackMap(); - powerSeriesTrack.addContainersToTrackMap(containerToTrackMap); - - assert.equal( - containerToTrackMap.getTrackByStableId('Device.PowerSeries'), - powerSeriesTrack); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track.html deleted file mode 100644 index c197bd9d010..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track.html +++ /dev/null @@ -1,73 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/tracks/chart_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_util.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var ALLOCATED_MEMORY_TRACK_HEIGHT = 50; - - /** - * A track that displays an array of ProcessMemoryDump objects. - * @constructor - * @extends {ContainerTrack} - */ - var ProcessMemoryDumpTrack = tr.ui.b.define( - 'process-memory-dump-track', tr.ui.tracks.ContainerTrack); - - ProcessMemoryDumpTrack.prototype = { - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.memoryDumps_ = undefined; - }, - - get memoryDumps() { - return this.memoryDumps_; - }, - - set memoryDumps(memoryDumps) { - this.memoryDumps_ = memoryDumps; - this.updateContents_(); - }, - - updateContents_: function() { - this.clearTracks_(); - - // Show no tracks if there are no dumps. - if (!this.memoryDumps_ || !this.memoryDumps_.length) - return; - - this.appendAllocatedMemoryTrack_(); - }, - - appendAllocatedMemoryTrack_: function() { - var series = tr.ui.tracks.buildProcessAllocatedMemoryChartSeries( - this.memoryDumps_); - if (!series) - return; - - var track = new tr.ui.tracks.ChartTrack(this.viewport); - track.heading = 'Memory per component'; - track.height = ALLOCATED_MEMORY_TRACK_HEIGHT + 'px'; - track.series = series; - track.autoSetAllAxes({expandMax: true}); - this.appendChild(track); - } - }; - - return { - ProcessMemoryDumpTrack: ProcessMemoryDumpTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track_test.html deleted file mode 100644 index a4515d50403..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_memory_dump_track_test.html +++ /dev/null @@ -1,55 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/process_memory_dump_track.html"> -<link rel="import" href="/tracing/ui/tracks/memory_dump_track_test_utils.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var Viewport = tr.ui.TimelineViewport; - var ProcessMemoryDumpTrack = tr.ui.tracks.ProcessMemoryDumpTrack; - var createTestProcessMemoryDumps = tr.ui.tracks.createTestProcessMemoryDumps; - - function instantiateTrack(withVMRegions, withAllocatorDumps, - expectedTrackCount) { - var dumps = createTestProcessMemoryDumps(withVMRegions, withAllocatorDumps); - - var div = document.createElement('div'); - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = new ProcessMemoryDumpTrack(viewport); - drawingContainer.appendChild(track); - drawingContainer.invalidate(); - - track.memoryDumps = dumps; - - // TODO(petrcermak): Check that the div has indeed zero size. - if (expectedTrackCount > 0) - this.addHTMLOutput(div); - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 50, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - - assert.lengthOf(track.tracks_, expectedTrackCount); - }; - - test('instantiate_withoutMemoryAllocatorDumps', function() { - instantiateTrack.call(this, false, false, 0); - }); - test('instantiate_withMemoryAllocatorDumps', function() { - instantiateTrack.call(this, false, true, 1); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track.html deleted file mode 100644 index 4390766292d..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track.html +++ /dev/null @@ -1,130 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/base/color_scheme.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/rect_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var ColorScheme = tr.b.ColorScheme; - - /** - * Visualizes a Process's state using a series of rects to represent activity. - * @constructor - */ - var ProcessSummaryTrack = tr.ui.b.define('process-summary-track', - tr.ui.tracks.RectTrack); - - ProcessSummaryTrack.buildRectsFromProcess = function(process) { - if (!process) - return []; - - var ops = []; - // build list of start/end ops for each top level or important slice - var pushOp = function(isStart, time, slice) { - ops.push({ - isStart: isStart, - time: time, - slice: slice - }); - }; - for (var tid in process.threads) { - var sliceGroup = process.threads[tid].sliceGroup; - - sliceGroup.topLevelSlices.forEach(function(slice) { - pushOp(true, slice.start, undefined); - pushOp(false, slice.end, undefined); - }); - sliceGroup.slices.forEach(function(slice) { - if (slice.important) { - pushOp(true, slice.start, slice); - pushOp(false, slice.end, slice); - } - }); - } - ops.sort(function(a, b) { return a.time - b.time; }); - - var rects = []; - /** - * Build a row of rects which display one way for unimportant activity, - * and during important slices, show up as those important slices. - * - * If an important slice starts in the middle of another, - * just drop it on the floor. - */ - var genericColorId = ColorScheme.getColorIdForReservedName('generic_work'); - var pushRect = function(start, end, slice) { - rects.push(new tr.ui.tracks.Rect( - slice, /* modelItem: show selection state of slice if present */ - slice ? slice.title : '', /* title */ - slice ? slice.colorId : genericColorId, /* colorId */ - start, /* start */ - end - start /* duration */)); - } - var depth = 0; - var currentSlice = undefined; - var lastStart = undefined; - ops.forEach(function(op) { - depth += op.isStart ? 1 : -1; - - if (currentSlice) { - // simply find end of current important slice - if (!op.isStart && op.slice == currentSlice) { - // important slice has ended - pushRect(lastStart, op.time, currentSlice); - lastStart = depth >= 1 ? op.time : undefined; - currentSlice = undefined; - } - } else { - if (op.isStart) { - if (depth == 1) { - lastStart = op.time; - currentSlice = op.slice; - } else if (op.slice) { - // switch to slice - if (op.time != lastStart) { - pushRect(lastStart, op.time, undefined); - lastStart = op.time; - } - currentSlice = op.slice; - } - } else { - if (depth == 0) { - pushRect(lastStart, op.time, undefined); - lastStart = undefined; - } - } - } - }); - return rects; - }; - - ProcessSummaryTrack.prototype = { - __proto__: tr.ui.tracks.RectTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.RectTrack.prototype.decorate.call(this, viewport); - }, - - get process() { - return this.process_; - }, - - set process(process) { - this.process_ = process; - this.rects = ProcessSummaryTrack.buildRectsFromProcess(process); - } - }; - - return { - ProcessSummaryTrack: ProcessSummaryTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track_test.html deleted file mode 100644 index 11a68527a2e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_summary_track_test.html +++ /dev/null @@ -1,110 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/model/slice_group.html"> -<link rel="import" href="/tracing/ui/tracks/process_summary_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ProcessSummaryTrack = tr.ui.tracks.ProcessSummaryTrack; - - test('buildRectSimple', function() { - var process; - var model = tr.c.TestUtils.newModel(function(model) { - process = model.getOrCreateProcess(1); - // XXXX - // XXXX - var thread1 = process.getOrCreateThread(1); - thread1.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 1, duration: 4})); - var thread2 = process.getOrCreateThread(2); - thread2.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 4, duration: 4})); - }); - - var rects = ProcessSummaryTrack.buildRectsFromProcess(process); - - assert.equal(rects.length, 1); - var rect = rects[0]; - assert.closeTo(rect.start, 1, 1e-5); - assert.closeTo(rect.end, 8, 1e-5); - }); - - test('buildRectComplex', function() { - var process; - var model = tr.c.TestUtils.newModel(function(model) { - process = model.getOrCreateProcess(1); - // XXXX X X XX - // XXXX XXX X - var thread1 = process.getOrCreateThread(1); - thread1.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 1, duration: 4})); - thread1.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 9, duration: 1})); - thread1.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 11, duration: 1})); - thread1.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 13, duration: 2})); - var thread2 = process.getOrCreateThread(2); - thread2.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 4, duration: 4})); - thread2.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 9, duration: 3})); - thread2.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx( - {start: 16, duration: 1})); - }); - - var rects = ProcessSummaryTrack.buildRectsFromProcess(process); - - assert.equal(4, rects.length); - assert.closeTo(rects[0].start, 1, 1e-5); - assert.closeTo(rects[0].end, 8, 1e-5); - assert.closeTo(rects[1].start, 9, 1e-5); - assert.closeTo(rects[1].end, 12, 1e-5); - assert.closeTo(rects[2].start, 13, 1e-5); - assert.closeTo(rects[2].end, 15, 1e-5); - assert.closeTo(rects[3].start, 16, 1e-5); - assert.closeTo(rects[3].end, 17, 1e-5); - }); - - test('buildRectImportantSlice', function() { - var process; - var model = tr.c.TestUtils.newModel(function(model) { - // [ unimportant ] - // [important] - var a = tr.c.TestUtils.newSliceEx( - {title: 'unimportant', start: 4, duration: 21}); - var b = tr.c.TestUtils.newSliceEx( - {title: 'important', start: 9, duration: 11}); - b.important = true; - process = model.getOrCreateProcess(1); - process.getOrCreateThread(1).sliceGroup.pushSlices([a, b]); - - model.importantSlice = b; - }); - - var rects = ProcessSummaryTrack.buildRectsFromProcess(process); - - assert.equal(3, rects.length); - assert.closeTo(rects[0].start, 4, 1e-5); - assert.closeTo(rects[0].end, 9, 1e-5); - assert.closeTo(rects[1].start, 9, 1e-5); - assert.closeTo(rects[1].end, 20, 1e-5); - assert.closeTo(rects[2].start, 20, 1e-5); - assert.closeTo(rects[2].end, 25, 1e-5); - - // middle rect represents important slice, so colorId & title are preserved - assert.equal(rects[1].title, model.importantSlice.title); - assert.equal(rects[1].colorId, model.importantSlice.colorId); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track.html deleted file mode 100644 index 42451c042d9..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track.html +++ /dev/null @@ -1,155 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/process_memory_dump_track.html"> -<link rel="import" href="/tracing/ui/tracks/process_track_base.html"> -<link rel="import" href="/tracing/ui/base/draw_helpers.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - var ProcessTrackBase = tr.ui.tracks.ProcessTrackBase; - - /** - * @constructor - */ - var ProcessTrack = tr.ui.b.define('process-track', ProcessTrackBase); - - ProcessTrack.prototype = { - __proto__: ProcessTrackBase.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ProcessTrackBase.prototype.decorate.call(this, viewport); - }, - - drawTrack: function(type) { - switch (type) { - case tr.ui.tracks.DrawType.INSTANT_EVENT: - if (!this.processBase.instantEvents || - this.processBase.instantEvents.length === 0) - break; - - var ctx = this.context(); - - var pixelRatio = window.devicePixelRatio || 1; - var bounds = this.getBoundingClientRect(); - var canvasBounds = ctx.canvas.getBoundingClientRect(); - - ctx.save(); - ctx.translate(0, pixelRatio * (bounds.top - canvasBounds.top)); - - var dt = this.viewport.currentDisplayTransform; - var viewLWorld = dt.xViewToWorld(0); - var viewRWorld = dt.xViewToWorld( - bounds.width * pixelRatio); - - tr.ui.b.drawInstantSlicesAsLines( - ctx, - this.viewport.currentDisplayTransform, - viewLWorld, - viewRWorld, - bounds.height, - this.processBase.instantEvents, - 2); - - ctx.restore(); - - break; - - case tr.ui.tracks.DrawType.BACKGROUND: - this.drawBackground_(); - // Don't bother recursing further, Process is the only level that - // draws backgrounds. - return; - } - - tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this, type); - }, - - drawBackground_: function() { - var ctx = this.context(); - var canvasBounds = ctx.canvas.getBoundingClientRect(); - var pixelRatio = window.devicePixelRatio || 1; - - var draw = false; - ctx.fillStyle = '#eee'; - for (var i = 0; i < this.children.length; ++i) { - if (!(this.children[i] instanceof tr.ui.tracks.Track) || - (this.children[i] instanceof tr.ui.tracks.SpacingTrack)) - continue; - - draw = !draw; - if (!draw) - continue; - - var bounds = this.children[i].getBoundingClientRect(); - ctx.fillRect(0, pixelRatio * (bounds.top - canvasBounds.top), - ctx.canvas.width, pixelRatio * bounds.height); - } - }, - - // Process maps to processBase because we derive from ProcessTrackBase. - set process(process) { - this.processBase = process; - }, - - get process() { - return this.processBase; - }, - - get eventContainer() { - return this.process; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.apply( - this, arguments); - containerToTrackMap.addContainer(this.process, this); - }, - - appendMemoryDumpTrack_: function() { - var processMemoryDumps = this.process.memoryDumps; - if (processMemoryDumps.length) { - var pmdt = new tr.ui.tracks.ProcessMemoryDumpTrack(this.viewport_); - pmdt.memoryDumps = processMemoryDumps; - this.appendChild(pmdt); - } - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - function onPickHit(instantEvent) { - selection.push(instantEvent); - } - var instantEventWidth = 2 * viewPixWidthWorld; - tr.b.iterateOverIntersectingIntervals(this.processBase.instantEvents, - function(x) { return x.start; }, - function(x) { return x.duration + instantEventWidth; }, - loWX, hiWX, - onPickHit.bind(this)); - - tr.ui.tracks.ContainerTrack.prototype. - addIntersectingEventsInRangeToSelectionInWorldSpace. - apply(this, arguments); - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - this.addClosestInstantEventToSelection(this.processBase.instantEvents, - worldX, worldMaxDist, selection); - tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection. - apply(this, arguments); - } - }; - - return { - ProcessTrack: ProcessTrack - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.css deleted file mode 100644 index 5f42096bbff..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.css +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2013 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. - */ - -.process-track-header { - -webkit-flex: 0 0 auto; - background-image: -webkit-gradient(linear, - 0 0, 100% 0, - from(#E5E5E5), - to(#D1D1D1)); - border-bottom: 1px solid #8e8e8e; - border-top: 1px solid white; - font-size: 75%; -} - -.process-track-name:before { - content: '\25B8'; /* Right triangle */ - padding: 0 5px; -} - -.process-track-base.expanded .process-track-name:before { - content: '\25BE'; /* Down triangle */ -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.html deleted file mode 100644 index d96f1ce02cb..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/process_track_base.html +++ /dev/null @@ -1,273 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/process_track_base.css"> - -<link rel="import" href="/tracing/core/filter.html"> -<link rel="import" href="/tracing/model/model_settings.html"> -<link rel="import" href="/tracing/ui/base/dom_helpers.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/counter_track.html"> -<link rel="import" href="/tracing/ui/tracks/frame_track.html"> -<link rel="import" href="/tracing/ui/tracks/object_instance_group_track.html"> -<link rel="import" href="/tracing/ui/tracks/process_summary_track.html"> -<link rel="import" href="/tracing/ui/tracks/spacing_track.html"> -<link rel="import" href="/tracing/ui/tracks/thread_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - var ObjectSnapshotView = tr.ui.analysis.ObjectSnapshotView; - var ObjectInstanceView = tr.ui.analysis.ObjectInstanceView; - var SpacingTrack = tr.ui.tracks.SpacingTrack; - - /** - * Visualizes a Process by building ThreadTracks and CounterTracks. - * @constructor - */ - var ProcessTrackBase = - tr.ui.b.define('process-track-base', tr.ui.tracks.ContainerTrack); - - ProcessTrackBase.prototype = { - - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - - this.processBase_ = undefined; - - this.classList.add('process-track-base'); - this.classList.add('expanded'); - - this.processNameEl_ = tr.ui.b.createSpan(); - this.processNameEl_.classList.add('process-track-name'); - - this.headerEl_ = tr.ui.b.createDiv({className: 'process-track-header'}); - this.headerEl_.appendChild(this.processNameEl_); - this.headerEl_.addEventListener('click', this.onHeaderClick_.bind(this)); - - this.appendChild(this.headerEl_); - }, - - get processBase() { - return this.processBase_; - }, - - set processBase(processBase) { - this.processBase_ = processBase; - - if (this.processBase_) { - var modelSettings = new tr.model.ModelSettings(this.processBase_.model); - var defaultValue = this.processBase_.important; - this.expanded = modelSettings.getSettingFor( - this.processBase_, 'expanded', defaultValue); - } - - this.updateContents_(); - }, - - get expanded() { - return this.classList.contains('expanded'); - }, - - set expanded(expanded) { - expanded = !!expanded; - - if (this.expanded === expanded) - return; - - this.classList.toggle('expanded'); - - // Expanding and collapsing tracks is, essentially, growing and shrinking - // the viewport. We dispatch a change event to trigger any processing - // to happen. - this.viewport_.dispatchChangeEvent(); - - if (!this.processBase_) - return; - - var modelSettings = new tr.model.ModelSettings(this.processBase_.model); - modelSettings.setSettingFor(this.processBase_, 'expanded', expanded); - this.updateContents_(); - this.viewport.rebuildEventToTrackMap(); - this.viewport.rebuildContainerToTrackMap(); - }, - - get hasVisibleContent() { - if (this.expanded) - return this.children.length > 1; - return true; - }, - - onHeaderClick_: function(e) { - e.stopPropagation(); - e.preventDefault(); - this.expanded = !this.expanded; - }, - - updateContents_: function() { - this.clearTracks_(); - - if (!this.processBase_) - return; - - this.processNameEl_.textContent = this.processBase_.userFriendlyName; - this.headerEl_.title = this.processBase_.userFriendlyDetails; - - // Create the object instance tracks for this process. - this.willAppendTracks_(); - if (this.expanded) { - this.appendMemoryDumpTrack_(); - this.appendObjectInstanceTracks_(); - this.appendCounterTracks_(); - this.appendFrameTrack_(); - this.appendThreadTracks_(); - } else { - this.appendSummaryTrack_(); - } - this.didAppendTracks_(); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - this.tracks_.forEach(function(track) { - track.addEventsToTrackMap(eventToTrackMap); - }); - }, - - willAppendTracks_: function() { - }, - - didAppendTracks_: function() { - }, - - appendMemoryDumpTrack_: function() { - }, - - appendSummaryTrack_: function() { - var track = new tr.ui.tracks.ProcessSummaryTrack(this.viewport); - track.process = this.process; - if (!track.hasVisibleContent) - return; - this.appendChild(track); - // no spacing track, since this track only shown in collapsed state - }, - - appendFrameTrack_: function() { - var frames = this.process ? this.process.frames : undefined; - if (!frames || !frames.length) - return; - - var track = new tr.ui.tracks.FrameTrack(this.viewport); - track.frames = frames; - this.appendChild(track); - }, - - appendObjectInstanceTracks_: function() { - var instancesByTypeName = - this.processBase_.objects.getAllInstancesByTypeName(); - var instanceTypeNames = tr.b.dictionaryKeys(instancesByTypeName); - instanceTypeNames.sort(); - - var didAppendAtLeastOneTrack = false; - instanceTypeNames.forEach(function(typeName) { - var allInstances = instancesByTypeName[typeName]; - - // If a object snapshot has a view it will be shown, - // unless the view asked for it to not be shown. - var instanceViewInfo = ObjectInstanceView.getTypeInfo( - undefined, typeName); - var snapshotViewInfo = ObjectSnapshotView.getTypeInfo( - undefined, typeName); - if (instanceViewInfo && !instanceViewInfo.metadata.showInTrackView) - instanceViewInfo = undefined; - if (snapshotViewInfo && !snapshotViewInfo.metadata.showInTrackView) - snapshotViewInfo = undefined; - var hasViewInfo = instanceViewInfo || snapshotViewInfo; - - // There are some instances that don't merit their own track in - // the UI. Filter them out. - var visibleInstances = []; - for (var i = 0; i < allInstances.length; i++) { - var instance = allInstances[i]; - - // Do not create tracks for instances that have no snapshots. - if (instance.snapshots.length === 0) - continue; - - // Do not create tracks for instances that have implicit snapshots - // and don't have a view. - if (instance.hasImplicitSnapshots && !hasViewInfo) - continue; - - visibleInstances.push(instance); - } - if (visibleInstances.length === 0) - return; - - // Look up the constructor for this track, or use the default - // constructor if none exists. - var trackConstructor = - tr.ui.tracks.ObjectInstanceTrack.getConstructor( - undefined, typeName); - if (!trackConstructor) { - var snapshotViewInfo = ObjectSnapshotView.getTypeInfo( - undefined, typeName); - if (snapshotViewInfo && snapshotViewInfo.metadata.showInstances) { - trackConstructor = tr.ui.tracks.ObjectInstanceGroupTrack; - } else { - trackConstructor = tr.ui.tracks.ObjectInstanceTrack; - } - } - var track = new trackConstructor(this.viewport); - track.objectInstances = visibleInstances; - this.appendChild(track); - didAppendAtLeastOneTrack = true; - }, this); - if (didAppendAtLeastOneTrack) - this.appendChild(new SpacingTrack(this.viewport)); - }, - - appendCounterTracks_: function() { - // Add counter tracks for this process. - var counters = tr.b.dictionaryValues(this.processBase.counters); - counters.sort(tr.model.Counter.compare); - - // Create the counters for this process. - counters.forEach(function(counter) { - var track = new tr.ui.tracks.CounterTrack(this.viewport); - track.counter = counter; - this.appendChild(track); - this.appendChild(new SpacingTrack(this.viewport)); - }.bind(this)); - }, - - appendThreadTracks_: function() { - // Get a sorted list of threads. - var threads = tr.b.dictionaryValues(this.processBase.threads); - threads.sort(tr.model.Thread.compare); - - // Create the threads. - threads.forEach(function(thread) { - var track = new tr.ui.tracks.ThreadTrack(this.viewport); - track.thread = thread; - if (!track.hasVisibleContent) - return; - this.appendChild(track); - this.appendChild(new SpacingTrack(this.viewport)); - }.bind(this)); - } - }; - - return { - ProcessTrackBase: ProcessTrackBase - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.css deleted file mode 100644 index 0467c91562c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.css +++ /dev/null @@ -1,8 +0,0 @@ -/* 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. - */ - -.rect-track { - height: 18px; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.html deleted file mode 100644 index 70da91be408..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track.html +++ /dev/null @@ -1,251 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/rect_track.css"> - -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/model/proxy_selectable_item.html"> -<link rel="import" href="/tracing/ui/base/draw_helpers.html"> -<link rel="import" href="/tracing/ui/base/fast_rect_renderer.html"> -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - - /** - * A track that displays an array of Rect objects. - * @constructor - * @extends {Track} - */ - var RectTrack = tr.ui.b.define( - 'rect-track', tr.ui.tracks.Track); - - RectTrack.prototype = { - - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('rect-track'); - this.asyncStyle_ = false; - this.rects_ = null; - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - set heading(heading) { - this.heading_.heading = heading; - }, - - get heading() { - return this.heading_.heading; - }, - - set tooltip(tooltip) { - this.heading_.tooltip = tooltip; - }, - - set selectionGenerator(generator) { - this.heading_.selectionGenerator = generator; - }, - - set expanded(expanded) { - this.heading_.expanded = !!expanded; - }, - - set arrowVisible(arrowVisible) { - this.heading_.arrowVisible = !!arrowVisible; - }, - - get expanded() { - return this.heading_.expanded; - }, - - get asyncStyle() { - return this.asyncStyle_; - }, - - set asyncStyle(v) { - this.asyncStyle_ = !!v; - }, - - get rects() { - return this.rects_; - }, - - set rects(rects) { - this.rects_ = rects || []; - this.invalidateDrawingContainer(); - }, - - get height() { - return window.getComputedStyle(this).height; - }, - - set height(height) { - this.style.height = height; - this.invalidateDrawingContainer(); - }, - - get hasVisibleContent() { - return this.rects_.length > 0; - }, - - draw: function(type, viewLWorld, viewRWorld) { - switch (type) { - case tr.ui.tracks.DrawType.GENERAL_EVENT: - this.drawRects_(viewLWorld, viewRWorld); - break; - } - }, - - drawRects_: function(viewLWorld, viewRWorld) { - var ctx = this.context(); - - ctx.save(); - var bounds = this.getBoundingClientRect(); - tr.ui.b.drawSlices( - ctx, - this.viewport.currentDisplayTransform, - viewLWorld, - viewRWorld, - bounds.height, - this.rects_, - this.asyncStyle_); - ctx.restore(); - - if (bounds.height <= 6) - return; - - var fontSize, yOffset; - if (bounds.height < 15) { - fontSize = 6; - yOffset = 1.0; - } else { - fontSize = 10; - yOffset = 2.5; - } - tr.ui.b.drawLabels( - ctx, - this.viewport.currentDisplayTransform, - viewLWorld, - viewRWorld, - this.rects_, - this.asyncStyle_, - fontSize, - yOffset); - }, - - addEventsToTrackMap: function(eventToTrackMap) { - if (this.rects_ === undefined || this.rects_ === null) - return; - - this.rects_.forEach(function(rect) { - rect.addToTrackMap(eventToTrackMap, this); - }, this); - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - function onRect(rect) { - rect.addToSelection(selection); - } - onRect = onRect.bind(this); - var instantEventWidth = 2 * viewPixWidthWorld; - tr.b.iterateOverIntersectingIntervals(this.rects_, - function(x) { return x.start; }, - function(x) { return x.duration == 0 ? - x.duration + instantEventWidth : - x.duration; }, - loWX, hiWX, - onRect); - }, - - /** - * Add the item to the left or right of the provided event, if any, to the - * selection. - * @param {rect} The current rect. - * @param {Number} offset Number of rects away from the event to look. - * @param {Selection} selection The selection to add an event to, - * if found. - * @return {boolean} Whether an event was found. - * @private - */ - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - var index = tr.b.findFirstIndexInArray(this.rects_, function(rect) { - return rect.modelItem === event; - }); - if (index === -1) - return false; - - var newIndex = index + offset; - if (newIndex < 0 || newIndex >= this.rects_.length) - return false; - - this.rects_[newIndex].addToSelection(selection); - return true; - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - for (var i = 0; i < this.rects_.length; ++i) { - // TODO(petrcermak): Rather than unpacking the proxy item here, - // we should probably add an addToSelectionIfMatching(selection, filter) - // method to SelectableItem (#900). - var modelItem = this.rects_[i].modelItem; - if (!modelItem) - continue; - if (filter.matchSlice(modelItem)) - selection.push(modelItem); - } - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - var rect = tr.b.findClosestIntervalInSortedIntervals( - this.rects_, - function(x) { return x.start; }, - function(x) { return x.end; }, - worldX, - worldMaxDist); - - if (!rect) - return; - - rect.addToSelection(selection); - } - }; - - /** - * A filled rectangle with a title. - * - * @constructor - * @extends {ProxySelectableItem} - */ - function Rect(modelItem, title, colorId, start, duration) { - tr.model.ProxySelectableItem.call(this, modelItem); - this.title = title; - this.colorId = colorId; - this.start = start; - this.duration = duration; - this.end = start + duration; - }; - - Rect.prototype = { - __proto__: tr.model.ProxySelectableItem.prototype - }; - - return { - RectTrack: RectTrack, - Rect: Rect - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track_test.html deleted file mode 100644 index 6dcb905a304..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/rect_track_test.html +++ /dev/null @@ -1,407 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/slice.html"> -<link rel="import" href="/tracing/ui/base/dom_helpers.html"> -<link rel="import" href="/tracing/ui/base/draw_helpers.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var EventSet = tr.model.EventSet; - var RectTrack = tr.ui.tracks.RectTrack; - var Rect = tr.ui.tracks.Rect; - var Slice = tr.model.Slice; - var Viewport = tr.ui.TimelineViewport; - - test('instantiate_withRects', function() { - var div = document.createElement('div'); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = RectTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.heading = 'testBasicRects'; - track.rects = [ - new Rect(undefined, 'a', 0, 1, 1), - new Rect(undefined, 'b', 1, 2.1, 4.8), - new Rect(undefined, 'b', 1, 7, 0.5), - new Rect(undefined, 'c', 2, 7.6, 0.4) - ]; - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 8.8, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('instantiate_withSlices', function() { - var div = document.createElement('div'); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = RectTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.heading = 'testBasicSlices'; - track.rects = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 2.1, {}, 4.8), - new Slice('', 'b', 1, 7, {}, 0.5), - new Slice('', 'c', 2, 7.6, {}, 0.4) - ]; - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 8.8, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('instantiate_shrinkingRectSize', function() { - var div = document.createElement('div'); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = RectTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.heading = 'testShrinkingRectSizes'; - var x = 0; - var widths = [10, 5, 4, 3, 2, 1, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05]; - var slices = []; - for (var i = 0; i < widths.length; i++) { - var s = new Rect(undefined, 'a', 1, x, widths[i]); - x += s.duration + 0.5; - slices.push(s); - } - track.rects = slices; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 1.1 * x, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - }); - - test('instantiate_elide', function() { - var optDicts = [{ trackName: 'elideOff', elide: false }, - { trackName: 'elideOn', elide: true }]; - - var tooLongTitle = 'Unless eliding this SHOULD NOT BE DISPLAYED. '; - var bigTitle = 'Very big title name that goes on longer ' + - 'than you may expect'; - - for (var dictIndex in optDicts) { - var dict = optDicts[dictIndex]; - - var div = document.createElement('div'); - div.appendChild(document.createTextNode(dict.trackName)); - - var viewport = new Viewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = new RectTrack(viewport); - drawingContainer.appendChild(track); - - this.addHTMLOutput(div); - drawingContainer.invalidate(); - - track.SHOULD_ELIDE_TEXT = dict.elide; - track.heading = 'Visual: ' + dict.trackName; - track.rects = [ - // title, colorId, start, args, opt_duration - new Rect(undefined, 'a ' + tooLongTitle + bigTitle, 0, 1, 1), - new Rect(undefined, bigTitle, 1, 2.1, 4.8), - new Rect(undefined, 'cccc cccc cccc', 1, 7, 0.5), - new Rect(undefined, 'd', 2, 7.6, 1.0) - ]; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 9.5, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - } - }); - - test('findAllObjectsMatchingInRectTrack', function() { - var track = new RectTrack(new tr.ui.TimelineViewport()); - track.rects = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 2.1, {}, 4.8), - new Slice('', 'b', 1, 7, {}, 0.5), - new Slice('', 'c', 2, 7.6, {}, 0.4) - ]; - var selection = new EventSet(); - track.addAllEventsMatchingFilterToSelection( - new tr.c.TitleOrCategoryFilter('b'), selection); - - var predictedSelection = new EventSet( - [track.rects[1].modelItem, track.rects[2].modelItem]); - assert.isTrue(selection.equals(predictedSelection)); - }); - - test('selectionHitTesting', function() { - var testEl = document.createElement('div'); - testEl.appendChild(tr.ui.b.createScopedStyle('heading { width: 100px; }')); - testEl.style.width = '600px'; - - var viewport = new Viewport(testEl); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - testEl.appendChild(drawingContainer); - - var track = new RectTrack(viewport); - drawingContainer.appendChild(track); - this.addHTMLOutput(testEl); - - drawingContainer.updateCanvasSizeIfNeeded_(); - - track.heading = 'testSelectionHitTesting'; - track.rects = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 5, {}, 4.8) - ]; - var y = track.getBoundingClientRect().top + 5; - var pixelRatio = window.devicePixelRatio || 1; - var wW = 10; - var vW = drawingContainer.canvas.getBoundingClientRect().width; - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, wW, vW * pixelRatio); - track.viewport.setDisplayTransformImmediately(dt); - - var selection = new EventSet(); - var x = (1.5 / wW) * vW; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y, y + 1, selection); - assert.isTrue(selection.equals(new EventSet(track.rects[0].modelItem))); - - var selection = new EventSet(); - x = (2.1 / wW) * vW; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y, y + 1, selection); - assert.equal(0, selection.length); - - var selection = new EventSet(); - x = (6.8 / wW) * vW; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y, y + 1, selection); - assert.isTrue(selection.equals(new EventSet(track.rects[1].modelItem))); - - var selection = new EventSet(); - x = (9.9 / wW) * vW; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y, y + 1, selection); - assert.equal(0, selection.length); - }); - - test('elide', function() { - var testEl = document.createElement('div'); - - var viewport = new Viewport(testEl); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - testEl.appendChild(drawingContainer); - - var track = new RectTrack(viewport); - drawingContainer.appendChild(track); - this.addHTMLOutput(testEl); - - drawingContainer.updateCanvasSizeIfNeeded_(); - - var bigtitle = 'Super duper long long title ' + - 'holy moly when did you get so verbose?'; - var smalltitle = 'small'; - track.heading = 'testElide'; - track.rects = [ - // title, colorId, start, args, opt_duration - new Slice('', bigtitle, 0, 1, {}, 1), - new Slice('', smalltitle, 1, 2, {}, 1) - ]; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, 3.3, track.clientWidth); - track.viewport.setDisplayTransformImmediately(dt); - - var stringWidthPair = undefined; - var pixWidth = dt.xViewVectorToWorld(1); - - // Small titles on big slices are not elided. - stringWidthPair = - tr.ui.b.elidedTitleCache_.get( - track.context(), - pixWidth, - smalltitle, - tr.ui.b.elidedTitleCache_.labelWidth( - track.context(), - smalltitle), - 1); - assert.equal(smalltitle, stringWidthPair.string); - - // Keep shrinking the slice until eliding starts. - var elidedWhenSmallEnough = false; - for (var sliceLength = 1; sliceLength >= 0.00001; sliceLength /= 2.0) { - stringWidthPair = - tr.ui.b.elidedTitleCache_.get( - track.context(), - pixWidth, - smalltitle, - tr.ui.b.elidedTitleCache_.labelWidth( - track.context(), - smalltitle), - sliceLength); - if (stringWidthPair.string.length < smalltitle.length) { - elidedWhenSmallEnough = true; - break; - } - } - assert.isTrue(elidedWhenSmallEnough); - - // Big titles are elided immediately. - var superBigTitle = ''; - for (var x = 0; x < 10; x++) { - superBigTitle += bigtitle; - } - stringWidthPair = - tr.ui.b.elidedTitleCache_.get( - track.context(), - pixWidth, - superBigTitle, - tr.ui.b.elidedTitleCache_.labelWidth( - track.context(), - superBigTitle), - 1); - assert.isTrue(stringWidthPair.string.length < superBigTitle.length); - - // And elided text ends with ... - var len = stringWidthPair.string.length; - assert.equal('...', stringWidthPair.string.substring(len - 3, len)); - }); - - test('rectTrackAddItemNearToProvidedEvent', function() { - var track = new RectTrack(new tr.ui.TimelineViewport()); - track.rects = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 2.1, {}, 4.8), - new Slice('', 'b', 1, 7, {}, 0.5), - new Slice('', 'c', 2, 7.6, {}, 0.4) - ]; - var sel = new EventSet(); - track.addAllEventsMatchingFilterToSelection( - new tr.c.TitleOrCategoryFilter('b'), sel); - var ret; - - // Select to the right of B. - var selRight = new EventSet(); - ret = track.addEventNearToProvidedEventToSelection(sel[0], 1, selRight); - assert.isTrue(ret); - assert.equal(track.rects[2].modelItem, selRight[0]); - - // Select to the right of the 2nd b. - var selRight2 = new EventSet(); - ret = track.addEventNearToProvidedEventToSelection(sel[0], 2, selRight2); - assert.isTrue(ret); - assert.equal(track.rects[3].modelItem, selRight2[0]); - - // Select to 2 to the right of the 2nd b. - var selRightOfRight = new EventSet(); - ret = track.addEventNearToProvidedEventToSelection( - selRight[0], 1, selRightOfRight); - assert.isTrue(ret); - assert.equal(track.rects[3].modelItem, selRightOfRight[0]); - - // Select to the right of the rightmost slice. - var selNone = new EventSet(); - ret = track.addEventNearToProvidedEventToSelection( - selRightOfRight[0], 1, selNone); - assert.isFalse(ret); - assert.equal(0, selNone.length); - - // Select A and then select left. - var sel = new EventSet(); - track.addAllEventsMatchingFilterToSelection( - new tr.c.TitleOrCategoryFilter('a'), sel); - var ret; - - selNone = new EventSet(); - ret = track.addEventNearToProvidedEventToSelection(sel[0], -1, selNone); - assert.isFalse(ret); - assert.equal(0, selNone.length); - }); - - test('rectTrackAddClosestEventToSelection', function() { - var track = new RectTrack(new tr.ui.TimelineViewport()); - track.rects = [ - new Slice('', 'a', 0, 1, {}, 1), - new Slice('', 'b', 1, 2.1, {}, 4.8), - new Slice('', 'b', 1, 7, {}, 0.5), - new Slice('', 'c', 2, 7.6, {}, 0.4) - ]; - - // Before with not range. - var sel = new EventSet(); - track.addClosestEventToSelection(0, 0, 0, 0, sel); - assert.equal(0, sel.length); - - // Before with negative range. - var sel = new EventSet(); - track.addClosestEventToSelection(1.5, -10, 0, 0, sel); - assert.equal(0, sel.length); - - // Before first slice. - var sel = new EventSet(); - track.addClosestEventToSelection(0.5, 1, 0, 0, sel); - assert.isTrue(sel.equals(new EventSet(track.rects[0].modelItem))); - - // Within first slice closer to start. - var sel = new EventSet(); - track.addClosestEventToSelection(1.3, 1, 0, 0, sel); - assert.isTrue(sel.equals(new EventSet(track.rects[0].modelItem))); - - // Between slices with good range. - var sel = new EventSet(); - track.addClosestEventToSelection(2.08, 3, 0, 0, sel); - assert.isTrue(sel.equals(new EventSet(track.rects[1].modelItem))); - - // Between slices with bad range. - var sel = new EventSet(); - track.addClosestEventToSelection(2.05, 0.03, 0, 0, sel); - assert.equal(0, sel.length); - - // Within slice closer to end. - var sel = new EventSet(); - track.addClosestEventToSelection(6, 100, 0, 0, sel); - assert.isTrue(sel.equals(new EventSet(track.rects[1].modelItem))); - - // Within slice with bad range. - var sel = new EventSet(); - track.addClosestEventToSelection(1.8, 0.1, 0, 0, sel); - assert.equal(0, sel.length); - - // After last slice with good range. - var sel = new EventSet(); - track.addClosestEventToSelection(8.5, 1, 0, 0, sel); - assert.isTrue(sel.equals(new EventSet(track.rects[3].modelItem))); - - // After last slice with bad range. - var sel = new EventSet(); - track.addClosestEventToSelection(10, 1, 0, 0, sel); - assert.equal(0, sel.length); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.css deleted file mode 100644 index 67a04a987ae..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.css +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2012 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. - */ - -.ruler-track { - height: 12px; -} - -.ruler-track.tall-mode { - height: 30px; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.html deleted file mode 100644 index 30ce44be39d..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track.html +++ /dev/null @@ -1,374 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/ruler_track.css"> - -<link rel="import" href="/tracing/ui/base/draw_helpers.html"> -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays the ruler. - * @constructor - * @extends {Track} - */ - var RulerTrack = tr.ui.b.define('ruler-track', tr.ui.tracks.Track); - - var logOf10 = Math.log(10); - function log10(x) { - return Math.log(x) / logOf10; - } - - RulerTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('ruler-track'); - this.strings_secs_ = []; - this.strings_msecs_ = []; - this.strings_usecs_ = []; - this.strings_nsecs_ = []; - - this.viewportChange_ = this.viewportChange_.bind(this); - viewport.addEventListener('change', this.viewportChange_); - - var heading = document.createElement('tr-ui-heading'); - heading.arrowVisible = false; - this.appendChild(heading); - }, - - detach: function() { - tr.ui.tracks.Track.prototype.detach.call(this); - this.viewport.removeEventListener('change', - this.viewportChange_); - }, - - viewportChange_: function() { - if (this.viewport.interestRange.isEmpty) - this.classList.remove('tall-mode'); - else - this.classList.add('tall-mode'); - }, - - draw: function(type, viewLWorld, viewRWorld) { - switch (type) { - case tr.ui.tracks.DrawType.GRID: - this.drawGrid_(viewLWorld, viewRWorld); - break; - case tr.ui.tracks.DrawType.MARKERS: - if (!this.viewport.interestRange.isEmpty) - this.viewport.interestRange.draw(this.context(), - viewLWorld, viewRWorld); - break; - } - }, - - drawGrid_: function(viewLWorld, viewRWorld) { - var ctx = this.context(); - var pixelRatio = window.devicePixelRatio || 1; - - var canvasBounds = ctx.canvas.getBoundingClientRect(); - var trackBounds = this.getBoundingClientRect(); - var width = canvasBounds.width * pixelRatio; - var height = trackBounds.height * pixelRatio; - - var hasInterestRange = !this.viewport.interestRange.isEmpty; - - var rulerHeight = hasInterestRange ? (height * 2) / 5 : height; - - var vp = this.viewport; - var dt = vp.currentDisplayTransform; - - var idealMajorMarkDistancePix = 150 * pixelRatio; - var idealMajorMarkDistanceWorld = - dt.xViewVectorToWorld(idealMajorMarkDistancePix); - - var majorMarkDistanceWorld; - - // The conservative guess is the nearest enclosing 0.1, 1, 10, 100, etc. - var conservativeGuess = - Math.pow(10, Math.ceil(log10(idealMajorMarkDistanceWorld))); - - // Once we have a conservative guess, consider things that evenly add up - // to the conservative guess, e.g. 0.5, 0.2, 0.1 Pick the one that still - // exceeds the ideal mark distance. - var divisors = [10, 5, 2, 1]; - for (var i = 0; i < divisors.length; ++i) { - var tightenedGuess = conservativeGuess / divisors[i]; - if (dt.xWorldVectorToView(tightenedGuess) < idealMajorMarkDistancePix) - continue; - majorMarkDistanceWorld = conservativeGuess / divisors[i - 1]; - break; - } - - var unit; - var unitDivisor; - var tickLabels = undefined; - if (majorMarkDistanceWorld < 0.0001) { - unit = 'ns'; - unitDivisor = 0.000001; - tickLabels = this.strings_nsecs_; - } else if (majorMarkDistanceWorld < 0.1) { - unit = 'us'; - unitDivisor = 0.001; - tickLabels = this.strings_usecs_; - } else if (majorMarkDistanceWorld < 100) { - unit = 'ms'; - unitDivisor = 1; - tickLabels = this.strings_msecs_; - } else { - unit = 's'; - unitDivisor = 1000; - tickLabels = this.strings_secs_; - } - - var numTicksPerMajor = 5; - var minorMarkDistanceWorld = majorMarkDistanceWorld / numTicksPerMajor; - var minorMarkDistancePx = dt.xWorldVectorToView(minorMarkDistanceWorld); - - var firstMajorMark = - Math.floor(viewLWorld / majorMarkDistanceWorld) * - majorMarkDistanceWorld; - - var minorTickH = Math.floor(rulerHeight * 0.25); - - ctx.save(); - - var pixelRatio = window.devicePixelRatio || 1; - ctx.lineWidth = Math.round(pixelRatio); - - // Apply subpixel translate to get crisp lines. - // http://www.mobtowers.com/html5-canvas-crisp-lines-every-time/ - var crispLineCorrection = (ctx.lineWidth % 2) / 2; - ctx.translate(crispLineCorrection, -crispLineCorrection); - - ctx.fillStyle = 'rgb(0, 0, 0)'; - ctx.strokeStyle = 'rgb(0, 0, 0)'; - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - ctx.font = (9 * pixelRatio) + 'px sans-serif'; - - vp.majorMarkPositions = []; - - // Each iteration of this loop draws one major mark - // and numTicksPerMajor minor ticks. - // - // Rendering can't be done in world space because canvas transforms - // affect line width. So, do the conversions manually. - ctx.beginPath(); - for (var curX = firstMajorMark; - curX < viewRWorld; - curX += majorMarkDistanceWorld) { - - var curXView = Math.floor(dt.xWorldToView(curX)); - - var unitValue = curX / unitDivisor; - var roundedUnitValue = Math.round(unitValue * 100000) / 100000; - - if (!tickLabels[roundedUnitValue]) - tickLabels[roundedUnitValue] = roundedUnitValue + ' ' + unit; - ctx.fillText(tickLabels[roundedUnitValue], - curXView + (2 * pixelRatio), 0); - - vp.majorMarkPositions.push(curXView); - - // Major mark - tr.ui.b.drawLine(ctx, curXView, 0, curXView, rulerHeight); - - // Minor marks - for (var i = 1; i < numTicksPerMajor; ++i) { - var xView = Math.floor(curXView + minorMarkDistancePx * i); - tr.ui.b.drawLine(ctx, - xView, rulerHeight - minorTickH, - xView, rulerHeight); - } - } - - // Draw bottom bar. - ctx.strokeStyle = 'rgb(0, 0, 0)'; - tr.ui.b.drawLine(ctx, 0, height, width, height); - ctx.stroke(); - - // Give distance between directly adjacent markers. - if (!hasInterestRange) - return; - - // Draw middle bar. - tr.ui.b.drawLine(ctx, 0, rulerHeight, width, rulerHeight); - ctx.stroke(); - - // Distance Variables. - var displayDistance; - var displayTextColor = 'rgb(0,0,0)'; - - // Arrow Variables. - var arrowSpacing = 10 * pixelRatio; - var arrowColor = 'rgb(128,121,121)'; - var arrowPosY = rulerHeight * 1.75; - var arrowWidthView = 3 * pixelRatio; - var arrowLengthView = 10 * pixelRatio; - var spaceForArrowsView = 2 * (arrowWidthView + arrowSpacing); - - ctx.textBaseline = 'middle'; - ctx.font = (14 * pixelRatio) + 'px sans-serif'; - var textPosY = arrowPosY; - - var interestRange = vp.interestRange; - - // If the range is zero, draw it's min timestamp next to the line. - if (interestRange.range === 0) { - var markerWorld = interestRange.min; - var markerView = dt.xWorldToView(markerWorld); - var displayValue = markerWorld / unitDivisor; - displayValue = Math.abs((Math.round(displayValue * 1000) / 1000)); - - var textToDraw = displayValue + ' ' + unit; - var textLeftView = markerView + 4 * pixelRatio; - var textWidthView = ctx.measureText(textToDraw).width; - - // Put text to the left in case it gets cut off. - if (textLeftView + textWidthView > width) - textLeftView = markerView - 4 * pixelRatio - textWidthView; - - ctx.fillStyle = displayTextColor; - ctx.fillText(textToDraw, textLeftView, textPosY); - return; - } - - var leftMarker = interestRange.min; - var rightMarker = interestRange.max; - - var leftMarkerView = dt.xWorldToView(leftMarker); - var rightMarkerView = dt.xWorldToView(rightMarker); - - var distanceBetweenMarkers = interestRange.range; - var distanceBetweenMarkersView = - dt.xWorldVectorToView(distanceBetweenMarkers); - var positionInMiddleOfMarkersView = - leftMarkerView + (distanceBetweenMarkersView / 2); - - // Determine units. - if (distanceBetweenMarkers < 0.0001) { - unit = 'ns'; - unitDivisor = 0.000001; - } else if (distanceBetweenMarkers < 0.1) { - unit = 'us'; - unitDivisor = 0.001; - } else if (distanceBetweenMarkers < 100) { - unit = 'ms'; - unitDivisor = 1; - } else { - unit = 's'; - unitDivisor = 1000; - } - - // Calculate display value to print. - displayDistance = distanceBetweenMarkers / unitDivisor; - var roundedDisplayDistance = - Math.abs((Math.round(displayDistance * 1000) / 1000)); - var textToDraw = roundedDisplayDistance + ' ' + unit; - var textWidthView = ctx.measureText(textToDraw).width; - var spaceForArrowsAndTextView = - textWidthView + spaceForArrowsView + arrowSpacing; - - // Set text positions. - var textLeftView = positionInMiddleOfMarkersView - textWidthView / 2; - var textRightView = textLeftView + textWidthView; - - if (spaceForArrowsAndTextView > distanceBetweenMarkersView) { - // Print the display distance text right of the 2 markers. - textLeftView = rightMarkerView + 2 * arrowSpacing; - - // Put text to the left in case it gets cut off. - if (textLeftView + textWidthView > width) - textLeftView = leftMarkerView - 2 * arrowSpacing - textWidthView; - - ctx.fillStyle = displayTextColor; - ctx.fillText(textToDraw, textLeftView, textPosY); - - // Draw the arrows pointing from outside in and a line in between. - ctx.strokeStyle = arrowColor; - ctx.beginPath(); - tr.ui.b.drawLine(ctx, leftMarkerView, arrowPosY, rightMarkerView, - arrowPosY); - ctx.stroke(); - - ctx.fillStyle = arrowColor; - tr.ui.b.drawArrow(ctx, - leftMarkerView - 1.5 * arrowSpacing, arrowPosY, - leftMarkerView, arrowPosY, - arrowLengthView, arrowWidthView); - tr.ui.b.drawArrow(ctx, - rightMarkerView + 1.5 * arrowSpacing, arrowPosY, - rightMarkerView, arrowPosY, - arrowLengthView, arrowWidthView); - - } else if (spaceForArrowsView <= distanceBetweenMarkersView) { - var leftArrowStart; - var rightArrowStart; - if (spaceForArrowsAndTextView <= distanceBetweenMarkersView) { - // Print the display distance text. - ctx.fillStyle = displayTextColor; - ctx.fillText(textToDraw, textLeftView, textPosY); - - leftArrowStart = textLeftView - arrowSpacing; - rightArrowStart = textRightView + arrowSpacing; - } else { - leftArrowStart = positionInMiddleOfMarkersView; - rightArrowStart = positionInMiddleOfMarkersView; - } - - // Draw the arrows pointing inside out. - ctx.strokeStyle = arrowColor; - ctx.fillStyle = arrowColor; - tr.ui.b.drawArrow(ctx, - leftArrowStart, arrowPosY, - leftMarkerView, arrowPosY, - arrowLengthView, arrowWidthView); - tr.ui.b.drawArrow(ctx, - rightArrowStart, arrowPosY, - rightMarkerView, arrowPosY, - arrowLengthView, arrowWidthView); - } - - ctx.restore(); - }, - - /** - * Adds items intersecting the given range to a selection. - * @param {number} loVX Lower X bound of the interval to search, in - * viewspace. - * @param {number} hiVX Upper X bound of the interval to search, in - * viewspace. - * @param {number} loVY Lower Y bound of the interval to search, in - * viewspace. - * @param {number} hiVY Upper Y bound of the interval to search, in - * viewspace. - * @param {Selection} selection Selection to which to add results. - */ - addIntersectingEventsInRangeToSelection: function( - loVX, hiVX, loY, hiY, selection) { - // Does nothing. There's nothing interesting to pick on the ruler - // track. - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - } - }; - - return { - RulerTrack: RulerTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track_test.html deleted file mode 100644 index 3ca0d72fdf4..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/ruler_track_test.html +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_viewport.html"> -<link rel="import" href="/tracing/ui/tracks/drawing_container.html"> -<link rel="import" href="/tracing/ui/tracks/ruler_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - test('instantiate', function() { - var div = document.createElement('div'); - - var viewport = new tr.ui.TimelineViewport(div); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - div.appendChild(drawingContainer); - - var track = tr.ui.tracks.RulerTrack(viewport); - drawingContainer.appendChild(track); - this.addHTMLOutput(div); - - drawingContainer.invalidate(); - - var dt = new tr.ui.TimelineDisplayTransform(); - dt.setPanAndScale(0, track.clientWidth / 1000); - track.viewport.setDisplayTransformImmediately(dt); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track.html deleted file mode 100644 index 80010bbc2a3..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track.html +++ /dev/null @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/rect_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays an array of Sample objects. - * @constructor - * @extends {RectTrack} - */ - var SampleTrack = tr.ui.b.define( - 'sample-track', tr.ui.tracks.RectTrack); - - SampleTrack.prototype = { - - __proto__: tr.ui.tracks.RectTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.RectTrack.prototype.decorate.call(this, viewport); - }, - - get samples() { - return this.rects; - }, - - set samples(samples) { - this.rects = samples; - } - }; - - return { - SampleTrack: SampleTrack - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track_test.html deleted file mode 100644 index c5c7342af0e..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/sample_track_test.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/model/event_set.html"> -<link rel="import" href="/tracing/model/sample.html"> -<link rel="import" href="/tracing/model/stack_frame.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/ui/tracks/sample_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var SampleTrack = tr.ui.tracks.SampleTrack; - var Sample = tr.model.Sample; - var StackFrame = tr.model.StackFrame; - - test('modelMapping', function() { - var track = new SampleTrack(new tr.ui.TimelineViewport()); - var fA = new StackFrame(undefined, 1, 'cat', 'a', 7); - var sample = new Sample(undefined, undefined, 'instructions_retired', - 10, fA, 10); - track.samples = [sample]; - var me0 = track.rects[0].modelItem; - assert.equal(me0, sample); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track.html deleted file mode 100644 index 78ffd07cf00..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track.html +++ /dev/null @@ -1,168 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/multi_row_track.html"> -<link rel="import" href="/tracing/base/sorted_array_utils.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays a SliceGroup. - * @constructor - * @extends {MultiRowTrack} - */ - var SliceGroupTrack = tr.ui.b.define( - 'slice-group-track', tr.ui.tracks.MultiRowTrack); - - SliceGroupTrack.prototype = { - - __proto__: tr.ui.tracks.MultiRowTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this, viewport); - this.classList.add('slice-group-track'); - this.group_ = undefined; - // Set the collapse threshold so we don't collapse by default, but the - // user can explicitly collapse if they want it. - this.defaultToCollapsedWhenSubRowCountMoreThan = 100; - }, - - addSubTrack_: function(slices) { - var track = new tr.ui.tracks.SliceTrack(this.viewport); - track.slices = slices; - this.appendChild(track); - return track; - }, - - get group() { - return this.group_; - }, - - set group(group) { - this.group_ = group; - this.setItemsToGroup(this.group_.slices, this.group_); - }, - - get eventContainer() { - return this.group; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply( - this, arguments); - containerToTrackMap.addContainer(this.group, this); - }, - - /** - * Breaks up the list of slices into N rows, each of which is a list of - * slices that are non overlapping. - */ - buildSubRows_: function(slices) { - var precisionUnit = this.group.model.intrinsicTimeUnit; - - // This function works by walking through slices by start time. - // - // The basic idea here is to insert each slice as deep into the subrow - // list as it can go such that every subSlice is fully contained by its - // parent slice. - // - // Visually, if we start with this: - // 0: [ a ] - // 1: [ b ] - // 2: [c][d] - // - // To place this slice: - // [e] - // We first check row 2's last item, [d]. [e] wont fit into [d] (they dont - // even intersect). So we go to row 1. That gives us [b], and [d] wont fit - // into that either. So, we go to row 0 and its last slice, [a]. That can - // completely contain [e], so that means we should add [e] as a subchild - // of [a]. That puts it on row 1, yielding: - // 0: [ a ] - // 1: [ b ][e] - // 2: [c][d] - // - // If we then get this slice: - // [f] - // We do the same deepest-to-shallowest walk of the subrows trying to fit - // it. This time, it doesn't fit in any open slice. So, we simply append - // it to row 0: - // 0: [ a ] [f] - // 1: [ b ][e] - // 2: [c][d] - if (!slices.length) - return []; - - var ops = []; - for (var i = 0; i < slices.length; i++) { - if (slices[i].subSlices) - slices[i].subSlices.splice(0, - slices[i].subSlices.length); - ops.push(i); - } - - ops.sort(function(ix, iy) { - var x = slices[ix]; - var y = slices[iy]; - if (x.start != y.start) - return x.start - y.start; - - // Elements get inserted into the slices array in order of when the - // slices start. Because slices must be properly nested, we break - // start-time ties by assuming that the elements appearing earlier in - // the slices array (and thus ending earlier) start earlier. - return ix - iy; - }); - - var subRows = [[]]; - this.badSlices_ = []; // TODO(simonjam): Connect this again. - - for (var i = 0; i < ops.length; i++) { - var op = ops[i]; - var slice = slices[op]; - - // Try to fit the slice into the existing subrows. - var inserted = false; - for (var j = subRows.length - 1; j >= 0; j--) { - if (subRows[j].length == 0) - continue; - - var insertedSlice = subRows[j][subRows[j].length - 1]; - if (slice.start < insertedSlice.start) { - this.badSlices_.push(slice); - inserted = true; - } - if (insertedSlice.bounds(slice, precisionUnit)) { - // Insert it into subRow j + 1. - while (subRows.length <= j + 1) - subRows.push([]); - subRows[j + 1].push(slice); - if (insertedSlice.subSlices) - insertedSlice.subSlices.push(slice); - inserted = true; - break; - } - } - if (inserted) - continue; - - // Append it to subRow[0] as a root. - subRows[0].push(slice); - } - - return subRows; - } - }; - - return { - SliceGroupTrack: SliceGroupTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track_test.html deleted file mode 100644 index 6e3ff9813c4..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_group_track_test.html +++ /dev/null @@ -1,293 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/model/slice_group.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var ProcessTrack = tr.ui.tracks.ProcessTrack; - var ThreadTrack = tr.ui.tracks.ThreadTrack; - var SliceGroup = tr.model.SliceGroup; - var SliceGroupTrack = tr.ui.tracks.SliceGroupTrack; - var newSliceEx = tr.c.TestUtils.newSliceEx; - - test('subRowBuilderBasic', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 2})); - var sB = group.pushSlice(newSliceEx({title: 'a', start: 3, duration: 1})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 1); - assert.equal(subRows[0].length, 2); - assert.deepEqual(subRows[0], [sA, sB]); - }); - - test('subRowBuilderBasic2', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 4})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 3, duration: 1})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 1); - assert.equal(subRows[1].length, 1); - assert.deepEqual(subRows[0], [sA]); - assert.deepEqual(subRows[1], [sB]); - }); - - test('subRowBuilderNestedExactly', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - var sB = group.pushSlice(newSliceEx({title: 'b', start: 1, duration: 4})); - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 4})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 1); - assert.equal(subRows[1].length, 1); - assert.deepEqual(subRows[0], [sB]); - assert.deepEqual(subRows[1], [sA]); - }); - - test('subRowBuilderInstantEvents', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 0})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 2, duration: 0})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 1); - assert.equal(subRows[0].length, 2); - assert.deepEqual(subRows[0], [sA, sB]); - }); - - test('subRowBuilderTwoInstantEvents', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 0})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 1, duration: 0})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.deepEqual(subRows[0], [sA]); - assert.deepEqual(subRows[1], [sB]); - }); - - test('subRowBuilderOutOfOrderAddition', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - // Pattern being tested: - // [ a ][ b ] - // Where insertion is done backward. - var sB = group.pushSlice(newSliceEx({title: 'b', start: 3, duration: 1})); - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 2})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 1); - assert.equal(subRows[0].length, 2); - assert.deepEqual(subRows[0], [sA, sB]); - }); - - test('subRowBuilderOutOfOrderAddition2', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - // Pattern being tested: - // [ a ] - // [ b ] - // Where insertion is done backward. - var sB = group.pushSlice(newSliceEx({title: 'b', start: 3, duration: 1})); - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 5})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.equal(subRows[0].length, 1); - assert.equal(subRows[1].length, 1); - assert.deepEqual(subRows[0], [sA]); - assert.deepEqual(subRows[1], [sB]); - }); - - test('subRowBuilderOnNestedZeroLength', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - // Pattern being tested: - // [ a ] - // [ b1 ] []<- b2 where b2.duration = 0 and b2.end == a.end. - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 3})); - var sB1 = group.pushSlice(newSliceEx({title: 'b1', start: 1, duration: 2})); - var sB2 = group.pushSlice(newSliceEx({title: 'b2', start: 4, duration: 0})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.deepEqual(subRows[0], [sA]); - assert.deepEqual(subRows[1], [sB1, sB2]); - }); - - test('subRowBuilderOnGroup1', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - // Pattern being tested: - // [ a ] [ c ] - // [ b ] - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 3})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 1.5, duration: 1})); - var sC = group.pushSlice(newSliceEx({title: 'c', start: 5, duration: 0})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - var subRows = track.subRows; - - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 2); - assert.deepEqual(subRows[0], [sA, sC]); - assert.deepEqual(subRows[1], [sB]); - }); - - test('subRowBuilderOnGroup2', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - // Pattern being tested: - // [ a ] [ d ] - // [ b ] - // [ c ] - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 3})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 1.5, duration: 1})); - var sC = group.pushSlice(newSliceEx( - {title: 'c', start: 1.75, duration: 0.5})); - var sD = group.pushSlice(newSliceEx( - {title: 'c', start: 5, duration: 0.25})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - - var subRows = track.subRows; - assert.equal(track.badSlices_.length, 0); - assert.equal(subRows.length, 3); - assert.deepEqual(subRows[0], [sA, sD]); - assert.deepEqual(subRows[1], [sB]); - assert.deepEqual(subRows[2], [sC]); - }); - - test('trackFiltering', function() { - var m = new tr.Model(); - var t1 = m.getOrCreateProcess(1).getOrCreateThread(2); - var group = t1.sliceGroup; - - var sA = group.pushSlice(newSliceEx({title: 'a', start: 1, duration: 3})); - var sB = group.pushSlice(newSliceEx({title: 'b', start: 1.5, duration: 1})); - - var track = new SliceGroupTrack(new tr.ui.TimelineViewport()); - track.group = group; - - assert.equal(track.subRows.length, 2); - assert.isTrue(track.hasVisibleContent); - }); - -test('sliceGroupContainerMap', function() { - var vp = new tr.ui.TimelineViewport(); - var containerToTrack = vp.containerToTrackMap; - var model = new tr.Model(); - var process = model.getOrCreateProcess(123); - var thread = process.getOrCreateThread(456); - var group = new SliceGroup(thread); - - var processTrack = new ProcessTrack(vp); - var threadTrack = new ThreadTrack(vp); - var groupTrack = new SliceGroupTrack(vp); - processTrack.process = process; - threadTrack.thread = thread; - groupTrack.group = group; - processTrack.appendChild(threadTrack); - threadTrack.appendChild(groupTrack); - - assert.equal(processTrack.eventContainer, process); - assert.equal(threadTrack.eventContainer, thread); - assert.equal(groupTrack.eventContainer, group); - - assert.isUndefined(containerToTrack.getTrackByStableId('123')); - assert.isUndefined(containerToTrack.getTrackByStableId('123.456')); - assert.isUndefined( - containerToTrack.getTrackByStableId('123.456.SliceGroup')); - - vp.modelTrackContainer = { - addContainersToTrackMap: function(containerToTrackMap) { - processTrack.addContainersToTrackMap(containerToTrackMap); - }, - addEventListener: function() {} - }; - vp.rebuildContainerToTrackMap(); - - // Check that all tracks call childs' addContainersToTrackMap() - // by checking the resulting map. - assert.equal(containerToTrack.getTrackByStableId('123'), processTrack); - assert.equal(containerToTrack.getTrackByStableId('123.456'), threadTrack); - assert.equal(containerToTrack.getTrackByStableId('123.456.SliceGroup'), - groupTrack); - - // Check the track's eventContainer getter. - assert.equal(processTrack.eventContainer, process); - assert.equal(threadTrack.eventContainer, thread); - assert.equal(groupTrack.eventContainer, group); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track.html deleted file mode 100644 index 87123811d62..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track.html +++ /dev/null @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/tracks/rect_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays an array of Slice objects. - * @constructor - * @extends {RectTrack} - */ - var SliceTrack = tr.ui.b.define( - 'slice-track', tr.ui.tracks.RectTrack); - - SliceTrack.prototype = { - - __proto__: tr.ui.tracks.RectTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.RectTrack.prototype.decorate.call(this, viewport); - }, - - get slices() { - return this.rects; - }, - - set slices(slices) { - this.rects = slices; - } - }; - - return { - SliceTrack: SliceTrack - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track_test.html deleted file mode 100644 index 2c22784a848..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/slice_track_test.html +++ /dev/null @@ -1,29 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/model/event_set.html"> -<link rel="import" href="/tracing/model/slice.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/ui/tracks/slice_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var SliceTrack = tr.ui.tracks.SliceTrack; - var Slice = tr.model.Slice; - - test('modelMapping', function() { - var track = new SliceTrack(new tr.ui.TimelineViewport()); - var slice = new Slice('', 'a', 0, 1, {}, 1); - track.slices = [slice]; - var me0 = track.rects[0].modelItem; - assert.equal(slice, me0); - }); -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.css deleted file mode 100644 index 094eee0862d..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.css +++ /dev/null @@ -1,7 +0,0 @@ -/* Copyright (c) 2013 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. - */ -.spacing-track { - height: 4px; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.html deleted file mode 100644 index 5eea1c903e0..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/spacing_track.html +++ /dev/null @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/spacing_track.css"> - -<link rel="import" href="/tracing/ui/base/heading.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track used to provide whitespace between the tracks above and below it. - * - * @constructor - * @extends {tr.ui.tracks.Track} - */ - var SpacingTrack = tr.ui.b.define('spacing-track', tr.ui.tracks.Track); - - SpacingTrack.prototype = { - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('spacing-track'); - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - } - }; - - return { - SpacingTrack: SpacingTrack - }; -}); -</script> - diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/stacked_bars_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/stacked_bars_track.html deleted file mode 100644 index e3e9ea89d40..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/stacked_bars_track.html +++ /dev/null @@ -1,130 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/heading.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * A track that displays traces as stacked bars. - * @constructor - * @extends {Track} - */ - var StackedBarsTrack = tr.ui.b.define( - 'stacked-bars-track', tr.ui.tracks.Track); - - StackedBarsTrack.prototype = { - - __proto__: tr.ui.tracks.Track.prototype, - - decorate: function(viewport) { - tr.ui.tracks.Track.prototype.decorate.call(this, viewport); - this.classList.add('stacked-bars-track'); - this.objectInstance_ = null; - - this.heading_ = document.createElement('tr-ui-heading'); - this.appendChild(this.heading_); - }, - - set heading(heading) { - this.heading_.heading = heading; - }, - - get heading() { - return this.heading_.heading; - }, - - set tooltip(tooltip) { - this.heading_.tooltip = tooltip; - }, - - addEventsToTrackMap: function(eventToTrackMap) { - var objectSnapshots = this.objectInstance_.snapshots; - objectSnapshots.forEach(function(obj) { - eventToTrackMap.addEvent(obj, this); - }, this); - }, - - /** - * Used to hit-test clicks in the graph. - */ - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - function onSnapshot(snapshot) { - selection.push(snapshot); - } - - var snapshots = this.objectInstance_.snapshots; - var maxBounds = this.objectInstance_.parent.model.bounds.max; - - tr.b.iterateOverIntersectingIntervals( - snapshots, - function(x) { return x.ts; }, - function(x, i) { - if (i == snapshots.length - 1) { - if (snapshots.length == 1) - return maxBounds; - - return snapshots[i].ts - snapshots[i - 1].ts; - } - - return snapshots[i + 1].ts - snapshots[i].ts; - }, - loWX, hiWX, - onSnapshot); - }, - - /** - * Add the item to the left or right of the provided item, if any, to the - * selection. - * @param {slice} The current slice. - * @param {Number} offset Number of slices away from the object to look. - * @param {Selection} selection The selection to add an event to, - * if found. - * @return {boolean} Whether an event was found. - * @private - */ - addEventNearToProvidedEventToSelection: function(event, offset, selection) { - if (!(event instanceof tr.model.ObjectSnapshot)) - throw new Error('Unrecognized event'); - var objectSnapshots = this.objectInstance_.snapshots; - var index = objectSnapshots.indexOf(event); - var newIndex = index + offset; - if (newIndex >= 0 && newIndex < objectSnapshots.length) { - selection.push(objectSnapshots[newIndex]); - return true; - } - return false; - }, - - addAllEventsMatchingFilterToSelection: function(filter, selection) { - }, - - addClosestEventToSelection: function(worldX, worldMaxDist, loY, hiY, - selection) { - var snapshot = tr.b.findClosestElementInSortedArray( - this.objectInstance_.snapshots, - function(x) { return x.ts; }, - worldX, - worldMaxDist); - - if (!snapshot) - return; - - selection.push(snapshot); - } - }; - - return { - StackedBarsTrack: StackedBarsTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.css deleted file mode 100644 index c42cee032d8..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.css +++ /dev/null @@ -1,10 +0,0 @@ -/* Copyright (c) 2012 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. - */ - -.thread-track { - -webkit-box-orient: vertical; - display: -webkit-box; - position: relative; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.html deleted file mode 100644 index aca956546b3..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track.html +++ /dev/null @@ -1,163 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/thread_track.css"> - -<link rel="import" href="/tracing/base/iteration_helpers.html"> -<link rel="import" href="/tracing/core/filter.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> -<link rel="import" href="/tracing/ui/tracks/async_slice_group_track.html"> -<link rel="import" href="/tracing/ui/tracks/container_track.html"> -<link rel="import" href="/tracing/ui/tracks/sample_track.html"> -<link rel="import" href="/tracing/ui/tracks/slice_group_track.html"> -<link rel="import" href="/tracing/ui/tracks/slice_track.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * Visualizes a Thread using a series of SliceTracks. - * @constructor - */ - var ThreadTrack = tr.ui.b.define('thread-track', - tr.ui.tracks.ContainerTrack); - ThreadTrack.prototype = { - __proto__: tr.ui.tracks.ContainerTrack.prototype, - - decorate: function(viewport) { - tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport); - this.classList.add('thread-track'); - }, - - get thread() { - return this.thread_; - }, - - set thread(thread) { - this.thread_ = thread; - this.updateContents_(); - }, - - get hasVisibleContent() { - return this.tracks_.length > 0; - }, - - get eventContainer() { - return this.thread; - }, - - addContainersToTrackMap: function(containerToTrackMap) { - tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.apply( - this, arguments); - containerToTrackMap.addContainer(this.thread, this); - }, - - updateContents_: function() { - this.detach(); - - if (!this.thread_) - return; - - this.heading = this.thread_.userFriendlyName + ': '; - this.tooltip = this.thread_.userFriendlyDetails; - - if (this.thread_.asyncSliceGroup.length) - this.appendAsyncSliceTracks_(); - - this.appendThreadSamplesTracks_(); - - if (this.thread_.timeSlices) { - var timeSlicesTrack = new tr.ui.tracks.SliceTrack(this.viewport); - timeSlicesTrack.heading = ''; - timeSlicesTrack.height = tr.ui.b.THIN_SLICE_HEIGHT + 'px'; - timeSlicesTrack.slices = this.thread_.timeSlices; - if (timeSlicesTrack.hasVisibleContent) - this.appendChild(timeSlicesTrack); - } - - if (this.thread_.sliceGroup.length) { - var track = new tr.ui.tracks.SliceGroupTrack(this.viewport); - track.heading = this.thread_.userFriendlyName; - track.tooltip = this.thread_.userFriendlyDetails; - track.group = this.thread_.sliceGroup; - if (track.hasVisibleContent) - this.appendChild(track); - } - }, - - appendAsyncSliceTracks_: function() { - var subGroups = this.thread_.asyncSliceGroup.viewSubGroups; - subGroups.forEach(function(subGroup) { - var asyncTrack = new tr.ui.tracks.AsyncSliceGroupTrack(this.viewport); - var title = subGroup.slices[0].viewSubGroupTitle; - asyncTrack.group = subGroup; - asyncTrack.heading = title; - if (asyncTrack.hasVisibleContent) - this.appendChild(asyncTrack); - }, this); - }, - - appendThreadSamplesTracks_: function() { - var threadSamples = this.thread_.samples; - if (threadSamples === undefined || threadSamples.length === 0) - return; - var samplesByTitle = {}; - threadSamples.forEach(function(sample) { - if (samplesByTitle[sample.title] === undefined) - samplesByTitle[sample.title] = []; - samplesByTitle[sample.title].push(sample); - }); - - var sampleTitles = tr.b.dictionaryKeys(samplesByTitle); - sampleTitles.sort(); - - sampleTitles.forEach(function(sampleTitle) { - var samples = samplesByTitle[sampleTitle]; - var samplesTrack = new tr.ui.tracks.SampleTrack(this.viewport); - samplesTrack.group = this.thread_; - samplesTrack.samples = samples; - samplesTrack.heading = this.thread_.userFriendlyName + ': ' + - sampleTitle; - samplesTrack.tooltip = this.thread_.userFriendlyDetails; - samplesTrack.selectionGenerator = function() { - var selection = new tr.model.EventSet(); - for (var i = 0; i < samplesTrack.samples.length; i++) { - selection.push(samplesTrack.samples[i]); - } - return selection; - }; - this.appendChild(samplesTrack); - }, this); - }, - - collapsedDidChange: function(collapsed) { - if (collapsed) { - var h = parseInt(this.tracks[0].height); - for (var i = 0; i < this.tracks.length; ++i) { - if (h > 2) { - this.tracks[i].height = Math.floor(h) + 'px'; - } else { - this.tracks[i].style.display = 'none'; - } - h = h * 0.5; - } - } else { - for (var i = 0; i < this.tracks.length; ++i) { - this.tracks[i].height = this.tracks[0].height; - this.tracks[i].style.display = ''; - } - } - } - }; - - return { - ThreadTrack: ThreadTrack - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track_test.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track_test.html deleted file mode 100644 index 068c4f01e02..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/thread_track_test.html +++ /dev/null @@ -1,145 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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/core/test_utils.html"> -<link rel="import" href="/tracing/model/event_set.html"> -<link rel="import" href="/tracing/model/instant_event.html"> -<link rel="import" href="/tracing/ui/base/dom_helpers.html"> -<link rel="import" href="/tracing/ui/timeline_track_view.html"> -<link rel="import" href="/tracing/ui/tracks/thread_track.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var HighlightInstantEvent = tr.model.ThreadHighlightInstantEvent; - var Process = tr.model.Process; - var EventSet = tr.model.EventSet; - var StackFrame = tr.model.StackFrame; - var Sample = tr.model.Sample; - var Thread = tr.model.Thread; - var ThreadSlice = tr.model.ThreadSlice; - var ThreadTrack = tr.ui.tracks.ThreadTrack; - var Viewport = tr.ui.TimelineViewport; - var newAsyncSlice = tr.c.TestUtils.newAsyncSlice; - var newAsyncSliceNamed = tr.c.TestUtils.newAsyncSliceNamed; - var newSliceEx = tr.c.TestUtils.newSliceEx; - - test('selectionHitTestingWithThreadTrack', function() { - var model = new tr.Model(); - var p1 = model.getOrCreateProcess(1); - var t1 = p1.getOrCreateThread(1); - t1.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4)); - t1.sliceGroup.pushSlice(new ThreadSlice('', 'b', 0, 5.1, {}, 4)); - - var testEl = document.createElement('div'); - testEl.appendChild(tr.ui.b.createScopedStyle('heading { width: 100px; }')); - testEl.style.width = '600px'; - - var viewport = new Viewport(testEl); - var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport); - testEl.appendChild(drawingContainer); - - var track = new ThreadTrack(viewport); - drawingContainer.appendChild(track); - drawingContainer.updateCanvasSizeIfNeeded_(); - track.thread = t1; - - var y = track.getBoundingClientRect().top; - var h = track.getBoundingClientRect().height; - var wW = 10; - var vW = drawingContainer.canvas.getBoundingClientRect().width; - var dt = new tr.ui.TimelineDisplayTransform(); - dt.xSetWorldBounds(0, wW, vW); - track.viewport.setDisplayTransformImmediately(dt); - - var selection = new EventSet(); - var x = (1.5 / wW) * vW; - track.addIntersectingEventsInRangeToSelection( - x, x + 1, y, y + 1, selection); - assert.isTrue(selection.equals( - new EventSet([t1.sliceGroup.slices[0], t1.sliceGroup.slices[1]]))); - - var selection = new EventSet(); - track.addIntersectingEventsInRangeToSelection( - (1.5 / wW) * vW, (1.8 / wW) * vW, - y, y + h, selection); - assert.isTrue(selection.equals( - new EventSet([t1.sliceGroup.slices[0], t1.sliceGroup.slices[1]]))); - }); - - test('filterThreadSlices', function() { - var model = new tr.Model(); - var thread = new Thread(new Process(model, 7), 1); - thread.sliceGroup.pushSlice(newSliceEx( - {title: 'a', start: 0, duration: 0})); - thread.asyncSliceGroup.push(newAsyncSliceNamed('a', 0, 5, t, t)); - - var t = new ThreadTrack(new tr.ui.TimelineViewport()); - t.thread = thread; - - assert.equal(t.tracks_.length, 2); - assert.instanceOf(t.tracks_[0], tr.ui.tracks.AsyncSliceGroupTrack); - assert.instanceOf(t.tracks_[1], tr.ui.tracks.SliceGroupTrack); - }); - - test('sampleThreadSlices', function() { - var thread; - var cpu; - var model = tr.c.TestUtils.newModelWithEvents([], { - shiftWorldToZero: false, - pruneContainers: false, - customizeModelCallback: function(model) { - cpu = model.kernel.getOrCreateCpu(1); - thread = model.getOrCreateProcess(1).getOrCreateThread(2); - - var fA = model.addStackFrame(new StackFrame( - undefined, 1, 'cat', 'a', 7)); - var fAB = model.addStackFrame(new StackFrame( - fA, 2, 'cat', 'b', 7)); - var fABC = model.addStackFrame(new StackFrame( - fAB, 3, 'cat', 'c', 7)); - var fAD = model.addStackFrame(new StackFrame( - fA, 4, 'cat', 'd', 7)); - - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 10, fABC, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 20, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 30, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'instructions_retired', - 40, fAD, 10)); - - model.samples.push(new Sample(undefined, thread, 'page_fault', - 25, fAB, 10)); - model.samples.push(new Sample(undefined, thread, 'page_fault', - 35, fAD, 10)); - } - }); - - var t = new ThreadTrack(new tr.ui.TimelineViewport()); - t.thread = thread; - assert.equal(t.tracks_.length, 2); - - // Instructions retired - var t0 = t.tracks_[0]; - assert.notEqual(t0.heading.indexOf('instructions_retired'), -1); - assert.instanceOf(t0, tr.ui.tracks.SampleTrack); - assert.equal(t0.samples.length, 4); - t0.samples.forEach(function(s) { - assert.instanceOf(s, tr.model.Sample); - }); - - // page_fault - var t1 = t.tracks_[1]; - assert.notEqual(t1.heading.indexOf('page_fault'), -1); - assert.instanceOf(t1, tr.ui.tracks.SampleTrack); - assert.equal(t1.samples.length, 2); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.css b/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.css deleted file mode 100644 index 3d56eef5b8d..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.css +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (c) 2012 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. - */ - -.track-button { - background-color: rgba(255, 255, 255, 0.5); - border: 1px solid rgba(0, 0, 0, 0.1); - color: rgba(0,0,0,0.2); - font-size: 10px; - height: 12px; - text-align: center; - width: 12px; -} - -.track-button:hover { - background-color: rgba(255, 255, 255, 1.0); - border: 1px solid rgba(0, 0, 0, 0.5); - box-shadow: 0 0 .05em rgba(0, 0, 0, 0.4); - color: rgba(0, 0, 0, 1); -} - -.track-close-button { - left: 2px; - position: absolute; - top: 2px; -} - -.track-collapse-button { - left: 3px; - position: absolute; - top: 2px; -} diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.html deleted file mode 100644 index 09a54c27223..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/track.html +++ /dev/null @@ -1,167 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2013 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="stylesheet" href="/tracing/ui/tracks/track.css"> - -<link rel="import" href="/tracing/ui/base/container_that_decorates_its_children.html"> -<link rel="import" href="/tracing/ui/base/ui.html"> - -<script> -'use strict'; - -tr.exportTo('tr.ui.tracks', function() { - /** - * The base class for all tracks, which render data into a provided div. - * @constructor - */ - var Track = tr.ui.b.define('track', - tr.ui.b.ContainerThatDecoratesItsChildren); - Track.prototype = { - __proto__: tr.ui.b.ContainerThatDecoratesItsChildren.prototype, - - decorate: function(viewport) { - tr.ui.b.ContainerThatDecoratesItsChildren.prototype.decorate.call(this); - if (viewport === undefined) - throw new Error('viewport is required when creating a Track.'); - - this.viewport_ = viewport; - this.classList.add('track'); - }, - - get viewport() { - return this.viewport_; - }, - - get drawingContainer() { - var cur = this; - while (cur) { - if (cur instanceof tr.ui.tracks.DrawingContainer) - return cur; - cur = cur.parentElement; - } - return undefined; - }, - - get eventContainer() { - }, - - invalidateDrawingContainer: function() { - var dc = this.drawingContainer; - if (dc) - dc.invalidate(); - }, - - context: function() { - // This is a little weird here, but we have to be able to walk up the - // parent tree to get the context. - if (!this.parentNode) - return undefined; - if (!this.parentNode.context) - throw new Error('Parent container does not support context() method.'); - return this.parentNode.context(); - }, - - decorateChild_: function(childTrack) { - }, - - undecorateChild_: function(childTrack) { - if (childTrack.detach) - childTrack.detach(); - }, - - updateContents_: function() { - }, - - /** - * Wrapper function around draw() that performs transformations on the - * context necessary for the track's contents to be drawn in the right place - * given the current pan and zoom. - */ - drawTrack: function(type) { - var ctx = this.context(); - - var pixelRatio = window.devicePixelRatio || 1; - var bounds = this.getBoundingClientRect(); - var canvasBounds = ctx.canvas.getBoundingClientRect(); - - ctx.save(); - ctx.translate(0, pixelRatio * (bounds.top - canvasBounds.top)); - - var dt = this.viewport.currentDisplayTransform; - var viewLWorld = dt.xViewToWorld(0); - var viewRWorld = dt.xViewToWorld(bounds.width * pixelRatio); - - this.draw(type, viewLWorld, viewRWorld); - ctx.restore(); - }, - - draw: function(type, viewLWorld, viewRWorld) { - }, - - addEventsToTrackMap: function(eventToTrackMap) { - }, - - addContainersToTrackMap: function(containerToTrackMap) { - }, - - addIntersectingEventsInRangeToSelection: function( - loVX, hiVX, loVY, hiVY, selection) { - - var pixelRatio = window.devicePixelRatio || 1; - var dt = this.viewport.currentDisplayTransform; - var viewPixWidthWorld = dt.xViewVectorToWorld(1); - var loWX = dt.xViewToWorld(loVX * pixelRatio); - var hiWX = dt.xViewToWorld(hiVX * pixelRatio); - - var clientRect = this.getBoundingClientRect(); - var a = Math.max(loVY, clientRect.top); - var b = Math.min(hiVY, clientRect.bottom); - if (a > b) - return; - - this.addIntersectingEventsInRangeToSelectionInWorldSpace( - loWX, hiWX, viewPixWidthWorld, selection); - }, - - addIntersectingEventsInRangeToSelectionInWorldSpace: function( - loWX, hiWX, viewPixWidthWorld, selection) { - }, - - /** - * Gets implemented by supporting track types. The method adds the event - * closest to worldX to the selection. - * - * @param {number} worldX The position that is looked for. - * @param {number} worldMaxDist The maximum distance allowed from worldX to - * the event. - * @param {number} loY Lower Y bound of the search interval in view space. - * @param {number} hiY Upper Y bound of the search interval in view space. - * @param {Selection} selection Selection to which to add hits. - */ - addClosestEventToSelection: function( - worldX, worldMaxDist, loY, hiY, selection) { - }, - - addClosestInstantEventToSelection: function(instantEvents, worldX, - worldMaxDist, selection) { - var instantEvent = tr.b.findClosestElementInSortedArray( - instantEvents, - function(x) { return x.start; }, - worldX, - worldMaxDist); - - if (!instantEvent) - return; - - selection.push(instantEvent); - } - }; - - return { - Track: Track - }; -}); -</script> |