summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js')
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js907
1 files changed, 0 insertions, 907 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js b/chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js
deleted file mode 100644
index 71d0928599d..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/FlameChart.js
+++ /dev/null
@@ -1,907 +0,0 @@
-/**
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @extends {WebInspector.View}
- * @param {!WebInspector.FlameChartDataProvider} dataProvider
- */
-WebInspector.FlameChart = function(dataProvider)
-{
- WebInspector.View.call(this);
- this.registerRequiredCSS("flameChart.css");
- this.element.className = "fill";
- this.element.id = "cpu-flame-chart";
-
- this._overviewPane = new WebInspector.FlameChart.OverviewPane(dataProvider);
- this._overviewPane.show(this.element);
-
- this._mainPane = new WebInspector.FlameChart.MainPane(dataProvider, this._overviewPane);
- this._mainPane.show(this.element);
- this._mainPane.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onEntrySelected, this);
- this._overviewPane._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged, this._onWindowChanged, this);
-
- if (!WebInspector.FlameChart._colorGenerator)
- WebInspector.FlameChart._colorGenerator = new WebInspector.FlameChart.ColorGenerator();
-}
-
-WebInspector.FlameChart.prototype = {
- /**
- * @param {!WebInspector.Event} event
- */
- _onWindowChanged: function(event)
- {
- this._mainPane.changeWindow(this._overviewPane._overviewGrid.windowLeft(), this._overviewPane._overviewGrid.windowRight());
- },
-
- /**
- * @param {!number} timeLeft
- * @param {!number} timeRight
- */
- selectRange: function(timeLeft, timeRight)
- {
- this._overviewPane._selectRange(timeLeft, timeRight);
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _onEntrySelected: function(event)
- {
- this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelected, event.data);
- },
-
- update: function()
- {
- this._overviewPane.update();
- this._mainPane.update();
- },
-
- __proto__: WebInspector.View.prototype
-};
-
-/**
- * @interface
- */
-WebInspector.FlameChartDataProvider = function()
-{
-}
-
-WebInspector.FlameChartDataProvider.prototype = {
- /**
- * @param {!WebInspector.FlameChart.ColorGenerator} colorGenerator
- * @return {!Object}
- */
- timelineData: function(colorGenerator) { },
-
- /**
- * @param {number} entryIndex
- */
- prepareHighlightedEntryInfo: function(entryIndex) { },
-
- /**
- * @param {number} entryIndex
- * @return {boolean}
- */
- canJumpToEntry: function(entryIndex) { },
-
- /**
- * @param {number} entryIndex
- * @return {!Object}
- */
- entryData: function(entryIndex) { }
-}
-
-/**
- * @constructor
- * @implements {WebInspector.TimelineGrid.Calculator}
- */
-WebInspector.FlameChart.Calculator = function()
-{
-}
-
-WebInspector.FlameChart.Calculator.prototype = {
- /**
- * @param {!WebInspector.FlameChart.MainPane} mainPane
- */
- _updateBoundaries: function(mainPane)
- {
- function log10(x)
- {
- return Math.log(x) / Math.LN10;
- }
- this._decimalDigits = Math.max(0, -Math.floor(log10(mainPane._timelineGrid.gridSliceTime * 1.01)));
- var totalTime = mainPane._timelineData().totalTime;
- this._minimumBoundaries = mainPane._windowLeft * totalTime;
- this._maximumBoundaries = mainPane._windowRight * totalTime;
- this.paddingLeft = mainPane._paddingLeft;
- this._width = mainPane._canvas.width - this.paddingLeft;
- this._timeToPixel = this._width / this.boundarySpan();
- },
-
- /**
- * @param {number} time
- * @return {number}
- */
- computePosition: function(time)
- {
- return (time - this._minimumBoundaries) * this._timeToPixel + this.paddingLeft;
- },
-
- /**
- * @param {number} value
- * @param {boolean=} hires
- * @return {string}
- */
- formatTime: function(value, hires)
- {
- var format = "%." + this._decimalDigits + "f\u2009ms";
- return WebInspector.UIString(format, value + this._minimumBoundaries);
- },
-
- /**
- * @return {number}
- */
- maximumBoundary: function()
- {
- return this._maximumBoundaries;
- },
-
- /**
- * @return {number}
- */
- minimumBoundary: function()
- {
- return this._minimumBoundaries;
- },
-
- /**
- * @return {number}
- */
- zeroTime: function()
- {
- return 0;
- },
-
- /**
- * @return {number}
- */
- boundarySpan: function()
- {
- return this._maximumBoundaries - this._minimumBoundaries;
- }
-}
-
-/**
- * @constructor
- * @implements {WebInspector.TimelineGrid.Calculator}
- */
-WebInspector.FlameChart.OverviewCalculator = function()
-{
-}
-
-WebInspector.FlameChart.OverviewCalculator.prototype = {
- /**
- * @param {!WebInspector.FlameChart.OverviewPane} overviewPane
- */
- _updateBoundaries: function(overviewPane)
- {
- this._minimumBoundaries = 0;
- var totalTime = overviewPane._timelineData().totalTime;
- this._maximumBoundaries = totalTime;
- this._xScaleFactor = overviewPane._overviewCanvas.width / totalTime;
- },
-
- /**
- * @param {number} time
- * @return {number}
- */
- computePosition: function(time)
- {
- return (time - this._minimumBoundaries) * this._xScaleFactor;
- },
-
- /**
- * @param {number} value
- * @param {boolean=} hires
- * @return {string}
- */
- formatTime: function(value, hires)
- {
- return Number.secondsToString((value + this._minimumBoundaries) / 1000, hires);
- },
-
- /**
- * @return {number}
- */
- maximumBoundary: function()
- {
- return this._maximumBoundaries;
- },
-
- /**
- * @return {number}
- */
- minimumBoundary: function()
- {
- return this._minimumBoundaries;
- },
-
- /**
- * @return {number}
- */
- zeroTime: function()
- {
- return this._minimumBoundaries;
- },
-
- /**
- * @return {number}
- */
- boundarySpan: function()
- {
- return this._maximumBoundaries - this._minimumBoundaries;
- }
-}
-
-WebInspector.FlameChart.Events = {
- EntrySelected: "EntrySelected"
-}
-
-/**
- * @constructor
- */
-WebInspector.FlameChart.ColorGenerator = function()
-{
- this._colorPairs = {};
- this._colorIndexes = [];
- this._currentColorIndex = 0;
- this._colorPairForID("(idle)::0", 50);
- this._colorPairForID("(program)::0", 50);
- this._colorPairForID("(garbage collector)::0", 50);
-}
-
-WebInspector.FlameChart.ColorGenerator.prototype = {
- /**
- * @param {!string} id
- * @param {number=} sat
- */
- _colorPairForID: function(id, sat)
- {
- if (typeof sat !== "number")
- sat = 100;
- var colorPairs = this._colorPairs;
- var colorPair = colorPairs[id];
- if (!colorPair) {
- colorPairs[id] = colorPair = this._createPair(this._currentColorIndex++, sat);
- this._colorIndexes[colorPair.index] = colorPair;
- }
- return colorPair;
- },
-
- /**
- * @param {!number} index
- */
- _colorPairForIndex: function(index)
- {
- return this._colorIndexes[index];
- },
-
- /**
- * @param {!number} index
- * @param {!number} sat
- */
- _createPair: function(index, sat)
- {
- var hue = (index * 7 + 12 * (index % 2)) % 360;
- return {index: index, highlighted: "hsla(" + hue + ", " + sat + "%, 33%, 0.7)", normal: "hsla(" + hue + ", " + sat + "%, 66%, 0.7)"}
- }
-}
-
-/**
- * @interface
- */
-WebInspector.FlameChart.OverviewPaneInterface = function()
-{
-}
-
-WebInspector.FlameChart.OverviewPaneInterface.prototype = {
- /**
- * @param {number} zoom
- * @param {number} referencePoint
- */
- zoom: function(zoom, referencePoint) { },
-
- /**
- * @param {number} windowLeft
- * @param {number} windowRight
- */
- setWindow: function(windowLeft, windowRight) { },
-}
-
-/**
- * @constructor
- * @extends {WebInspector.View}
- * @implements {WebInspector.FlameChart.OverviewPaneInterface}
- * @param {!WebInspector.FlameChartDataProvider} dataProvider
- */
-WebInspector.FlameChart.OverviewPane = function(dataProvider)
-{
- WebInspector.View.call(this);
- this._overviewContainer = this.element.createChild("div", "overview-container");
- this._overviewGrid = new WebInspector.OverviewGrid("flame-chart");
- this._overviewGrid.element.classList.add("fill");
- this._overviewCanvas = this._overviewContainer.createChild("canvas", "flame-chart-overview-canvas");
- this._overviewContainer.appendChild(this._overviewGrid.element);
- this._overviewCalculator = new WebInspector.FlameChart.OverviewCalculator();
- this._dataProvider = dataProvider;
-}
-
-WebInspector.FlameChart.OverviewPane.prototype = {
- /**
- * @param {number} zoom
- * @param {number} referencePoint
- */
- zoom: function(zoom, referencePoint)
- {
- this._overviewGrid.zoom(zoom, referencePoint);
- },
-
- /**
- * @param {number} windowLeft
- * @param {number} windowRight
- */
- setWindow: function(windowLeft, windowRight)
- {
- this._overviewGrid.setWindow(windowLeft, windowRight);
- },
-
- /**
- * @param {!number} timeLeft
- * @param {!number} timeRight
- */
- _selectRange: function(timeLeft, timeRight)
- {
- var timelineData = this._timelineData();
- if (!timelineData)
- return;
- this._overviewGrid.setWindow(timeLeft / timelineData._totalTime, timeRight / timelineData._totalTime);
- },
-
- _timelineData: function()
- {
- return this._dataProvider.timelineData(WebInspector.FlameChart._colorGenerator);
- },
-
- onResize: function()
- {
- this._scheduleUpdate();
- },
-
- _scheduleUpdate: function()
- {
- if (this._updateTimerId)
- return;
- this._updateTimerId = setTimeout(this.update.bind(this), 10);
- },
-
- update: function()
- {
- this._updateTimerId = 0;
- var timelineData = this._timelineData();
- if (!timelineData)
- return;
- this._resetCanvas(this._overviewContainer.clientWidth, this._overviewContainer.clientHeight - 20);
- this._overviewCalculator._updateBoundaries(this);
- this._overviewGrid.updateDividers(this._overviewCalculator);
- WebInspector.FlameChart.OverviewPane.drawOverviewCanvas(
- timelineData,
- this._overviewCanvas.getContext("2d"),
- this._overviewContainer.clientWidth,
- this._overviewContainer.clientHeight - 20
- );
- },
-
- /**
- * @param {!number} width
- * @param {!number} height
- */
- _resetCanvas: function(width, height)
- {
- var ratio = window.devicePixelRatio;
- this._overviewCanvas.width = width * ratio;
- this._overviewCanvas.height = height * ratio;
- },
-
- __proto__: WebInspector.View.prototype
-}
-
-/**
- * @param {!Object} timelineData
- * @param {!number} width
- */
-WebInspector.FlameChart.OverviewPane.calculateDrawData = function(timelineData, width)
-{
- var entryOffsets = timelineData.entryOffsets;
- var entryTotalTimes = timelineData.entryTotalTimes;
- var entryLevels = timelineData.entryLevels;
- var length = entryOffsets.length;
-
- var drawData = new Uint8Array(width);
- var scaleFactor = width / timelineData.totalTime;
-
- for (var entryIndex = 0; entryIndex < length; ++entryIndex) {
- var start = Math.floor(entryOffsets[entryIndex] * scaleFactor);
- var finish = Math.floor((entryOffsets[entryIndex] + entryTotalTimes[entryIndex]) * scaleFactor);
- for (var x = start; x <= finish; ++x)
- drawData[x] = Math.max(drawData[x], entryLevels[entryIndex] + 1);
- }
- return drawData;
-}
-
-/**
- * @param {!Object} timelineData
- * @param {!Object} context
- * @param {!number} width
- * @param {!number} height
- */
-WebInspector.FlameChart.OverviewPane.drawOverviewCanvas = function(timelineData, context, width, height)
-{
- var drawData = WebInspector.FlameChart.OverviewPane.calculateDrawData(timelineData, width);
- if (!drawData)
- return;
-
- var ratio = window.devicePixelRatio;
- var canvasWidth = width * ratio;
- var canvasHeight = height * ratio;
-
- var yScaleFactor = canvasHeight / (timelineData.maxStackDepth * 1.1);
- context.lineWidth = 1;
- context.translate(0.5, 0.5);
- context.strokeStyle = "rgba(20,0,0,0.4)";
- context.fillStyle = "rgba(214,225,254,0.8)";
- context.moveTo(-1, canvasHeight - 1);
- if (drawData)
- context.lineTo(-1, Math.round(height - drawData[0] * yScaleFactor - 1));
- var value;
- for (var x = 0; x < width; ++x) {
- value = Math.round(canvasHeight - drawData[x] * yScaleFactor - 1);
- context.lineTo(x * ratio, value);
- }
- context.lineTo(canvasWidth + 1, value);
- context.lineTo(canvasWidth + 1, canvasHeight - 1);
- context.fill();
- context.stroke();
- context.closePath();
-}
-
-/**
- * @constructor
- * @extends {WebInspector.View}
- * @param {!WebInspector.FlameChartDataProvider} dataProvider
- * @param {!WebInspector.FlameChart.OverviewPaneInterface} overviewPane
- */
-WebInspector.FlameChart.MainPane = function(dataProvider, overviewPane)
-{
- WebInspector.View.call(this);
- this._overviewPane = overviewPane;
- this._chartContainer = this.element.createChild("div", "chart-container");
- this._timelineGrid = new WebInspector.TimelineGrid();
- this._chartContainer.appendChild(this._timelineGrid.element);
- this._calculator = new WebInspector.FlameChart.Calculator();
-
- this._canvas = this._chartContainer.createChild("canvas");
- this._canvas.addEventListener("mousemove", this._onMouseMove.bind(this));
- this._canvas.addEventListener("mousewheel", this._onMouseWheel.bind(this), false);
- this._canvas.addEventListener("click", this._onClick.bind(this), false);
- WebInspector.installDragHandle(this._canvas, this._startCanvasDragging.bind(this), this._canvasDragging.bind(this), this._endCanvasDragging.bind(this), "col-resize");
-
- this._entryInfo = this._chartContainer.createChild("div", "entry-info");
-
- this._dataProvider = dataProvider;
-
- this._windowLeft = 0.0;
- this._windowRight = 1.0;
- this._windowWidth = 1.0;
- this._barHeight = 15;
- this._minWidth = 1;
- this._paddingLeft = 15;
- this._highlightedEntryIndex = -1;
-}
-
-WebInspector.FlameChart.MainPane.prototype = {
- _timelineData: function()
- {
- return this._dataProvider.timelineData(WebInspector.FlameChart._colorGenerator);
- },
-
- /**
- * @param {!number} windowLeft
- * @param {!number} windowRight
- */
- changeWindow: function(windowLeft, windowRight)
- {
- this._windowLeft = windowLeft;
- this._windowRight = windowRight;
- this._windowWidth = this._windowRight - this._windowLeft;
-
- this._scheduleUpdate();
- },
-
- /**
- * @param {!MouseEvent} event
- */
- _startCanvasDragging: function(event)
- {
- if (!this._timelineData())
- return false;
- this._isDragging = true;
- this._wasDragged = false;
- this._dragStartPoint = event.pageX;
- this._dragStartWindowLeft = this._windowLeft;
- this._dragStartWindowRight = this._windowRight;
-
- return true;
- },
-
- /**
- * @param {!MouseEvent} event
- */
- _canvasDragging: function(event)
- {
- var pixelShift = this._dragStartPoint - event.pageX;
- var windowShift = pixelShift / this._totalPixels;
-
- var windowLeft = Math.max(0, this._dragStartWindowLeft + windowShift);
- if (windowLeft === this._windowLeft)
- return;
- windowShift = windowLeft - this._dragStartWindowLeft;
-
- var windowRight = Math.min(1, this._dragStartWindowRight + windowShift);
- if (windowRight === this._windowRight)
- return;
- windowShift = windowRight - this._dragStartWindowRight;
- this._overviewPane.setWindow(this._dragStartWindowLeft + windowShift, this._dragStartWindowRight + windowShift);
- this._wasDragged = true;
- },
-
- _endCanvasDragging: function()
- {
- this._isDragging = false;
- },
-
- /**
- * @param {?MouseEvent} event
- */
- _onMouseMove: function(event)
- {
- if (this._isDragging)
- return;
-
- var entryIndex = this._coordinatesToEntryIndex(event.offsetX, event.offsetY);
-
- if (this._highlightedEntryIndex === entryIndex)
- return;
-
- if (entryIndex === -1 || !this._dataProvider.canJumpToEntry(entryIndex))
- this._canvas.style.cursor = "default";
- else
- this._canvas.style.cursor = "pointer";
-
- this._highlightedEntryIndex = entryIndex;
- this._scheduleUpdate();
- },
-
- _onClick: function()
- {
- // onClick comes after dragStart and dragEnd events.
- // So if there was drag (mouse move) in the middle of that events
- // we skip the click. Otherwise we jump to the sources.
- if (this._wasDragged)
- return;
- if (this._highlightedEntryIndex === -1)
- return;
- var data = this._dataProvider.entryData(this._highlightedEntryIndex);
- this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelected, data);
- },
-
- /**
- * @param {?MouseEvent} e
- */
- _onMouseWheel: function(e)
- {
- if (e.wheelDeltaY) {
- const zoomFactor = 1.1;
- const mouseWheelZoomSpeed = 1 / 120;
-
- var zoom = Math.pow(zoomFactor, -e.wheelDeltaY * mouseWheelZoomSpeed);
- var referencePoint = (this._pixelWindowLeft + e.offsetX - this._paddingLeft) / this._totalPixels;
- this._overviewPane.zoom(zoom, referencePoint);
- } else {
- var shift = Number.constrain(-1 * this._windowWidth / 4 * e.wheelDeltaX / 120, -this._windowLeft, 1 - this._windowRight);
- this._overviewPane.setWindow(this._windowLeft + shift, this._windowRight + shift);
- }
- },
-
- /**
- * @param {!number} x
- * @param {!number} y
- */
- _coordinatesToEntryIndex: function(x, y)
- {
- var timelineData = this._timelineData();
- if (!timelineData)
- return -1;
- var cursorTime = (x + this._pixelWindowLeft - this._paddingLeft) * this._pixelToTime;
- var cursorLevel = Math.floor((this._canvas.height / window.devicePixelRatio - y) / this._barHeight);
-
- var entryOffsets = timelineData.entryOffsets;
- var entryTotalTimes = timelineData.entryTotalTimes;
- var entryLevels = timelineData.entryLevels;
- var length = entryOffsets.length;
- for (var i = 0; i < length; ++i) {
- if (cursorTime < entryOffsets[i])
- return -1;
- if (cursorTime < (entryOffsets[i] + entryTotalTimes[i])
- && cursorLevel === entryLevels[i])
- return i;
- }
- return -1;
- },
-
- /**
- * @param {!number} height
- * @param {!number} width
- */
- draw: function(width, height)
- {
- var timelineData = this._timelineData();
- if (!timelineData)
- return;
-
- var ratio = window.devicePixelRatio;
- this._canvas.width = width * ratio;
- this._canvas.height = height * ratio;
- this._canvas.style.width = width + "px";
- this._canvas.style.height = height + "px";
-
- var context = this._canvas.getContext("2d");
- context.scale(ratio, ratio);
- var timeWindowRight = this._timeWindowRight;
- var timeToPixel = this._timeToPixel;
- var pixelWindowLeft = this._pixelWindowLeft;
- var paddingLeft = this._paddingLeft;
- var minWidth = this._minWidth;
- var entryTotalTimes = timelineData.entryTotalTimes;
- var entryOffsets = timelineData.entryOffsets;
- var entryLevels = timelineData.entryLevels;
- var colorEntryIndexes = timelineData.colorEntryIndexes;
- var entryTitles = timelineData.entryTitles;
- var entryDeoptFlags = timelineData.entryDeoptFlags;
-
- var colorGenerator = WebInspector.FlameChart._colorGenerator;
- var titleIndexes = new Uint32Array(timelineData.entryTotalTimes);
- var lastTitleIndex = 0;
- var dotsWidth = context.measureText("\u2026").width;
- var textPaddingLeft = 2;
- this._minTextWidth = context.measureText("\u2026").width + textPaddingLeft;
- var minTextWidth = this._minTextWidth;
-
- var marksField = [];
- for (var i = 0; i < timelineData.maxStackDepth; ++i)
- marksField.push(new Uint16Array(width));
-
- var barHeight = this._barHeight;
- var barX = 0;
- var barWidth = 0;
- var barRight = 0;
- var barLevel = 0;
- var bHeight = height - barHeight;
- context.strokeStyle = "black";
- var colorPair;
- var entryIndex = 0;
- var entryOffset = 0;
- for (var colorIndex = 0; colorIndex < colorEntryIndexes.length; ++colorIndex) {
- colorPair = colorGenerator._colorPairForIndex(colorIndex);
- context.fillStyle = colorPair.normal;
- var indexes = colorEntryIndexes[colorIndex];
- if (!indexes)
- continue;
- context.beginPath();
- for (var i = 0; i < indexes.length; ++i) {
- entryIndex = indexes[i];
- entryOffset = entryOffsets[entryIndex];
- if (entryOffset > timeWindowRight)
- break;
- barX = Math.ceil(entryOffset * timeToPixel) - pixelWindowLeft + paddingLeft;
- if (barX >= width)
- continue;
- barRight = Math.floor((entryOffset + entryTotalTimes[entryIndex]) * timeToPixel) - pixelWindowLeft + paddingLeft;
- if (barRight < 0)
- continue;
- barWidth = (barRight - barX) || minWidth;
- barLevel = entryLevels[entryIndex];
- var marksRow = marksField[barLevel];
- if (barWidth <= marksRow[barX])
- continue;
- marksRow[barX] = barWidth;
- if (entryIndex === this._highlightedEntryIndex) {
- context.fill();
- context.beginPath();
- context.fillStyle = colorPair.highlighted;
- }
- context.rect(barX, bHeight - barLevel * barHeight, barWidth, barHeight);
- if (entryIndex === this._highlightedEntryIndex) {
- context.fill();
- context.beginPath();
- context.fillStyle = colorPair.normal;
- }
- if (barWidth > minTextWidth)
- titleIndexes[lastTitleIndex++] = entryIndex;
- }
- context.fill();
- }
-
- var font = (barHeight - 4) + "px " + window.getComputedStyle(this.element, null).getPropertyValue("font-family");
- var boldFont = "bold " + font;
- var isBoldFontSelected = false;
- context.font = font;
- context.textBaseline = "alphabetic";
- context.fillStyle = "#333";
- this._dotsWidth = context.measureText("\u2026").width;
-
- var textBaseHeight = bHeight + barHeight - 4;
- for (var i = 0; i < lastTitleIndex; ++i) {
- entryIndex = titleIndexes[i];
- if (isBoldFontSelected) {
- if (!entryDeoptFlags[entryIndex]) {
- context.font = font;
- isBoldFontSelected = false;
- }
- } else {
- if (entryDeoptFlags[entryIndex]) {
- context.font = boldFont;
- isBoldFontSelected = true;
- }
- }
-
- entryOffset = entryOffsets[entryIndex];
- barX = Math.floor(entryOffset * timeToPixel) - pixelWindowLeft + paddingLeft;
- barRight = Math.ceil((entryOffset + entryTotalTimes[entryIndex]) * timeToPixel) - pixelWindowLeft + paddingLeft;
- barWidth = (barRight - barX) || minWidth;
- var xText = Math.max(0, barX);
- var widthText = barWidth - textPaddingLeft + barX - xText;
- var title = this._prepareText(context, entryTitles[entryIndex], widthText);
- if (title)
- context.fillText(title, xText + textPaddingLeft, textBaseHeight - entryLevels[entryIndex] * barHeight);
- }
-
- this._entryInfo.removeChildren();
- if (!this._isDragging) {
- var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(this._highlightedEntryIndex);
- if (entryInfo)
- this._entryInfo.appendChild(this._buildEntryInfo(entryInfo));
- }
- },
-
- _buildEntryInfo: function(entryInfo)
- {
- var infoTable = document.createElement("table");
- infoTable.className = "info-table";
- for (var i = 0; i < entryInfo.length; ++i) {
- var row = infoTable.createChild("tr");
- var titleCell = row.createChild("td");
- titleCell.textContent = entryInfo[i].title;
- titleCell.className = "title";
- var textCell = row.createChild("td");
- textCell.textContent = entryInfo[i].text;
- }
- return infoTable;
- },
-
- _prepareText: function(context, title, maxSize)
- {
- if (maxSize < this._dotsWidth)
- return null;
- var titleWidth = context.measureText(title).width;
- if (maxSize > titleWidth)
- return title;
- maxSize -= this._dotsWidth;
- var dotRegExp=/[\.\$]/g;
- var match = dotRegExp.exec(title);
- if (!match) {
- var visiblePartSize = maxSize / titleWidth;
- var newTextLength = Math.floor(title.length * visiblePartSize) + 1;
- var minTextLength = 4;
- if (newTextLength < minTextLength)
- return null;
- var substring;
- do {
- --newTextLength;
- substring = title.substring(0, newTextLength);
- } while (context.measureText(substring).width > maxSize);
- return title.substring(0, newTextLength) + "\u2026";
- }
- while (match) {
- var substring = title.substring(match.index + 1);
- var width = context.measureText(substring).width;
- if (maxSize > width)
- return "\u2026" + substring;
- match = dotRegExp.exec(title);
- }
- var i = 0;
- do {
- ++i;
- } while (context.measureText(title.substring(0, i)).width < maxSize);
- return title.substring(0, i - 1) + "\u2026";
- },
-
- _updateBoundaries: function()
- {
- this._totalTime = this._timelineData().totalTime;
- this._timeWindowLeft = this._windowLeft * this._totalTime;
- this._timeWindowRight = this._windowRight * this._totalTime;
-
- this._pixelWindowWidth = this._chartContainer.clientWidth - this._paddingLeft;
- this._totalPixels = Math.floor(this._pixelWindowWidth / this._windowWidth);
- this._pixelWindowLeft = Math.floor(this._totalPixels * this._windowLeft);
- this._pixelWindowRight = Math.floor(this._totalPixels * this._windowRight);
-
- this._timeToPixel = this._totalPixels / this._totalTime;
- this._pixelToTime = this._totalTime / this._totalPixels;
- this._paddingLeftTime = this._paddingLeft / this._timeToPixel;
- },
-
- onResize: function()
- {
- this._scheduleUpdate();
- },
-
- _scheduleUpdate: function()
- {
- if (this._updateTimerId)
- return;
- this._updateTimerId = setTimeout(this.update.bind(this), 10);
- },
-
- update: function()
- {
- this._updateTimerId = 0;
- if (!this._timelineData())
- return;
- this._updateBoundaries();
- this.draw(this._chartContainer.clientWidth, this._chartContainer.clientHeight);
- this._calculator._updateBoundaries(this);
- this._timelineGrid.element.style.width = this.element.clientWidth;
- this._timelineGrid.updateDividers(this._calculator);
- },
-
- __proto__: WebInspector.View.prototype
-}