| Index: third_party/WebKit/Source/devtools/front_end/layer_viewer/PaintProfilerView.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/layer_viewer/PaintProfilerView.js b/third_party/WebKit/Source/devtools/front_end/layer_viewer/PaintProfilerView.js
|
| index 016fcf82b8e4eba8ef4eba0fdd64c2c91fc6e7fa..62ee2ed9d7724e5b0755e78e2474a4dcf5f556fb 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/layer_viewer/PaintProfilerView.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/layer_viewer/PaintProfilerView.js
|
| @@ -27,28 +27,28 @@
|
| * (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
|
| - * @param {function(string=)} showImageCallback
|
| - * @extends {WebInspector.HBox}
|
| + * @unrestricted
|
| */
|
| -WebInspector.PaintProfilerView = function(showImageCallback)
|
| -{
|
| - WebInspector.HBox.call(this, true);
|
| - this.registerRequiredCSS("layer_viewer/paintProfiler.css");
|
| - this.contentElement.classList.add("paint-profiler-overview");
|
| - this._canvasContainer = this.contentElement.createChild("div", "paint-profiler-canvas-container");
|
| - this._progressBanner = this.contentElement.createChild("div", "full-widget-dimmed-banner hidden");
|
| - this._progressBanner.textContent = WebInspector.UIString("Profiling\u2026");
|
| +WebInspector.PaintProfilerView = class extends WebInspector.HBox {
|
| + /**
|
| + * @param {function(string=)} showImageCallback
|
| + */
|
| + constructor(showImageCallback) {
|
| + super(true);
|
| + this.registerRequiredCSS('layer_viewer/paintProfiler.css');
|
| + this.contentElement.classList.add('paint-profiler-overview');
|
| + this._canvasContainer = this.contentElement.createChild('div', 'paint-profiler-canvas-container');
|
| + this._progressBanner = this.contentElement.createChild('div', 'full-widget-dimmed-banner hidden');
|
| + this._progressBanner.textContent = WebInspector.UIString('Profiling\u2026');
|
| this._pieChart = new WebInspector.PieChart(55, this._formatPieChartTime.bind(this), true);
|
| - this._pieChart.element.classList.add("paint-profiler-pie-chart");
|
| + this._pieChart.element.classList.add('paint-profiler-pie-chart');
|
| this.contentElement.appendChild(this._pieChart.element);
|
|
|
| this._showImageCallback = showImageCallback;
|
|
|
| - this._canvas = this._canvasContainer.createChild("canvas", "fill");
|
| - this._context = this._canvas.getContext("2d");
|
| + this._canvas = this._canvasContainer.createChild('canvas', 'fill');
|
| + this._context = this._canvas.getContext('2d');
|
| this._selectionWindow = new WebInspector.OverviewGrid.Window(this._canvasContainer);
|
| this._selectionWindow.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged, this._onWindowChanged, this);
|
|
|
| @@ -60,525 +60,507 @@ WebInspector.PaintProfilerView = function(showImageCallback)
|
| this._scale = this._pendingScale;
|
|
|
| this._reset();
|
| -};
|
| + }
|
|
|
| -/** @enum {symbol} */
|
| -WebInspector.PaintProfilerView.Events = {
|
| - WindowChanged: Symbol("WindowChanged")
|
| -};
|
| + /**
|
| + * @return {!Object.<string, !WebInspector.PaintProfilerCategory>}
|
| + */
|
| + static categories() {
|
| + if (WebInspector.PaintProfilerView._categories)
|
| + return WebInspector.PaintProfilerView._categories;
|
| + WebInspector.PaintProfilerView._categories = {
|
| + shapes: new WebInspector.PaintProfilerCategory('shapes', WebInspector.UIString('Shapes'), 'rgb(255, 161, 129)'),
|
| + bitmap: new WebInspector.PaintProfilerCategory('bitmap', WebInspector.UIString('Bitmap'), 'rgb(136, 196, 255)'),
|
| + text: new WebInspector.PaintProfilerCategory('text', WebInspector.UIString('Text'), 'rgb(180, 255, 137)'),
|
| + misc: new WebInspector.PaintProfilerCategory('misc', WebInspector.UIString('Misc'), 'rgb(206, 160, 255)')
|
| + };
|
| + return WebInspector.PaintProfilerView._categories;
|
| + }
|
|
|
| -WebInspector.PaintProfilerView.prototype = {
|
| - onResize: function()
|
| - {
|
| - this._update();
|
| - },
|
| + /**
|
| + * @return {!Object.<string, !WebInspector.PaintProfilerCategory>}
|
| + */
|
| + static _initLogItemCategories() {
|
| + if (WebInspector.PaintProfilerView._logItemCategoriesMap)
|
| + return WebInspector.PaintProfilerView._logItemCategoriesMap;
|
|
|
| - /**
|
| - * @param {?WebInspector.PaintProfilerSnapshot} snapshot
|
| - * @param {!Array.<!WebInspector.PaintProfilerLogItem>} log
|
| - * @param {?DOMAgent.Rect} clipRect
|
| - */
|
| - setSnapshotAndLog: function(snapshot, log, clipRect)
|
| - {
|
| - this._reset();
|
| - this._snapshot = snapshot;
|
| - if (this._snapshot)
|
| - this._snapshot.addReference();
|
| - this._log = log;
|
| - this._logCategories = this._log.map(WebInspector.PaintProfilerView._categoryForLogItem);
|
| -
|
| - if (!this._snapshot) {
|
| - this._update();
|
| - this._pieChart.setTotal(0);
|
| - this._selectionWindow.setEnabled(false);
|
| - return;
|
| - }
|
| - this._selectionWindow.setEnabled(true);
|
| - this._progressBanner.classList.remove("hidden");
|
| - this._updateImage();
|
| - snapshot.profile(clipRect, onProfileDone.bind(this));
|
| - /**
|
| - * @param {!Array.<!LayerTreeAgent.PaintProfile>=} profiles
|
| - * @this {WebInspector.PaintProfilerView}
|
| - */
|
| - function onProfileDone(profiles)
|
| - {
|
| - this._progressBanner.classList.add("hidden");
|
| - this._profiles = profiles;
|
| - this._update();
|
| - this._updatePieChart();
|
| - }
|
| - },
|
| + var categories = WebInspector.PaintProfilerView.categories();
|
|
|
| - /**
|
| - * @param {number} scale
|
| - */
|
| - setScale: function(scale)
|
| - {
|
| - var needsUpdate = scale > this._scale;
|
| - var predictiveGrowthFactor = 2;
|
| - this._pendingScale = Math.min(1, scale * predictiveGrowthFactor);
|
| - if (needsUpdate && this._snapshot)
|
| - this._updateImage();
|
| - },
|
| -
|
| - _update: function()
|
| - {
|
| - this._canvas.width = this._canvasContainer.clientWidth * window.devicePixelRatio;
|
| - this._canvas.height = this._canvasContainer.clientHeight * window.devicePixelRatio;
|
| - this._samplesPerBar = 0;
|
| - if (!this._profiles || !this._profiles.length)
|
| - return;
|
| -
|
| - var maxBars = Math.floor((this._canvas.width - 2 * this._barPaddingWidth) / this._outerBarWidth);
|
| - var sampleCount = this._log.length;
|
| - this._samplesPerBar = Math.ceil(sampleCount / maxBars);
|
| -
|
| - var maxBarTime = 0;
|
| - var barTimes = [];
|
| - var barHeightByCategory = [];
|
| - var heightByCategory = {};
|
| - for (var i = 0, lastBarIndex = 0, lastBarTime = 0; i < sampleCount;) {
|
| - var categoryName = (this._logCategories[i] && this._logCategories[i].name) || "misc";
|
| - var sampleIndex = this._log[i].commandIndex;
|
| - for (var row = 0; row < this._profiles.length; row++) {
|
| - var sample = this._profiles[row][sampleIndex];
|
| - lastBarTime += sample;
|
| - heightByCategory[categoryName] = (heightByCategory[categoryName] || 0) + sample;
|
| - }
|
| - ++i;
|
| - if (i - lastBarIndex === this._samplesPerBar || i === sampleCount) {
|
| - // Normalize by total number of samples accumulated.
|
| - var factor = this._profiles.length * (i - lastBarIndex);
|
| - lastBarTime /= factor;
|
| - for (categoryName in heightByCategory)
|
| - heightByCategory[categoryName] /= factor;
|
| -
|
| - barTimes.push(lastBarTime);
|
| - barHeightByCategory.push(heightByCategory);
|
| -
|
| - if (lastBarTime > maxBarTime)
|
| - maxBarTime = lastBarTime;
|
| - lastBarTime = 0;
|
| - heightByCategory = {};
|
| - lastBarIndex = i;
|
| - }
|
| - }
|
| -
|
| - const paddingHeight = 4 * window.devicePixelRatio;
|
| - var scale = (this._canvas.height - paddingHeight - this._minBarHeight) / maxBarTime;
|
| - for (var i = 0; i < barTimes.length; ++i) {
|
| - for (var categoryName in barHeightByCategory[i])
|
| - barHeightByCategory[i][categoryName] *= (barTimes[i] * scale + this._minBarHeight) / barTimes[i];
|
| - this._renderBar(i, barHeightByCategory[i]);
|
| - }
|
| - },
|
| + var logItemCategories = {};
|
| + logItemCategories['Clear'] = categories['misc'];
|
| + logItemCategories['DrawPaint'] = categories['misc'];
|
| + logItemCategories['DrawData'] = categories['misc'];
|
| + logItemCategories['SetMatrix'] = categories['misc'];
|
| + logItemCategories['PushCull'] = categories['misc'];
|
| + logItemCategories['PopCull'] = categories['misc'];
|
| + logItemCategories['Translate'] = categories['misc'];
|
| + logItemCategories['Scale'] = categories['misc'];
|
| + logItemCategories['Concat'] = categories['misc'];
|
| + logItemCategories['Restore'] = categories['misc'];
|
| + logItemCategories['SaveLayer'] = categories['misc'];
|
| + logItemCategories['Save'] = categories['misc'];
|
| + logItemCategories['BeginCommentGroup'] = categories['misc'];
|
| + logItemCategories['AddComment'] = categories['misc'];
|
| + logItemCategories['EndCommentGroup'] = categories['misc'];
|
| + logItemCategories['ClipRect'] = categories['misc'];
|
| + logItemCategories['ClipRRect'] = categories['misc'];
|
| + logItemCategories['ClipPath'] = categories['misc'];
|
| + logItemCategories['ClipRegion'] = categories['misc'];
|
| + logItemCategories['DrawPoints'] = categories['shapes'];
|
| + logItemCategories['DrawRect'] = categories['shapes'];
|
| + logItemCategories['DrawOval'] = categories['shapes'];
|
| + logItemCategories['DrawRRect'] = categories['shapes'];
|
| + logItemCategories['DrawPath'] = categories['shapes'];
|
| + logItemCategories['DrawVertices'] = categories['shapes'];
|
| + logItemCategories['DrawDRRect'] = categories['shapes'];
|
| + logItemCategories['DrawBitmap'] = categories['bitmap'];
|
| + logItemCategories['DrawBitmapRectToRect'] = categories['bitmap'];
|
| + logItemCategories['DrawBitmapMatrix'] = categories['bitmap'];
|
| + logItemCategories['DrawBitmapNine'] = categories['bitmap'];
|
| + logItemCategories['DrawSprite'] = categories['bitmap'];
|
| + logItemCategories['DrawPicture'] = categories['bitmap'];
|
| + logItemCategories['DrawText'] = categories['text'];
|
| + logItemCategories['DrawPosText'] = categories['text'];
|
| + logItemCategories['DrawPosTextH'] = categories['text'];
|
| + logItemCategories['DrawTextOnPath'] = categories['text'];
|
|
|
| - /**
|
| - * @param {number} index
|
| - * @param {!Object.<string, number>} heightByCategory
|
| - */
|
| - _renderBar: function(index, heightByCategory)
|
| - {
|
| - var categories = WebInspector.PaintProfilerView.categories();
|
| - var currentHeight = 0;
|
| - var x = this._barPaddingWidth + index * this._outerBarWidth;
|
| - for (var categoryName in categories) {
|
| - if (!heightByCategory[categoryName])
|
| - continue;
|
| - currentHeight += heightByCategory[categoryName];
|
| - var y = this._canvas.height - currentHeight;
|
| - this._context.fillStyle = categories[categoryName].color;
|
| - this._context.fillRect(x, y, this._innerBarWidth, heightByCategory[categoryName]);
|
| - }
|
| - },
|
| -
|
| - _onWindowChanged: function()
|
| - {
|
| - this.dispatchEventToListeners(WebInspector.PaintProfilerView.Events.WindowChanged);
|
| - this._updatePieChart();
|
| - if (this._updateImageTimer)
|
| - return;
|
| - this._updateImageTimer = setTimeout(this._updateImage.bind(this), 100);
|
| - },
|
| -
|
| - _updatePieChart: function()
|
| - {
|
| - var window = this.selectionWindow();
|
| - if (!this._profiles || !this._profiles.length || !window)
|
| - return;
|
| - var totalTime = 0;
|
| - var timeByCategory = {};
|
| - for (var i = window.left; i < window.right; ++i) {
|
| - var logEntry = this._log[i];
|
| - var category = WebInspector.PaintProfilerView._categoryForLogItem(logEntry);
|
| - timeByCategory[category.color] = timeByCategory[category.color] || 0;
|
| - for (var j = 0; j < this._profiles.length; ++j) {
|
| - var time = this._profiles[j][logEntry.commandIndex];
|
| - totalTime += time;
|
| - timeByCategory[category.color] += time;
|
| - }
|
| - }
|
| - this._pieChart.setTotal(totalTime / this._profiles.length);
|
| - for (var color in timeByCategory)
|
| - this._pieChart.addSlice(timeByCategory[color] / this._profiles.length, color);
|
| - },
|
| + WebInspector.PaintProfilerView._logItemCategoriesMap = logItemCategories;
|
| + return logItemCategories;
|
| + }
|
|
|
| - /**
|
| - * @param {number} value
|
| - * @return {string}
|
| - */
|
| - _formatPieChartTime: function(value)
|
| - {
|
| - return Number.millisToString(value * 1000, true);
|
| - },
|
| + /**
|
| + * @param {!Object} logItem
|
| + * @return {!WebInspector.PaintProfilerCategory}
|
| + */
|
| + static _categoryForLogItem(logItem) {
|
| + var method = logItem.method.toTitleCase();
|
|
|
| + var logItemCategories = WebInspector.PaintProfilerView._initLogItemCategories();
|
| + var result = logItemCategories[method];
|
| + if (!result) {
|
| + result = WebInspector.PaintProfilerView.categories()['misc'];
|
| + logItemCategories[method] = result;
|
| + }
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onResize() {
|
| + this._update();
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.PaintProfilerSnapshot} snapshot
|
| + * @param {!Array.<!WebInspector.PaintProfilerLogItem>} log
|
| + * @param {?DOMAgent.Rect} clipRect
|
| + */
|
| + setSnapshotAndLog(snapshot, log, clipRect) {
|
| + this._reset();
|
| + this._snapshot = snapshot;
|
| + if (this._snapshot)
|
| + this._snapshot.addReference();
|
| + this._log = log;
|
| + this._logCategories = this._log.map(WebInspector.PaintProfilerView._categoryForLogItem);
|
| +
|
| + if (!this._snapshot) {
|
| + this._update();
|
| + this._pieChart.setTotal(0);
|
| + this._selectionWindow.setEnabled(false);
|
| + return;
|
| + }
|
| + this._selectionWindow.setEnabled(true);
|
| + this._progressBanner.classList.remove('hidden');
|
| + this._updateImage();
|
| + snapshot.profile(clipRect, onProfileDone.bind(this));
|
| /**
|
| - * @return {?{left: number, right: number}}
|
| + * @param {!Array.<!LayerTreeAgent.PaintProfile>=} profiles
|
| + * @this {WebInspector.PaintProfilerView}
|
| */
|
| - selectionWindow: function()
|
| - {
|
| - if (!this._log)
|
| - return null;
|
| -
|
| - var screenLeft = this._selectionWindow.windowLeft * this._canvas.width;
|
| - var screenRight = this._selectionWindow.windowRight * this._canvas.width;
|
| - var barLeft = Math.floor(screenLeft / this._outerBarWidth);
|
| - var barRight = Math.floor((screenRight + this._innerBarWidth - this._barPaddingWidth / 2) / this._outerBarWidth);
|
| - var stepLeft = Number.constrain(barLeft * this._samplesPerBar, 0, this._log.length - 1);
|
| - var stepRight = Number.constrain(barRight * this._samplesPerBar, 0, this._log.length);
|
| -
|
| - return { left: stepLeft, right: stepRight };
|
| - },
|
| -
|
| - _updateImage: function()
|
| - {
|
| - delete this._updateImageTimer;
|
| - var left = null;
|
| - var right = null;
|
| - var window = this.selectionWindow();
|
| - if (this._profiles && this._profiles.length && window) {
|
| - left = this._log[window.left].commandIndex;
|
| - right = this._log[window.right - 1].commandIndex;
|
| - }
|
| - var scale = this._pendingScale;
|
| - this._snapshot.replay(left, right, scale).then(image => {
|
| - if (!image)
|
| - return;
|
| - this._scale = scale;
|
| - this._showImageCallback(image);
|
| - });
|
| - },
|
| -
|
| - _reset: function()
|
| - {
|
| - if (this._snapshot)
|
| - this._snapshot.release();
|
| - this._snapshot = null;
|
| - this._profiles = null;
|
| - this._selectionWindow.reset();
|
| - this._selectionWindow.setEnabled(false);
|
| - },
|
| -
|
| - __proto__: WebInspector.HBox.prototype
|
| + function onProfileDone(profiles) {
|
| + this._progressBanner.classList.add('hidden');
|
| + this._profiles = profiles;
|
| + this._update();
|
| + this._updatePieChart();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {number} scale
|
| + */
|
| + setScale(scale) {
|
| + var needsUpdate = scale > this._scale;
|
| + var predictiveGrowthFactor = 2;
|
| + this._pendingScale = Math.min(1, scale * predictiveGrowthFactor);
|
| + if (needsUpdate && this._snapshot)
|
| + this._updateImage();
|
| + }
|
| +
|
| + _update() {
|
| + this._canvas.width = this._canvasContainer.clientWidth * window.devicePixelRatio;
|
| + this._canvas.height = this._canvasContainer.clientHeight * window.devicePixelRatio;
|
| + this._samplesPerBar = 0;
|
| + if (!this._profiles || !this._profiles.length)
|
| + return;
|
| +
|
| + var maxBars = Math.floor((this._canvas.width - 2 * this._barPaddingWidth) / this._outerBarWidth);
|
| + var sampleCount = this._log.length;
|
| + this._samplesPerBar = Math.ceil(sampleCount / maxBars);
|
| +
|
| + var maxBarTime = 0;
|
| + var barTimes = [];
|
| + var barHeightByCategory = [];
|
| + var heightByCategory = {};
|
| + for (var i = 0, lastBarIndex = 0, lastBarTime = 0; i < sampleCount;) {
|
| + var categoryName = (this._logCategories[i] && this._logCategories[i].name) || 'misc';
|
| + var sampleIndex = this._log[i].commandIndex;
|
| + for (var row = 0; row < this._profiles.length; row++) {
|
| + var sample = this._profiles[row][sampleIndex];
|
| + lastBarTime += sample;
|
| + heightByCategory[categoryName] = (heightByCategory[categoryName] || 0) + sample;
|
| + }
|
| + ++i;
|
| + if (i - lastBarIndex === this._samplesPerBar || i === sampleCount) {
|
| + // Normalize by total number of samples accumulated.
|
| + var factor = this._profiles.length * (i - lastBarIndex);
|
| + lastBarTime /= factor;
|
| + for (categoryName in heightByCategory)
|
| + heightByCategory[categoryName] /= factor;
|
| +
|
| + barTimes.push(lastBarTime);
|
| + barHeightByCategory.push(heightByCategory);
|
| +
|
| + if (lastBarTime > maxBarTime)
|
| + maxBarTime = lastBarTime;
|
| + lastBarTime = 0;
|
| + heightByCategory = {};
|
| + lastBarIndex = i;
|
| + }
|
| + }
|
| +
|
| + const paddingHeight = 4 * window.devicePixelRatio;
|
| + var scale = (this._canvas.height - paddingHeight - this._minBarHeight) / maxBarTime;
|
| + for (var i = 0; i < barTimes.length; ++i) {
|
| + for (var categoryName in barHeightByCategory[i])
|
| + barHeightByCategory[i][categoryName] *= (barTimes[i] * scale + this._minBarHeight) / barTimes[i];
|
| + this._renderBar(i, barHeightByCategory[i]);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {number} index
|
| + * @param {!Object.<string, number>} heightByCategory
|
| + */
|
| + _renderBar(index, heightByCategory) {
|
| + var categories = WebInspector.PaintProfilerView.categories();
|
| + var currentHeight = 0;
|
| + var x = this._barPaddingWidth + index * this._outerBarWidth;
|
| + for (var categoryName in categories) {
|
| + if (!heightByCategory[categoryName])
|
| + continue;
|
| + currentHeight += heightByCategory[categoryName];
|
| + var y = this._canvas.height - currentHeight;
|
| + this._context.fillStyle = categories[categoryName].color;
|
| + this._context.fillRect(x, y, this._innerBarWidth, heightByCategory[categoryName]);
|
| + }
|
| + }
|
| +
|
| + _onWindowChanged() {
|
| + this.dispatchEventToListeners(WebInspector.PaintProfilerView.Events.WindowChanged);
|
| + this._updatePieChart();
|
| + if (this._updateImageTimer)
|
| + return;
|
| + this._updateImageTimer = setTimeout(this._updateImage.bind(this), 100);
|
| + }
|
| +
|
| + _updatePieChart() {
|
| + var window = this.selectionWindow();
|
| + if (!this._profiles || !this._profiles.length || !window)
|
| + return;
|
| + var totalTime = 0;
|
| + var timeByCategory = {};
|
| + for (var i = window.left; i < window.right; ++i) {
|
| + var logEntry = this._log[i];
|
| + var category = WebInspector.PaintProfilerView._categoryForLogItem(logEntry);
|
| + timeByCategory[category.color] = timeByCategory[category.color] || 0;
|
| + for (var j = 0; j < this._profiles.length; ++j) {
|
| + var time = this._profiles[j][logEntry.commandIndex];
|
| + totalTime += time;
|
| + timeByCategory[category.color] += time;
|
| + }
|
| + }
|
| + this._pieChart.setTotal(totalTime / this._profiles.length);
|
| + for (var color in timeByCategory)
|
| + this._pieChart.addSlice(timeByCategory[color] / this._profiles.length, color);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} value
|
| + * @return {string}
|
| + */
|
| + _formatPieChartTime(value) {
|
| + return Number.millisToString(value * 1000, true);
|
| + }
|
| +
|
| + /**
|
| + * @return {?{left: number, right: number}}
|
| + */
|
| + selectionWindow() {
|
| + if (!this._log)
|
| + return null;
|
| +
|
| + var screenLeft = this._selectionWindow.windowLeft * this._canvas.width;
|
| + var screenRight = this._selectionWindow.windowRight * this._canvas.width;
|
| + var barLeft = Math.floor(screenLeft / this._outerBarWidth);
|
| + var barRight = Math.floor((screenRight + this._innerBarWidth - this._barPaddingWidth / 2) / this._outerBarWidth);
|
| + var stepLeft = Number.constrain(barLeft * this._samplesPerBar, 0, this._log.length - 1);
|
| + var stepRight = Number.constrain(barRight * this._samplesPerBar, 0, this._log.length);
|
| +
|
| + return {left: stepLeft, right: stepRight};
|
| + }
|
| +
|
| + _updateImage() {
|
| + delete this._updateImageTimer;
|
| + var left = null;
|
| + var right = null;
|
| + var window = this.selectionWindow();
|
| + if (this._profiles && this._profiles.length && window) {
|
| + left = this._log[window.left].commandIndex;
|
| + right = this._log[window.right - 1].commandIndex;
|
| + }
|
| + var scale = this._pendingScale;
|
| + this._snapshot.replay(left, right, scale).then(image => {
|
| + if (!image)
|
| + return;
|
| + this._scale = scale;
|
| + this._showImageCallback(image);
|
| + });
|
| + }
|
| +
|
| + _reset() {
|
| + if (this._snapshot)
|
| + this._snapshot.release();
|
| + this._snapshot = null;
|
| + this._profiles = null;
|
| + this._selectionWindow.reset();
|
| + this._selectionWindow.setEnabled(false);
|
| + }
|
| +};
|
| +
|
| +/** @enum {symbol} */
|
| +WebInspector.PaintProfilerView.Events = {
|
| + WindowChanged: Symbol('WindowChanged')
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.ThrottledWidget}
|
| + * @unrestricted
|
| */
|
| -WebInspector.PaintProfilerCommandLogView = function()
|
| -{
|
| - WebInspector.ThrottledWidget.call(this);
|
| +WebInspector.PaintProfilerCommandLogView = class extends WebInspector.ThrottledWidget {
|
| + constructor() {
|
| + super();
|
| this.setMinimumSize(100, 25);
|
| - this.element.classList.add("overflow-auto");
|
| + this.element.classList.add('overflow-auto');
|
|
|
| this._treeOutline = new TreeOutlineInShadow();
|
| this.element.appendChild(this._treeOutline.element);
|
|
|
| this._log = [];
|
| -};
|
| -
|
| -WebInspector.PaintProfilerCommandLogView.prototype = {
|
| - /**
|
| - * @param {?WebInspector.Target} target
|
| - * @param {!Array.<!WebInspector.PaintProfilerLogItem>} log
|
| - */
|
| - setCommandLog: function(target, log)
|
| - {
|
| - this._target = target;
|
| - this._log = log;
|
| - /** @type {!Map<!WebInspector.PaintProfilerLogItem>} */
|
| - this._treeItemCache = new Map();
|
| - this.updateWindow({left: 0, right: this._log.length});
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.PaintProfilerLogItem} logItem
|
| - */
|
| - _appendLogItem: function(logItem)
|
| - {
|
| - var treeElement = this._treeItemCache.get(logItem);
|
| - if (!treeElement) {
|
| - treeElement = new WebInspector.LogTreeElement(this, logItem);
|
| - this._treeItemCache.set(logItem, treeElement);
|
| - } else if (treeElement.parent) {
|
| - return;
|
| - }
|
| - this._treeOutline.appendChild(treeElement);
|
| - },
|
| -
|
| - /**
|
| - * @param {?{left: number, right: number}} selectionWindow
|
| - */
|
| - updateWindow: function(selectionWindow)
|
| - {
|
| - this._selectionWindow = selectionWindow;
|
| - this.update();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise<*>}
|
| - */
|
| - doUpdate: function()
|
| - {
|
| - if (!this._selectionWindow || !this._log.length) {
|
| - this._treeOutline.removeChildren();
|
| - return Promise.resolve();
|
| - }
|
| - var root = this._treeOutline.rootElement();
|
| - for (;;) {
|
| - var child = root.firstChild();
|
| - if (!child || child._logItem.commandIndex >= this._selectionWindow.left)
|
| - break;
|
| - root.removeChildAtIndex(0);
|
| - }
|
| - for (;;) {
|
| - var child = root.lastChild();
|
| - if (!child || child._logItem.commandIndex < this._selectionWindow.right)
|
| - break;
|
| - root.removeChildAtIndex(root.children().length - 1);
|
| - }
|
| - for (var i = this._selectionWindow.left, right = this._selectionWindow.right; i < right; ++i)
|
| - this._appendLogItem(this._log[i]);
|
| - return Promise.resolve();
|
| - },
|
| -
|
| - __proto__: WebInspector.ThrottledWidget.prototype
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.Target} target
|
| + * @param {!Array.<!WebInspector.PaintProfilerLogItem>} log
|
| + */
|
| + setCommandLog(target, log) {
|
| + this._target = target;
|
| + this._log = log;
|
| + /** @type {!Map<!WebInspector.PaintProfilerLogItem>} */
|
| + this._treeItemCache = new Map();
|
| + this.updateWindow({left: 0, right: this._log.length});
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.PaintProfilerLogItem} logItem
|
| + */
|
| + _appendLogItem(logItem) {
|
| + var treeElement = this._treeItemCache.get(logItem);
|
| + if (!treeElement) {
|
| + treeElement = new WebInspector.LogTreeElement(this, logItem);
|
| + this._treeItemCache.set(logItem, treeElement);
|
| + } else if (treeElement.parent) {
|
| + return;
|
| + }
|
| + this._treeOutline.appendChild(treeElement);
|
| + }
|
| +
|
| + /**
|
| + * @param {?{left: number, right: number}} selectionWindow
|
| + */
|
| + updateWindow(selectionWindow) {
|
| + this._selectionWindow = selectionWindow;
|
| + this.update();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise<*>}
|
| + */
|
| + doUpdate() {
|
| + if (!this._selectionWindow || !this._log.length) {
|
| + this._treeOutline.removeChildren();
|
| + return Promise.resolve();
|
| + }
|
| + var root = this._treeOutline.rootElement();
|
| + for (;;) {
|
| + var child = root.firstChild();
|
| + if (!child || child._logItem.commandIndex >= this._selectionWindow.left)
|
| + break;
|
| + root.removeChildAtIndex(0);
|
| + }
|
| + for (;;) {
|
| + var child = root.lastChild();
|
| + if (!child || child._logItem.commandIndex < this._selectionWindow.right)
|
| + break;
|
| + root.removeChildAtIndex(root.children().length - 1);
|
| + }
|
| + for (var i = this._selectionWindow.left, right = this._selectionWindow.right; i < right; ++i)
|
| + this._appendLogItem(this._log[i]);
|
| + return Promise.resolve();
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.PaintProfilerCommandLogView} ownerView
|
| - * @param {!WebInspector.PaintProfilerLogItem} logItem
|
| - * @extends {TreeElement}
|
| - */
|
| -WebInspector.LogTreeElement = function(ownerView, logItem)
|
| -{
|
| - TreeElement.call(this, "", !!logItem.params);
|
| + * @unrestricted
|
| + */
|
| +WebInspector.LogTreeElement = class extends TreeElement {
|
| + /**
|
| + * @param {!WebInspector.PaintProfilerCommandLogView} ownerView
|
| + * @param {!WebInspector.PaintProfilerLogItem} logItem
|
| + */
|
| + constructor(ownerView, logItem) {
|
| + super('', !!logItem.params);
|
| this._logItem = logItem;
|
| this._ownerView = ownerView;
|
| this._filled = false;
|
| -};
|
| -
|
| -WebInspector.LogTreeElement.prototype = {
|
| - onattach: function()
|
| - {
|
| - this._update();
|
| - },
|
| -
|
| - onpopulate: function()
|
| - {
|
| - for (var param in this._logItem.params)
|
| - WebInspector.LogPropertyTreeElement._appendLogPropertyItem(this, param, this._logItem.params[param]);
|
| - },
|
| -
|
| - /**
|
| - * @param {*} param
|
| - * @param {string} name
|
| - * @return {string}
|
| - */
|
| - _paramToString: function(param, name)
|
| - {
|
| - if (typeof param !== "object")
|
| - return typeof param === "string" && param.length > 100 ? name : JSON.stringify(param);
|
| - var str = "";
|
| - var keyCount = 0;
|
| - for (var key in param) {
|
| - if (++keyCount > 4 || typeof param[key] === "object" || (typeof param[key] === "string" && param[key].length > 100))
|
| - return name;
|
| - if (str)
|
| - str += ", ";
|
| - str += param[key];
|
| - }
|
| - return str;
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onattach() {
|
| + this._update();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onpopulate() {
|
| + for (var param in this._logItem.params)
|
| + WebInspector.LogPropertyTreeElement._appendLogPropertyItem(this, param, this._logItem.params[param]);
|
| + }
|
| +
|
| + /**
|
| + * @param {*} param
|
| + * @param {string} name
|
| + * @return {string}
|
| + */
|
| + _paramToString(param, name) {
|
| + if (typeof param !== 'object')
|
| + return typeof param === 'string' && param.length > 100 ? name : JSON.stringify(param);
|
| + var str = '';
|
| + var keyCount = 0;
|
| + for (var key in param) {
|
| + if (++keyCount > 4 || typeof param[key] === 'object' ||
|
| + (typeof param[key] === 'string' && param[key].length > 100))
|
| + return name;
|
| + if (str)
|
| + str += ', ';
|
| + str += param[key];
|
| + }
|
| + return str;
|
| + }
|
| +
|
| + /**
|
| + * @param {?Object<string, *>} params
|
| + * @return {string}
|
| + */
|
| + _paramsToString(params) {
|
| + var str = '';
|
| + for (var key in params) {
|
| + if (str)
|
| + str += ', ';
|
| + str += this._paramToString(params[key], key);
|
| + }
|
| + return str;
|
| + }
|
|
|
| - /**
|
| - * @param {?Object<string, *>} params
|
| - * @return {string}
|
| - */
|
| - _paramsToString: function(params)
|
| - {
|
| - var str = "";
|
| - for (var key in params) {
|
| - if (str)
|
| - str += ", ";
|
| - str += this._paramToString(params[key], key);
|
| - }
|
| - return str;
|
| - },
|
| -
|
| - _update: function()
|
| - {
|
| - var title = createDocumentFragment();
|
| - title.createTextChild(this._logItem.method + "(" + this._paramsToString(this._logItem.params) + ")");
|
| - this.title = title;
|
| - },
|
| -
|
| - __proto__: TreeElement.prototype
|
| + _update() {
|
| + var title = createDocumentFragment();
|
| + title.createTextChild(this._logItem.method + '(' + this._paramsToString(this._logItem.params) + ')');
|
| + this.title = title;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!{name: string, value}} property
|
| - * @extends {TreeElement}
|
| - */
|
| -WebInspector.LogPropertyTreeElement = function(property)
|
| -{
|
| - TreeElement.call(this);
|
| + * @unrestricted
|
| + */
|
| +WebInspector.LogPropertyTreeElement = class extends TreeElement {
|
| + /**
|
| + * @param {!{name: string, value}} property
|
| + */
|
| + constructor(property) {
|
| + super();
|
| this._property = property;
|
| -};
|
| -
|
| -/**
|
| - * @param {!TreeElement} element
|
| - * @param {string} name
|
| - * @param {*} value
|
| - */
|
| -WebInspector.LogPropertyTreeElement._appendLogPropertyItem = function(element, name, value)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!TreeElement} element
|
| + * @param {string} name
|
| + * @param {*} value
|
| + */
|
| + static _appendLogPropertyItem(element, name, value) {
|
| var treeElement = new WebInspector.LogPropertyTreeElement({name: name, value: value});
|
| element.appendChild(treeElement);
|
| - if (value && typeof value === "object") {
|
| - for (var property in value)
|
| - WebInspector.LogPropertyTreeElement._appendLogPropertyItem(treeElement, property, value[property]);
|
| + if (value && typeof value === 'object') {
|
| + for (var property in value)
|
| + WebInspector.LogPropertyTreeElement._appendLogPropertyItem(treeElement, property, value[property]);
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onattach() {
|
| + var title = createDocumentFragment();
|
| + var nameElement = title.createChild('span', 'name');
|
| + nameElement.textContent = this._property.name;
|
| + var separatorElement = title.createChild('span', 'separator');
|
| + separatorElement.textContent = ': ';
|
| + if (this._property.value === null || typeof this._property.value !== 'object') {
|
| + var valueElement = title.createChild('span', 'value');
|
| + valueElement.textContent = JSON.stringify(this._property.value);
|
| + valueElement.classList.add('cm-js-' + (this._property.value === null ? 'null' : typeof this._property.value));
|
| + }
|
| + this.title = title;
|
| + }
|
| };
|
|
|
| -WebInspector.LogPropertyTreeElement.prototype = {
|
| - onattach: function()
|
| - {
|
| - var title = createDocumentFragment();
|
| - var nameElement = title.createChild("span", "name");
|
| - nameElement.textContent = this._property.name;
|
| - var separatorElement = title.createChild("span", "separator");
|
| - separatorElement.textContent = ": ";
|
| - if (this._property.value === null || typeof this._property.value !== "object") {
|
| - var valueElement = title.createChild("span", "value");
|
| - valueElement.textContent = JSON.stringify(this._property.value);
|
| - valueElement.classList.add("cm-js-" + (this._property.value === null ? "null" : typeof this._property.value));
|
| - }
|
| - this.title = title;
|
| - },
|
| -
|
| - __proto__: TreeElement.prototype
|
| -};
|
| -
|
| -/**
|
| - * @return {!Object.<string, !WebInspector.PaintProfilerCategory>}
|
| - */
|
| -WebInspector.PaintProfilerView.categories = function()
|
| -{
|
| - if (WebInspector.PaintProfilerView._categories)
|
| - return WebInspector.PaintProfilerView._categories;
|
| - WebInspector.PaintProfilerView._categories = {
|
| - shapes: new WebInspector.PaintProfilerCategory("shapes", WebInspector.UIString("Shapes"), "rgb(255, 161, 129)"),
|
| - bitmap: new WebInspector.PaintProfilerCategory("bitmap", WebInspector.UIString("Bitmap"), "rgb(136, 196, 255)"),
|
| - text: new WebInspector.PaintProfilerCategory("text", WebInspector.UIString("Text"), "rgb(180, 255, 137)"),
|
| - misc: new WebInspector.PaintProfilerCategory("misc", WebInspector.UIString("Misc"), "rgb(206, 160, 255)")
|
| - };
|
| - return WebInspector.PaintProfilerView._categories;
|
| -};
|
|
|
| /**
|
| - * @constructor
|
| - * @param {string} name
|
| - * @param {string} title
|
| - * @param {string} color
|
| + * @unrestricted
|
| */
|
| -WebInspector.PaintProfilerCategory = function(name, title, color)
|
| -{
|
| +WebInspector.PaintProfilerCategory = class {
|
| + /**
|
| + * @param {string} name
|
| + * @param {string} title
|
| + * @param {string} color
|
| + */
|
| + constructor(name, title, color) {
|
| this.name = name;
|
| this.title = title;
|
| this.color = color;
|
| + }
|
| };
|
|
|
| -/**
|
| - * @return {!Object.<string, !WebInspector.PaintProfilerCategory>}
|
| - */
|
| -WebInspector.PaintProfilerView._initLogItemCategories = function()
|
| -{
|
| - if (WebInspector.PaintProfilerView._logItemCategoriesMap)
|
| - return WebInspector.PaintProfilerView._logItemCategoriesMap;
|
| -
|
| - var categories = WebInspector.PaintProfilerView.categories();
|
| -
|
| - var logItemCategories = {};
|
| - logItemCategories["Clear"] = categories["misc"];
|
| - logItemCategories["DrawPaint"] = categories["misc"];
|
| - logItemCategories["DrawData"] = categories["misc"];
|
| - logItemCategories["SetMatrix"] = categories["misc"];
|
| - logItemCategories["PushCull"] = categories["misc"];
|
| - logItemCategories["PopCull"] = categories["misc"];
|
| - logItemCategories["Translate"] = categories["misc"];
|
| - logItemCategories["Scale"] = categories["misc"];
|
| - logItemCategories["Concat"] = categories["misc"];
|
| - logItemCategories["Restore"] = categories["misc"];
|
| - logItemCategories["SaveLayer"] = categories["misc"];
|
| - logItemCategories["Save"] = categories["misc"];
|
| - logItemCategories["BeginCommentGroup"] = categories["misc"];
|
| - logItemCategories["AddComment"] = categories["misc"];
|
| - logItemCategories["EndCommentGroup"] = categories["misc"];
|
| - logItemCategories["ClipRect"] = categories["misc"];
|
| - logItemCategories["ClipRRect"] = categories["misc"];
|
| - logItemCategories["ClipPath"] = categories["misc"];
|
| - logItemCategories["ClipRegion"] = categories["misc"];
|
| - logItemCategories["DrawPoints"] = categories["shapes"];
|
| - logItemCategories["DrawRect"] = categories["shapes"];
|
| - logItemCategories["DrawOval"] = categories["shapes"];
|
| - logItemCategories["DrawRRect"] = categories["shapes"];
|
| - logItemCategories["DrawPath"] = categories["shapes"];
|
| - logItemCategories["DrawVertices"] = categories["shapes"];
|
| - logItemCategories["DrawDRRect"] = categories["shapes"];
|
| - logItemCategories["DrawBitmap"] = categories["bitmap"];
|
| - logItemCategories["DrawBitmapRectToRect"] = categories["bitmap"];
|
| - logItemCategories["DrawBitmapMatrix"] = categories["bitmap"];
|
| - logItemCategories["DrawBitmapNine"] = categories["bitmap"];
|
| - logItemCategories["DrawSprite"] = categories["bitmap"];
|
| - logItemCategories["DrawPicture"] = categories["bitmap"];
|
| - logItemCategories["DrawText"] = categories["text"];
|
| - logItemCategories["DrawPosText"] = categories["text"];
|
| - logItemCategories["DrawPosTextH"] = categories["text"];
|
| - logItemCategories["DrawTextOnPath"] = categories["text"];
|
| -
|
| - WebInspector.PaintProfilerView._logItemCategoriesMap = logItemCategories;
|
| - return logItemCategories;
|
| -};
|
| -
|
| -/**
|
| - * @param {!Object} logItem
|
| - * @return {!WebInspector.PaintProfilerCategory}
|
| - */
|
| -WebInspector.PaintProfilerView._categoryForLogItem = function(logItem)
|
| -{
|
| - var method = logItem.method.toTitleCase();
|
|
|
| - var logItemCategories = WebInspector.PaintProfilerView._initLogItemCategories();
|
| - var result = logItemCategories[method];
|
| - if (!result) {
|
| - result = WebInspector.PaintProfilerView.categories()["misc"];
|
| - logItemCategories[method] = result;
|
| - }
|
| - return result;
|
| -};
|
|
|