| Index: chrome_linux/resources/inspector/TimelinePanel.js
|
| ===================================================================
|
| --- chrome_linux/resources/inspector/TimelinePanel.js (revision 221742)
|
| +++ chrome_linux/resources/inspector/TimelinePanel.js (working copy)
|
| @@ -1,5063 +1,819 @@
|
| -
|
| -
|
| -
|
| -
|
| -
|
| -
|
| -WebInspector.MemoryStatistics = function(timelinePanel, model, sidebarWidth)
|
| -{
|
| -this._timelinePanel = timelinePanel;
|
| -this._counters = [];
|
| -
|
| -model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded, this._onRecordAdded, this);
|
| -model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared, this._onRecordsCleared, this);
|
| -
|
| -this._containerAnchor = timelinePanel.element.lastChild;
|
| -this._memorySidebarView = new WebInspector.SidebarView(WebInspector.SidebarView.SidebarPosition.Start, undefined, sidebarWidth);
|
| -this._memorySidebarView.sidebarElement.addStyleClass("sidebar");
|
| -this._memorySidebarView.element.id = "memory-graphs-container";
|
| -
|
| -this._memorySidebarView.addEventListener(WebInspector.SidebarView.EventTypes.Resized, this._sidebarResized.bind(this));
|
| -
|
| -this._canvasContainer = this._memorySidebarView.mainElement;
|
| -this._canvasContainer.id = "memory-graphs-canvas-container";
|
| -this._createCurrentValuesBar();
|
| -this._canvas = this._canvasContainer.createChild("canvas");
|
| -this._canvas.id = "memory-counters-graph";
|
| -this._lastMarkerXPosition = 0;
|
| -
|
| -this._canvas.addEventListener("mouseover", this._onMouseOver.bind(this), true);
|
| -this._canvas.addEventListener("mousemove", this._onMouseMove.bind(this), true);
|
| -this._canvas.addEventListener("mouseout", this._onMouseOut.bind(this), true);
|
| -this._canvas.addEventListener("click", this._onClick.bind(this), true);
|
| -
|
| -this._timelineGrid = new WebInspector.TimelineGrid();
|
| -this._canvasContainer.appendChild(this._timelineGrid.dividersElement);
|
| -
|
| -
|
| -this._memorySidebarView.sidebarElement.createChild("div", "sidebar-tree sidebar-tree-section").textContent = WebInspector.UIString("COUNTERS");
|
| -this._counterUI = this._createCounterUIList();
|
| -}
|
| -
|
| -
|
| -WebInspector.MemoryStatistics.Counter = function(time)
|
| -{
|
| -this.time = time;
|
| -}
|
| -
|
| -
|
| -WebInspector.SwatchCheckbox = function(title, color)
|
| -{
|
| -this.element = document.createElement("div");
|
| -this._swatch = this.element.createChild("div", "swatch");
|
| -this.element.createChild("span", "title").textContent = title;
|
| -this._color = color;
|
| -this.checked = true;
|
| -
|
| -this.element.addEventListener("click", this._toggleCheckbox.bind(this), true);
|
| -}
|
| -
|
| -WebInspector.SwatchCheckbox.Events = {
|
| -Changed: "Changed"
|
| -}
|
| -
|
| -WebInspector.SwatchCheckbox.prototype = {
|
| -get checked()
|
| -{
|
| -return this._checked;
|
| -},
|
| -
|
| -set checked(v)
|
| -{
|
| -this._checked = v;
|
| -if (this._checked)
|
| -this._swatch.style.backgroundColor = this._color;
|
| -else
|
| -this._swatch.style.backgroundColor = "";
|
| -},
|
| -
|
| -_toggleCheckbox: function(event)
|
| -{
|
| -this.checked = !this.checked;
|
| -this.dispatchEventToListeners(WebInspector.SwatchCheckbox.Events.Changed);
|
| -},
|
| -
|
| -__proto__: WebInspector.Object.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.CounterUIBase = function(memoryCountersPane, title, graphColor, valueGetter)
|
| -{
|
| -this._memoryCountersPane = memoryCountersPane;
|
| -this.valueGetter = valueGetter;
|
| -var container = memoryCountersPane._memorySidebarView.sidebarElement.createChild("div", "memory-counter-sidebar-info");
|
| -var swatchColor = graphColor;
|
| -this._swatch = new WebInspector.SwatchCheckbox(WebInspector.UIString(title), swatchColor);
|
| -this._swatch.addEventListener(WebInspector.SwatchCheckbox.Events.Changed, this._toggleCounterGraph.bind(this));
|
| -container.appendChild(this._swatch.element);
|
| -
|
| -this._value = null;
|
| -this.graphColor =graphColor;
|
| -this.strokeColor = graphColor;
|
| -this.graphYValues = [];
|
| -}
|
| -
|
| -WebInspector.CounterUIBase.prototype = {
|
| -_toggleCounterGraph: function(event)
|
| -{
|
| -if (this._swatch.checked)
|
| -this._value.removeStyleClass("hidden");
|
| -else
|
| -this._value.addStyleClass("hidden");
|
| -this._memoryCountersPane.refresh();
|
| -},
|
| -
|
| -updateCurrentValue: function(countersEntry)
|
| -{
|
| -this._value.textContent = Number.bytesToString(this.valueGetter(countersEntry));
|
| -},
|
| -
|
| -clearCurrentValueAndMarker: function(ctx)
|
| -{
|
| -this._value.textContent = "";
|
| -},
|
| -
|
| -get visible()
|
| -{
|
| -return this._swatch.checked;
|
| -},
|
| -}
|
| -
|
| -WebInspector.MemoryStatistics.prototype = {
|
| -_createCurrentValuesBar: function()
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -_createCounterUIList: function()
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -_onRecordsCleared: function()
|
| -{
|
| -this._counters = [];
|
| -},
|
| -
|
| -
|
| -setMainTimelineGrid: function(timelineGrid)
|
| -{
|
| -this._mainTimelineGrid = timelineGrid;
|
| -},
|
| -
|
| -
|
| -setTopPosition: function(top)
|
| -{
|
| -this._memorySidebarView.element.style.top = top + "px";
|
| -this._updateSize();
|
| -},
|
| -
|
| -
|
| -setSidebarWidth: function(width)
|
| -{
|
| -if (this._ignoreSidebarResize)
|
| -return;
|
| -this._ignoreSidebarResize = true;
|
| -this._memorySidebarView.setSidebarWidth(width);
|
| -this._ignoreSidebarResize = false;
|
| -},
|
| -
|
| -
|
| -_sidebarResized: function(event)
|
| -{
|
| -if (this._ignoreSidebarResize)
|
| -return;
|
| -this._ignoreSidebarResize = true;
|
| -this._timelinePanel.splitView.setSidebarWidth(event.data);
|
| -this._ignoreSidebarResize = false;
|
| -},
|
| -
|
| -_canvasHeight: function()
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -_updateSize: function()
|
| -{
|
| -var width = this._mainTimelineGrid.dividersElement.offsetWidth + 1;
|
| -this._canvasContainer.style.width = width + "px";
|
| -
|
| -var height = this._canvasHeight();
|
| -this._canvas.width = width;
|
| -this._canvas.height = height;
|
| -},
|
| -
|
| -
|
| -_onRecordAdded: function(event)
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -_draw: function()
|
| -{
|
| -this._calculateVisibleIndexes();
|
| -this._calculateXValues();
|
| -this._clear();
|
| -
|
| -this._setVerticalClip(10, this._canvas.height - 20);
|
| -},
|
| -
|
| -_calculateVisibleIndexes: function()
|
| -{
|
| -var calculator = this._timelinePanel.calculator;
|
| -var start = calculator.minimumBoundary() * 1000;
|
| -var end = calculator.maximumBoundary() * 1000;
|
| -var firstIndex = 0;
|
| -var lastIndex = this._counters.length - 1;
|
| -for (var i = 0; i < this._counters.length; i++) {
|
| -var time = this._counters[i].time;
|
| -if (time <= start) {
|
| -firstIndex = i;
|
| -} else {
|
| -if (end < time)
|
| -break;
|
| -lastIndex = i;
|
| -}
|
| -}
|
| -
|
| -this._minimumIndex = firstIndex;
|
| -
|
| -
|
| -this._maximumIndex = lastIndex;
|
| -
|
| -
|
| -this._minTime = start;
|
| -this._maxTime = end;
|
| -},
|
| -
|
| -
|
| -_onClick: function(event)
|
| -{
|
| -var x = event.x - event.target.offsetParent.offsetLeft;
|
| -var i = this._recordIndexAt(x);
|
| -var counter = this._counters[i];
|
| -if (counter)
|
| -this._timelinePanel.revealRecordAt(counter.time / 1000);
|
| -},
|
| -
|
| -
|
| -_onMouseOut: function(event)
|
| -{
|
| -delete this._markerXPosition;
|
| -
|
| -var ctx = this._canvas.getContext("2d");
|
| -this._clearCurrentValueAndMarker(ctx);
|
| -},
|
| -
|
| -
|
| -_clearCurrentValueAndMarker: function(ctx)
|
| -{
|
| -for (var i = 0; i < this._counterUI.length; i++)
|
| -this._counterUI[i].clearCurrentValueAndMarker(ctx);
|
| -},
|
| -
|
| -
|
| -_onMouseOver: function(event)
|
| -{
|
| -this._onMouseMove(event);
|
| -},
|
| -
|
| -
|
| -_onMouseMove: function(event)
|
| -{
|
| -var x = event.x - event.target.offsetParent.offsetLeft
|
| -this._markerXPosition = x;
|
| -this._refreshCurrentValues();
|
| -},
|
| -
|
| -_refreshCurrentValues: function()
|
| -{
|
| -if (!this._counters.length)
|
| -return;
|
| -if (this._markerXPosition === undefined)
|
| -return;
|
| -if (this._maximumIndex === -1)
|
| -return;
|
| -var i = this._recordIndexAt(this._markerXPosition);
|
| -
|
| -this._updateCurrentValue(this._counters[i]);
|
| -
|
| -this._highlightCurrentPositionOnGraphs(this._markerXPosition, i);
|
| -},
|
| -
|
| -_updateCurrentValue: function(counterEntry)
|
| -{
|
| -for (var j = 0; j < this._counterUI.length; j++)
|
| -this._counterUI[j].updateCurrentValue(counterEntry);
|
| -},
|
| -
|
| -_recordIndexAt: function(x)
|
| -{
|
| -var i;
|
| -for (i = this._minimumIndex + 1; i <= this._maximumIndex; i++) {
|
| -var statX = this._counters[i].x;
|
| -if (x < statX)
|
| -break;
|
| -}
|
| -i--;
|
| -return i;
|
| -},
|
| -
|
| -_highlightCurrentPositionOnGraphs: function(x, index)
|
| -{
|
| -var ctx = this._canvas.getContext("2d");
|
| -this._restoreImageUnderMarker(ctx);
|
| -this._drawMarker(ctx, x, index);
|
| -},
|
| -
|
| -_restoreImageUnderMarker: function(ctx)
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -_drawMarker: function(ctx, x, index)
|
| -{
|
| -throw new Error("Not implemented");
|
| -},
|
| -
|
| -visible: function()
|
| -{
|
| -return this._memorySidebarView.isShowing();
|
| -},
|
| -
|
| -show: function()
|
| -{
|
| -var anchor = (this._containerAnchor.nextSibling);
|
| -this._memorySidebarView.show(this._timelinePanel.element, anchor);
|
| -this._updateSize();
|
| -this._refreshDividers();
|
| -setTimeout(this._draw.bind(this), 0);
|
| -},
|
| -
|
| -refresh: function()
|
| -{
|
| -this._updateSize();
|
| -this._refreshDividers();
|
| -this._draw();
|
| -this._refreshCurrentValues();
|
| -},
|
| -
|
| -hide: function()
|
| -{
|
| -this._memorySidebarView.detach();
|
| -},
|
| -
|
| -_refreshDividers: function()
|
| -{
|
| -this._timelineGrid.updateDividers(this._timelinePanel.calculator);
|
| -},
|
| -
|
| -_setVerticalClip: function(originY, height)
|
| -{
|
| -this._originY = originY;
|
| -this._clippedHeight = height;
|
| -},
|
| -
|
| -_calculateXValues: function()
|
| -{
|
| -if (!this._counters.length)
|
| -return;
|
| -
|
| -var width = this._canvas.width;
|
| -var xFactor = width / (this._maxTime - this._minTime);
|
| -
|
| -this._counters[this._minimumIndex].x = 0;
|
| -for (var i = this._minimumIndex + 1; i < this._maximumIndex; i++)
|
| -this._counters[i].x = xFactor * (this._counters[i].time - this._minTime);
|
| -this._counters[this._maximumIndex].x = width;
|
| -},
|
| -
|
| -_clear: function() {
|
| -var ctx = this._canvas.getContext("2d");
|
| -ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
|
| -this._discardImageUnderMarker();
|
| -},
|
| -
|
| -_discardImageUnderMarker: function()
|
| -{
|
| -throw new Error("Not implemented");
|
| -}
|
| -}
|
| -
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.DOMCountersGraph = function(timelinePanel, model, sidebarWidth)
|
| -{
|
| -WebInspector.MemoryStatistics.call(this, timelinePanel, model, sidebarWidth);
|
| -}
|
| -
|
| -
|
| -WebInspector.DOMCounterUI = function(memoryCountersPane, title, currentValueLabel, rgb, valueGetter)
|
| -{
|
| -var swatchColor = "rgb(" + rgb.join(",") + ")";
|
| -WebInspector.CounterUIBase.call(this, memoryCountersPane, title, swatchColor, valueGetter)
|
| -this._range = this._swatch.element.createChild("span");
|
| -
|
| -this._value = memoryCountersPane._currentValuesBar.createChild("span", "memory-counter-value");
|
| -this._value.style.color = swatchColor;
|
| -this._currentValueLabel = currentValueLabel;
|
| -
|
| -this.graphColor = "rgba(" + rgb.join(",") + ",0.8)";
|
| -this.graphYValues = [];
|
| -}
|
| -
|
| -
|
| -WebInspector.DOMCountersGraph.Counter = function(time, documentCount, nodeCount, listenerCount)
|
| -{
|
| -WebInspector.MemoryStatistics.Counter.call(this, time);
|
| -this.documentCount = documentCount;
|
| -this.nodeCount = nodeCount;
|
| -this.listenerCount = listenerCount;
|
| -}
|
| -
|
| -WebInspector.DOMCounterUI.prototype = {
|
| -
|
| -setRange: function(minValue, maxValue)
|
| -{
|
| -this._range.textContent = WebInspector.UIString("[ %d - %d ]", minValue, maxValue);
|
| -},
|
| -
|
| -updateCurrentValue: function(countersEntry)
|
| -{
|
| -this._value.textContent = WebInspector.UIString(this._currentValueLabel, this.valueGetter(countersEntry));
|
| -},
|
| -
|
| -clearCurrentValueAndMarker: function(ctx)
|
| -{
|
| -this._value.textContent = "";
|
| -this.restoreImageUnderMarker(ctx);
|
| -},
|
| -
|
| -
|
| -saveImageUnderMarker: function(ctx, x, y, radius)
|
| -{
|
| -const w = radius + 1;
|
| -var imageData = ctx.getImageData(x - w, y - w, 2 * w, 2 * w);
|
| -this._imageUnderMarker = {
|
| -x: x - w,
|
| -y: y - w,
|
| -imageData: imageData
|
| -};
|
| -},
|
| -
|
| -
|
| -restoreImageUnderMarker: function(ctx)
|
| -{
|
| -if (!this.visible)
|
| -return;
|
| -if (this._imageUnderMarker)
|
| -ctx.putImageData(this._imageUnderMarker.imageData, this._imageUnderMarker.x, this._imageUnderMarker.y);
|
| -this.discardImageUnderMarker();
|
| -},
|
| -
|
| -discardImageUnderMarker: function()
|
| -{
|
| -delete this._imageUnderMarker;
|
| -},
|
| -
|
| -__proto__: WebInspector.CounterUIBase.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.DOMCountersGraph.prototype = {
|
| -_createCurrentValuesBar: function()
|
| -{
|
| -this._currentValuesBar = this._canvasContainer.createChild("div");
|
| -this._currentValuesBar.id = "counter-values-bar";
|
| -this._canvasContainer.addStyleClass("dom-counters");
|
| -},
|
| -
|
| -
|
| -_createCounterUIList: function()
|
| -{
|
| -function getDocumentCount(entry)
|
| -{
|
| -return entry.documentCount;
|
| -}
|
| +WebInspector.MemoryStatistics=function(timelinePanel,model,sidebarWidth)
|
| +{this._timelinePanel=timelinePanel;this._counters=[];model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onRecordAdded,this);model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._onRecordsCleared,this);this._containerAnchor=timelinePanel.element.lastChild;this._memorySidebarView=new WebInspector.SidebarView(WebInspector.SidebarView.SidebarPosition.Start,undefined,sidebarWidth);this._memorySidebarView.sidebarElement.addStyleClass("sidebar");this._memorySidebarView.element.id="memory-graphs-container";this._memorySidebarView.addEventListener(WebInspector.SidebarView.EventTypes.Resized,this._sidebarResized.bind(this));this._canvasContainer=this._memorySidebarView.mainElement;this._canvasContainer.id="memory-graphs-canvas-container";this._createCurrentValuesBar();this._canvas=this._canvasContainer.createChild("canvas");this._canvas.id="memory-counters-graph";this._lastMarkerXPosition=0;this._canvas.addEventListener("mouseover",this._onMouseOver.bind(this),true);this._canvas.addEventListener("mousemove",this._onMouseMove.bind(this),true);this._canvas.addEventListener("mouseout",this._onMouseOut.bind(this),true);this._canvas.addEventListener("click",this._onClick.bind(this),true);this._timelineGrid=new WebInspector.TimelineGrid();this._canvasContainer.appendChild(this._timelineGrid.dividersElement);this._memorySidebarView.sidebarElement.createChild("div","sidebar-tree sidebar-tree-section").textContent=WebInspector.UIString("COUNTERS");this._counterUI=this._createCounterUIList();}
|
| +WebInspector.MemoryStatistics.Counter=function(time)
|
| +{this.time=time;}
|
| +WebInspector.SwatchCheckbox=function(title,color)
|
| +{this.element=document.createElement("div");this._swatch=this.element.createChild("div","swatch");this.element.createChild("span","title").textContent=title;this._color=color;this.checked=true;this.element.addEventListener("click",this._toggleCheckbox.bind(this),true);}
|
| +WebInspector.SwatchCheckbox.Events={Changed:"Changed"}
|
| +WebInspector.SwatchCheckbox.prototype={get checked()
|
| +{return this._checked;},set checked(v)
|
| +{this._checked=v;if(this._checked)
|
| +this._swatch.style.backgroundColor=this._color;else
|
| +this._swatch.style.backgroundColor="";},_toggleCheckbox:function(event)
|
| +{this.checked=!this.checked;this.dispatchEventToListeners(WebInspector.SwatchCheckbox.Events.Changed);},__proto__:WebInspector.Object.prototype}
|
| +WebInspector.CounterUIBase=function(memoryCountersPane,title,graphColor,valueGetter)
|
| +{this._memoryCountersPane=memoryCountersPane;this.valueGetter=valueGetter;var container=memoryCountersPane._memorySidebarView.sidebarElement.createChild("div","memory-counter-sidebar-info");var swatchColor=graphColor;this._swatch=new WebInspector.SwatchCheckbox(WebInspector.UIString(title),swatchColor);this._swatch.addEventListener(WebInspector.SwatchCheckbox.Events.Changed,this._toggleCounterGraph.bind(this));container.appendChild(this._swatch.element);this._value=null;this.graphColor=graphColor;this.strokeColor=graphColor;this.graphYValues=[];}
|
| +WebInspector.CounterUIBase.prototype={_toggleCounterGraph:function(event)
|
| +{if(this._swatch.checked)
|
| +this._value.removeStyleClass("hidden");else
|
| +this._value.addStyleClass("hidden");this._memoryCountersPane.refresh();},updateCurrentValue:function(countersEntry)
|
| +{this._value.textContent=Number.bytesToString(this.valueGetter(countersEntry));},clearCurrentValueAndMarker:function(ctx)
|
| +{this._value.textContent="";},get visible()
|
| +{return this._swatch.checked;},}
|
| +WebInspector.MemoryStatistics.prototype={_createCurrentValuesBar:function()
|
| +{throw new Error("Not implemented");},_createCounterUIList:function()
|
| +{throw new Error("Not implemented");},_onRecordsCleared:function()
|
| +{this._counters=[];},setMainTimelineGrid:function(timelineGrid)
|
| +{this._mainTimelineGrid=timelineGrid;},setTopPosition:function(top)
|
| +{this._memorySidebarView.element.style.top=top+"px";this._updateSize();},setSidebarWidth:function(width)
|
| +{if(this._ignoreSidebarResize)
|
| +return;this._ignoreSidebarResize=true;this._memorySidebarView.setSidebarWidth(width);this._ignoreSidebarResize=false;},_sidebarResized:function(event)
|
| +{if(this._ignoreSidebarResize)
|
| +return;this._ignoreSidebarResize=true;this._timelinePanel.splitView.setSidebarWidth(event.data);this._ignoreSidebarResize=false;},_canvasHeight:function()
|
| +{throw new Error("Not implemented");},_updateSize:function()
|
| +{var width=this._mainTimelineGrid.dividersElement.offsetWidth+1;this._canvasContainer.style.width=width+"px";var height=this._canvasHeight();this._canvas.width=width;this._canvas.height=height;},_onRecordAdded:function(event)
|
| +{throw new Error("Not implemented");},_draw:function()
|
| +{this._calculateVisibleIndexes();this._calculateXValues();this._clear();this._setVerticalClip(10,this._canvas.height-20);},_calculateVisibleIndexes:function()
|
| +{var calculator=this._timelinePanel.calculator;var start=calculator.minimumBoundary()*1000;var end=calculator.maximumBoundary()*1000;function comparator(value,sample)
|
| +{return value-sample.time;}
|
| +this._minimumIndex=Number.constrain(this._counters.upperBound(start,comparator)-1,0,this._counters.length-1);this._maximumIndex=Number.constrain(this._counters.lowerBound(end,comparator),0,this._counters.length-1);this._minTime=start;this._maxTime=end;},_onClick:function(event)
|
| +{var x=event.x-event.target.offsetParent.offsetLeft;var i=this._recordIndexAt(x);var counter=this._counters[i];if(counter)
|
| +this._timelinePanel.revealRecordAt(counter.time/1000);},_onMouseOut:function(event)
|
| +{delete this._markerXPosition;var ctx=this._canvas.getContext("2d");this._clearCurrentValueAndMarker(ctx);},_clearCurrentValueAndMarker:function(ctx)
|
| +{for(var i=0;i<this._counterUI.length;i++)
|
| +this._counterUI[i].clearCurrentValueAndMarker(ctx);},_onMouseOver:function(event)
|
| +{this._onMouseMove(event);},_onMouseMove:function(event)
|
| +{var x=event.x-event.target.offsetParent.offsetLeft
|
| +this._markerXPosition=x;this._refreshCurrentValues();},_refreshCurrentValues:function()
|
| +{if(!this._counters.length)
|
| +return;if(this._markerXPosition===undefined)
|
| +return;if(this._maximumIndex===-1)
|
| +return;var i=this._recordIndexAt(this._markerXPosition);this._updateCurrentValue(this._counters[i]);this._highlightCurrentPositionOnGraphs(this._markerXPosition,i);},_updateCurrentValue:function(counterEntry)
|
| +{for(var j=0;j<this._counterUI.length;j++)
|
| +this._counterUI[j].updateCurrentValue(counterEntry);},_recordIndexAt:function(x)
|
| +{var i;for(i=this._minimumIndex+1;i<=this._maximumIndex;i++){var statX=this._counters[i].x;if(x<statX)
|
| +break;}
|
| +i--;return i;},_highlightCurrentPositionOnGraphs:function(x,index)
|
| +{var ctx=this._canvas.getContext("2d");this._restoreImageUnderMarker(ctx);this._drawMarker(ctx,x,index);},_restoreImageUnderMarker:function(ctx)
|
| +{throw new Error("Not implemented");},_drawMarker:function(ctx,x,index)
|
| +{throw new Error("Not implemented");},visible:function()
|
| +{return this._memorySidebarView.isShowing();},show:function()
|
| +{var anchor=(this._containerAnchor.nextSibling);var savedSidebarSize=this._timelinePanel.splitView.sidebarWidth();this._memorySidebarView.show(this._timelinePanel.element,anchor);if(savedSidebarSize>0){this.setSidebarWidth(savedSidebarSize);this._timelinePanel.splitView.setSidebarWidth(savedSidebarSize);}
|
| +this._updateSize();this._refreshDividers();setTimeout(this._draw.bind(this),0);},refresh:function()
|
| +{this._updateSize();this._refreshDividers();this._draw();this._refreshCurrentValues();},hide:function()
|
| +{this._memorySidebarView.detach();},_refreshDividers:function()
|
| +{this._timelineGrid.updateDividers(this._timelinePanel.calculator);},_setVerticalClip:function(originY,height)
|
| +{this._originY=originY;this._clippedHeight=height;},_calculateXValues:function()
|
| +{if(!this._counters.length)
|
| +return;var width=this._canvas.width;var xFactor=width/(this._maxTime-this._minTime);this._counters[this._minimumIndex].x=0;for(var i=this._minimumIndex+1;i<this._maximumIndex;i++)
|
| +this._counters[i].x=xFactor*(this._counters[i].time-this._minTime);this._counters[this._maximumIndex].x=width;},_clear:function(){var ctx=this._canvas.getContext("2d");ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);this._discardImageUnderMarker();},_discardImageUnderMarker:function()
|
| +{throw new Error("Not implemented");}};WebInspector.DOMCountersGraph=function(timelinePanel,model,sidebarWidth)
|
| +{WebInspector.MemoryStatistics.call(this,timelinePanel,model,sidebarWidth);}
|
| +WebInspector.DOMCounterUI=function(memoryCountersPane,title,currentValueLabel,rgb,valueGetter)
|
| +{var swatchColor="rgb("+rgb.join(",")+")";WebInspector.CounterUIBase.call(this,memoryCountersPane,title,swatchColor,valueGetter)
|
| +this._range=this._swatch.element.createChild("span");this._value=memoryCountersPane._currentValuesBar.createChild("span","memory-counter-value");this._value.style.color=swatchColor;this._currentValueLabel=currentValueLabel;this.graphColor="rgba("+rgb.join(",")+",0.8)";this.graphYValues=[];}
|
| +WebInspector.DOMCountersGraph.Counter=function(time,documentCount,nodeCount,listenerCount)
|
| +{WebInspector.MemoryStatistics.Counter.call(this,time);this.documentCount=documentCount;this.nodeCount=nodeCount;this.listenerCount=listenerCount;}
|
| +WebInspector.DOMCounterUI.prototype={setRange:function(minValue,maxValue)
|
| +{this._range.textContent=WebInspector.UIString("[ %d - %d ]",minValue,maxValue);},updateCurrentValue:function(countersEntry)
|
| +{this._value.textContent=WebInspector.UIString(this._currentValueLabel,this.valueGetter(countersEntry));},clearCurrentValueAndMarker:function(ctx)
|
| +{this._value.textContent="";this.restoreImageUnderMarker(ctx);},saveImageUnderMarker:function(ctx,x,y,radius)
|
| +{const w=radius+1;var imageData=ctx.getImageData(x-w,y-w,2*w,2*w);this._imageUnderMarker={x:x-w,y:y-w,imageData:imageData};},restoreImageUnderMarker:function(ctx)
|
| +{if(!this.visible)
|
| +return;if(this._imageUnderMarker)
|
| +ctx.putImageData(this._imageUnderMarker.imageData,this._imageUnderMarker.x,this._imageUnderMarker.y);this.discardImageUnderMarker();},discardImageUnderMarker:function()
|
| +{delete this._imageUnderMarker;},__proto__:WebInspector.CounterUIBase.prototype}
|
| +WebInspector.DOMCountersGraph.prototype={_createCurrentValuesBar:function()
|
| +{this._currentValuesBar=this._canvasContainer.createChild("div");this._currentValuesBar.id="counter-values-bar";this._canvasContainer.addStyleClass("dom-counters");},_createCounterUIList:function()
|
| +{function getDocumentCount(entry)
|
| +{return entry.documentCount;}
|
| function getNodeCount(entry)
|
| -{
|
| -return entry.nodeCount;
|
| -}
|
| +{return entry.nodeCount;}
|
| function getListenerCount(entry)
|
| -{
|
| -return entry.listenerCount;
|
| -}
|
| -return [
|
| -new WebInspector.DOMCounterUI(this, "Document Count", "Documents: %d", [100, 0, 0], getDocumentCount),
|
| -new WebInspector.DOMCounterUI(this, "DOM Node Count", "Nodes: %d", [0, 100, 0], getNodeCount),
|
| -new WebInspector.DOMCounterUI(this, "Event Listener Count", "Listeners: %d", [0, 0, 100], getListenerCount)
|
| -];
|
| -},
|
| -
|
| -_canvasHeight: function()
|
| -{
|
| -return this._canvasContainer.offsetHeight - this._currentValuesBar.offsetHeight;
|
| -},
|
| -
|
| -
|
| -_onRecordAdded: function(event)
|
| -{
|
| -function addStatistics(record)
|
| -{
|
| -var counters = record["counters"];
|
| -if (!counters)
|
| -return;
|
| -this._counters.push(new WebInspector.DOMCountersGraph.Counter(
|
| -record.endTime || record.startTime,
|
| -counters["documents"],
|
| -counters["nodes"],
|
| -counters["jsEventListeners"]
|
| -));
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords([event.data], null, addStatistics.bind(this));
|
| -},
|
| -
|
| -_draw: function()
|
| -{
|
| -WebInspector.MemoryStatistics.prototype._draw.call(this);
|
| -for (var i = 0; i < this._counterUI.length; i++)
|
| -this._drawGraph(this._counterUI[i]);
|
| -},
|
| -
|
| -
|
| -_restoreImageUnderMarker: function(ctx)
|
| -{
|
| -for (var i = 0; i < this._counterUI.length; i++) {
|
| -var counterUI = this._counterUI[i];
|
| -if (!counterUI.visible)
|
| -continue;
|
| -counterUI.restoreImageUnderMarker(ctx);
|
| -}
|
| -},
|
| -
|
| -
|
| -_saveImageUnderMarker: function(ctx, x, index)
|
| -{
|
| -const radius = 2;
|
| -for (var i = 0; i < this._counterUI.length; i++) {
|
| -var counterUI = this._counterUI[i];
|
| -if (!counterUI.visible)
|
| -continue;
|
| -var y = counterUI.graphYValues[index];
|
| -counterUI.saveImageUnderMarker(ctx, x, y, radius);
|
| -}
|
| -},
|
| -
|
| -
|
| -_drawMarker: function(ctx, x, index)
|
| -{
|
| -this._saveImageUnderMarker(ctx, x, index);
|
| -const radius = 2;
|
| -for (var i = 0; i < this._counterUI.length; i++) {
|
| -var counterUI = this._counterUI[i];
|
| -if (!counterUI.visible)
|
| -continue;
|
| -var y = counterUI.graphYValues[index];
|
| -ctx.beginPath();
|
| -ctx.arc(x, y, radius, 0, Math.PI * 2, true);
|
| -ctx.lineWidth = 1;
|
| -ctx.fillStyle = counterUI.graphColor;
|
| -ctx.strokeStyle = counterUI.graphColor;
|
| -ctx.fill();
|
| -ctx.stroke();
|
| -ctx.closePath();
|
| -}
|
| -},
|
| -
|
| -
|
| -_drawGraph: function(counterUI)
|
| -{
|
| -var canvas = this._canvas;
|
| -var ctx = canvas.getContext("2d");
|
| -var width = canvas.width;
|
| -var height = this._clippedHeight;
|
| -var originY = this._originY;
|
| -var valueGetter = counterUI.valueGetter;
|
| -
|
| -if (!this._counters.length)
|
| -return;
|
| -
|
| -var maxValue;
|
| -var minValue;
|
| -for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
|
| -var value = valueGetter(this._counters[i]);
|
| -if (minValue === undefined || value < minValue)
|
| -minValue = value;
|
| -if (maxValue === undefined || value > maxValue)
|
| -maxValue = value;
|
| -}
|
| -
|
| -counterUI.setRange(minValue, maxValue);
|
| -
|
| -if (!counterUI.visible)
|
| -return;
|
| -
|
| -var yValues = counterUI.graphYValues;
|
| -yValues.length = this._counters.length;
|
| -
|
| -var maxYRange = maxValue - minValue;
|
| -var yFactor = maxYRange ? height / (maxYRange) : 1;
|
| -
|
| -ctx.beginPath();
|
| -var currentY = originY + (height - (valueGetter(this._counters[this._minimumIndex]) - minValue) * yFactor);
|
| -ctx.moveTo(0, currentY);
|
| -for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
|
| -var x = this._counters[i].x;
|
| -ctx.lineTo(x, currentY);
|
| -currentY = originY + (height - (valueGetter(this._counters[i]) - minValue) * yFactor);
|
| -ctx.lineTo(x, currentY);
|
| -
|
| -yValues[i] = currentY;
|
| -}
|
| -ctx.lineTo(width, currentY);
|
| -ctx.lineWidth = 1;
|
| -ctx.strokeStyle = counterUI.graphColor;
|
| -ctx.stroke();
|
| -ctx.closePath();
|
| -},
|
| -
|
| -_discardImageUnderMarker: function()
|
| -{
|
| -for (var i = 0; i < this._counterUI.length; i++)
|
| -this._counterUI[i].discardImageUnderMarker();
|
| -},
|
| -
|
| -__proto__: WebInspector.MemoryStatistics.prototype
|
| -}
|
| -
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.NativeMemoryGraph = function(timelinePanel, model, sidebarWidth)
|
| -{
|
| -WebInspector.MemoryStatistics.call(this, timelinePanel, model, sidebarWidth);
|
| -}
|
| -
|
| -
|
| -WebInspector.NativeMemoryGraph.Counter = function(time, nativeCounters)
|
| -{
|
| -WebInspector.MemoryStatistics.Counter.call(this, time);
|
| -this.nativeCounters = nativeCounters;
|
| -}
|
| -
|
| -
|
| -WebInspector.NativeMemoryCounterUI = function(memoryCountersPane, title, hsl, valueGetter)
|
| -{
|
| -var swatchColor = this._hslToString(hsl);
|
| -WebInspector.CounterUIBase.call(this, memoryCountersPane, title, swatchColor, valueGetter);
|
| -this._value = this._swatch.element.createChild("span", "memory-category-value");
|
| -
|
| -const borderLightnessDifference = 3;
|
| -hsl[2] -= borderLightnessDifference;
|
| -this.strokeColor = this._hslToString(hsl);
|
| -this.graphYValues = [];
|
| -}
|
| -
|
| -WebInspector.NativeMemoryCounterUI.prototype = {
|
| -_hslToString: function(hsl)
|
| -{
|
| -return "hsl(" + hsl[0] + "," + hsl[1] + "%," + hsl[2] + "%)";
|
| -},
|
| -
|
| -updateCurrentValue: function(countersEntry)
|
| -{
|
| -var bytes = this.valueGetter(countersEntry);
|
| -var megabytes = bytes / (1024 * 1024);
|
| -this._value.textContent = WebInspector.UIString("%.1f\u2009MB", megabytes);
|
| -},
|
| -
|
| -clearCurrentValueAndMarker: function(ctx)
|
| -{
|
| -this._value.textContent = "";
|
| -},
|
| -
|
| -__proto__: WebInspector.CounterUIBase.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.NativeMemoryGraph.prototype = {
|
| -_createCurrentValuesBar: function()
|
| -{
|
| -},
|
| -
|
| -_createCounterUIList: function()
|
| -{
|
| -var nativeCounters = [
|
| -"JSExternalResources",
|
| -"CSS",
|
| -"GlyphCache",
|
| -"Image",
|
| -"Resources",
|
| -"DOM",
|
| -"Rendering",
|
| -"Audio",
|
| -"WebInspector",
|
| -"JSHeap.Used",
|
| -"JSHeap.Unused",
|
| -"MallocWaste",
|
| -"Other",
|
| -"PrivateBytes",
|
| -];
|
| -
|
| -
|
| -function getCounterValue(name, entry)
|
| -{
|
| -return (entry.nativeCounters && entry.nativeCounters[name]) || 0;
|
| -}
|
| -
|
| -var list = [];
|
| -for (var i = nativeCounters.length - 1; i >= 0; i--) {
|
| -var name = nativeCounters[i];
|
| -if ("PrivateBytes" === name) {
|
| -var counterUI = new WebInspector.NativeMemoryCounterUI(this, "Total", [0, 0, 0], getCounterValue.bind(this, name))
|
| -this._privateBytesCounter = counterUI;
|
| -} else {
|
| -var counterUI = new WebInspector.NativeMemoryCounterUI(this, name, [i * 20, 65, 63], getCounterValue.bind(this, name))
|
| -list.push(counterUI);
|
| -}
|
| -}
|
| -return list.reverse();
|
| -},
|
| -
|
| -_canvasHeight: function()
|
| -{
|
| -return this._canvasContainer.offsetHeight;
|
| -},
|
| -
|
| -
|
| -_onRecordAdded: function(event)
|
| -{
|
| -var statistics = this._counters;
|
| -function addStatistics(record)
|
| -{
|
| -var nativeCounters = record["nativeHeapStatistics"];
|
| -if (!nativeCounters)
|
| -return;
|
| -
|
| -var knownSize = 0;
|
| -for (var name in nativeCounters) {
|
| -if (name === "PrivateBytes")
|
| -continue;
|
| -knownSize += nativeCounters[name];
|
| -}
|
| -nativeCounters["Other"] = nativeCounters["PrivateBytes"] - knownSize;
|
| -
|
| -statistics.push(new WebInspector.NativeMemoryGraph.Counter(
|
| -record.endTime || record.startTime,
|
| -nativeCounters
|
| -));
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords([event.data], null, addStatistics);
|
| -},
|
| -
|
| -_draw: function()
|
| -{
|
| -WebInspector.MemoryStatistics.prototype._draw.call(this);
|
| -
|
| -var maxValue = this._maxCounterValue();
|
| -this._resetTotalValues();
|
| -
|
| -var previousCounterUI;
|
| -for (var i = 0; i < this._counterUI.length; i++) {
|
| -this._drawGraph(this._counterUI[i], previousCounterUI, maxValue);
|
| -if (this._counterUI[i].visible)
|
| -previousCounterUI = this._counterUI[i];
|
| -}
|
| -},
|
| -
|
| -
|
| -_clearCurrentValueAndMarker: function(ctx)
|
| -{
|
| -WebInspector.MemoryStatistics.prototype._clearCurrentValueAndMarker.call(this, ctx);
|
| -this._privateBytesCounter.clearCurrentValueAndMarker(ctx);
|
| -},
|
| -
|
| -_updateCurrentValue: function(counterEntry)
|
| -{
|
| -WebInspector.MemoryStatistics.prototype._updateCurrentValue.call(this, counterEntry);
|
| -this._privateBytesCounter.updateCurrentValue(counterEntry);
|
| -},
|
| -
|
| -
|
| -_restoreImageUnderMarker: function(ctx)
|
| -{
|
| -if (this._imageUnderMarker)
|
| -ctx.putImageData(this._imageUnderMarker.imageData, this._imageUnderMarker.x, this._imageUnderMarker.y);
|
| -this._discardImageUnderMarker();
|
| -},
|
| -
|
| -
|
| -_saveImageUnderMarker: function(ctx, left, top, right, bottom)
|
| -{
|
| -var imageData = ctx.getImageData(left, top, right, bottom);
|
| -this._imageUnderMarker = {
|
| -x: left,
|
| -y: top,
|
| -imageData: imageData
|
| -};
|
| -},
|
| -
|
| -
|
| -_drawMarker: function(ctx, x, index)
|
| -{
|
| -var left = this._counters[index].x;
|
| -var right = index + 1 < this._counters.length ? this._counters[index + 1].x : left;
|
| -var top = this._originY;
|
| -top = 0;
|
| -var bottom = top + this._clippedHeight;
|
| -bottom += this._originY;
|
| -
|
| -this._saveImageUnderMarker(ctx, left, top, right, bottom);
|
| -
|
| -ctx.beginPath();
|
| -ctx.moveTo(left, top);
|
| -ctx.lineTo(right, top);
|
| -ctx.lineTo(right, bottom);
|
| -ctx.lineTo(left, bottom);
|
| -ctx.lineWidth = 1;
|
| -ctx.closePath();
|
| -ctx.fillStyle = "rgba(220,220,220,0.3)";
|
| -ctx.fill();
|
| -},
|
| -
|
| -
|
| -_maxCounterValue: function()
|
| -{
|
| -if (!this._counters.length)
|
| -return 0;
|
| -
|
| -var valueGetter = this._privateBytesCounter.valueGetter;
|
| -var result = 0;
|
| -for (var i = this._minimumIndex; i < this._maximumIndex; i++) {
|
| -var counter = this._counters[i];
|
| -var value = valueGetter(counter);
|
| -if (value > result)
|
| -result = value;
|
| -}
|
| -return result;
|
| -},
|
| -
|
| -_resetTotalValues: function()
|
| -{
|
| -for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
|
| -var counter = this._counters[i];
|
| -counter.total = 0;
|
| -}
|
| -},
|
| -
|
| -
|
| -_drawGraph: function(counterUI, previousCounterUI, maxTotalValue)
|
| -{
|
| -var canvas = this._canvas;
|
| -var ctx = canvas.getContext("2d");
|
| -var width = canvas.width;
|
| -var height = this._clippedHeight;
|
| -var originY = this._originY;
|
| -var valueGetter = counterUI.valueGetter;
|
| -
|
| -if (!this._counters.length)
|
| -return;
|
| -
|
| -if (!counterUI.visible)
|
| -return;
|
| -
|
| -for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
|
| -var counter = this._counters[i];
|
| -var value = valueGetter(counter);
|
| -counter.total += value;
|
| -}
|
| -
|
| -var yValues = counterUI.graphYValues;
|
| -yValues.length = this._counters.length;
|
| -
|
| -var maxYRange = maxTotalValue;
|
| -var yFactor = maxYRange ? height / (maxYRange) : 1;
|
| -
|
| -ctx.beginPath();
|
| -if (previousCounterUI) {
|
| -var prevYValues = previousCounterUI.graphYValues;
|
| -var currentY = prevYValues[this._maximumIndex];
|
| -ctx.moveTo(width, currentY);
|
| -var currentX = width;
|
| -for (var i = this._maximumIndex - 1; i >= this._minimumIndex; i--) {
|
| -currentY = prevYValues[i];
|
| -currentX = this._counters[i].x;
|
| -ctx.lineTo(currentX, currentY);
|
| -}
|
| -} else {
|
| -var lastY = originY + height;
|
| -ctx.moveTo(width, lastY);
|
| -ctx.lineTo(0, lastY);
|
| -}
|
| -
|
| -var currentY = originY + (height - this._counters[this._minimumIndex].total * yFactor);
|
| -ctx.lineTo(0, currentY);
|
| -for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
|
| -var counter = this._counters[i];
|
| -var x = counter.x;
|
| -currentY = originY + (height - counter.total * yFactor);
|
| -ctx.lineTo(x, currentY);
|
| -
|
| -yValues[i] = currentY;
|
| -}
|
| -ctx.lineTo(width, currentY);
|
| -ctx.closePath();
|
| -ctx.lineWidth = 1;
|
| -
|
| -ctx.strokeStyle = counterUI.strokeColor;
|
| -ctx.fillStyle = counterUI.graphColor;
|
| -ctx.fill();
|
| -ctx.stroke();
|
| -},
|
| -
|
| -_discardImageUnderMarker: function()
|
| -{
|
| -delete this._imageUnderMarker;
|
| -},
|
| -
|
| -__proto__: WebInspector.MemoryStatistics.prototype
|
| -}
|
| -
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.TimelineModel = function()
|
| -{
|
| -this._records = [];
|
| -this._stringPool = new StringPool();
|
| -this._minimumRecordTime = -1;
|
| -this._maximumRecordTime = -1;
|
| -this._collectionEnabled = false;
|
| -
|
| -WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, this._onRecordAdded, this);
|
| -}
|
| -
|
| -WebInspector.TimelineModel.TransferChunkLengthBytes = 5000000;
|
| -
|
| -WebInspector.TimelineModel.RecordType = {
|
| -Root: "Root",
|
| -Program: "Program",
|
| -EventDispatch: "EventDispatch",
|
| -
|
| -BeginFrame: "BeginFrame",
|
| -ScheduleStyleRecalculation: "ScheduleStyleRecalculation",
|
| -RecalculateStyles: "RecalculateStyles",
|
| -InvalidateLayout: "InvalidateLayout",
|
| -Layout: "Layout",
|
| -Paint: "Paint",
|
| -Rasterize: "Rasterize",
|
| -ScrollLayer: "ScrollLayer",
|
| -DecodeImage: "DecodeImage",
|
| -ResizeImage: "ResizeImage",
|
| -CompositeLayers: "CompositeLayers",
|
| -
|
| -ParseHTML: "ParseHTML",
|
| -
|
| -TimerInstall: "TimerInstall",
|
| -TimerRemove: "TimerRemove",
|
| -TimerFire: "TimerFire",
|
| -
|
| -XHRReadyStateChange: "XHRReadyStateChange",
|
| -XHRLoad: "XHRLoad",
|
| -EvaluateScript: "EvaluateScript",
|
| -
|
| -MarkLoad: "MarkLoad",
|
| -MarkDOMContent: "MarkDOMContent",
|
| -
|
| -TimeStamp: "TimeStamp",
|
| -Time: "Time",
|
| -TimeEnd: "TimeEnd",
|
| -
|
| -ScheduleResourceRequest: "ScheduleResourceRequest",
|
| -ResourceSendRequest: "ResourceSendRequest",
|
| -ResourceReceiveResponse: "ResourceReceiveResponse",
|
| -ResourceReceivedData: "ResourceReceivedData",
|
| -ResourceFinish: "ResourceFinish",
|
| -
|
| -FunctionCall: "FunctionCall",
|
| -GCEvent: "GCEvent",
|
| -
|
| -RequestAnimationFrame: "RequestAnimationFrame",
|
| -CancelAnimationFrame: "CancelAnimationFrame",
|
| -FireAnimationFrame: "FireAnimationFrame",
|
| -
|
| -WebSocketCreate : "WebSocketCreate",
|
| -WebSocketSendHandshakeRequest : "WebSocketSendHandshakeRequest",
|
| -WebSocketReceiveHandshakeResponse : "WebSocketReceiveHandshakeResponse",
|
| -WebSocketDestroy : "WebSocketDestroy",
|
| -}
|
| -
|
| -WebInspector.TimelineModel.Events = {
|
| -RecordAdded: "RecordAdded",
|
| -RecordsCleared: "RecordsCleared"
|
| -}
|
| -
|
| -WebInspector.TimelineModel.startTimeInSeconds = function(record)
|
| -{
|
| -return record.startTime / 1000;
|
| -}
|
| -
|
| -WebInspector.TimelineModel.endTimeInSeconds = function(record)
|
| -{
|
| -return (typeof record.endTime === "undefined" ? record.startTime : record.endTime) / 1000;
|
| -}
|
| -
|
| -WebInspector.TimelineModel.durationInSeconds = function(record)
|
| -{
|
| -return WebInspector.TimelineModel.endTimeInSeconds(record) - WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineModel.aggregateTimeForRecord = function(total, rawRecord)
|
| -{
|
| -var childrenTime = 0;
|
| -var children = rawRecord["children"] || [];
|
| -for (var i = 0; i < children.length; ++i) {
|
| -WebInspector.TimelineModel.aggregateTimeForRecord(total, children[i]);
|
| -childrenTime += WebInspector.TimelineModel.durationInSeconds(children[i]);
|
| -}
|
| -var categoryName = WebInspector.TimelinePresentationModel.recordStyle(rawRecord).category.name;
|
| -var ownTime = WebInspector.TimelineModel.durationInSeconds(rawRecord) - childrenTime;
|
| -total[categoryName] = (total[categoryName] || 0) + ownTime;
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineModel.aggregateTimeByCategory = function(total, addend)
|
| -{
|
| -for (var category in addend)
|
| -total[category] = (total[category] || 0) + addend[category];
|
| -}
|
| -
|
| -WebInspector.TimelineModel.prototype = {
|
| -
|
| -startRecord: function(includeDomCounters, includeNativeMemoryStatistics)
|
| -{
|
| -if (this._collectionEnabled)
|
| -return;
|
| -this.reset();
|
| -var maxStackFrames = WebInspector.settings.timelineLimitStackFramesFlag.get() ? WebInspector.settings.timelineStackFramesToCapture.get() : 30;
|
| -WebInspector.timelineManager.start(maxStackFrames, includeDomCounters, includeNativeMemoryStatistics);
|
| -this._collectionEnabled = true;
|
| -},
|
| -
|
| -stopRecord: function()
|
| -{
|
| -if (!this._collectionEnabled)
|
| -return;
|
| -WebInspector.timelineManager.stop();
|
| -this._collectionEnabled = false;
|
| -},
|
| -
|
| -get records()
|
| -{
|
| -return this._records;
|
| -},
|
| -
|
| -_onRecordAdded: function(event)
|
| -{
|
| -if (this._collectionEnabled)
|
| -this._addRecord(event.data);
|
| -},
|
| -
|
| -_addRecord: function(record)
|
| -{
|
| -this._stringPool.internObjectStrings(record);
|
| -this._records.push(record);
|
| -this._updateBoundaries(record);
|
| -this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded, record);
|
| -},
|
| -
|
| -
|
| -loadFromFile: function(file, progress)
|
| -{
|
| -var delegate = new WebInspector.TimelineModelLoadFromFileDelegate(this, progress);
|
| -var fileReader = this._createFileReader(file, delegate);
|
| -var loader = new WebInspector.TimelineModelLoader(this, fileReader, progress);
|
| -fileReader.start(loader);
|
| -},
|
| -
|
| -
|
| -loadFromURL: function(url, progress)
|
| -{
|
| -var delegate = new WebInspector.TimelineModelLoadFromFileDelegate(this, progress);
|
| -var urlReader = new WebInspector.ChunkedXHRReader(url, delegate);
|
| -var loader = new WebInspector.TimelineModelLoader(this, urlReader, progress);
|
| -urlReader.start(loader);
|
| -},
|
| -
|
| -_createFileReader: function(file, delegate)
|
| -{
|
| -return new WebInspector.ChunkedFileReader(file, WebInspector.TimelineModel.TransferChunkLengthBytes, delegate);
|
| -},
|
| -
|
| -_createFileWriter: function(fileName, callback)
|
| -{
|
| -var stream = new WebInspector.FileOutputStream();
|
| -stream.open(fileName, callback);
|
| -},
|
| -
|
| -saveToFile: function()
|
| -{
|
| -var now = new Date();
|
| -var fileName = "TimelineRawData-" + now.toISO8601Compact() + ".json";
|
| -function callback(stream)
|
| -{
|
| -var saver = new WebInspector.TimelineSaver(stream);
|
| -saver.save(this._records, window.navigator.appVersion);
|
| -}
|
| -this._createFileWriter(fileName, callback.bind(this));
|
| -},
|
| -
|
| -reset: function()
|
| -{
|
| -this._records = [];
|
| -this._stringPool.reset();
|
| -this._minimumRecordTime = -1;
|
| -this._maximumRecordTime = -1;
|
| -this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordsCleared);
|
| -},
|
| -
|
| -minimumRecordTime: function()
|
| -{
|
| -return this._minimumRecordTime;
|
| -},
|
| -
|
| -maximumRecordTime: function()
|
| -{
|
| -return this._maximumRecordTime;
|
| -},
|
| -
|
| -_updateBoundaries: function(record)
|
| -{
|
| -var startTime = WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -var endTime = WebInspector.TimelineModel.endTimeInSeconds(record);
|
| -
|
| -if (this._minimumRecordTime === -1 || startTime < this._minimumRecordTime)
|
| -this._minimumRecordTime = startTime;
|
| -if (this._maximumRecordTime === -1 || endTime > this._maximumRecordTime)
|
| -this._maximumRecordTime = endTime;
|
| -},
|
| -
|
| -
|
| -recordOffsetInSeconds: function(rawRecord)
|
| -{
|
| -return WebInspector.TimelineModel.startTimeInSeconds(rawRecord) - this._minimumRecordTime;
|
| -},
|
| -
|
| -__proto__: WebInspector.Object.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineModelLoader = function(model, reader, progress)
|
| -{
|
| -this._model = model;
|
| -this._reader = reader;
|
| -this._progress = progress;
|
| -this._buffer = "";
|
| -this._firstChunk = true;
|
| -}
|
| -
|
| -WebInspector.TimelineModelLoader.prototype = {
|
| -
|
| -write: function(chunk)
|
| -{
|
| -var data = this._buffer + chunk;
|
| -var lastIndex = 0;
|
| -var index;
|
| -do {
|
| -index = lastIndex;
|
| -lastIndex = WebInspector.findBalancedCurlyBrackets(data, index);
|
| -} while (lastIndex !== -1)
|
| -
|
| -var json = data.slice(0, index) + "]";
|
| -this._buffer = data.slice(index);
|
| -
|
| -if (!index)
|
| -return;
|
| -
|
| -
|
| -if (!this._firstChunk)
|
| -json = "[0" + json;
|
| -
|
| -var items;
|
| -try {
|
| -items = (JSON.parse(json));
|
| -} catch (e) {
|
| -WebInspector.showErrorMessage("Malformed timeline data.");
|
| -this._model.reset();
|
| -this._reader.cancel();
|
| -this._progress.done();
|
| -return;
|
| -}
|
| -
|
| -if (this._firstChunk) {
|
| -this._version = items[0];
|
| -this._firstChunk = false;
|
| -this._model.reset();
|
| -}
|
| -
|
| -
|
| -for (var i = 1, size = items.length; i < size; ++i)
|
| -this._model._addRecord(items[i]);
|
| -},
|
| -
|
| -close: function() { }
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineModelLoadFromFileDelegate = function(model, progress)
|
| -{
|
| -this._model = model;
|
| -this._progress = progress;
|
| -}
|
| -
|
| -WebInspector.TimelineModelLoadFromFileDelegate.prototype = {
|
| -onTransferStarted: function()
|
| -{
|
| -this._progress.setTitle(WebInspector.UIString("Loading\u2026"));
|
| -},
|
| -
|
| -
|
| -onChunkTransferred: function(reader)
|
| -{
|
| -if (this._progress.isCanceled()) {
|
| -reader.cancel();
|
| -this._progress.done();
|
| -this._model.reset();
|
| -return;
|
| -}
|
| -
|
| -var totalSize = reader.fileSize();
|
| -if (totalSize) {
|
| -this._progress.setTotalWork(totalSize);
|
| -this._progress.setWorked(reader.loadedSize());
|
| -}
|
| -},
|
| -
|
| -onTransferFinished: function()
|
| -{
|
| -this._progress.done();
|
| -},
|
| -
|
| -
|
| -onError: function(reader, event)
|
| -{
|
| -this._progress.done();
|
| -this._model.reset();
|
| -switch (event.target.error.code) {
|
| -case FileError.NOT_FOUND_ERR:
|
| -WebInspector.showErrorMessage(WebInspector.UIString("File \"%s\" not found.", reader.fileName()));
|
| -break;
|
| -case FileError.NOT_READABLE_ERR:
|
| -WebInspector.showErrorMessage(WebInspector.UIString("File \"%s\" is not readable", reader.fileName()));
|
| -break;
|
| -case FileError.ABORT_ERR:
|
| -break;
|
| -default:
|
| -WebInspector.showErrorMessage(WebInspector.UIString("An error occurred while reading the file \"%s\"", reader.fileName()));
|
| -}
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineSaver = function(stream)
|
| -{
|
| -this._stream = stream;
|
| -}
|
| -
|
| -WebInspector.TimelineSaver.prototype = {
|
| -
|
| -save: function(records, version)
|
| -{
|
| -this._records = records;
|
| -this._recordIndex = 0;
|
| -this._prologue = "[" + JSON.stringify(version);
|
| -
|
| -this._writeNextChunk(this._stream);
|
| -},
|
| -
|
| -_writeNextChunk: function(stream)
|
| -{
|
| -const separator = ",\n";
|
| -var data = [];
|
| -var length = 0;
|
| -
|
| -if (this._prologue) {
|
| -data.push(this._prologue);
|
| -length += this._prologue.length;
|
| -delete this._prologue;
|
| -} else {
|
| -if (this._recordIndex === this._records.length) {
|
| -stream.close();
|
| -return;
|
| -}
|
| -data.push("");
|
| -}
|
| -while (this._recordIndex < this._records.length) {
|
| -var item = JSON.stringify(this._records[this._recordIndex]);
|
| -var itemLength = item.length + separator.length;
|
| -if (length + itemLength > WebInspector.TimelineModel.TransferChunkLengthBytes)
|
| -break;
|
| -length += itemLength;
|
| -data.push(item);
|
| -++this._recordIndex;
|
| -}
|
| -if (this._recordIndex === this._records.length)
|
| -data.push(data.pop() + "]");
|
| -stream.write(data.join(separator), this._writeNextChunk.bind(this));
|
| -}
|
| -}
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.TimelineOverviewPane = function(model)
|
| -{
|
| -WebInspector.View.call(this);
|
| -this.element.id = "timeline-overview-panel";
|
| -
|
| -this._windowStartTime = 0;
|
| -this._windowEndTime = Infinity;
|
| -this._eventDividers = [];
|
| -
|
| -this._model = model;
|
| -
|
| -this._topPaneSidebarElement = document.createElement("div");
|
| -this._topPaneSidebarElement.id = "timeline-overview-sidebar";
|
| -
|
| -var overviewTreeElement = document.createElement("ol");
|
| -overviewTreeElement.className = "sidebar-tree";
|
| -this._topPaneSidebarElement.appendChild(overviewTreeElement);
|
| -this.element.appendChild(this._topPaneSidebarElement);
|
| -
|
| -var topPaneSidebarTree = new TreeOutline(overviewTreeElement);
|
| -
|
| -this._overviewItems = {};
|
| -this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Events] = new WebInspector.SidebarTreeElement("timeline-overview-sidebar-events",
|
| -WebInspector.UIString("Events"));
|
| -this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Frames] = new WebInspector.SidebarTreeElement("timeline-overview-sidebar-frames",
|
| -WebInspector.UIString("Frames"));
|
| -this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Memory] = new WebInspector.SidebarTreeElement("timeline-overview-sidebar-memory",
|
| -WebInspector.UIString("Memory"));
|
| -
|
| -for (var mode in this._overviewItems) {
|
| -var item = this._overviewItems[mode];
|
| -item.onselect = this.setMode.bind(this, mode);
|
| -topPaneSidebarTree.appendChild(item);
|
| -}
|
| -
|
| -this._overviewGrid = new WebInspector.OverviewGrid("timeline");
|
| -this.element.appendChild(this._overviewGrid.element);
|
| -
|
| -var separatorElement = document.createElement("div");
|
| -separatorElement.id = "timeline-overview-separator";
|
| -this.element.appendChild(separatorElement);
|
| -
|
| -this._innerSetMode(WebInspector.TimelineOverviewPane.Mode.Events);
|
| -
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -for (var category in categories)
|
| -categories[category].addEventListener(WebInspector.TimelineCategory.Events.VisibilityChanged, this._onCategoryVisibilityChanged, this);
|
| -
|
| -this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();
|
| -
|
| -model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded, this._onRecordAdded, this);
|
| -model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared, this._reset, this);
|
| -this._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged, this._onWindowChanged, this);
|
| -}
|
| -
|
| -WebInspector.TimelineOverviewPane.Mode = {
|
| -Events: "Events",
|
| -Frames: "Frames",
|
| -Memory: "Memory"
|
| -};
|
| -
|
| -WebInspector.TimelineOverviewPane.Events = {
|
| -ModeChanged: "ModeChanged",
|
| -WindowChanged: "WindowChanged"
|
| -};
|
| -
|
| -WebInspector.TimelineOverviewPane.prototype = {
|
| -wasShown: function()
|
| -{
|
| -this._update();
|
| -},
|
| -
|
| -onResize: function()
|
| -{
|
| -this._update();
|
| -},
|
| -
|
| -setMode: function(newMode)
|
| -{
|
| -if (this._currentMode === newMode)
|
| -return;
|
| -this._innerSetMode(newMode);
|
| -this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.ModeChanged, this._currentMode);
|
| -this._update();
|
| -},
|
| -
|
| -_innerSetMode: function(newMode)
|
| -{
|
| -if (this._overviewControl)
|
| -this._overviewControl.detach();
|
| -
|
| -this._currentMode = newMode;
|
| -this._overviewControl = this._createOverviewControl();
|
| -this._overviewControl.show(this._overviewGrid.element);
|
| -this._overviewItems[this._currentMode].revealAndSelect(false);
|
| -},
|
| -
|
| -
|
| -_createOverviewControl: function()
|
| -{
|
| -switch (this._currentMode) {
|
| -case WebInspector.TimelineOverviewPane.Mode.Events:
|
| -return new WebInspector.TimelineEventOverview(this._model);
|
| -case WebInspector.TimelineOverviewPane.Mode.Frames:
|
| -return new WebInspector.TimelineFrameOverview(this._model);
|
| -case WebInspector.TimelineOverviewPane.Mode.Memory:
|
| -return new WebInspector.TimelineMemoryOverview(this._model);
|
| -}
|
| -throw new Error("Invalid overview mode: " + this._currentMode);
|
| -},
|
| -
|
| -_onCategoryVisibilityChanged: function(event)
|
| -{
|
| -this._overviewControl.categoryVisibilityChanged();
|
| -},
|
| -
|
| -_update: function()
|
| -{
|
| -delete this._refreshTimeout;
|
| -
|
| -this._updateWindow();
|
| -this._overviewCalculator.setWindow(this._model.minimumRecordTime(), this._model.maximumRecordTime());
|
| -this._overviewCalculator.setDisplayWindow(0, this._overviewGrid.clientWidth());
|
| -
|
| -this._overviewControl.update();
|
| -this._overviewGrid.updateDividers(this._overviewCalculator);
|
| -this._updateEventDividers();
|
| -},
|
| -
|
| -_updateEventDividers: function()
|
| -{
|
| -var records = this._eventDividers;
|
| -this._overviewGrid.removeEventDividers();
|
| -var dividers = [];
|
| -for (var i = 0; i < records.length; ++i) {
|
| -var record = records[i];
|
| -var positions = this._overviewCalculator.computeBarGraphPercentages(record);
|
| -var dividerPosition = Math.round(positions.start * 10);
|
| -if (dividers[dividerPosition])
|
| -continue;
|
| -var divider = WebInspector.TimelinePresentationModel.createEventDivider(record.type);
|
| -divider.style.left = positions.start + "%";
|
| -dividers[dividerPosition] = divider;
|
| -}
|
| -this._overviewGrid.addEventDividers(dividers);
|
| -},
|
| -
|
| -
|
| -sidebarResized: function(width)
|
| -{
|
| -this._overviewGrid.element.style.left = width + "px";
|
| -this._topPaneSidebarElement.style.width = width + "px";
|
| -this._update();
|
| -},
|
| -
|
| -
|
| -addFrame: function(frame)
|
| -{
|
| -this._overviewControl.addFrame(frame);
|
| -this._scheduleRefresh();
|
| -},
|
| -
|
| -
|
| -zoomToFrame: function(frame)
|
| -{
|
| -var frameOverview = (this._overviewControl);
|
| -var window = frameOverview.framePosition(frame);
|
| -if (!window)
|
| -return;
|
| -
|
| -this._overviewGrid.setWindowPosition(window.start, window.end);
|
| -},
|
| -
|
| -_onRecordAdded: function(event)
|
| -{
|
| -var record = event.data;
|
| -var eventDividers = this._eventDividers;
|
| -function addEventDividers(record)
|
| -{
|
| -if (WebInspector.TimelinePresentationModel.isEventDivider(record))
|
| -eventDividers.push(record);
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords([record], addEventDividers);
|
| -this._scheduleRefresh();
|
| -},
|
| -
|
| -_reset: function()
|
| -{
|
| -this._windowStartTime = 0;
|
| -this._windowEndTime = Infinity;
|
| -this._overviewCalculator.reset();
|
| -this._overviewGrid.reset();
|
| -this._eventDividers = [];
|
| -this._overviewGrid.updateDividers(this._overviewCalculator);
|
| -this._overviewControl.reset();
|
| -this._update();
|
| -},
|
| -
|
| -windowStartTime: function()
|
| -{
|
| -return this._windowStartTime || this._model.minimumRecordTime();
|
| -},
|
| -
|
| -windowEndTime: function()
|
| -{
|
| -return this._windowEndTime < Infinity ? this._windowEndTime : this._model.maximumRecordTime();
|
| -},
|
| -
|
| -windowLeft: function()
|
| -{
|
| -return this._overviewGrid.windowLeft();
|
| -},
|
| -
|
| -windowRight: function()
|
| -{
|
| -return this._overviewGrid.windowRight();
|
| -},
|
| -
|
| -_onWindowChanged: function()
|
| -{
|
| -if (this._ignoreWindowChangedEvent)
|
| -return;
|
| -var times = this._overviewControl.windowTimes(this.windowLeft(), this.windowRight());
|
| -this._windowStartTime = times.startTime;
|
| -this._windowEndTime = times.endTime;
|
| -this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.WindowChanged);
|
| -},
|
| -
|
| -
|
| -setWindowTimes: function(left, right)
|
| -{
|
| -this._windowStartTime = left;
|
| -this._windowEndTime = right;
|
| -this._updateWindow();
|
| -},
|
| -
|
| -_updateWindow: function()
|
| -{
|
| -var offset = this._model.minimumRecordTime();
|
| -var timeSpan = this._model.maximumRecordTime() - offset;
|
| -var left = this._windowStartTime ? (this._windowStartTime - offset) / timeSpan : 0;
|
| -var right = this._windowEndTime < Infinity ? (this._windowEndTime - offset) / timeSpan : 1;
|
| -this._ignoreWindowChangedEvent = true;
|
| -this._overviewGrid.setWindow(left, right);
|
| -this._ignoreWindowChangedEvent = false;
|
| -},
|
| -
|
| -_scheduleRefresh: function()
|
| -{
|
| -if (this._refreshTimeout)
|
| -return;
|
| -if (!this.isShowing())
|
| -return;
|
| -this._refreshTimeout = setTimeout(this._update.bind(this), 300);
|
| -},
|
| -
|
| -__proto__: WebInspector.View.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineOverviewCalculator = function()
|
| -{
|
| -}
|
| -
|
| -WebInspector.TimelineOverviewCalculator.prototype = {
|
| -
|
| -computePosition: function(time)
|
| -{
|
| -return (time - this._minimumBoundary) / this.boundarySpan() * this._workingArea + this.paddingLeft;
|
| -},
|
| -
|
| -computeBarGraphPercentages: function(record)
|
| -{
|
| -var start = (WebInspector.TimelineModel.startTimeInSeconds(record) - this._minimumBoundary) / this.boundarySpan() * 100;
|
| -var end = (WebInspector.TimelineModel.endTimeInSeconds(record) - this._minimumBoundary) / this.boundarySpan() * 100;
|
| -return {start: start, end: end};
|
| -},
|
| -
|
| -
|
| -setWindow: function(minimum, maximum)
|
| -{
|
| -this._minimumBoundary = minimum >= 0 ? minimum : undefined;
|
| -this._maximumBoundary = maximum >= 0 ? maximum : undefined;
|
| -},
|
| -
|
| -
|
| -setDisplayWindow: function(paddingLeft, clientWidth)
|
| -{
|
| -this._workingArea = clientWidth - paddingLeft;
|
| -this.paddingLeft = paddingLeft;
|
| -},
|
| -
|
| -reset: function()
|
| -{
|
| -this.setWindow();
|
| -},
|
| -
|
| -formatTime: function(value)
|
| -{
|
| -return Number.secondsToString(value);
|
| -},
|
| -
|
| -maximumBoundary: function()
|
| -{
|
| -return this._maximumBoundary;
|
| -},
|
| -
|
| -minimumBoundary: function()
|
| -{
|
| -return this._minimumBoundary;
|
| -},
|
| -
|
| -zeroTime: function()
|
| -{
|
| -return this._minimumBoundary;
|
| -},
|
| -
|
| -boundarySpan: function()
|
| -{
|
| -return this._maximumBoundary - this._minimumBoundary;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineOverviewBase = function(model)
|
| -{
|
| -WebInspector.View.call(this);
|
| -this.element.classList.add("fill");
|
| -
|
| -this._model = model;
|
| -this._canvas = this.element.createChild("canvas", "fill");
|
| -this._context = this._canvas.getContext("2d");
|
| -}
|
| -
|
| -WebInspector.TimelineOverviewBase.prototype = {
|
| -update: function() { },
|
| -reset: function() { },
|
| -
|
| -categoryVisibilityChanged: function() { },
|
| -
|
| -
|
| -addFrame: function(frame) { },
|
| -
|
| -
|
| -windowTimes: function(windowLeft, windowRight)
|
| -{
|
| -var absoluteMin = this._model.minimumRecordTime();
|
| -var absoluteMax = this._model.maximumRecordTime();
|
| -return {
|
| -startTime: absoluteMin + (absoluteMax - absoluteMin) * windowLeft,
|
| -endTime: absoluteMin + (absoluteMax - absoluteMin) * windowRight
|
| -};
|
| -},
|
| -
|
| -_resetCanvas: function()
|
| -{
|
| -this._canvas.width = this.element.clientWidth * window.devicePixelRatio;
|
| -this._canvas.height = this.element.clientHeight * window.devicePixelRatio;
|
| -},
|
| -
|
| -__proto__: WebInspector.View.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineMemoryOverview = function(model)
|
| -{
|
| -WebInspector.TimelineOverviewBase.call(this, model);
|
| -this.element.id = "timeline-overview-memory";
|
| -
|
| -this._maxHeapSizeLabel = this.element.createChild("div", "max memory-graph-label");
|
| -this._minHeapSizeLabel = this.element.createChild("div", "min memory-graph-label");
|
| -}
|
| -
|
| -WebInspector.TimelineMemoryOverview.prototype = {
|
| -update: function()
|
| -{
|
| -var records = this._model.records;
|
| -if (!records.length)
|
| -return;
|
| -
|
| -this._resetCanvas();
|
| -
|
| -const lowerOffset = 3;
|
| -var maxUsedHeapSize = 0;
|
| -var minUsedHeapSize = 100000000000;
|
| -var minTime = this._model.minimumRecordTime();
|
| -var maxTime = this._model.maximumRecordTime();;
|
| -WebInspector.TimelinePresentationModel.forAllRecords(records, function(r) {
|
| -maxUsedHeapSize = Math.max(maxUsedHeapSize, r.usedHeapSize || maxUsedHeapSize);
|
| -minUsedHeapSize = Math.min(minUsedHeapSize, r.usedHeapSize || minUsedHeapSize);
|
| -});
|
| -minUsedHeapSize = Math.min(minUsedHeapSize, maxUsedHeapSize);
|
| -
|
| -var width = this._canvas.width;
|
| -var height = this._canvas.height - lowerOffset;
|
| -var xFactor = width / (maxTime - minTime);
|
| -var yFactor = height / (maxUsedHeapSize - minUsedHeapSize);
|
| -
|
| -var histogram = new Array(width);
|
| -WebInspector.TimelinePresentationModel.forAllRecords(records, function(r) {
|
| -if (!r.usedHeapSize)
|
| -return;
|
| -var x = Math.round((WebInspector.TimelineModel.endTimeInSeconds(r) - minTime) * xFactor);
|
| -var y = Math.round((r.usedHeapSize - minUsedHeapSize) * yFactor);
|
| -histogram[x] = Math.max(histogram[x] || 0, y);
|
| -});
|
| -
|
| -var ctx = this._context;
|
| -this._clear(ctx);
|
| -
|
| -
|
| -height = height + 1;
|
| -
|
| -ctx.beginPath();
|
| -var initialY = 0;
|
| -for (var k = 0; k < histogram.length; k++) {
|
| -if (histogram[k]) {
|
| -initialY = histogram[k];
|
| -break;
|
| -}
|
| -}
|
| -ctx.moveTo(0, height - initialY);
|
| -
|
| -for (var x = 0; x < histogram.length; x++) {
|
| -if (!histogram[x])
|
| -continue;
|
| -ctx.lineTo(x, height - histogram[x]);
|
| -}
|
| -
|
| -ctx.lineWidth = 0.5;
|
| -ctx.strokeStyle = "rgba(20,0,0,0.8)";
|
| -ctx.stroke();
|
| -
|
| -ctx.fillStyle = "rgba(214,225,254, 0.8);";
|
| -ctx.lineTo(width, this._canvas.height);
|
| -ctx.lineTo(0, this._canvas.height);
|
| -ctx.lineTo(0, height - initialY);
|
| -ctx.fill();
|
| -ctx.closePath();
|
| -
|
| -this._maxHeapSizeLabel.textContent = Number.bytesToString(maxUsedHeapSize);
|
| -this._minHeapSizeLabel.textContent = Number.bytesToString(minUsedHeapSize);
|
| -},
|
| -
|
| -_clear: function(ctx)
|
| -{
|
| -ctx.fillStyle = "rgba(255,255,255,0.8)";
|
| -ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);
|
| -},
|
| -
|
| -__proto__: WebInspector.TimelineOverviewBase.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineEventOverview = function(model)
|
| -{
|
| -WebInspector.TimelineOverviewBase.call(this, model);
|
| -
|
| -this.element.id = "timeline-overview-events";
|
| -
|
| -this._fillStyles = {};
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -for (var category in categories)
|
| -this._fillStyles[category] = WebInspector.TimelinePresentationModel.createFillStyleForCategory(this._context, 0, WebInspector.TimelineEventOverview._stripGradientHeight, categories[category]);
|
| -
|
| -this._disabledCategoryFillStyle = WebInspector.TimelinePresentationModel.createFillStyle(this._context, 0, WebInspector.TimelineEventOverview._stripGradientHeight,
|
| -"rgb(218, 218, 218)", "rgb(170, 170, 170)", "rgb(143, 143, 143)");
|
| -
|
| -this._disabledCategoryBorderStyle = "rgb(143, 143, 143)";
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineEventOverview._numberOfStrips = 3;
|
| -
|
| -
|
| -WebInspector.TimelineEventOverview._stripGradientHeight = 120;
|
| -
|
| -WebInspector.TimelineEventOverview.prototype = {
|
| -update: function()
|
| -{
|
| -this._resetCanvas();
|
| -
|
| -var stripHeight = Math.round(this._canvas.height / WebInspector.TimelineEventOverview._numberOfStrips);
|
| -var timeOffset = this._model.minimumRecordTime();
|
| -var timeSpan = this._model.maximumRecordTime() - timeOffset;
|
| -var scale = this._canvas.width / timeSpan;
|
| -
|
| -var lastBarByGroup = [];
|
| -
|
| -this._context.fillStyle = "rgba(0, 0, 0, 0.05)";
|
| -for (var i = 1; i < WebInspector.TimelineEventOverview._numberOfStrips; i += 2)
|
| -this._context.fillRect(0.5, i * stripHeight + 0.5, this._canvas.width, stripHeight);
|
| -
|
| -function appendRecord(record)
|
| -{
|
| -if (record.type === WebInspector.TimelineModel.RecordType.BeginFrame)
|
| -return;
|
| -var recordStart = Math.floor((WebInspector.TimelineModel.startTimeInSeconds(record) - timeOffset) * scale);
|
| -var recordEnd = Math.ceil((WebInspector.TimelineModel.endTimeInSeconds(record) - timeOffset) * scale);
|
| -var category = WebInspector.TimelinePresentationModel.categoryForRecord(record);
|
| -if (category.overviewStripGroupIndex < 0)
|
| -return;
|
| -var bar = lastBarByGroup[category.overviewStripGroupIndex];
|
| -
|
| -const barsMergeThreshold = 2;
|
| -if (bar && bar.category === category && bar.end + barsMergeThreshold >= recordStart) {
|
| -if (recordEnd > bar.end)
|
| -bar.end = recordEnd;
|
| -return;
|
| -}
|
| -if (bar)
|
| -this._renderBar(bar.start, bar.end, stripHeight, bar.category);
|
| -lastBarByGroup[category.overviewStripGroupIndex] = { start: recordStart, end: recordEnd, category: category };
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords(this._model.records, appendRecord.bind(this));
|
| -for (var i = 0; i < lastBarByGroup.length; ++i) {
|
| -if (lastBarByGroup[i])
|
| -this._renderBar(lastBarByGroup[i].start, lastBarByGroup[i].end, stripHeight, lastBarByGroup[i].category);
|
| -}
|
| -},
|
| -
|
| -categoryVisibilityChanged: function()
|
| -{
|
| -this.update();
|
| -},
|
| -
|
| -
|
| -_renderBar: function(begin, end, height, category)
|
| -{
|
| -const stripPadding = 4 * window.devicePixelRatio;
|
| -const innerStripHeight = height - 2 * stripPadding;
|
| -
|
| -var x = begin + 0.5;
|
| -var y = category.overviewStripGroupIndex * height + stripPadding + 0.5;
|
| -var width = Math.max(end - begin, 1);
|
| -
|
| -this._context.save();
|
| -this._context.translate(x, y);
|
| -this._context.scale(1, innerStripHeight / WebInspector.TimelineEventOverview._stripGradientHeight);
|
| -this._context.fillStyle = category.hidden ? this._disabledCategoryFillStyle : this._fillStyles[category.name];
|
| -this._context.fillRect(0, 0, width, WebInspector.TimelineEventOverview._stripGradientHeight);
|
| -this._context.strokeStyle = category.hidden ? this._disabledCategoryBorderStyle : category.borderColor;
|
| -this._context.strokeRect(0, 0, width, WebInspector.TimelineEventOverview._stripGradientHeight);
|
| -this._context.restore();
|
| -},
|
| -
|
| -__proto__: WebInspector.TimelineOverviewBase.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineFrameOverview = function(model)
|
| -{
|
| -WebInspector.TimelineOverviewBase.call(this, model);
|
| -this.element.id = "timeline-overview-frames";
|
| -this.reset();
|
| -
|
| -this._outerPadding = 4 * window.devicePixelRatio;
|
| -this._maxInnerBarWidth = 10 * window.devicePixelRatio;
|
| -
|
| -
|
| -this._actualPadding = 5 * window.devicePixelRatio;
|
| -this._actualOuterBarWidth = this._maxInnerBarWidth + this._actualPadding;
|
| -
|
| -this._fillStyles = {};
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -for (var category in categories)
|
| -this._fillStyles[category] = WebInspector.TimelinePresentationModel.createFillStyleForCategory(this._context, this._maxInnerBarWidth, 0, categories[category]);
|
| -}
|
| -
|
| -WebInspector.TimelineFrameOverview.prototype = {
|
| -reset: function()
|
| -{
|
| -this._recordsPerBar = 1;
|
| -this._barTimes = [];
|
| -this._frames = [];
|
| -},
|
| -
|
| -update: function()
|
| -{
|
| -const minBarWidth = 4 * window.devicePixelRatio;
|
| -this._resetCanvas();
|
| -this._framesPerBar = Math.max(1, this._frames.length * minBarWidth / this._canvas.width);
|
| -this._barTimes = [];
|
| -var visibleFrames = this._aggregateFrames(this._framesPerBar);
|
| -
|
| -const paddingTop = 4 * window.devicePixelRatio;
|
| -
|
| -
|
| -
|
| -const targetFPS = 30;
|
| -var fullBarLength = 1.0 / targetFPS;
|
| -if (fullBarLength < this._medianFrameLength)
|
| -fullBarLength = Math.min(this._medianFrameLength * 2, this._maxFrameLength);
|
| -
|
| -var scale = (this._canvas.height - paddingTop) / fullBarLength;
|
| -this._renderBars(visibleFrames, scale);
|
| -},
|
| -
|
| -
|
| -addFrame: function(frame)
|
| -{
|
| -this._frames.push(frame);
|
| -},
|
| -
|
| -framePosition: function(frame)
|
| -{
|
| -var frameNumber = this._frames.indexOf(frame);
|
| -if (frameNumber < 0)
|
| -return;
|
| -var barNumber = Math.floor(frameNumber / this._framesPerBar);
|
| -var firstBar = this._framesPerBar > 1 ? barNumber : Math.max(barNumber - 1, 0);
|
| -var lastBar = this._framesPerBar > 1 ? barNumber : Math.min(barNumber + 1, this._barTimes.length - 1);
|
| -return {
|
| -start: Math.ceil(this._barNumberToScreenPosition(firstBar) - this._actualPadding / 2),
|
| -end: Math.floor(this._barNumberToScreenPosition(lastBar + 1) - this._actualPadding / 2)
|
| -}
|
| -},
|
| -
|
| -
|
| -_aggregateFrames: function(framesPerBar)
|
| -{
|
| -var visibleFrames = [];
|
| -var durations = [];
|
| -
|
| -this._maxFrameLength = 0;
|
| -
|
| -for (var barNumber = 0, currentFrame = 0; currentFrame < this._frames.length; ++barNumber) {
|
| -var barStartTime = this._frames[currentFrame].startTime;
|
| -var longestFrame = null;
|
| -
|
| -for (var lastFrame = Math.min(Math.floor((barNumber + 1) * framesPerBar), this._frames.length);
|
| -currentFrame < lastFrame; ++currentFrame) {
|
| -if (!longestFrame || longestFrame.duration < this._frames[currentFrame].duration)
|
| -longestFrame = this._frames[currentFrame];
|
| -}
|
| -var barEndTime = this._frames[currentFrame - 1].endTime;
|
| -if (longestFrame) {
|
| -this._maxFrameLength = Math.max(this._maxFrameLength, longestFrame.duration);
|
| -visibleFrames.push(longestFrame);
|
| -this._barTimes.push({ startTime: barStartTime, endTime: barEndTime });
|
| -durations.push(longestFrame.duration);
|
| -}
|
| -}
|
| -this._medianFrameLength = durations.qselect(Math.floor(durations.length / 2));
|
| -return visibleFrames;
|
| -},
|
| -
|
| -
|
| -_renderBars: function(frames, scale)
|
| -{
|
| -const maxPadding = 5 * window.devicePixelRatio;
|
| -this._actualOuterBarWidth = Math.min((this._canvas.width - 2 * this._outerPadding) / frames.length, this._maxInnerBarWidth + maxPadding);
|
| -this._actualPadding = Math.min(Math.floor(this._actualOuterBarWidth / 3), maxPadding);
|
| -
|
| -var barWidth = this._actualOuterBarWidth - this._actualPadding;
|
| -for (var i = 0; i < frames.length; ++i)
|
| -this._renderBar(this._barNumberToScreenPosition(i), barWidth, frames[i], scale);
|
| -
|
| -this._drawFPSMarks(scale);
|
| -},
|
| -
|
| -
|
| -_barNumberToScreenPosition: function(n)
|
| -{
|
| -return this._outerPadding + this._actualOuterBarWidth * n;
|
| -},
|
| -
|
| -
|
| -_drawFPSMarks: function(scale)
|
| -{
|
| -const fpsMarks = [30, 60];
|
| -
|
| -this._context.save();
|
| -this._context.beginPath();
|
| -this._context.font = 9 * window.devicePixelRatio + "px monospace";
|
| -this._context.textAlign = "right";
|
| -this._context.textBaseline = "top";
|
| -
|
| -const labelPadding = 2 * window.devicePixelRatio;
|
| -var lineHeight = 12 * window.devicePixelRatio;
|
| -var labelTopMargin = 0;
|
| -
|
| -for (var i = 0; i < fpsMarks.length; ++i) {
|
| -var fps = fpsMarks[i];
|
| -
|
| -var y = this._canvas.height - Math.floor(1.0 / fps * scale) - 0.5;
|
| -var label = fps + " FPS ";
|
| -var labelWidth = this._context.measureText(label).width;
|
| -var labelX = this._canvas.width;
|
| -var labelY;
|
| -
|
| -if (labelTopMargin < y - lineHeight)
|
| -labelY = y - lineHeight;
|
| -else if (y + lineHeight < this._canvas.height)
|
| -labelY = y;
|
| -else
|
| -break;
|
| -
|
| -this._context.moveTo(0, y);
|
| -this._context.lineTo(this._canvas.width, y);
|
| -
|
| -this._context.fillStyle = "rgba(255, 255, 255, 0.75)";
|
| -this._context.fillRect(labelX - labelWidth - labelPadding, labelY, labelWidth + 2 * labelPadding, lineHeight);
|
| -this._context.fillStyle = "rgb(0, 0, 0)";
|
| -this._context.fillText(label, labelX, labelY);
|
| -labelTopMargin = labelY + lineHeight;
|
| -}
|
| -this._context.strokeStyle = "rgb(0, 0, 0, 0.3)";
|
| -this._context.stroke();
|
| -this._context.restore();
|
| -},
|
| -
|
| -_renderBar: function(left, width, frame, scale)
|
| -{
|
| -var categories = Object.keys(WebInspector.TimelinePresentationModel.categories());
|
| -if (!categories.length)
|
| -return;
|
| -var x = Math.floor(left) + 0.5;
|
| -width = Math.floor(width);
|
| -
|
| -for (var i = 0, bottomOffset = this._canvas.height; i < categories.length; ++i) {
|
| -var category = categories[i];
|
| -var duration = frame.timeByCategory[category];
|
| -
|
| -if (!duration)
|
| -continue;
|
| -var height = duration * scale;
|
| -var y = Math.floor(bottomOffset - height) + 0.5;
|
| -
|
| -this._context.save();
|
| -this._context.translate(x, 0);
|
| -this._context.scale(width / this._maxInnerBarWidth, 1);
|
| -this._context.fillStyle = this._fillStyles[category];
|
| -this._context.fillRect(0, y, this._maxInnerBarWidth, Math.floor(height));
|
| -this._context.strokeStyle = WebInspector.TimelinePresentationModel.categories()[category].borderColor;
|
| -this._context.beginPath();
|
| -this._context.moveTo(0, y);
|
| -this._context.lineTo(this._maxInnerBarWidth, y);
|
| -this._context.stroke();
|
| -this._context.restore();
|
| -
|
| -bottomOffset -= height - 1;
|
| -}
|
| -
|
| -var y0 = Math.floor(this._canvas.height - frame.duration * scale) + 0.5;
|
| -var y1 = this._canvas.height + 0.5;
|
| -
|
| -this._context.strokeStyle = "rgba(90, 90, 90, 0.3)";
|
| -this._context.beginPath();
|
| -this._context.moveTo(x, y1);
|
| -this._context.lineTo(x, y0);
|
| -this._context.lineTo(x + width, y0);
|
| -this._context.lineTo(x + width, y1);
|
| -this._context.stroke();
|
| -},
|
| -
|
| -windowTimes: function(windowLeft, windowRight)
|
| -{
|
| -var windowSpan = this.element.clientWidth;
|
| -var leftOffset = windowLeft * windowSpan - this._outerPadding + this._actualPadding;
|
| -var rightOffset = windowRight * windowSpan - this._outerPadding;
|
| -var bars = this.element.children;
|
| -var firstBar = Math.floor(Math.max(leftOffset, 0) / this._actualOuterBarWidth);
|
| -var lastBar = Math.min(Math.floor(rightOffset / this._actualOuterBarWidth), this._barTimes.length - 1);
|
| -const snapToRightTolerancePixels = 3;
|
| -return {
|
| -startTime: firstBar >= this._barTimes.length ? Infinity : this._barTimes[firstBar].startTime,
|
| -endTime: rightOffset + snapToRightTolerancePixels > windowSpan ? Infinity : this._barTimes[lastBar].endTime
|
| -}
|
| -},
|
| -
|
| -__proto__: WebInspector.TimelineOverviewBase.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineWindowFilter = function(pane)
|
| -{
|
| -this._pane = pane;
|
| -}
|
| -
|
| -WebInspector.TimelineWindowFilter.prototype = {
|
| -
|
| -accept: function(record)
|
| -{
|
| -return record.lastChildEndTime >= this._pane._windowStartTime && record.startTime <= this._pane._windowEndTime;
|
| -}
|
| -}
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel = function()
|
| -{
|
| -this._linkifier = new WebInspector.Linkifier();
|
| -this._glueRecords = false;
|
| -this._filters = [];
|
| -this.reset();
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.categories = function()
|
| -{
|
| -if (WebInspector.TimelinePresentationModel._categories)
|
| -return WebInspector.TimelinePresentationModel._categories;
|
| -WebInspector.TimelinePresentationModel._categories = {
|
| -loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), 0, "#5A8BCC", "#8EB6E9", "#70A2E3"),
|
| -scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), 1, "#D8AA34", "#F3D07A", "#F1C453"),
|
| -rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), 2, "#8266CC", "#AF9AEB", "#9A7EE6"),
|
| -painting: new WebInspector.TimelineCategory("painting", WebInspector.UIString("Painting"), 2, "#5FA050", "#8DC286", "#71B363"),
|
| -other: new WebInspector.TimelineCategory("other", WebInspector.UIString("Other"), -1, "#BBBBBB", "#DDDDDD", "#DDDDDD")
|
| -};
|
| -return WebInspector.TimelinePresentationModel._categories;
|
| -};
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel._initRecordStyles = function()
|
| -{
|
| -if (WebInspector.TimelinePresentationModel._recordStylesMap)
|
| -return WebInspector.TimelinePresentationModel._recordStylesMap;
|
| -
|
| -var recordTypes = WebInspector.TimelineModel.RecordType;
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -
|
| -var recordStyles = {};
|
| -recordStyles[recordTypes.Root] = { title: "#root", category: categories["loading"] };
|
| -recordStyles[recordTypes.Program] = { title: WebInspector.UIString("Other"), category: categories["other"] };
|
| -recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.BeginFrame] = { title: WebInspector.UIString("Frame Start"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.ScheduleStyleRecalculation] = { title: WebInspector.UIString("Schedule Style Recalculation"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.InvalidateLayout] = { title: WebInspector.UIString("Invalidate Layout"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: categories["painting"] };
|
| -recordStyles[recordTypes.Rasterize] = { title: WebInspector.UIString("Rasterize"), category: categories["painting"] };
|
| -recordStyles[recordTypes.ScrollLayer] = { title: WebInspector.UIString("Scroll"), category: categories["rendering"] };
|
| -recordStyles[recordTypes.DecodeImage] = { title: WebInspector.UIString("Image Decode"), category: categories["painting"] };
|
| -recordStyles[recordTypes.ResizeImage] = { title: WebInspector.UIString("Image Resize"), category: categories["painting"] };
|
| -recordStyles[recordTypes.CompositeLayers] = { title: WebInspector.UIString("Composite Layers"), category: categories["painting"] };
|
| -recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse HTML"), category: categories["loading"] };
|
| -recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: categories["loading"] };
|
| -recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: categories["loading"] };
|
| -recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: categories["loading"] };
|
| -recordStyles[recordTypes.FunctionCall] = { title: WebInspector.UIString("Function Call"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.ResourceReceivedData] = { title: WebInspector.UIString("Receive Data"), category: categories["loading"] };
|
| -recordStyles[recordTypes.GCEvent] = { title: WebInspector.UIString("GC Event"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.MarkDOMContent] = { title: WebInspector.UIString("DOMContentLoaded event"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.MarkLoad] = { title: WebInspector.UIString("Load event"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.TimeStamp] = { title: WebInspector.UIString("Stamp"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.Time] = { title: WebInspector.UIString("Time"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.TimeEnd] = { title: WebInspector.UIString("Time End"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.ScheduleResourceRequest] = { title: WebInspector.UIString("Schedule Request"), category: categories["loading"] };
|
| -recordStyles[recordTypes.RequestAnimationFrame] = { title: WebInspector.UIString("Request Animation Frame"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.CancelAnimationFrame] = { title: WebInspector.UIString("Cancel Animation Frame"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.FireAnimationFrame] = { title: WebInspector.UIString("Animation Frame Fired"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.WebSocketCreate] = { title: WebInspector.UIString("Create WebSocket"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.WebSocketSendHandshakeRequest] = { title: WebInspector.UIString("Send WebSocket Handshake"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.WebSocketReceiveHandshakeResponse] = { title: WebInspector.UIString("Receive WebSocket Handshake"), category: categories["scripting"] };
|
| -recordStyles[recordTypes.WebSocketDestroy] = { title: WebInspector.UIString("Destroy WebSocket"), category: categories["scripting"] };
|
| -
|
| -WebInspector.TimelinePresentationModel._recordStylesMap = recordStyles;
|
| -return recordStyles;
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.recordStyle = function(record)
|
| -{
|
| -var recordStyles = WebInspector.TimelinePresentationModel._initRecordStyles();
|
| -var result = recordStyles[record.type];
|
| -if (!result) {
|
| -result = {
|
| -title: WebInspector.UIString("Unknown: %s", record.type),
|
| -category: WebInspector.TimelinePresentationModel.categories()["other"]
|
| -};
|
| -recordStyles[record.type] = result;
|
| -}
|
| -return result;
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.categoryForRecord = function(record)
|
| -{
|
| -return WebInspector.TimelinePresentationModel.recordStyle(record).category;
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.isEventDivider = function(record)
|
| -{
|
| -var recordTypes = WebInspector.TimelineModel.RecordType;
|
| -if (record.type === recordTypes.TimeStamp)
|
| -return true;
|
| -if (record.type === recordTypes.MarkDOMContent || record.type === recordTypes.MarkLoad) {
|
| -if (record.data && ((typeof record.data.isMainFrame) === "boolean"))
|
| -return record.data.isMainFrame;
|
| -}
|
| -return false;
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.forAllRecords = function(recordsArray, preOrderCallback, postOrderCallback)
|
| -{
|
| -if (!recordsArray)
|
| -return;
|
| -var stack = [{array: recordsArray, index: 0}];
|
| -while (stack.length) {
|
| -var entry = stack[stack.length - 1];
|
| -var records = entry.array;
|
| -if (entry.index < records.length) {
|
| -var record = records[entry.index];
|
| -if (preOrderCallback && preOrderCallback(record))
|
| -return;
|
| -if (record.children)
|
| -stack.push({array: record.children, index: 0, record: record});
|
| -else if (postOrderCallback && postOrderCallback(record))
|
| -return;
|
| -++entry.index;
|
| -} else {
|
| -if (entry.record && postOrderCallback && postOrderCallback(entry.record))
|
| -return;
|
| -stack.pop();
|
| -}
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.needsPreviewElement = function(recordType)
|
| -{
|
| -if (!recordType)
|
| -return false;
|
| -const recordTypes = WebInspector.TimelineModel.RecordType;
|
| -switch (recordType) {
|
| -case recordTypes.ScheduleResourceRequest:
|
| -case recordTypes.ResourceSendRequest:
|
| -case recordTypes.ResourceReceiveResponse:
|
| -case recordTypes.ResourceReceivedData:
|
| -case recordTypes.ResourceFinish:
|
| -return true;
|
| -default:
|
| -return false;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.createEventDivider = function(recordType, title)
|
| -{
|
| -var eventDivider = document.createElement("div");
|
| -eventDivider.className = "resources-event-divider";
|
| -var recordTypes = WebInspector.TimelineModel.RecordType;
|
| -
|
| -if (recordType === recordTypes.MarkDOMContent)
|
| -eventDivider.className += " resources-blue-divider";
|
| -else if (recordType === recordTypes.MarkLoad)
|
| -eventDivider.className += " resources-red-divider";
|
| -else if (recordType === recordTypes.TimeStamp)
|
| -eventDivider.className += " resources-orange-divider";
|
| -else if (recordType === recordTypes.BeginFrame)
|
| -eventDivider.className += " timeline-frame-divider";
|
| -
|
| -if (title)
|
| -eventDivider.title = title;
|
| -
|
| -return eventDivider;
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel._hiddenRecords = { }
|
| -WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkDOMContent] = 1;
|
| -WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkLoad] = 1;
|
| -WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation] = 1;
|
| -WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.InvalidateLayout] = 1;
|
| -
|
| -WebInspector.TimelinePresentationModel.prototype = {
|
| -
|
| -addFilter: function(filter)
|
| -{
|
| -this._filters.push(filter);
|
| -},
|
| -
|
| -
|
| -removeFilter: function(filter)
|
| -{
|
| -var index = this._filters.indexOf(filter);
|
| -if (index !== -1)
|
| -this._filters.splice(index, 1);
|
| -},
|
| -
|
| -rootRecord: function()
|
| -{
|
| -return this._rootRecord;
|
| -},
|
| -
|
| -frames: function()
|
| -{
|
| -return this._frames;
|
| -},
|
| -
|
| -reset: function()
|
| -{
|
| -this._linkifier.reset();
|
| -this._rootRecord = new WebInspector.TimelinePresentationModel.Record(this, { type: WebInspector.TimelineModel.RecordType.Root }, null, null, null, false);
|
| -this._sendRequestRecords = {};
|
| -this._scheduledResourceRequests = {};
|
| -this._timerRecords = {};
|
| -this._requestAnimationFrameRecords = {};
|
| -this._eventDividerRecords = [];
|
| -this._timeRecords = {};
|
| -this._timeRecordStack = [];
|
| -this._frames = [];
|
| -this._minimumRecordTime = -1;
|
| -this._layoutInvalidateStack = {};
|
| -this._lastScheduleStyleRecalculation = {};
|
| -this._webSocketCreateRecords = {};
|
| -this._coalescingBuckets = {};
|
| -},
|
| -
|
| -addFrame: function(frame)
|
| -{
|
| -this._frames.push(frame);
|
| -},
|
| -
|
| -addRecord: function(record)
|
| -{
|
| -if (this._minimumRecordTime === -1 || record.startTime < this._minimumRecordTime)
|
| -this._minimumRecordTime = WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -
|
| -var records;
|
| -if (record.type === WebInspector.TimelineModel.RecordType.Program)
|
| -records = record.children;
|
| -else
|
| -records = [record];
|
| -
|
| -var formattedRecords = [];
|
| -var recordsCount = records.length;
|
| -for (var i = 0; i < recordsCount; ++i)
|
| -formattedRecords.push(this._innerAddRecord(records[i], this._rootRecord));
|
| -return formattedRecords;
|
| -},
|
| -
|
| -_innerAddRecord: function(record, parentRecord)
|
| -{
|
| -const recordTypes = WebInspector.TimelineModel.RecordType;
|
| -var isHiddenRecord = record.type in WebInspector.TimelinePresentationModel._hiddenRecords;
|
| -var origin;
|
| -var coalescingBucket;
|
| -
|
| -if (!isHiddenRecord) {
|
| -var newParentRecord = this._findParentRecord(record);
|
| -if (newParentRecord) {
|
| -origin = parentRecord;
|
| -parentRecord = newParentRecord;
|
| -}
|
| -
|
| -if (parentRecord === this._rootRecord)
|
| -coalescingBucket = record.thread ? record.type : "mainThread";
|
| -var coalescedRecord = this._findCoalescedParent(record, parentRecord, coalescingBucket);
|
| -if (coalescedRecord) {
|
| -if (!origin)
|
| -origin = parentRecord;
|
| -parentRecord = coalescedRecord;
|
| -}
|
| -}
|
| -
|
| -var children = record.children;
|
| -var scriptDetails;
|
| -if (record.data && record.data["scriptName"]) {
|
| -scriptDetails = {
|
| -scriptName: record.data["scriptName"],
|
| -scriptLine: record.data["scriptLine"]
|
| -}
|
| -};
|
| -
|
| -if ((record.type === recordTypes.TimerFire || record.type === recordTypes.FireAnimationFrame) && children && children.length) {
|
| -var childRecord = children[0];
|
| -if (childRecord.type === recordTypes.FunctionCall) {
|
| -scriptDetails = {
|
| -scriptName: childRecord.data["scriptName"],
|
| -scriptLine: childRecord.data["scriptLine"]
|
| -};
|
| -children = childRecord.children.concat(children.slice(1));
|
| -}
|
| -}
|
| -
|
| -var formattedRecord = new WebInspector.TimelinePresentationModel.Record(this, record, parentRecord, origin, scriptDetails, isHiddenRecord);
|
| -
|
| -if (WebInspector.TimelinePresentationModel.isEventDivider(formattedRecord))
|
| -this._eventDividerRecords.push(formattedRecord);
|
| -
|
| -if (isHiddenRecord)
|
| -return formattedRecord;
|
| -
|
| -formattedRecord.collapsed = parentRecord === this._rootRecord;
|
| -if (coalescingBucket)
|
| -this._coalescingBuckets[coalescingBucket] = formattedRecord;
|
| -
|
| -var childrenCount = children ? children.length : 0;
|
| -for (var i = 0; i < childrenCount; ++i)
|
| -this._innerAddRecord(children[i], formattedRecord);
|
| -
|
| -formattedRecord.calculateAggregatedStats();
|
| -
|
| -if (origin)
|
| -this._updateAncestorStats(formattedRecord);
|
| -
|
| -if (parentRecord.coalesced && parentRecord.startTime > formattedRecord.startTime)
|
| -parentRecord._record.startTime = record.startTime;
|
| -
|
| -origin = formattedRecord.origin();
|
| -if (!origin.isRoot() && !origin.coalesced)
|
| -origin.selfTime -= formattedRecord.endTime - formattedRecord.startTime;
|
| -return formattedRecord;
|
| -},
|
| -
|
| -
|
| -_updateAncestorStats: function(record)
|
| -{
|
| -var lastChildEndTime = record.lastChildEndTime;
|
| -var aggregatedStats = record.aggregatedStats;
|
| -for (var currentRecord = record.parent; currentRecord && !currentRecord.isRoot(); currentRecord = currentRecord.parent) {
|
| -currentRecord._cpuTime += record._cpuTime;
|
| -if (currentRecord.lastChildEndTime < lastChildEndTime)
|
| -currentRecord.lastChildEndTime = lastChildEndTime;
|
| -for (var category in aggregatedStats)
|
| -currentRecord.aggregatedStats[category] += aggregatedStats[category];
|
| -}
|
| -},
|
| -
|
| -
|
| -_findCoalescedParent: function(record, newParent, bucket)
|
| -{
|
| -const coalescingThresholdSeconds = 0.005;
|
| -
|
| -var lastRecord = bucket ? this._coalescingBuckets[bucket] : newParent.children.peekLast();
|
| -if (lastRecord && lastRecord.coalesced)
|
| -lastRecord = lastRecord.children.peekLast();
|
| -var startTime = WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -var endTime = WebInspector.TimelineModel.endTimeInSeconds(record);
|
| -if (!lastRecord || lastRecord.type !== record.type)
|
| -return null;
|
| -if (lastRecord.endTime + coalescingThresholdSeconds < startTime)
|
| -return null;
|
| -if (endTime + coalescingThresholdSeconds < lastRecord.startTime)
|
| -return null;
|
| -if (lastRecord.parent.coalesced)
|
| -return lastRecord.parent;
|
| -return this._replaceWithCoalescedRecord(lastRecord);
|
| -},
|
| -
|
| -
|
| -_replaceWithCoalescedRecord: function(record)
|
| -{
|
| -var rawRecord = {
|
| -type: record._record.type,
|
| -startTime: record._record.startTime,
|
| -endTime: record._record.endTime,
|
| -data: { }
|
| -};
|
| -if (record._record.thread)
|
| -rawRecord.thread = "aggregated";
|
| -var coalescedRecord = new WebInspector.TimelinePresentationModel.Record(this, rawRecord, null, null, null, false);
|
| -var parent = record.parent;
|
| -
|
| -coalescedRecord.coalesced = true;
|
| -coalescedRecord.collapsed = true;
|
| -coalescedRecord._children.push(record);
|
| -record.parent = coalescedRecord;
|
| -coalescedRecord.calculateAggregatedStats();
|
| -if (record.hasWarning || record.childHasWarning)
|
| -coalescedRecord.childHasWarning = true;
|
| -
|
| -coalescedRecord.parent = parent;
|
| -parent._children[parent._children.indexOf(record)] = coalescedRecord;
|
| -return coalescedRecord;
|
| -},
|
| -
|
| -_findParentRecord: function(record)
|
| -{
|
| -if (!this._glueRecords)
|
| -return null;
|
| -var recordTypes = WebInspector.TimelineModel.RecordType;
|
| -
|
| -switch (record.type) {
|
| -case recordTypes.ResourceReceiveResponse:
|
| -case recordTypes.ResourceFinish:
|
| -case recordTypes.ResourceReceivedData:
|
| -return this._sendRequestRecords[record.data["requestId"]];
|
| -
|
| -case recordTypes.ResourceSendRequest:
|
| -return this._rootRecord;
|
| -
|
| -case recordTypes.TimerFire:
|
| -return this._timerRecords[record.data["timerId"]];
|
| -
|
| -case recordTypes.ResourceSendRequest:
|
| -return this._scheduledResourceRequests[record.data["url"]];
|
| -
|
| -case recordTypes.FireAnimationFrame:
|
| -return this._requestAnimationFrameRecords[record.data["id"]];
|
| -
|
| -case recordTypes.Time:
|
| -return this._rootRecord;
|
| -
|
| -case recordTypes.TimeEnd:
|
| -return this._timeRecords[record.data["message"]];
|
| -}
|
| -},
|
| -
|
| -setGlueRecords: function(glue)
|
| -{
|
| -this._glueRecords = glue;
|
| -},
|
| -
|
| -invalidateFilteredRecords: function()
|
| -{
|
| -delete this._filteredRecords;
|
| -},
|
| -
|
| -filteredRecords: function()
|
| -{
|
| -if (this._filteredRecords)
|
| -return this._filteredRecords;
|
| -
|
| -var recordsInWindow = [];
|
| -
|
| -var stack = [{children: this._rootRecord.children, index: 0, parentIsCollapsed: false}];
|
| -while (stack.length) {
|
| -var entry = stack[stack.length - 1];
|
| -var records = entry.children;
|
| -if (records && entry.index < records.length) {
|
| -var record = records[entry.index];
|
| -++entry.index;
|
| -
|
| -if (this.isVisible(record)) {
|
| -++record.parent._invisibleChildrenCount;
|
| -if (!entry.parentIsCollapsed)
|
| -recordsInWindow.push(record);
|
| -}
|
| -
|
| -record._invisibleChildrenCount = 0;
|
| -
|
| -stack.push({children: record.children,
|
| -index: 0,
|
| -parentIsCollapsed: (entry.parentIsCollapsed || record.collapsed),
|
| -parentRecord: record,
|
| -windowLengthBeforeChildrenTraversal: recordsInWindow.length});
|
| -} else {
|
| -stack.pop();
|
| -if (entry.parentRecord)
|
| -entry.parentRecord._visibleChildrenCount = recordsInWindow.length - entry.windowLengthBeforeChildrenTraversal;
|
| -}
|
| -}
|
| -
|
| -this._filteredRecords = recordsInWindow;
|
| -return recordsInWindow;
|
| -},
|
| -
|
| -filteredFrames: function(startTime, endTime)
|
| -{
|
| -function compareStartTime(value, object)
|
| -{
|
| -return value - object.startTime;
|
| -}
|
| -function compareEndTime(value, object)
|
| -{
|
| -return value - object.endTime;
|
| -}
|
| -var firstFrame = insertionIndexForObjectInListSortedByFunction(startTime, this._frames, compareStartTime);
|
| -var lastFrame = insertionIndexForObjectInListSortedByFunction(endTime, this._frames, compareEndTime);
|
| -while (lastFrame < this._frames.length && this._frames[lastFrame].endTime <= endTime)
|
| -++lastFrame;
|
| -return this._frames.slice(firstFrame, lastFrame);
|
| -},
|
| -
|
| -eventDividerRecords: function()
|
| -{
|
| -return this._eventDividerRecords;
|
| -},
|
| -
|
| -isVisible: function(record)
|
| -{
|
| -for (var i = 0; i < this._filters.length; ++i) {
|
| -if (!this._filters[i].accept(record))
|
| -return false;
|
| -}
|
| -return true;
|
| -},
|
| -
|
| -
|
| -generateMainThreadBarPopupContent: function(info)
|
| -{
|
| -var firstTaskIndex = info.firstTaskIndex;
|
| -var lastTaskIndex = info.lastTaskIndex;
|
| -var tasks = info.tasks;
|
| -var messageCount = lastTaskIndex - firstTaskIndex + 1;
|
| -var cpuTime = 0;
|
| -
|
| -for (var i = firstTaskIndex; i <= lastTaskIndex; ++i) {
|
| -var task = tasks[i];
|
| -cpuTime += task.endTime - task.startTime;
|
| -}
|
| -var startTime = tasks[firstTaskIndex].startTime;
|
| -var endTime = tasks[lastTaskIndex].endTime;
|
| -var duration = endTime - startTime;
|
| -var offset = this._minimumRecordTime;
|
| -
|
| -var contentHelper = new WebInspector.PopoverContentHelper(WebInspector.UIString("CPU"));
|
| -var durationText = WebInspector.UIString("%s (at %s)", Number.secondsToString(duration, true),
|
| -Number.secondsToString(startTime - offset, true));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Duration"), durationText);
|
| -contentHelper.appendTextRow(WebInspector.UIString("CPU time"), Number.secondsToString(cpuTime, true));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Message Count"), messageCount);
|
| -return contentHelper.contentTable();
|
| -},
|
| -
|
| -__proto__: WebInspector.Object.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.Record = function(presentationModel, record, parentRecord, origin, scriptDetails, hidden)
|
| -{
|
| -this._linkifier = presentationModel._linkifier;
|
| -this._aggregatedStats = {};
|
| -this._record = record;
|
| -this._children = [];
|
| -if (!hidden && parentRecord) {
|
| -this.parent = parentRecord;
|
| -if (this.isBackground)
|
| -WebInspector.TimelinePresentationModel.insertRetrospectiveRecord(parentRecord, this);
|
| -else
|
| -parentRecord.children.push(this);
|
| -}
|
| -if (origin)
|
| -this._origin = origin;
|
| -
|
| -this._selfTime = this.endTime - this.startTime;
|
| -this._lastChildEndTime = this.endTime;
|
| -this._startTimeOffset = this.startTime - presentationModel._minimumRecordTime;
|
| -
|
| -if (record.data && record.data["url"])
|
| -this.url = record.data["url"];
|
| -if (scriptDetails) {
|
| -this.scriptName = scriptDetails.scriptName;
|
| -this.scriptLine = scriptDetails.scriptLine;
|
| -}
|
| -if (parentRecord && parentRecord.callSiteStackTrace)
|
| -this.callSiteStackTrace = parentRecord.callSiteStackTrace;
|
| -
|
| -var recordTypes = WebInspector.TimelineModel.RecordType;
|
| -switch (record.type) {
|
| -case recordTypes.ResourceSendRequest:
|
| -
|
| -presentationModel._sendRequestRecords[record.data["requestId"]] = this;
|
| -break;
|
| -
|
| -case recordTypes.ScheduleResourceRequest:
|
| -presentationModel._scheduledResourceRequests[record.data["url"]] = this;
|
| -break;
|
| -
|
| -case recordTypes.ResourceReceiveResponse:
|
| -var sendRequestRecord = presentationModel._sendRequestRecords[record.data["requestId"]];
|
| -if (sendRequestRecord) {
|
| -this.url = sendRequestRecord.url;
|
| -
|
| -sendRequestRecord._refreshDetails();
|
| -if (sendRequestRecord.parent !== presentationModel._rootRecord && sendRequestRecord.parent.type === recordTypes.ScheduleResourceRequest)
|
| -sendRequestRecord.parent._refreshDetails();
|
| -}
|
| -break;
|
| -
|
| -case recordTypes.ResourceReceivedData:
|
| -case recordTypes.ResourceFinish:
|
| -var sendRequestRecord = presentationModel._sendRequestRecords[record.data["requestId"]];
|
| -if (sendRequestRecord)
|
| -this.url = sendRequestRecord.url;
|
| -break;
|
| -
|
| -case recordTypes.TimerInstall:
|
| -this.timeout = record.data["timeout"];
|
| -this.singleShot = record.data["singleShot"];
|
| -presentationModel._timerRecords[record.data["timerId"]] = this;
|
| -break;
|
| -
|
| -case recordTypes.TimerFire:
|
| -var timerInstalledRecord = presentationModel._timerRecords[record.data["timerId"]];
|
| -if (timerInstalledRecord) {
|
| -this.callSiteStackTrace = timerInstalledRecord.stackTrace;
|
| -this.timeout = timerInstalledRecord.timeout;
|
| -this.singleShot = timerInstalledRecord.singleShot;
|
| -}
|
| -break;
|
| -
|
| -case recordTypes.RequestAnimationFrame:
|
| -presentationModel._requestAnimationFrameRecords[record.data["id"]] = this;
|
| -break;
|
| -
|
| -case recordTypes.FireAnimationFrame:
|
| -var requestAnimationRecord = presentationModel._requestAnimationFrameRecords[record.data["id"]];
|
| -if (requestAnimationRecord)
|
| -this.callSiteStackTrace = requestAnimationRecord.stackTrace;
|
| -break;
|
| -
|
| -case recordTypes.Time:
|
| -var message = record.data["message"];
|
| -var oldReference = presentationModel._timeRecords[message];
|
| -if (oldReference)
|
| -break;
|
| -presentationModel._timeRecords[message] = this;
|
| -if (origin)
|
| -presentationModel._timeRecordStack.push(this);
|
| -break;
|
| -
|
| -case recordTypes.TimeEnd:
|
| -var message = record.data["message"];
|
| -var timeRecord = presentationModel._timeRecords[message];
|
| -delete presentationModel._timeRecords[message];
|
| -if (timeRecord) {
|
| -this.timeRecord = timeRecord;
|
| -timeRecord.timeEndRecord = this;
|
| -var intervalDuration = this.startTime - timeRecord.startTime;
|
| -this.intervalDuration = intervalDuration;
|
| -timeRecord.intervalDuration = intervalDuration;
|
| -if (!origin)
|
| -break;
|
| -var recordStack = presentationModel._timeRecordStack;
|
| -recordStack.splice(recordStack.indexOf(timeRecord), 1);
|
| -for (var index = recordStack.length; index; --index) {
|
| -var openRecord = recordStack[index - 1];
|
| -if (openRecord.startTime > timeRecord.startTime)
|
| -continue;
|
| -WebInspector.TimelinePresentationModel.adoptRecord(openRecord, timeRecord);
|
| -break;
|
| -}
|
| -}
|
| -break;
|
| -
|
| -case recordTypes.ScheduleStyleRecalculation:
|
| -presentationModel._lastScheduleStyleRecalculation[this.frameId] = this;
|
| -break;
|
| -
|
| -case recordTypes.RecalculateStyles:
|
| -var scheduleStyleRecalculationRecord = presentationModel._lastScheduleStyleRecalculation[this.frameId];
|
| -if (!scheduleStyleRecalculationRecord)
|
| -break;
|
| -this.callSiteStackTrace = scheduleStyleRecalculationRecord.stackTrace;
|
| -break;
|
| -
|
| -case recordTypes.InvalidateLayout:
|
| -
|
| -
|
| -var styleRecalcStack;
|
| -if (!presentationModel._layoutInvalidateStack[this.frameId]) {
|
| -for (var outerRecord = parentRecord; outerRecord; outerRecord = record.parent) {
|
| -if (outerRecord.type === recordTypes.RecalculateStyles) {
|
| -styleRecalcStack = outerRecord.callSiteStackTrace;
|
| -break;
|
| -}
|
| -}
|
| -}
|
| -presentationModel._layoutInvalidateStack[this.frameId] = styleRecalcStack || this.stackTrace;
|
| -break;
|
| -
|
| -case recordTypes.Layout:
|
| -var layoutInvalidateStack = presentationModel._layoutInvalidateStack[this.frameId];
|
| -if (layoutInvalidateStack)
|
| -this.callSiteStackTrace = layoutInvalidateStack;
|
| -if (this.stackTrace)
|
| -this.setHasWarning();
|
| -presentationModel._layoutInvalidateStack[this.frameId] = null;
|
| -this.highlightQuad = record.data.root || WebInspector.TimelinePresentationModel.quadFromRectData(record.data);
|
| -break;
|
| -
|
| -case recordTypes.Paint:
|
| -this.highlightQuad = record.data.clip || WebInspector.TimelinePresentationModel.quadFromRectData(record.data);
|
| -break;
|
| -
|
| -case recordTypes.WebSocketCreate:
|
| -this.webSocketURL = record.data["url"];
|
| -if (typeof record.data["webSocketProtocol"] !== "undefined")
|
| -this.webSocketProtocol = record.data["webSocketProtocol"];
|
| -presentationModel._webSocketCreateRecords[record.data["identifier"]] = this;
|
| -break;
|
| -
|
| -case recordTypes.WebSocketSendHandshakeRequest:
|
| -case recordTypes.WebSocketReceiveHandshakeResponse:
|
| -case recordTypes.WebSocketDestroy:
|
| -var webSocketCreateRecord = presentationModel._webSocketCreateRecords[record.data["identifier"]];
|
| -if (webSocketCreateRecord) {
|
| -this.webSocketURL = webSocketCreateRecord.webSocketURL;
|
| -if (typeof webSocketCreateRecord.webSocketProtocol !== "undefined")
|
| -this.webSocketProtocol = webSocketCreateRecord.webSocketProtocol;
|
| -}
|
| -break;
|
| -}
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.adoptRecord = function(newParent, record)
|
| -{
|
| -record.parent.children.splice(record.parent.children.indexOf(record));
|
| -WebInspector.TimelinePresentationModel.insertRetrospectiveRecord(newParent, record);
|
| -record.parent = newParent;
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.insertRetrospectiveRecord = function(parent, record)
|
| -{
|
| -function compareStartTime(value, record)
|
| -{
|
| -return value < record.startTime ? -1 : 1;
|
| -}
|
| -
|
| -parent.children.splice(insertionIndexForObjectInListSortedByFunction(record.startTime, parent.children, compareStartTime), 0, record);
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.Record.prototype = {
|
| -get lastChildEndTime()
|
| -{
|
| -return this._lastChildEndTime;
|
| -},
|
| -
|
| -set lastChildEndTime(time)
|
| -{
|
| -this._lastChildEndTime = time;
|
| -},
|
| -
|
| -get selfTime()
|
| -{
|
| -return this.coalesced ? this._lastChildEndTime - this.startTime : this._selfTime;
|
| -},
|
| -
|
| -set selfTime(time)
|
| -{
|
| -this._selfTime = time;
|
| -},
|
| -
|
| -get cpuTime()
|
| -{
|
| -return this._cpuTime;
|
| -},
|
| -
|
| -
|
| -isRoot: function()
|
| -{
|
| -return this.type === WebInspector.TimelineModel.RecordType.Root;
|
| -},
|
| -
|
| -
|
| -origin: function()
|
| -{
|
| -return this._origin || this.parent;
|
| -},
|
| -
|
| -
|
| -get children()
|
| -{
|
| -return this._children;
|
| -},
|
| -
|
| -
|
| -get visibleChildrenCount()
|
| -{
|
| -return this._visibleChildrenCount || 0;
|
| -},
|
| -
|
| -
|
| -get invisibleChildrenCount()
|
| -{
|
| -return this._invisibleChildrenCount || 0;
|
| -},
|
| -
|
| -
|
| -get category()
|
| -{
|
| -return WebInspector.TimelinePresentationModel.recordStyle(this._record).category
|
| -},
|
| -
|
| -
|
| -get title()
|
| -{
|
| -return this.type === WebInspector.TimelineModel.RecordType.TimeStamp ? this._record.data["message"] :
|
| -WebInspector.TimelinePresentationModel.recordStyle(this._record).title;
|
| -},
|
| -
|
| -
|
| -get startTime()
|
| -{
|
| -return WebInspector.TimelineModel.startTimeInSeconds(this._record);
|
| -},
|
| -
|
| -
|
| -get endTime()
|
| -{
|
| -return WebInspector.TimelineModel.endTimeInSeconds(this._record);
|
| -},
|
| -
|
| -
|
| -get isBackground()
|
| -{
|
| -return !!this._record.thread;
|
| -},
|
| -
|
| -
|
| -get data()
|
| -{
|
| -return this._record.data;
|
| -},
|
| -
|
| -
|
| -get type()
|
| -{
|
| -return this._record.type;
|
| -},
|
| -
|
| -
|
| -get frameId()
|
| -{
|
| -return this._record.frameId;
|
| -},
|
| -
|
| -
|
| -get usedHeapSizeDelta()
|
| -{
|
| -return this._record.usedHeapSizeDelta || 0;
|
| -},
|
| -
|
| -
|
| -get usedHeapSize()
|
| -{
|
| -return this._record.usedHeapSize;
|
| -},
|
| -
|
| -
|
| -get stackTrace()
|
| -{
|
| -if (this._record.stackTrace && this._record.stackTrace.length)
|
| -return this._record.stackTrace;
|
| -return null;
|
| -},
|
| -
|
| -containsTime: function(time)
|
| -{
|
| -return this.startTime <= time && time <= this.endTime;
|
| -},
|
| -
|
| -
|
| -generatePopupContent: function(callback)
|
| -{
|
| -if (WebInspector.TimelinePresentationModel.needsPreviewElement(this.type))
|
| -WebInspector.DOMPresentationUtils.buildImagePreviewContents(this.url, false, this._generatePopupContentWithImagePreview.bind(this, callback));
|
| -else
|
| -this._generatePopupContentWithImagePreview(callback);
|
| -},
|
| -
|
| -
|
| -_generatePopupContentWithImagePreview: function(callback, previewElement)
|
| -{
|
| -var contentHelper = new WebInspector.PopoverContentHelper(this.title);
|
| -var text = WebInspector.UIString("%s (at %s)", Number.secondsToString(this._lastChildEndTime - this.startTime, true),
|
| -Number.secondsToString(this._startTimeOffset));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Duration"), text);
|
| -
|
| -if (this._children.length) {
|
| -if (!this.coalesced)
|
| -contentHelper.appendTextRow(WebInspector.UIString("Self Time"), Number.secondsToString(this._selfTime, true));
|
| -contentHelper.appendTextRow(WebInspector.UIString("CPU Time"), Number.secondsToString(this._cpuTime, true));
|
| -contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"),
|
| -WebInspector.TimelinePresentationModel._generateAggregatedInfo(this._aggregatedStats));
|
| -}
|
| -
|
| -if (this.coalesced) {
|
| -callback(contentHelper.contentTable());
|
| -return;
|
| -}
|
| -const recordTypes = WebInspector.TimelineModel.RecordType;
|
| -
|
| -
|
| -var callSiteStackTraceLabel;
|
| -var callStackLabel;
|
| -
|
| -switch (this.type) {
|
| -case recordTypes.GCEvent:
|
| -contentHelper.appendTextRow(WebInspector.UIString("Collected"), Number.bytesToString(this.data["usedHeapSizeDelta"]));
|
| -break;
|
| -case recordTypes.TimerFire:
|
| -callSiteStackTraceLabel = WebInspector.UIString("Timer installed");
|
| -
|
| -
|
| -case recordTypes.TimerInstall:
|
| -case recordTypes.TimerRemove:
|
| -contentHelper.appendTextRow(WebInspector.UIString("Timer ID"), this.data["timerId"]);
|
| -if (typeof this.timeout === "number") {
|
| -contentHelper.appendTextRow(WebInspector.UIString("Timeout"), Number.secondsToString(this.timeout / 1000));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Repeats"), !this.singleShot);
|
| -}
|
| -break;
|
| -case recordTypes.FireAnimationFrame:
|
| -callSiteStackTraceLabel = WebInspector.UIString("Animation frame requested");
|
| -contentHelper.appendTextRow(WebInspector.UIString("Callback ID"), this.data["id"]);
|
| -break;
|
| -case recordTypes.FunctionCall:
|
| -contentHelper.appendElementRow(WebInspector.UIString("Location"), this._linkifyScriptLocation());
|
| -break;
|
| -case recordTypes.ScheduleResourceRequest:
|
| -case recordTypes.ResourceSendRequest:
|
| -case recordTypes.ResourceReceiveResponse:
|
| -case recordTypes.ResourceReceivedData:
|
| -case recordTypes.ResourceFinish:
|
| -contentHelper.appendElementRow(WebInspector.UIString("Resource"), WebInspector.linkifyResourceAsNode(this.url));
|
| -if (previewElement)
|
| -contentHelper.appendElementRow(WebInspector.UIString("Preview"), previewElement);
|
| -if (this.data["requestMethod"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("Request Method"), this.data["requestMethod"]);
|
| -if (typeof this.data["statusCode"] === "number")
|
| -contentHelper.appendTextRow(WebInspector.UIString("Status Code"), this.data["statusCode"]);
|
| -if (this.data["mimeType"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("MIME Type"), this.data["mimeType"]);
|
| -if (this.data["encodedDataLength"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("Encoded Data Length"), WebInspector.UIString("%d Bytes", this.data["encodedDataLength"]));
|
| -break;
|
| -case recordTypes.EvaluateScript:
|
| -if (this.data && this.url)
|
| -contentHelper.appendElementRow(WebInspector.UIString("Script"), this._linkifyLocation(this.url, this.data["lineNumber"]));
|
| -break;
|
| -case recordTypes.Paint:
|
| -var clip = this.data["clip"];
|
| -if (clip) {
|
| -contentHelper.appendTextRow(WebInspector.UIString("Location"), WebInspector.UIString("(%d, %d)", clip[0], clip[1]));
|
| -var clipWidth = WebInspector.TimelinePresentationModel.quadWidth(clip);
|
| -var clipHeight = WebInspector.TimelinePresentationModel.quadHeight(clip);
|
| -contentHelper.appendTextRow(WebInspector.UIString("Dimensions"), WebInspector.UIString("%d × %d", clipWidth, clipHeight));
|
| -} else {
|
| -
|
| -if (typeof this.data["x"] !== "undefined" && typeof this.data["y"] !== "undefined")
|
| -contentHelper.appendTextRow(WebInspector.UIString("Location"), WebInspector.UIString("(%d, %d)", this.data["x"], this.data["y"]));
|
| -if (typeof this.data["width"] !== "undefined" && typeof this.data["height"] !== "undefined")
|
| -contentHelper.appendTextRow(WebInspector.UIString("Dimensions"), WebInspector.UIString("%d\u2009\u00d7\u2009%d", this.data["width"], this.data["height"]));
|
| -}
|
| -break;
|
| -case recordTypes.RecalculateStyles:
|
| -if (this.data["elementCount"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("Elements affected"), this.data["elementCount"]);
|
| -callStackLabel = WebInspector.UIString("Styles recalculation forced");
|
| -break;
|
| -case recordTypes.Layout:
|
| -if (this.data["dirtyObjects"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layout"), this.data["dirtyObjects"]);
|
| -if (this.data["totalObjects"])
|
| -contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"), this.data["totalObjects"]);
|
| -if (typeof this.data["partialLayout"] === "boolean") {
|
| -contentHelper.appendTextRow(WebInspector.UIString("Layout scope"),
|
| -this.data["partialLayout"] ? WebInspector.UIString("Partial") : WebInspector.UIString("Whole document"));
|
| -}
|
| -callSiteStackTraceLabel = WebInspector.UIString("Layout invalidated");
|
| -if (this.stackTrace) {
|
| -callStackLabel = WebInspector.UIString("Layout forced");
|
| -contentHelper.appendTextRow(WebInspector.UIString("Note"), WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck."));
|
| -}
|
| -break;
|
| -case recordTypes.Time:
|
| -case recordTypes.TimeEnd:
|
| -contentHelper.appendTextRow(WebInspector.UIString("Message"), this.data["message"]);
|
| -if (typeof this.intervalDuration === "number")
|
| -contentHelper.appendTextRow(WebInspector.UIString("Interval Duration"), Number.secondsToString(this.intervalDuration, true));
|
| -break;
|
| -case recordTypes.WebSocketCreate:
|
| -case recordTypes.WebSocketSendHandshakeRequest:
|
| -case recordTypes.WebSocketReceiveHandshakeResponse:
|
| -case recordTypes.WebSocketDestroy:
|
| -if (typeof this.webSocketURL !== "undefined")
|
| -contentHelper.appendTextRow(WebInspector.UIString("URL"), this.webSocketURL);
|
| -if (typeof this.webSocketProtocol !== "undefined")
|
| -contentHelper.appendTextRow(WebInspector.UIString("WebSocket Protocol"), this.webSocketProtocol);
|
| -if (typeof this.data["message"] !== "undefined")
|
| -contentHelper.appendTextRow(WebInspector.UIString("Message"), this.data["message"])
|
| -break;
|
| -default:
|
| -if (this.detailsNode())
|
| -contentHelper.appendElementRow(WebInspector.UIString("Details"), this.detailsNode().childNodes[1].cloneNode());
|
| -break;
|
| -}
|
| -
|
| -if (this.scriptName && this.type !== recordTypes.FunctionCall)
|
| -contentHelper.appendElementRow(WebInspector.UIString("Function Call"), this._linkifyScriptLocation());
|
| -
|
| -if (this.usedHeapSize) {
|
| -if (this.usedHeapSizeDelta) {
|
| -var sign = this.usedHeapSizeDelta > 0 ? "+" : "-";
|
| -contentHelper.appendTextRow(WebInspector.UIString("Used Heap Size"),
|
| -WebInspector.UIString("%s (%s%s)", Number.bytesToString(this.usedHeapSize), sign, Number.bytesToString(this.usedHeapSizeDelta)));
|
| -} else if (this.category === WebInspector.TimelinePresentationModel.categories().scripting)
|
| -contentHelper.appendTextRow(WebInspector.UIString("Used Heap Size"), Number.bytesToString(this.usedHeapSize));
|
| -}
|
| -
|
| -if (this.callSiteStackTrace)
|
| -contentHelper.appendStackTrace(callSiteStackTraceLabel || WebInspector.UIString("Call Site stack"), this.callSiteStackTrace, this._linkifyCallFrame.bind(this));
|
| -
|
| -if (this.stackTrace)
|
| -contentHelper.appendStackTrace(callStackLabel || WebInspector.UIString("Call Stack"), this.stackTrace, this._linkifyCallFrame.bind(this));
|
| -
|
| -callback(contentHelper.contentTable());
|
| -},
|
| -
|
| -_refreshDetails: function()
|
| -{
|
| -delete this._detailsNode;
|
| -},
|
| -
|
| -
|
| -detailsNode: function()
|
| -{
|
| -if (typeof this._detailsNode === "undefined") {
|
| -this._detailsNode = this._getRecordDetails();
|
| -
|
| -if (this._detailsNode && !this.coalesced) {
|
| -this._detailsNode.insertBefore(document.createTextNode("("), this._detailsNode.firstChild);
|
| -this._detailsNode.appendChild(document.createTextNode(")"));
|
| -}
|
| -}
|
| -return this._detailsNode;
|
| -},
|
| -
|
| -_createSpanWithText: function(textContent)
|
| -{
|
| -var node = document.createElement("span");
|
| -node.textContent = textContent;
|
| -return node;
|
| -},
|
| -
|
| -
|
| -_getRecordDetails: function()
|
| -{
|
| -var details;
|
| -if (this.coalesced)
|
| -return this._createSpanWithText(WebInspector.UIString("× %d", this.children.length));
|
| -
|
| -switch (this.type) {
|
| -case WebInspector.TimelineModel.RecordType.GCEvent:
|
| -details = WebInspector.UIString("%s collected", Number.bytesToString(this.data["usedHeapSizeDelta"]));
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.TimerFire:
|
| -details = this._linkifyScriptLocation(this.data["timerId"]);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.FunctionCall:
|
| -details = this._linkifyScriptLocation();
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.FireAnimationFrame:
|
| -details = this._linkifyScriptLocation(this.data["id"]);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.EventDispatch:
|
| -details = this.data ? this.data["type"] : null;
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.Paint:
|
| -var width = this.data.clip ? WebInspector.TimelinePresentationModel.quadWidth(this.data.clip) : this.data.width;
|
| -var height = this.data.clip ? WebInspector.TimelinePresentationModel.quadHeight(this.data.clip) : this.data.height;
|
| -if (width && height)
|
| -details = WebInspector.UIString("%d\u2009\u00d7\u2009%d", width, height);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.DecodeImage:
|
| -details = this.data["imageType"];
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.ResizeImage:
|
| -details = this.data["cached"] ? WebInspector.UIString("cached") : WebInspector.UIString("non-cached");
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.TimerInstall:
|
| -case WebInspector.TimelineModel.RecordType.TimerRemove:
|
| -details = this._linkifyTopCallFrame(this.data["timerId"]);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.RequestAnimationFrame:
|
| -case WebInspector.TimelineModel.RecordType.CancelAnimationFrame:
|
| -details = this._linkifyTopCallFrame(this.data["id"]);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.ParseHTML:
|
| -case WebInspector.TimelineModel.RecordType.RecalculateStyles:
|
| -details = this._linkifyTopCallFrame();
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.EvaluateScript:
|
| -details = this.url ? this._linkifyLocation(this.url, this.data["lineNumber"], 0) : null;
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.XHRReadyStateChange:
|
| -case WebInspector.TimelineModel.RecordType.XHRLoad:
|
| -case WebInspector.TimelineModel.RecordType.ScheduleResourceRequest:
|
| -case WebInspector.TimelineModel.RecordType.ResourceSendRequest:
|
| -case WebInspector.TimelineModel.RecordType.ResourceReceivedData:
|
| -case WebInspector.TimelineModel.RecordType.ResourceReceiveResponse:
|
| -case WebInspector.TimelineModel.RecordType.ResourceFinish:
|
| -details = WebInspector.displayNameForURL(this.url);
|
| -break;
|
| -case WebInspector.TimelineModel.RecordType.Time:
|
| -case WebInspector.TimelineModel.RecordType.TimeEnd:
|
| -case WebInspector.TimelineModel.RecordType.TimeStamp:
|
| -details = this.data["message"];
|
| -break;
|
| -default:
|
| -details = this._linkifyScriptLocation() || this._linkifyTopCallFrame() || null;
|
| -break;
|
| -}
|
| -
|
| -if (details) {
|
| -if (details instanceof Node)
|
| -details.tabIndex = -1;
|
| -else
|
| -return this._createSpanWithText("" + details);
|
| -}
|
| -
|
| -return details || null;
|
| -},
|
| -
|
| -
|
| -_linkifyLocation: function(url, lineNumber, columnNumber)
|
| -{
|
| -
|
| -columnNumber = columnNumber ? columnNumber - 1 : 0;
|
| -return this._linkifier.linkifyLocation(url, lineNumber - 1, columnNumber, "timeline-details");
|
| -},
|
| -
|
| -_linkifyCallFrame: function(callFrame)
|
| -{
|
| -return this._linkifyLocation(callFrame.url, callFrame.lineNumber, callFrame.columnNumber);
|
| -},
|
| -
|
| -
|
| -_linkifyTopCallFrame: function(defaultValue)
|
| -{
|
| -if (this.stackTrace)
|
| -return this._linkifyCallFrame(this.stackTrace[0]);
|
| -if (this.callSiteStackTrace)
|
| -return this._linkifyCallFrame(this.callSiteStackTrace[0]);
|
| -return defaultValue;
|
| -},
|
| -
|
| -
|
| -_linkifyScriptLocation: function(defaultValue)
|
| -{
|
| -if (this.scriptName)
|
| -return this._linkifyLocation(this.scriptName, this.scriptLine, 0);
|
| -else
|
| -return defaultValue ? "" + defaultValue : null;
|
| -},
|
| -
|
| -calculateAggregatedStats: function()
|
| -{
|
| -this._aggregatedStats = {};
|
| -this._cpuTime = this._selfTime;
|
| -
|
| -for (var index = this._children.length; index; --index) {
|
| -var child = this._children[index - 1];
|
| -for (var category in child._aggregatedStats)
|
| -this._aggregatedStats[category] = (this._aggregatedStats[category] || 0) + child._aggregatedStats[category];
|
| -}
|
| -for (var category in this._aggregatedStats)
|
| -this._cpuTime += this._aggregatedStats[category];
|
| -this._aggregatedStats[this.category.name] = (this._aggregatedStats[this.category.name] || 0) + this._selfTime;
|
| -},
|
| -
|
| -get aggregatedStats()
|
| -{
|
| -return this._aggregatedStats;
|
| -},
|
| -
|
| -setHasWarning: function()
|
| -{
|
| -this.hasWarning = true;
|
| -for (var parent = this.parent; parent && !parent.childHasWarning; parent = parent.parent)
|
| -parent.childHasWarning = true;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel._generateAggregatedInfo = function(aggregatedStats)
|
| -{
|
| -var cell = document.createElement("span");
|
| -cell.className = "timeline-aggregated-info";
|
| -for (var index in aggregatedStats) {
|
| -var label = document.createElement("div");
|
| -label.className = "timeline-aggregated-category timeline-" + index;
|
| -cell.appendChild(label);
|
| -var text = document.createElement("span");
|
| -text.textContent = Number.secondsToString(aggregatedStats[index], true);
|
| -cell.appendChild(text);
|
| -}
|
| -return cell;
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.generatePopupContentForFrame = function(frame)
|
| -{
|
| -var contentHelper = new WebInspector.PopoverContentHelper(WebInspector.UIString("Frame"));
|
| -var durationInSeconds = frame.endTime - frame.startTime;
|
| -var durationText = WebInspector.UIString("%s (at %s)", Number.secondsToString(frame.endTime - frame.startTime, true),
|
| -Number.secondsToString(frame.startTimeOffset, true));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Duration"), durationText);
|
| -contentHelper.appendTextRow(WebInspector.UIString("FPS"), Math.floor(1 / durationInSeconds));
|
| -contentHelper.appendTextRow(WebInspector.UIString("CPU time"), Number.secondsToString(frame.cpuTime, true));
|
| -contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"),
|
| -WebInspector.TimelinePresentationModel._generateAggregatedInfo(frame.timeByCategory));
|
| -
|
| -return contentHelper.contentTable();
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.generatePopupContentForFrameStatistics = function(statistics)
|
| -{
|
| -
|
| -function formatTimeAndFPS(time)
|
| -{
|
| -return WebInspector.UIString("%s (%.0f FPS)", Number.secondsToString(time, true), 1 / time);
|
| -}
|
| -
|
| -var contentHelper = new WebInspector.PopoverContentHelper(WebInspector.UIString("Selected Range"));
|
| -
|
| -contentHelper.appendTextRow(WebInspector.UIString("Selected range"), WebInspector.UIString("%s\u2013%s (%d frames)",
|
| -Number.secondsToString(statistics.startOffset, true), Number.secondsToString(statistics.endOffset, true), statistics.frameCount));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Minimum Time"), formatTimeAndFPS(statistics.minDuration));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Average Time"), formatTimeAndFPS(statistics.average));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Maximum Time"), formatTimeAndFPS(statistics.maxDuration));
|
| -contentHelper.appendTextRow(WebInspector.UIString("Standard Deviation"), Number.secondsToString(statistics.stddev, true));
|
| -contentHelper.appendElementRow(WebInspector.UIString("Time by category"),
|
| -WebInspector.TimelinePresentationModel._generateAggregatedInfo(statistics.timeByCategory));
|
| -
|
| -return contentHelper.contentTable();
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.createFillStyle = function(context, width, height, color0, color1, color2)
|
| -{
|
| -var gradient = context.createLinearGradient(0, 0, width, height);
|
| -gradient.addColorStop(0, color0);
|
| -gradient.addColorStop(0.25, color1);
|
| -gradient.addColorStop(0.75, color1);
|
| -gradient.addColorStop(1, color2);
|
| -return gradient;
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.createFillStyleForCategory = function(context, width, height, category)
|
| -{
|
| -return WebInspector.TimelinePresentationModel.createFillStyle(context, width, height, category.fillColorStop0, category.fillColorStop1, category.borderColor);
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.createStyleRuleForCategory = function(category)
|
| -{
|
| -var selector = ".timeline-category-" + category.name + " .timeline-graph-bar, " +
|
| -".timeline-category-statusbar-item.timeline-category-" + category.name + " .timeline-category-checkbox, " +
|
| -".popover .timeline-" + category.name + ", " +
|
| -".timeline-category-" + category.name + " .timeline-tree-icon"
|
| -
|
| -return selector + " { background-image: -webkit-linear-gradient(" +
|
| -category.fillColorStop0 + ", " + category.fillColorStop1 + " 25%, " + category.fillColorStop1 + " 25%, " + category.fillColorStop1 + ");" +
|
| -" border-color: " + category.borderColor +
|
| -"}";
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.quadWidth = function(quad)
|
| -{
|
| -return Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1] - quad[3], 2)));
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.quadHeight = function(quad)
|
| -{
|
| -return Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1] - quad[7], 2)));
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.quadFromRectData = function(data)
|
| -{
|
| -if (typeof data["x"] === "undefined" || typeof data["y"] === "undefined")
|
| -return null;
|
| -var x0 = data["x"];
|
| -var x1 = data["x"] + data["width"];
|
| -var y0 = data["y"];
|
| -var y1 = data["y"] + data["height"];
|
| -return [x0, y0, x1, y0, x1, y1, x0, y1];
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePresentationModel.Filter = function()
|
| -{
|
| -}
|
| -
|
| -WebInspector.TimelinePresentationModel.Filter.prototype = {
|
| -
|
| -accept: function(record) { return false; }
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineCategory = function(name, title, overviewStripGroupIndex, borderColor, fillColorStop0, fillColorStop1)
|
| -{
|
| -this.name = name;
|
| -this.title = title;
|
| -this.overviewStripGroupIndex = overviewStripGroupIndex;
|
| -this.borderColor = borderColor;
|
| -this.fillColorStop0 = fillColorStop0;
|
| -this.fillColorStop1 = fillColorStop1;
|
| -this.hidden = false;
|
| -}
|
| -
|
| -WebInspector.TimelineCategory.Events = {
|
| -VisibilityChanged: "VisibilityChanged"
|
| -};
|
| -
|
| -WebInspector.TimelineCategory.prototype = {
|
| -
|
| -get hidden()
|
| -{
|
| -return this._hidden;
|
| -},
|
| -
|
| -set hidden(hidden)
|
| -{
|
| -this._hidden = hidden;
|
| -this.dispatchEventToListeners(WebInspector.TimelineCategory.Events.VisibilityChanged, this);
|
| -},
|
| -
|
| -__proto__: WebInspector.Object.prototype
|
| -}
|
| -;
|
| -
|
| -
|
| -
|
| -WebInspector.TimelineFrameController = function(model, overviewPane, presentationModel)
|
| -{
|
| -this._lastFrame = null;
|
| -this._model = model;
|
| -this._overviewPane = overviewPane;
|
| -this._presentationModel = presentationModel;
|
| -this._model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded, this._onRecordAdded, this);
|
| -this._model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared, this._onRecordsCleared, this);
|
| -
|
| -var records = model.records;
|
| -for (var i = 0; i < records.length; ++i)
|
| -this._addRecord(records[i]);
|
| -}
|
| -
|
| -WebInspector.TimelineFrameController.prototype = {
|
| -_onRecordAdded: function(event)
|
| -{
|
| -this._addRecord(event.data);
|
| -},
|
| -
|
| -_onRecordsCleared: function()
|
| -{
|
| -this._lastFrame = null;
|
| -},
|
| -
|
| -_addRecord: function(record)
|
| -{
|
| -if (record.isBackground)
|
| -return;
|
| -var records;
|
| -var programRecord;
|
| -if (record.type === WebInspector.TimelineModel.RecordType.Program) {
|
| -programRecord = record;
|
| -if (this._lastFrame)
|
| -this._lastFrame.timeByCategory["other"] += WebInspector.TimelineModel.durationInSeconds(programRecord);
|
| -records = record["children"] || [];
|
| -} else
|
| -records = [record];
|
| -records.forEach(this._innerAddRecord.bind(this, programRecord));
|
| -},
|
| -
|
| -
|
| -_innerAddRecord: function(programRecord, record)
|
| -{
|
| -var isFrameRecord = record.type === WebInspector.TimelineModel.RecordType.BeginFrame;
|
| -var programTimeCarryover = isFrameRecord && programRecord ? WebInspector.TimelineModel.endTimeInSeconds(programRecord) - WebInspector.TimelineModel.startTimeInSeconds(record) : 0;
|
| -if (isFrameRecord && this._lastFrame)
|
| -this._flushFrame(record, programTimeCarryover);
|
| -else {
|
| -if (!this._lastFrame)
|
| -this._lastFrame = this._createFrame(record, programTimeCarryover);
|
| -if (!record.thread)
|
| -WebInspector.TimelineModel.aggregateTimeForRecord(this._lastFrame.timeByCategory, record);
|
| -var duration = WebInspector.TimelineModel.durationInSeconds(record);
|
| -this._lastFrame.cpuTime += duration;
|
| -this._lastFrame.timeByCategory["other"] -= duration;
|
| -}
|
| -},
|
| -
|
| -
|
| -_flushFrame: function(record, programTimeCarryover)
|
| -{
|
| -this._lastFrame.endTime = WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -this._lastFrame.duration = this._lastFrame.endTime - this._lastFrame.startTime;
|
| -this._lastFrame.timeByCategory["other"] -= programTimeCarryover;
|
| -
|
| -
|
| -this._lastFrame.cpuTime += this._lastFrame.timeByCategory["other"];
|
| -this._overviewPane.addFrame(this._lastFrame);
|
| -this._presentationModel.addFrame(this._lastFrame);
|
| -this._lastFrame = this._createFrame(record, programTimeCarryover);
|
| -},
|
| -
|
| -
|
| -_createFrame: function(record, programTimeCarryover)
|
| -{
|
| -var frame = new WebInspector.TimelineFrame();
|
| -frame.startTime = WebInspector.TimelineModel.startTimeInSeconds(record);
|
| -frame.startTimeOffset = this._model.recordOffsetInSeconds(record);
|
| -frame.timeByCategory["other"] = programTimeCarryover;
|
| -return frame;
|
| -},
|
| -
|
| -dispose: function()
|
| -{
|
| -this._model.removeEventListener(WebInspector.TimelineModel.Events.RecordAdded, this._onRecordAdded, this);
|
| -this._model.removeEventListener(WebInspector.TimelineModel.Events.RecordsCleared, this._onRecordsCleared, this);
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.FrameStatistics = function(frames)
|
| -{
|
| -this.frameCount = frames.length;
|
| -this.minDuration = Infinity;
|
| -this.maxDuration = 0;
|
| -this.timeByCategory = {};
|
| -this.startOffset = frames[0].startTimeOffset;
|
| -var lastFrame = frames[this.frameCount - 1];
|
| -this.endOffset = lastFrame.startTimeOffset + lastFrame.duration;
|
| -
|
| -var totalDuration = 0;
|
| -var sumOfSquares = 0;
|
| -for (var i = 0; i < this.frameCount; ++i) {
|
| -var duration = frames[i].duration;
|
| -totalDuration += duration;
|
| -sumOfSquares += duration * duration;
|
| -this.minDuration = Math.min(this.minDuration, duration);
|
| -this.maxDuration = Math.max(this.maxDuration, duration);
|
| -WebInspector.TimelineModel.aggregateTimeByCategory(this.timeByCategory, frames[i].timeByCategory);
|
| -}
|
| -this.average = totalDuration / this.frameCount;
|
| -var variance = sumOfSquares / this.frameCount - this.average * this.average;
|
| -this.stddev = Math.sqrt(variance);
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineFrame = function()
|
| -{
|
| -this.timeByCategory = {};
|
| -this.cpuTime = 0;
|
| -}
|
| -;
|
| -
|
| -
|
| -WebInspector.TimelinePanel = function()
|
| -{
|
| -WebInspector.Panel.call(this, "timeline");
|
| -this.registerRequiredCSS("timelinePanel.css");
|
| -
|
| -this._model = new WebInspector.TimelineModel();
|
| -this._presentationModel = new WebInspector.TimelinePresentationModel();
|
| -
|
| -this._overviewModeSetting = WebInspector.settings.createSetting("timelineOverviewMode", WebInspector.TimelineOverviewPane.Mode.Events);
|
| -this._glueRecordsSetting = WebInspector.settings.createSetting("timelineGlueRecords", false);
|
| -
|
| -this._overviewPane = new WebInspector.TimelineOverviewPane(this._model);
|
| -this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.WindowChanged, this._invalidateAndScheduleRefresh.bind(this, false, true));
|
| -this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.ModeChanged, this._overviewModeChanged, this);
|
| -this._overviewPane.show(this.element);
|
| -
|
| -this.element.addEventListener("contextmenu", this._contextMenu.bind(this), false);
|
| -
|
| -this.element.addStyleClass("split-view-vertical");
|
| -
|
| -this._sidebarBackgroundElement = document.createElement("div");
|
| -this._sidebarBackgroundElement.className = "sidebar split-view-sidebar split-view-contents-first timeline-sidebar-background";
|
| -this.element.appendChild(this._sidebarBackgroundElement);
|
| -
|
| -this.createSidebarViewWithTree();
|
| -this.element.appendChild(this.splitView.resizerElement());
|
| -
|
| -this._containerElement = this.splitView.element;
|
| -this._containerElement.tabIndex = 0;
|
| -this._containerElement.id = "timeline-container";
|
| -this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);
|
| -
|
| -this._timelineMemorySplitter = this.element.createChild("div");
|
| -this._timelineMemorySplitter.id = "timeline-memory-splitter";
|
| -WebInspector.installDragHandle(this._timelineMemorySplitter, this._startSplitterDragging.bind(this), this._splitterDragging.bind(this), this._endSplitterDragging.bind(this), "ns-resize");
|
| -this._timelineMemorySplitter.addStyleClass("hidden");
|
| -this._includeDomCounters = false;
|
| -this._includeNativeMemoryStatistics = false;
|
| -if (WebInspector.experimentsSettings.nativeMemoryTimeline.isEnabled()) {
|
| -this._memoryStatistics = new WebInspector.NativeMemoryGraph(this, this._model, this.splitView.sidebarWidth());
|
| -this._includeNativeMemoryStatistics = true;
|
| -} else {
|
| -this._memoryStatistics = new WebInspector.DOMCountersGraph(this, this._model, this.splitView.sidebarWidth());
|
| -this._includeDomCounters = true;
|
| -}
|
| -WebInspector.settings.memoryCounterGraphsHeight = WebInspector.settings.createSetting("memoryCounterGraphsHeight", 150);
|
| -
|
| -var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);
|
| -this.sidebarTree.appendChild(itemsTreeElement);
|
| -this.sidebarTree.setFocusable(false);
|
| -
|
| -this._sidebarListElement = document.createElement("div");
|
| -this.sidebarElement.appendChild(this._sidebarListElement);
|
| -
|
| -this._containerContentElement = this.splitView.mainElement;
|
| -this._containerContentElement.id = "resources-container-content";
|
| -
|
| -this._timelineGrid = new WebInspector.TimelineGrid();
|
| -this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
|
| -this._itemsGraphsElement.id = "timeline-graphs";
|
| -this._containerContentElement.appendChild(this._timelineGrid.element);
|
| -this._timelineGrid.gridHeaderElement.id = "timeline-grid-header";
|
| -this._memoryStatistics.setMainTimelineGrid(this._timelineGrid);
|
| -this.element.appendChild(this._timelineGrid.gridHeaderElement);
|
| -
|
| -this._topGapElement = document.createElement("div");
|
| -this._topGapElement.className = "timeline-gap";
|
| -this._itemsGraphsElement.appendChild(this._topGapElement);
|
| -
|
| -this._graphRowsElement = document.createElement("div");
|
| -this._itemsGraphsElement.appendChild(this._graphRowsElement);
|
| -
|
| -this._bottomGapElement = document.createElement("div");
|
| -this._bottomGapElement.className = "timeline-gap";
|
| -this._itemsGraphsElement.appendChild(this._bottomGapElement);
|
| -
|
| -this._expandElements = document.createElement("div");
|
| -this._expandElements.id = "orphan-expand-elements";
|
| -this._itemsGraphsElement.appendChild(this._expandElements);
|
| -
|
| -this._calculator = new WebInspector.TimelineCalculator(this._model);
|
| -this._createStatusBarItems();
|
| -
|
| -this._frameMode = false;
|
| -this._boundariesAreValid = true;
|
| -this._scrollTop = 0;
|
| -
|
| -this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._getPopoverAnchor.bind(this), this._showPopover.bind(this));
|
| -this.element.addEventListener("mousemove", this._mouseMove.bind(this), false);
|
| -this.element.addEventListener("mouseout", this._mouseOut.bind(this), false);
|
| -
|
| -
|
| -this._durationFilter = new WebInspector.TimelineIsLongFilter();
|
| -
|
| -this._expandOffset = 15;
|
| -
|
| -this._headerLineCount = 1;
|
| -this._adjustHeaderHeight();
|
| -
|
| -this._mainThreadTasks = ([]);
|
| -this._cpuBarsElement = this._timelineGrid.gridHeaderElement.createChild("div", "timeline-cpu-bars");
|
| -this._mainThreadMonitoringEnabled = WebInspector.settings.showCpuOnTimelineRuler.get();
|
| -WebInspector.settings.showCpuOnTimelineRuler.addChangeListener(this._showCpuOnTimelineRulerChanged, this);
|
| -
|
| -this._createFileSelector();
|
| -
|
| -this._model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded, this._onTimelineEventRecorded, this);
|
| -this._model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared, this._onRecordsCleared, this);
|
| -
|
| -this._registerShortcuts();
|
| -
|
| -this._allRecordsCount = 0;
|
| -
|
| -this._presentationModel.addFilter(new WebInspector.TimelineWindowFilter(this._overviewPane));
|
| -this._presentationModel.addFilter(new WebInspector.TimelineCategoryFilter());
|
| -this._presentationModel.addFilter(this._durationFilter);
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelinePanel.rowHeight = 18;
|
| -
|
| -WebInspector.TimelinePanel.durationFilterPresetsMs = [0, 1, 15];
|
| -
|
| -WebInspector.TimelinePanel.prototype = {
|
| -_showCpuOnTimelineRulerChanged: function()
|
| -{
|
| -var mainThreadMonitoringEnabled = WebInspector.settings.showCpuOnTimelineRuler.get();
|
| -if (this._mainThreadMonitoringEnabled !== mainThreadMonitoringEnabled) {
|
| -this._mainThreadMonitoringEnabled = mainThreadMonitoringEnabled;
|
| -this._refreshMainThreadBars();
|
| -}
|
| -},
|
| -
|
| -
|
| -_startSplitterDragging: function(event)
|
| -{
|
| -this._dragOffset = this._timelineMemorySplitter.offsetTop + 2 - event.pageY;
|
| -return true;
|
| -},
|
| -
|
| -
|
| -_splitterDragging: function(event)
|
| -{
|
| -var top = event.pageY + this._dragOffset
|
| -this._setSplitterPosition(top);
|
| -event.preventDefault();
|
| -},
|
| -
|
| -
|
| -_endSplitterDragging: function(event)
|
| -{
|
| -delete this._dragOffset;
|
| -this._memoryStatistics.show();
|
| -WebInspector.settings.memoryCounterGraphsHeight.set(this.splitView.element.offsetHeight);
|
| -},
|
| -
|
| -_setSplitterPosition: function(top)
|
| -{
|
| -const overviewHeight = 90;
|
| -const sectionMinHeight = 100;
|
| -top = Number.constrain(top, overviewHeight + sectionMinHeight, this.element.offsetHeight - sectionMinHeight);
|
| -
|
| -this.splitView.element.style.height = (top - overviewHeight) + "px";
|
| -this._timelineMemorySplitter.style.top = (top - 2) + "px";
|
| -this._memoryStatistics.setTopPosition(top);
|
| -this._containerElementHeight = this._containerElement.clientHeight;
|
| -this.onResize();
|
| -},
|
| -
|
| -get calculator()
|
| -{
|
| -return this._calculator;
|
| -},
|
| -
|
| -get statusBarItems()
|
| -{
|
| -return this._statusBarItems.select("element").concat([
|
| -this._miscStatusBarItems
|
| -]);
|
| -},
|
| -
|
| -defaultFocusedElement: function()
|
| -{
|
| -return this.element;
|
| -},
|
| -
|
| -_createStatusBarItems: function()
|
| -{
|
| -this._statusBarItems = ([]);
|
| -
|
| -this.toggleTimelineButton = new WebInspector.StatusBarButton(WebInspector.UIString("Record"), "record-profile-status-bar-item");
|
| -this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked, this);
|
| -this._statusBarItems.push(this.toggleTimelineButton);
|
| -
|
| -this.clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
|
| -this.clearButton.addEventListener("click", this._clearPanel, this);
|
| -this._statusBarItems.push(this.clearButton);
|
| -
|
| -this.garbageCollectButton = new WebInspector.StatusBarButton(WebInspector.UIString("Collect Garbage"), "garbage-collect-status-bar-item");
|
| -this.garbageCollectButton.addEventListener("click", this._garbageCollectButtonClicked, this);
|
| -this._statusBarItems.push(this.garbageCollectButton);
|
| -
|
| -this._glueParentButton = new WebInspector.StatusBarButton(WebInspector.UIString("Glue asynchronous events to causes"), "glue-async-status-bar-item");
|
| -this._glueParentButton.toggled = this._glueRecordsSetting.get();
|
| -this._presentationModel.setGlueRecords(this._glueParentButton.toggled);
|
| -this._glueParentButton.addEventListener("click", this._glueParentButtonClicked, this);
|
| -this._statusBarItems.push(this._glueParentButton);
|
| -
|
| -this._durationFilterSelector = new WebInspector.StatusBarComboBox(this._durationFilterChanged.bind(this));
|
| -for (var presetIndex = 0; presetIndex < WebInspector.TimelinePanel.durationFilterPresetsMs.length; ++presetIndex) {
|
| -var durationMs = WebInspector.TimelinePanel.durationFilterPresetsMs[presetIndex];
|
| -var option = document.createElement("option");
|
| -if (!durationMs) {
|
| -option.text = WebInspector.UIString("All");
|
| -option.title = WebInspector.UIString("Show all records");
|
| -} else {
|
| -option.text = WebInspector.UIString("\u2265 %dms", durationMs);
|
| -option.title = WebInspector.UIString("Hide records shorter than %dms", durationMs);
|
| -}
|
| -option._durationMs = durationMs;
|
| -this._durationFilterSelector.addOption(option);
|
| -this._durationFilterSelector.element.title = this._durationFilterSelector.selectedOption().title;
|
| -}
|
| -this._statusBarItems.push(this._durationFilterSelector);
|
| -
|
| -this._miscStatusBarItems = document.createElement("div");
|
| -this._miscStatusBarItems.className = "status-bar-items timeline-misc-status-bar-items";
|
| -
|
| -this._statusBarFilters = this._miscStatusBarItems.createChild("div", "timeline-misc-status-bar-filters");
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -for (var categoryName in categories) {
|
| -var category = categories[categoryName];
|
| -if (category.overviewStripGroupIndex < 0)
|
| -continue;
|
| -this._statusBarFilters.appendChild(this._createTimelineCategoryStatusBarCheckbox(category, this._onCategoryCheckboxClicked.bind(this, category)));
|
| -}
|
| -
|
| -var statsContainer = this._statusBarFilters.createChild("div");
|
| -statsContainer.className = "timeline-records-stats-container";
|
| -
|
| -this.recordsCounter = statsContainer.createChild("div");
|
| -this.recordsCounter.className = "timeline-records-stats";
|
| -
|
| -this.frameStatistics = statsContainer.createChild("div");
|
| -this.frameStatistics.className = "timeline-records-stats hidden";
|
| -
|
| -function getAnchor()
|
| -{
|
| -return this.frameStatistics;
|
| -}
|
| -this._frameStatisticsPopoverHelper = new WebInspector.PopoverHelper(this.frameStatistics, getAnchor.bind(this), this._showFrameStatistics.bind(this));
|
| -},
|
| -
|
| -_createTimelineCategoryStatusBarCheckbox: function(category, onCheckboxClicked)
|
| -{
|
| -var labelContainer = document.createElement("div");
|
| -labelContainer.addStyleClass("timeline-category-statusbar-item");
|
| -labelContainer.addStyleClass("timeline-category-" + category.name);
|
| -labelContainer.addStyleClass("status-bar-item");
|
| -
|
| -var label = document.createElement("label");
|
| -var checkBorder = label.createChild("div", "timeline-category-checkbox");
|
| -var checkElement = checkBorder.createChild("div", "timeline-category-checkbox-check timeline-category-checkbox-checked");
|
| -checkElement.type = "checkbox";
|
| -checkElement.checked = true;
|
| -checkElement.addEventListener("click", listener, false);
|
| -
|
| -function listener(event)
|
| -{
|
| -checkElement.checked = !checkElement.checked;
|
| -checkElement.enableStyleClass("timeline-category-checkbox-checked", checkElement.checked);
|
| -onCheckboxClicked(event);
|
| -}
|
| -
|
| -var typeElement = document.createElement("span");
|
| -typeElement.className = "type";
|
| -typeElement.textContent = category.title;
|
| -label.appendChild(typeElement);
|
| -
|
| -labelContainer.appendChild(label);
|
| -return labelContainer;
|
| -},
|
| -
|
| -_onCategoryCheckboxClicked: function(category, event)
|
| -{
|
| -category.hidden = !event.target.checked;
|
| -this._invalidateAndScheduleRefresh(true, true);
|
| -},
|
| -
|
| -
|
| -_setOperationInProgress: function(indicator)
|
| -{
|
| -this._operationInProgress = !!indicator;
|
| -for (var i = 0; i < this._statusBarItems.length; ++i)
|
| -this._statusBarItems[i].setEnabled(!this._operationInProgress);
|
| -this._glueParentButton.setEnabled(!this._operationInProgress && !this._frameController);
|
| -this._miscStatusBarItems.removeChildren();
|
| -this._miscStatusBarItems.appendChild(indicator ? indicator.element : this._statusBarFilters);
|
| -},
|
| -
|
| -_registerShortcuts: function()
|
| -{
|
| -this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.StartStopRecording, this._toggleTimelineButtonClicked.bind(this));
|
| -this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.SaveToFile, this._saveToFile.bind(this));
|
| -this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.LoadFromFile, this._selectFileToLoad.bind(this));
|
| -},
|
| -
|
| -_createFileSelector: function()
|
| -{
|
| -if (this._fileSelectorElement)
|
| -this.element.removeChild(this._fileSelectorElement);
|
| -
|
| -this._fileSelectorElement = WebInspector.createFileSelectorElement(this._loadFromFile.bind(this));
|
| -this.element.appendChild(this._fileSelectorElement);
|
| -},
|
| -
|
| -_contextMenu: function(event)
|
| -{
|
| -var contextMenu = new WebInspector.ContextMenu(event);
|
| -contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Save Timeline data\u2026" : "Save Timeline Data\u2026"), this._saveToFile.bind(this), this._operationInProgress);
|
| -contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Load Timeline data\u2026" : "Load Timeline Data\u2026"), this._selectFileToLoad.bind(this), this._operationInProgress);
|
| -contextMenu.show();
|
| -},
|
| -
|
| -
|
| -_saveToFile: function(event)
|
| -{
|
| -if (this._operationInProgress)
|
| -return true;
|
| -this._model.saveToFile();
|
| -return true;
|
| -},
|
| -
|
| -
|
| -_selectFileToLoad: function(event) {
|
| -this._fileSelectorElement.click();
|
| -return true;
|
| -},
|
| -
|
| -
|
| -_loadFromFile: function(file)
|
| -{
|
| -var progressIndicator = this._prepareToLoadTimeline();
|
| -if (!progressIndicator)
|
| -return;
|
| -this._model.loadFromFile(file, progressIndicator);
|
| -this._createFileSelector();
|
| -},
|
| -
|
| -
|
| -loadFromURL: function(url)
|
| -{
|
| -var progressIndicator = this._prepareToLoadTimeline();
|
| -if (!progressIndicator)
|
| -return;
|
| -this._model.loadFromURL(url, progressIndicator);
|
| -},
|
| -
|
| -
|
| -_prepareToLoadTimeline: function()
|
| -{
|
| -if (this._operationInProgress)
|
| -return null;
|
| -if (this.toggleTimelineButton.toggled) {
|
| -this.toggleTimelineButton.toggled = false;
|
| -this._model.stopRecord();
|
| -}
|
| -var progressIndicator = new WebInspector.ProgressIndicator();
|
| -progressIndicator.addEventListener(WebInspector.ProgressIndicator.Events.Done, this._setOperationInProgress.bind(this, null));
|
| -this._setOperationInProgress(progressIndicator);
|
| -return progressIndicator;
|
| -},
|
| -
|
| -_rootRecord: function()
|
| -{
|
| -return this._presentationModel.rootRecord();
|
| -},
|
| -
|
| -_updateRecordsCounter: function(recordsInWindowCount)
|
| -{
|
| -this.recordsCounter.textContent = WebInspector.UIString("%d of %d records shown", recordsInWindowCount, this._allRecordsCount);
|
| -},
|
| -
|
| -_updateFrameStatistics: function(frames)
|
| -{
|
| -if (frames.length) {
|
| -this._lastFrameStatistics = new WebInspector.FrameStatistics(frames);
|
| -var details = WebInspector.UIString("avg: %s, \u03c3: %s",
|
| -Number.secondsToString(this._lastFrameStatistics.average, true), Number.secondsToString(this._lastFrameStatistics.stddev, true));
|
| -} else
|
| -this._lastFrameStatistics = null;
|
| -this.frameStatistics.textContent = WebInspector.UIString("%d of %d frames shown", frames.length, this._presentationModel.frames().length);
|
| -if (details) {
|
| -this.frameStatistics.appendChild(document.createTextNode(" ("));
|
| -this.frameStatistics.createChild("span", "timeline-frames-stats").textContent = details;
|
| -this.frameStatistics.appendChild(document.createTextNode(")"));
|
| -}
|
| -},
|
| -
|
| -
|
| -_showFrameStatistics: function(anchor, popover)
|
| -{
|
| -popover.show(WebInspector.TimelinePresentationModel.generatePopupContentForFrameStatistics(this._lastFrameStatistics), anchor);
|
| -},
|
| -
|
| -_updateEventDividers: function()
|
| -{
|
| -this._timelineGrid.removeEventDividers();
|
| -var clientWidth = this._graphRowsElementWidth;
|
| -var dividers = [];
|
| -var eventDividerRecords = this._presentationModel.eventDividerRecords();
|
| -
|
| -for (var i = 0; i < eventDividerRecords.length; ++i) {
|
| -var record = eventDividerRecords[i];
|
| -var positions = this._calculator.computeBarGraphWindowPosition(record);
|
| -var dividerPosition = Math.round(positions.left);
|
| -if (dividerPosition < 0 || dividerPosition >= clientWidth || dividers[dividerPosition])
|
| -continue;
|
| -var divider = WebInspector.TimelinePresentationModel.createEventDivider(record.type, record.title);
|
| -divider.style.left = dividerPosition + "px";
|
| -dividers[dividerPosition] = divider;
|
| -}
|
| -this._timelineGrid.addEventDividers(dividers);
|
| -},
|
| -
|
| -_updateFrameBars: function(frames)
|
| -{
|
| -var clientWidth = this._graphRowsElementWidth;
|
| -if (this._frameContainer)
|
| -this._frameContainer.removeChildren();
|
| -else {
|
| -const frameContainerBorderWidth = 1;
|
| -this._frameContainer = document.createElement("div");
|
| -this._frameContainer.addStyleClass("fill");
|
| -this._frameContainer.addStyleClass("timeline-frame-container");
|
| -this._frameContainer.style.height = this._headerLineCount * WebInspector.TimelinePanel.rowHeight + frameContainerBorderWidth + "px";
|
| -this._frameContainer.addEventListener("dblclick", this._onFrameDoubleClicked.bind(this), false);
|
| -}
|
| -
|
| -var dividers = [ this._frameContainer ];
|
| -
|
| -for (var i = 0; i < frames.length; ++i) {
|
| -var frame = frames[i];
|
| -var frameStart = this._calculator.computePosition(frame.startTime);
|
| -var frameEnd = this._calculator.computePosition(frame.endTime);
|
| -
|
| -var frameStrip = document.createElement("div");
|
| -frameStrip.className = "timeline-frame-strip";
|
| -var actualStart = Math.max(frameStart, 0);
|
| -var width = frameEnd - actualStart;
|
| -frameStrip.style.left = actualStart + "px";
|
| -frameStrip.style.width = width + "px";
|
| -frameStrip._frame = frame;
|
| -
|
| -const minWidthForFrameInfo = 60;
|
| -if (width > minWidthForFrameInfo)
|
| -frameStrip.textContent = Number.secondsToString(frame.endTime - frame.startTime, true);
|
| -
|
| -this._frameContainer.appendChild(frameStrip);
|
| -
|
| -if (actualStart > 0) {
|
| -var frameMarker = WebInspector.TimelinePresentationModel.createEventDivider(WebInspector.TimelineModel.RecordType.BeginFrame);
|
| -frameMarker.style.left = frameStart + "px";
|
| -dividers.push(frameMarker);
|
| -}
|
| -}
|
| -this._timelineGrid.addEventDividers(dividers);
|
| -},
|
| -
|
| -_onFrameDoubleClicked: function(event)
|
| -{
|
| -var frameBar = event.target.enclosingNodeOrSelfWithClass("timeline-frame-strip");
|
| -if (!frameBar)
|
| -return;
|
| -this._overviewPane.zoomToFrame(frameBar._frame);
|
| -},
|
| -
|
| -_overviewModeChanged: function(event)
|
| -{
|
| -var mode = event.data;
|
| -var shouldShowMemory = mode === WebInspector.TimelineOverviewPane.Mode.Memory;
|
| -var frameMode = mode === WebInspector.TimelineOverviewPane.Mode.Frames;
|
| -this._overviewModeSetting.set(mode);
|
| -if (frameMode !== this._frameMode) {
|
| -this._frameMode = frameMode;
|
| -this._glueParentButton.setEnabled(!frameMode);
|
| -this._presentationModel.setGlueRecords(this._glueParentButton.toggled && !frameMode);
|
| -this._repopulateRecords();
|
| -
|
| -if (frameMode) {
|
| -this.element.addStyleClass("timeline-frame-overview");
|
| -this.recordsCounter.addStyleClass("hidden");
|
| -this.frameStatistics.removeStyleClass("hidden");
|
| -this._frameController = new WebInspector.TimelineFrameController(this._model, this._overviewPane, this._presentationModel);
|
| -} else {
|
| -this._frameController.dispose();
|
| -this._frameController = null;
|
| -this.element.removeStyleClass("timeline-frame-overview");
|
| -this.recordsCounter.removeStyleClass("hidden");
|
| -this.frameStatistics.addStyleClass("hidden");
|
| -}
|
| -}
|
| -if (shouldShowMemory === this._memoryStatistics.visible())
|
| -return;
|
| -if (!shouldShowMemory) {
|
| -this._timelineMemorySplitter.addStyleClass("hidden");
|
| -this._memoryStatistics.hide();
|
| -this.splitView.element.style.height = "auto";
|
| -this.splitView.element.style.bottom = "0";
|
| -this.onResize();
|
| -} else {
|
| -this._timelineMemorySplitter.removeStyleClass("hidden");
|
| -this._memoryStatistics.show();
|
| -this.splitView.element.style.bottom = "auto";
|
| -this._setSplitterPosition(WebInspector.settings.memoryCounterGraphsHeight.get());
|
| -}
|
| -},
|
| -
|
| -
|
| -_toggleTimelineButtonClicked: function()
|
| -{
|
| -if (this._operationInProgress)
|
| -return true;
|
| -if (this.toggleTimelineButton.toggled) {
|
| -this._model.stopRecord();
|
| -this.toggleTimelineButton.title = WebInspector.UIString("Record");
|
| -} else {
|
| -this._model.startRecord(this._includeDomCounters, this._includeNativeMemoryStatistics);
|
| -this.toggleTimelineButton.title = WebInspector.UIString("Stop");
|
| -WebInspector.userMetrics.TimelineStarted.record();
|
| -}
|
| -this.toggleTimelineButton.toggled = !this.toggleTimelineButton.toggled;
|
| -return true;
|
| -},
|
| -
|
| -_durationFilterChanged: function()
|
| -{
|
| -var option = this._durationFilterSelector.selectedOption();
|
| -var minimumRecordDuration = +option._durationMs / 1000.0;
|
| -this._durationFilter.setMinimumRecordDuration(minimumRecordDuration);
|
| -this._durationFilterSelector.element.title = option.title;
|
| -this._invalidateAndScheduleRefresh(true, true);
|
| -},
|
| -
|
| -_garbageCollectButtonClicked: function()
|
| -{
|
| -HeapProfilerAgent.collectGarbage();
|
| -},
|
| -
|
| -_glueParentButtonClicked: function()
|
| -{
|
| -var newValue = !this._glueParentButton.toggled;
|
| -this._glueParentButton.toggled = newValue;
|
| -this._presentationModel.setGlueRecords(newValue);
|
| -this._glueRecordsSetting.set(newValue);
|
| -this._repopulateRecords();
|
| -},
|
| -
|
| -_repopulateRecords: function()
|
| -{
|
| -this._resetPanel();
|
| -this._automaticallySizeWindow = false;
|
| -var records = this._model.records;
|
| -for (var i = 0; i < records.length; ++i)
|
| -this._innerAddRecordToTimeline(records[i]);
|
| -this._invalidateAndScheduleRefresh(false, true);
|
| -},
|
| -
|
| -_onTimelineEventRecorded: function(event)
|
| -{
|
| -if (this._innerAddRecordToTimeline(event.data))
|
| -this._invalidateAndScheduleRefresh(false, false);
|
| -},
|
| -
|
| -_innerAddRecordToTimeline: function(record)
|
| -{
|
| -if (record.type === WebInspector.TimelineModel.RecordType.Program) {
|
| -this._mainThreadTasks.push({
|
| -startTime: WebInspector.TimelineModel.startTimeInSeconds(record),
|
| -endTime: WebInspector.TimelineModel.endTimeInSeconds(record)
|
| -});
|
| -}
|
| -
|
| -var records = this._presentationModel.addRecord(record);
|
| -this._allRecordsCount += records.length;
|
| -var hasVisibleRecords = false;
|
| -var presentationModel = this._presentationModel;
|
| -function checkVisible(record)
|
| -{
|
| -hasVisibleRecords |= presentationModel.isVisible(record);
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords(records, checkVisible);
|
| -
|
| -function isAdoptedRecord(record)
|
| -{
|
| -return record.parent !== presentationModel.rootRecord;
|
| -}
|
| -
|
| -return hasVisibleRecords || records.some(isAdoptedRecord);
|
| -},
|
| -
|
| -sidebarResized: function(event)
|
| -{
|
| -var width = event.data;
|
| -this._resize(width);
|
| -this._sidebarBackgroundElement.style.width = width + "px";
|
| -this._overviewPane.sidebarResized(width);
|
| -this._memoryStatistics.setSidebarWidth(width);
|
| -this._timelineGrid.gridHeaderElement.style.left = width + "px";
|
| -},
|
| -
|
| -onResize: function()
|
| -{
|
| -this._resize(this.splitView.sidebarWidth());
|
| -},
|
| -
|
| -
|
| -_resize: function(sidebarWidth)
|
| -{
|
| -this._closeRecordDetails();
|
| -this._scheduleRefresh(false, true);
|
| -this._graphRowsElementWidth = this._graphRowsElement.offsetWidth;
|
| -this._containerElementHeight = this._containerElement.clientHeight;
|
| -var lastItemElement = this._statusBarItems[this._statusBarItems.length - 1].element;
|
| -var minFloatingStatusBarItemsOffset = lastItemElement.totalOffsetLeft() + lastItemElement.offsetWidth;
|
| -this._timelineGrid.gridHeaderElement.style.width = this._itemsGraphsElement.offsetWidth + "px";
|
| -this._miscStatusBarItems.style.left = Math.max(minFloatingStatusBarItemsOffset, sidebarWidth) + "px";
|
| -},
|
| -
|
| -_clearPanel: function()
|
| -{
|
| -this._model.reset();
|
| -},
|
| -
|
| -_onRecordsCleared: function()
|
| -{
|
| -this._resetPanel();
|
| -this._invalidateAndScheduleRefresh(true, true);
|
| -},
|
| -
|
| -_resetPanel: function()
|
| -{
|
| -this._presentationModel.reset();
|
| -this._boundariesAreValid = false;
|
| -this._adjustScrollPosition(0);
|
| -this._closeRecordDetails();
|
| -this._allRecordsCount = 0;
|
| -this._automaticallySizeWindow = true;
|
| -this._mainThreadTasks = [];
|
| -},
|
| -
|
| -elementsToRestoreScrollPositionsFor: function()
|
| -{
|
| -return [this._containerElement];
|
| -},
|
| -
|
| -wasShown: function()
|
| -{
|
| -WebInspector.Panel.prototype.wasShown.call(this);
|
| -if (!WebInspector.TimelinePanel._categoryStylesInitialized) {
|
| -WebInspector.TimelinePanel._categoryStylesInitialized = true;
|
| -this._injectCategoryStyles();
|
| -}
|
| -this._overviewPane.setMode(this._overviewModeSetting.get());
|
| -this._refresh();
|
| -},
|
| -
|
| -willHide: function()
|
| -{
|
| -this._closeRecordDetails();
|
| -WebInspector.Panel.prototype.willHide.call(this);
|
| -},
|
| -
|
| -_onScroll: function(event)
|
| -{
|
| -this._closeRecordDetails();
|
| -this._scrollTop = this._containerElement.scrollTop;
|
| -var dividersTop = Math.max(0, this._scrollTop);
|
| -this._timelineGrid.setScrollAndDividerTop(this._scrollTop, dividersTop);
|
| -this._scheduleRefresh(true, true);
|
| -},
|
| -
|
| -
|
| -_invalidateAndScheduleRefresh: function(preserveBoundaries, userGesture)
|
| -{
|
| -this._presentationModel.invalidateFilteredRecords();
|
| -delete this._searchResults;
|
| -this._scheduleRefresh(preserveBoundaries, userGesture);
|
| -},
|
| -
|
| -
|
| -_scheduleRefresh: function(preserveBoundaries, userGesture)
|
| -{
|
| -this._closeRecordDetails();
|
| -this._boundariesAreValid &= preserveBoundaries;
|
| -
|
| -if (!this.isShowing())
|
| -return;
|
| -
|
| -if (preserveBoundaries || userGesture)
|
| -this._refresh();
|
| -else {
|
| -if (!this._refreshTimeout)
|
| -this._refreshTimeout = setTimeout(this._refresh.bind(this), 300);
|
| -}
|
| -},
|
| -
|
| -_refresh: function()
|
| -{
|
| -if (this._refreshTimeout) {
|
| -clearTimeout(this._refreshTimeout);
|
| -delete this._refreshTimeout;
|
| -}
|
| -
|
| -this._timelinePaddingLeft = this._expandOffset;
|
| -this._calculator.setWindow(this._overviewPane.windowStartTime(), this._overviewPane.windowEndTime());
|
| -this._calculator.setDisplayWindow(this._timelinePaddingLeft, this._graphRowsElementWidth);
|
| -
|
| -var recordsInWindowCount = this._refreshRecords();
|
| -this._updateRecordsCounter(recordsInWindowCount);
|
| -if (!this._boundariesAreValid) {
|
| -this._updateEventDividers();
|
| -var frames = this._frameController && this._presentationModel.filteredFrames(this._overviewPane.windowStartTime(), this._overviewPane.windowEndTime());
|
| -if (frames) {
|
| -this._updateFrameStatistics(frames);
|
| -const maxFramesForFrameBars = 30;
|
| -if (frames.length && frames.length < maxFramesForFrameBars) {
|
| -this._timelineGrid.removeDividers();
|
| -this._updateFrameBars(frames);
|
| -} else
|
| -this._timelineGrid.updateDividers(this._calculator);
|
| -} else
|
| -this._timelineGrid.updateDividers(this._calculator);
|
| -if (this._mainThreadMonitoringEnabled)
|
| -this._refreshMainThreadBars();
|
| -}
|
| -if (this._memoryStatistics.visible())
|
| -this._memoryStatistics.refresh();
|
| -this._boundariesAreValid = true;
|
| -},
|
| -
|
| -revealRecordAt: function(time)
|
| -{
|
| -var recordToReveal;
|
| -function findRecordToReveal(record)
|
| -{
|
| -if (record.containsTime(time)) {
|
| -recordToReveal = record;
|
| -return true;
|
| -}
|
| -
|
| -if (!recordToReveal || record.endTime < time && recordToReveal.endTime < record.endTime)
|
| -recordToReveal = record;
|
| -return false;
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords(this._presentationModel.rootRecord().children, null, findRecordToReveal);
|
| -
|
| -
|
| -if (!recordToReveal) {
|
| -this._containerElement.scrollTop = 0;
|
| -return;
|
| -}
|
| -
|
| -this._revealRecord(recordToReveal);
|
| -},
|
| -
|
| -_revealRecord: function(recordToReveal)
|
| -{
|
| -
|
| -for (var parent = recordToReveal.parent; parent !== this._rootRecord(); parent = parent.parent) {
|
| -if (!parent.collapsed)
|
| -continue;
|
| -this._presentationModel.invalidateFilteredRecords();
|
| -parent.collapsed = false;
|
| -}
|
| -var recordsInWindow = this._presentationModel.filteredRecords();
|
| -var index = recordsInWindow.indexOf(recordToReveal);
|
| -this._recordToHighlight = recordToReveal;
|
| -var oldScrollTop = this._containerElement.scrollTop;
|
| -this._containerElement.scrollTop = index * WebInspector.TimelinePanel.rowHeight;
|
| -
|
| -
|
| -
|
| -if (this._containerElement.scrollTop === oldScrollTop)
|
| -this._refresh();
|
| -},
|
| -
|
| -_refreshRecords: function()
|
| -{
|
| -var recordsInWindow = this._presentationModel.filteredRecords();
|
| -
|
| -
|
| -var visibleTop = this._scrollTop;
|
| -var visibleBottom = visibleTop + this._containerElementHeight;
|
| -
|
| -const rowHeight = WebInspector.TimelinePanel.rowHeight;
|
| -
|
| -
|
| -var startIndex = Math.max(0, Math.min(Math.floor(visibleTop / rowHeight) - this._headerLineCount, recordsInWindow.length - 1));
|
| -var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
|
| -var lastVisibleLine = Math.max(0, Math.floor(visibleBottom / rowHeight) - this._headerLineCount);
|
| -if (this._automaticallySizeWindow && recordsInWindow.length > lastVisibleLine) {
|
| -this._automaticallySizeWindow = false;
|
| -
|
| -var windowStartTime = startIndex ? recordsInWindow[startIndex].startTime : this._model.minimumRecordTime();
|
| -this._overviewPane.setWindowTimes(windowStartTime, recordsInWindow[Math.max(0, lastVisibleLine - 1)].endTime);
|
| -recordsInWindow = this._presentationModel.filteredRecords();
|
| -endIndex = Math.min(recordsInWindow.length, lastVisibleLine);
|
| -}
|
| -
|
| -
|
| -this._topGapElement.style.height = (startIndex * rowHeight) + "px";
|
| -this.sidebarTreeElement.style.height = ((startIndex + this._headerLineCount) * rowHeight) + "px";
|
| -this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";
|
| -
|
| -
|
| -var listRowElement = this._sidebarListElement.firstChild;
|
| -var width = this._graphRowsElementWidth;
|
| -this._itemsGraphsElement.removeChild(this._graphRowsElement);
|
| -var graphRowElement = this._graphRowsElement.firstChild;
|
| -var scheduleRefreshCallback = this._invalidateAndScheduleRefresh.bind(this, true, true);
|
| -this._itemsGraphsElement.removeChild(this._expandElements);
|
| -this._expandElements.removeChildren();
|
| -
|
| -var highlightedRecord = this._recordToHighlight;
|
| -delete this._recordToHighlight;
|
| -var highlightedListRowElement;
|
| -var highlightedGraphRowElement;
|
| -
|
| -for (var i = 0; i < endIndex; ++i) {
|
| -var record = recordsInWindow[i];
|
| -var isEven = !(i % 2);
|
| -
|
| -if (i < startIndex) {
|
| -var lastChildIndex = i + record.visibleChildrenCount;
|
| -if (lastChildIndex >= startIndex && lastChildIndex < endIndex) {
|
| -var expandElement = new WebInspector.TimelineExpandableElement(this._expandElements);
|
| -var positions = this._calculator.computeBarGraphWindowPosition(record);
|
| -expandElement._update(record, i, positions.left - this._expandOffset, positions.width);
|
| -}
|
| -} else {
|
| -if (!listRowElement) {
|
| -listRowElement = new WebInspector.TimelineRecordListRow().element;
|
| -this._sidebarListElement.appendChild(listRowElement);
|
| -}
|
| -if (!graphRowElement) {
|
| -graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback).element;
|
| -this._graphRowsElement.appendChild(graphRowElement);
|
| -}
|
| -
|
| -if (highlightedRecord === record) {
|
| -highlightedListRowElement = listRowElement;
|
| -highlightedGraphRowElement = graphRowElement;
|
| -}
|
| -
|
| -listRowElement.row.update(record, isEven, visibleTop);
|
| -graphRowElement.row.update(record, isEven, this._calculator, this._expandOffset, i);
|
| -
|
| -listRowElement = listRowElement.nextSibling;
|
| -graphRowElement = graphRowElement.nextSibling;
|
| -}
|
| -}
|
| -
|
| -
|
| -while (listRowElement) {
|
| -var nextElement = listRowElement.nextSibling;
|
| -listRowElement.row.dispose();
|
| -listRowElement = nextElement;
|
| -}
|
| -while (graphRowElement) {
|
| -var nextElement = graphRowElement.nextSibling;
|
| -graphRowElement.row.dispose();
|
| -graphRowElement = nextElement;
|
| -}
|
| -
|
| -this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bottomGapElement);
|
| -this._itemsGraphsElement.appendChild(this._expandElements);
|
| -this._adjustScrollPosition((recordsInWindow.length + this._headerLineCount) * rowHeight);
|
| -this._updateSearchHighlight(false);
|
| -
|
| -if (highlightedListRowElement) {
|
| -highlightedListRowElement.addStyleClass("highlighted-timeline-record");
|
| -highlightedGraphRowElement.addStyleClass("highlighted-timeline-record");
|
| -}
|
| -
|
| -return recordsInWindow.length;
|
| -},
|
| -
|
| -_refreshMainThreadBars: function()
|
| -{
|
| -const barOffset = 3;
|
| -const minGap = 3;
|
| -
|
| -var minWidth = WebInspector.TimelineCalculator._minWidth;
|
| -var widthAdjustment = minWidth / 2;
|
| -
|
| -var width = this._graphRowsElementWidth;
|
| -var boundarySpan = this._overviewPane.windowEndTime() - this._overviewPane.windowStartTime();
|
| -var scale = boundarySpan / (width - minWidth - this._timelinePaddingLeft);
|
| -var startTime = this._overviewPane.windowStartTime() - this._timelinePaddingLeft * scale;
|
| -var endTime = startTime + width * scale;
|
| -
|
| -var tasks = this._mainThreadMonitoringEnabled ? this._mainThreadTasks : [];
|
| -
|
| -function compareEndTime(value, task)
|
| -{
|
| -return value < task.endTime ? -1 : 1;
|
| -}
|
| -
|
| -var taskIndex = insertionIndexForObjectInListSortedByFunction(startTime, tasks, compareEndTime);
|
| -
|
| -var container = this._cpuBarsElement;
|
| -var element = container.firstChild;
|
| -var lastElement;
|
| -var lastLeft;
|
| -var lastRight;
|
| -
|
| -for (; taskIndex < tasks.length; ++taskIndex) {
|
| -var task = tasks[taskIndex];
|
| -if (task.startTime > endTime)
|
| -break;
|
| -
|
| -var left = Math.max(0, this._calculator.computePosition(task.startTime) + barOffset - widthAdjustment);
|
| -var right = Math.min(width, this._calculator.computePosition(task.endTime) + barOffset + widthAdjustment);
|
| -
|
| -if (lastElement) {
|
| -var gap = Math.floor(left) - Math.ceil(lastRight);
|
| -if (gap < minGap) {
|
| -lastRight = right;
|
| -lastElement._tasksInfo.lastTaskIndex = taskIndex;
|
| -continue;
|
| -}
|
| -lastElement.style.width = (lastRight - lastLeft) + "px";
|
| -}
|
| -
|
| -if (!element)
|
| -element = container.createChild("div", "timeline-graph-bar");
|
| -
|
| -element.style.left = left + "px";
|
| -element._tasksInfo = {tasks: tasks, firstTaskIndex: taskIndex, lastTaskIndex: taskIndex};
|
| -lastLeft = left;
|
| -lastRight = right;
|
| -
|
| -lastElement = element;
|
| -element = element.nextSibling;
|
| -}
|
| -
|
| -if (lastElement)
|
| -lastElement.style.width = (lastRight - lastLeft) + "px";
|
| -
|
| -while (element) {
|
| -var nextElement = element.nextSibling;
|
| -element._tasksInfo = null;
|
| -container.removeChild(element);
|
| -element = nextElement;
|
| -}
|
| -},
|
| -
|
| -_adjustHeaderHeight: function()
|
| -{
|
| -const headerBorderWidth = 1;
|
| -const headerMargin = 2;
|
| -
|
| -var headerHeight = this._headerLineCount * WebInspector.TimelinePanel.rowHeight;
|
| -this.sidebarElement.firstChild.style.height = headerHeight + "px";
|
| -this._timelineGrid.dividersLabelBarElement.style.height = headerHeight + headerMargin + "px";
|
| -this._itemsGraphsElement.style.top = headerHeight + headerBorderWidth + "px";
|
| -},
|
| -
|
| -_adjustScrollPosition: function(totalHeight)
|
| -{
|
| -
|
| -if ((this._scrollTop + this._containerElementHeight) > totalHeight + 1)
|
| -this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);
|
| -},
|
| -
|
| -_getPopoverAnchor: function(element)
|
| -{
|
| -return element.enclosingNodeOrSelfWithClass("timeline-graph-bar") ||
|
| -element.enclosingNodeOrSelfWithClass("timeline-tree-item") ||
|
| -element.enclosingNodeOrSelfWithClass("timeline-frame-strip");
|
| -},
|
| -
|
| -_mouseOut: function(e)
|
| -{
|
| -this._hideQuadHighlight();
|
| -},
|
| -
|
| -
|
| -_mouseMove: function(e)
|
| -{
|
| -var anchor = this._getPopoverAnchor(e.target);
|
| -
|
| -if (anchor && anchor.row && anchor.row._record.highlightQuad)
|
| -this._highlightQuad(anchor.row._record.highlightQuad);
|
| -else
|
| -this._hideQuadHighlight();
|
| -
|
| -if (anchor && anchor._tasksInfo) {
|
| -var offset = anchor.offsetLeft;
|
| -this._timelineGrid.showCurtains(offset >= 0 ? offset : 0, anchor.offsetWidth);
|
| -} else
|
| -this._timelineGrid.hideCurtains();
|
| -},
|
| -
|
| -
|
| -_highlightQuad: function(quad)
|
| -{
|
| -if (this._highlightedQuad === quad)
|
| -return;
|
| -this._highlightedQuad = quad;
|
| -DOMAgent.highlightQuad(quad, WebInspector.Color.PageHighlight.Content.toProtocolRGBA(), WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());
|
| -},
|
| -
|
| -_hideQuadHighlight: function()
|
| -{
|
| -if (this._highlightedQuad) {
|
| -delete this._highlightedQuad;
|
| -DOMAgent.hideHighlight();
|
| -}
|
| -},
|
| -
|
| -
|
| -_showPopover: function(anchor, popover)
|
| -{
|
| -if (anchor.hasStyleClass("timeline-frame-strip")) {
|
| -var frame = anchor._frame;
|
| -popover.show(WebInspector.TimelinePresentationModel.generatePopupContentForFrame(frame), anchor);
|
| -} else {
|
| -if (anchor.row && anchor.row._record)
|
| -anchor.row._record.generatePopupContent(showCallback);
|
| -else if (anchor._tasksInfo)
|
| -popover.show(this._presentationModel.generateMainThreadBarPopupContent(anchor._tasksInfo), anchor, null, null, WebInspector.Popover.Orientation.Bottom);
|
| -}
|
| -
|
| +{return entry.listenerCount;}
|
| +return[new WebInspector.DOMCounterUI(this,"Document Count","Documents: %d",[100,0,0],getDocumentCount),new WebInspector.DOMCounterUI(this,"DOM Node Count","Nodes: %d",[0,100,0],getNodeCount),new WebInspector.DOMCounterUI(this,"Event Listener Count","Listeners: %d",[0,0,100],getListenerCount)];},_canvasHeight:function()
|
| +{return this._canvasContainer.offsetHeight-this._currentValuesBar.offsetHeight;},_onRecordAdded:function(event)
|
| +{function addStatistics(record)
|
| +{var counters=record["counters"];if(!counters)
|
| +return;this._counters.push(new WebInspector.DOMCountersGraph.Counter(record.endTime||record.startTime,counters["documents"],counters["nodes"],counters["jsEventListeners"]));}
|
| +WebInspector.TimelinePresentationModel.forAllRecords([event.data],null,addStatistics.bind(this));},_draw:function()
|
| +{WebInspector.MemoryStatistics.prototype._draw.call(this);for(var i=0;i<this._counterUI.length;i++)
|
| +this._drawGraph(this._counterUI[i]);},_restoreImageUnderMarker:function(ctx)
|
| +{for(var i=0;i<this._counterUI.length;i++){var counterUI=this._counterUI[i];if(!counterUI.visible)
|
| +continue;counterUI.restoreImageUnderMarker(ctx);}},_saveImageUnderMarker:function(ctx,x,index)
|
| +{const radius=2;for(var i=0;i<this._counterUI.length;i++){var counterUI=this._counterUI[i];if(!counterUI.visible)
|
| +continue;var y=counterUI.graphYValues[index];counterUI.saveImageUnderMarker(ctx,x,y,radius);}},_drawMarker:function(ctx,x,index)
|
| +{this._saveImageUnderMarker(ctx,x,index);const radius=2;for(var i=0;i<this._counterUI.length;i++){var counterUI=this._counterUI[i];if(!counterUI.visible)
|
| +continue;var y=counterUI.graphYValues[index];ctx.beginPath();ctx.arc(x,y,radius,0,Math.PI*2,true);ctx.lineWidth=1;ctx.fillStyle=counterUI.graphColor;ctx.strokeStyle=counterUI.graphColor;ctx.fill();ctx.stroke();ctx.closePath();}},_drawGraph:function(counterUI)
|
| +{var canvas=this._canvas;var ctx=canvas.getContext("2d");var width=canvas.width;var height=this._clippedHeight;var originY=this._originY;var valueGetter=counterUI.valueGetter;if(!this._counters.length)
|
| +return;var maxValue;var minValue;for(var i=this._minimumIndex;i<=this._maximumIndex;i++){var value=valueGetter(this._counters[i]);if(minValue===undefined||value<minValue)
|
| +minValue=value;if(maxValue===undefined||value>maxValue)
|
| +maxValue=value;}
|
| +counterUI.setRange(minValue,maxValue);if(!counterUI.visible)
|
| +return;var yValues=counterUI.graphYValues;yValues.length=this._counters.length;var maxYRange=maxValue-minValue;var yFactor=maxYRange?height/(maxYRange):1;ctx.beginPath();var currentY=originY+(height-(valueGetter(this._counters[this._minimumIndex])-minValue)*yFactor);ctx.moveTo(0,currentY);for(var i=this._minimumIndex;i<=this._maximumIndex;i++){var x=this._counters[i].x;ctx.lineTo(x,currentY);currentY=originY+(height-(valueGetter(this._counters[i])-minValue)*yFactor);ctx.lineTo(x,currentY);yValues[i]=currentY;}
|
| +ctx.lineTo(width,currentY);ctx.lineWidth=1;ctx.strokeStyle=counterUI.graphColor;ctx.stroke();ctx.closePath();},_discardImageUnderMarker:function()
|
| +{for(var i=0;i<this._counterUI.length;i++)
|
| +this._counterUI[i].discardImageUnderMarker();},__proto__:WebInspector.MemoryStatistics.prototype};WebInspector.TimelineModel=function()
|
| +{this._records=[];this._stringPool=new StringPool();this._minimumRecordTime=-1;this._maximumRecordTime=-1;this._collectionEnabled=false;WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,this._onRecordAdded,this);}
|
| +WebInspector.TimelineModel.TransferChunkLengthBytes=5000000;WebInspector.TimelineModel.RecordType={Root:"Root",Program:"Program",EventDispatch:"EventDispatch",BeginFrame:"BeginFrame",ScheduleStyleRecalculation:"ScheduleStyleRecalculation",RecalculateStyles:"RecalculateStyles",InvalidateLayout:"InvalidateLayout",Layout:"Layout",PaintSetup:"PaintSetup",Paint:"Paint",Rasterize:"Rasterize",ScrollLayer:"ScrollLayer",DecodeImage:"DecodeImage",ResizeImage:"ResizeImage",CompositeLayers:"CompositeLayers",ParseHTML:"ParseHTML",TimerInstall:"TimerInstall",TimerRemove:"TimerRemove",TimerFire:"TimerFire",XHRReadyStateChange:"XHRReadyStateChange",XHRLoad:"XHRLoad",EvaluateScript:"EvaluateScript",MarkLoad:"MarkLoad",MarkDOMContent:"MarkDOMContent",TimeStamp:"TimeStamp",Time:"Time",TimeEnd:"TimeEnd",ScheduleResourceRequest:"ScheduleResourceRequest",ResourceSendRequest:"ResourceSendRequest",ResourceReceiveResponse:"ResourceReceiveResponse",ResourceReceivedData:"ResourceReceivedData",ResourceFinish:"ResourceFinish",FunctionCall:"FunctionCall",GCEvent:"GCEvent",RequestAnimationFrame:"RequestAnimationFrame",CancelAnimationFrame:"CancelAnimationFrame",FireAnimationFrame:"FireAnimationFrame",WebSocketCreate:"WebSocketCreate",WebSocketSendHandshakeRequest:"WebSocketSendHandshakeRequest",WebSocketReceiveHandshakeResponse:"WebSocketReceiveHandshakeResponse",WebSocketDestroy:"WebSocketDestroy",}
|
| +WebInspector.TimelineModel.Events={RecordAdded:"RecordAdded",RecordsCleared:"RecordsCleared"}
|
| +WebInspector.TimelineModel.startTimeInSeconds=function(record)
|
| +{return record.startTime/1000;}
|
| +WebInspector.TimelineModel.endTimeInSeconds=function(record)
|
| +{return(typeof record.endTime==="undefined"?record.startTime:record.endTime)/1000;}
|
| +WebInspector.TimelineModel.durationInSeconds=function(record)
|
| +{return WebInspector.TimelineModel.endTimeInSeconds(record)-WebInspector.TimelineModel.startTimeInSeconds(record);}
|
| +WebInspector.TimelineModel.aggregateTimeForRecord=function(total,rawRecord)
|
| +{var childrenTime=0;var children=rawRecord["children"]||[];for(var i=0;i<children.length;++i){WebInspector.TimelineModel.aggregateTimeForRecord(total,children[i]);childrenTime+=WebInspector.TimelineModel.durationInSeconds(children[i]);}
|
| +var categoryName=WebInspector.TimelinePresentationModel.recordStyle(rawRecord).category.name;var ownTime=WebInspector.TimelineModel.durationInSeconds(rawRecord)-childrenTime;total[categoryName]=(total[categoryName]||0)+ownTime;}
|
| +WebInspector.TimelineModel.aggregateTimeByCategory=function(total,addend)
|
| +{for(var category in addend)
|
| +total[category]=(total[category]||0)+addend[category];}
|
| +WebInspector.TimelineModel.prototype={startRecord:function(includeDomCounters)
|
| +{if(this._collectionEnabled)
|
| +return;this.reset();var maxStackFrames=WebInspector.settings.timelineLimitStackFramesFlag.get()?WebInspector.settings.timelineStackFramesToCapture.get():30;WebInspector.timelineManager.start(maxStackFrames,includeDomCounters);this._collectionEnabled=true;},stopRecord:function()
|
| +{if(!this._collectionEnabled)
|
| +return;WebInspector.timelineManager.stop();this._collectionEnabled=false;},get records()
|
| +{return this._records;},_onRecordAdded:function(event)
|
| +{if(this._collectionEnabled)
|
| +this._addRecord(event.data);},_addRecord:function(record)
|
| +{this._stringPool.internObjectStrings(record);this._records.push(record);this._updateBoundaries(record);this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded,record);},loadFromFile:function(file,progress)
|
| +{var delegate=new WebInspector.TimelineModelLoadFromFileDelegate(this,progress);var fileReader=this._createFileReader(file,delegate);var loader=new WebInspector.TimelineModelLoader(this,fileReader,progress);fileReader.start(loader);},loadFromURL:function(url,progress)
|
| +{var delegate=new WebInspector.TimelineModelLoadFromFileDelegate(this,progress);var urlReader=new WebInspector.ChunkedXHRReader(url,delegate);var loader=new WebInspector.TimelineModelLoader(this,urlReader,progress);urlReader.start(loader);},_createFileReader:function(file,delegate)
|
| +{return new WebInspector.ChunkedFileReader(file,WebInspector.TimelineModel.TransferChunkLengthBytes,delegate);},_createFileWriter:function(fileName,callback)
|
| +{var stream=new WebInspector.FileOutputStream();stream.open(fileName,callback);},saveToFile:function()
|
| +{var now=new Date();var fileName="TimelineRawData-"+now.toISO8601Compact()+".json";function callback(stream)
|
| +{var saver=new WebInspector.TimelineSaver(stream);saver.save(this._records,window.navigator.appVersion);}
|
| +this._createFileWriter(fileName,callback.bind(this));},reset:function()
|
| +{this._records=[];this._stringPool.reset();this._minimumRecordTime=-1;this._maximumRecordTime=-1;this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordsCleared);},minimumRecordTime:function()
|
| +{return this._minimumRecordTime;},maximumRecordTime:function()
|
| +{return this._maximumRecordTime;},_updateBoundaries:function(record)
|
| +{var startTime=WebInspector.TimelineModel.startTimeInSeconds(record);var endTime=WebInspector.TimelineModel.endTimeInSeconds(record);if(this._minimumRecordTime===-1||startTime<this._minimumRecordTime)
|
| +this._minimumRecordTime=startTime;if(this._maximumRecordTime===-1||endTime>this._maximumRecordTime)
|
| +this._maximumRecordTime=endTime;},recordOffsetInSeconds:function(rawRecord)
|
| +{return WebInspector.TimelineModel.startTimeInSeconds(rawRecord)-this._minimumRecordTime;},__proto__:WebInspector.Object.prototype}
|
| +WebInspector.TimelineModelLoader=function(model,reader,progress)
|
| +{this._model=model;this._reader=reader;this._progress=progress;this._buffer="";this._firstChunk=true;}
|
| +WebInspector.TimelineModelLoader.prototype={write:function(chunk)
|
| +{var data=this._buffer+chunk;var lastIndex=0;var index;do{index=lastIndex;lastIndex=WebInspector.findBalancedCurlyBrackets(data,index);}while(lastIndex!==-1)
|
| +var json=data.slice(0,index)+"]";this._buffer=data.slice(index);if(!index)
|
| +return;if(!this._firstChunk)
|
| +json="[0"+json;var items;try{items=(JSON.parse(json));}catch(e){WebInspector.showErrorMessage("Malformed timeline data.");this._model.reset();this._reader.cancel();this._progress.done();return;}
|
| +if(this._firstChunk){this._version=items[0];this._firstChunk=false;this._model.reset();}
|
| +for(var i=1,size=items.length;i<size;++i)
|
| +this._model._addRecord(items[i]);},close:function(){}}
|
| +WebInspector.TimelineModelLoadFromFileDelegate=function(model,progress)
|
| +{this._model=model;this._progress=progress;}
|
| +WebInspector.TimelineModelLoadFromFileDelegate.prototype={onTransferStarted:function()
|
| +{this._progress.setTitle(WebInspector.UIString("Loading\u2026"));},onChunkTransferred:function(reader)
|
| +{if(this._progress.isCanceled()){reader.cancel();this._progress.done();this._model.reset();return;}
|
| +var totalSize=reader.fileSize();if(totalSize){this._progress.setTotalWork(totalSize);this._progress.setWorked(reader.loadedSize());}},onTransferFinished:function()
|
| +{this._progress.done();},onError:function(reader,event)
|
| +{this._progress.done();this._model.reset();switch(event.target.error.code){case FileError.NOT_FOUND_ERR:WebInspector.showErrorMessage(WebInspector.UIString("File \"%s\" not found.",reader.fileName()));break;case FileError.NOT_READABLE_ERR:WebInspector.showErrorMessage(WebInspector.UIString("File \"%s\" is not readable",reader.fileName()));break;case FileError.ABORT_ERR:break;default:WebInspector.showErrorMessage(WebInspector.UIString("An error occurred while reading the file \"%s\"",reader.fileName()));}}}
|
| +WebInspector.TimelineSaver=function(stream)
|
| +{this._stream=stream;}
|
| +WebInspector.TimelineSaver.prototype={save:function(records,version)
|
| +{this._records=records;this._recordIndex=0;this._prologue="["+JSON.stringify(version);this._writeNextChunk(this._stream);},_writeNextChunk:function(stream)
|
| +{const separator=",\n";var data=[];var length=0;if(this._prologue){data.push(this._prologue);length+=this._prologue.length;delete this._prologue;}else{if(this._recordIndex===this._records.length){stream.close();return;}
|
| +data.push("");}
|
| +while(this._recordIndex<this._records.length){var item=JSON.stringify(this._records[this._recordIndex]);var itemLength=item.length+separator.length;if(length+itemLength>WebInspector.TimelineModel.TransferChunkLengthBytes)
|
| +break;length+=itemLength;data.push(item);++this._recordIndex;}
|
| +if(this._recordIndex===this._records.length)
|
| +data.push(data.pop()+"]");stream.write(data.join(separator),this._writeNextChunk.bind(this));}};WebInspector.TimelineOverviewPane=function(model)
|
| +{WebInspector.View.call(this);this.element.id="timeline-overview-panel";this._windowStartTime=0;this._windowEndTime=Infinity;this._eventDividers=[];this._model=model;this._topPaneSidebarElement=document.createElement("div");this._topPaneSidebarElement.id="timeline-overview-sidebar";var overviewTreeElement=document.createElement("ol");overviewTreeElement.className="sidebar-tree";this._topPaneSidebarElement.appendChild(overviewTreeElement);this.element.appendChild(this._topPaneSidebarElement);var topPaneSidebarTree=new TreeOutline(overviewTreeElement);this._overviewItems={};this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Events]=new WebInspector.SidebarTreeElement("timeline-overview-sidebar-events",WebInspector.UIString("Events"));this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Frames]=new WebInspector.SidebarTreeElement("timeline-overview-sidebar-frames",WebInspector.UIString("Frames"));this._overviewItems[WebInspector.TimelineOverviewPane.Mode.Memory]=new WebInspector.SidebarTreeElement("timeline-overview-sidebar-memory",WebInspector.UIString("Memory"));for(var mode in this._overviewItems){var item=this._overviewItems[mode];item.onselect=this.setMode.bind(this,mode);topPaneSidebarTree.appendChild(item);}
|
| +this._overviewGrid=new WebInspector.OverviewGrid("timeline");this.element.appendChild(this._overviewGrid.element);var separatorElement=document.createElement("div");separatorElement.id="timeline-overview-separator";this.element.appendChild(separatorElement);this._innerSetMode(WebInspector.TimelineOverviewPane.Mode.Events);var categories=WebInspector.TimelinePresentationModel.categories();for(var category in categories)
|
| +categories[category].addEventListener(WebInspector.TimelineCategory.Events.VisibilityChanged,this._onCategoryVisibilityChanged,this);this._overviewCalculator=new WebInspector.TimelineOverviewCalculator();model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onRecordAdded,this);model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._reset,this);this._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged,this._onWindowChanged,this);}
|
| +WebInspector.TimelineOverviewPane.Mode={Events:"Events",Frames:"Frames",Memory:"Memory"};WebInspector.TimelineOverviewPane.Events={ModeChanged:"ModeChanged",WindowChanged:"WindowChanged"};WebInspector.TimelineOverviewPane.prototype={wasShown:function()
|
| +{this._update();},onResize:function()
|
| +{this._update();},setMode:function(newMode)
|
| +{if(this._currentMode===newMode)
|
| +return;var windowTimes;if(this._overviewControl)
|
| +windowTimes=this._overviewControl.windowTimes(this.windowLeft(),this.windowRight());this._innerSetMode(newMode);this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.ModeChanged,this._currentMode);if(windowTimes&&windowTimes.startTime>=0)
|
| +this.setWindowTimes(windowTimes.startTime,windowTimes.endTime);this._update();},_innerSetMode:function(newMode)
|
| +{var windowTimes;if(this._overviewControl)
|
| +this._overviewControl.detach();this._currentMode=newMode;this._overviewControl=this._createOverviewControl();this._overviewControl.show(this._overviewGrid.element);this._overviewItems[this._currentMode].revealAndSelect(false);},_createOverviewControl:function()
|
| +{switch(this._currentMode){case WebInspector.TimelineOverviewPane.Mode.Events:return new WebInspector.TimelineEventOverview(this._model);case WebInspector.TimelineOverviewPane.Mode.Frames:return new WebInspector.TimelineFrameOverview(this._model);case WebInspector.TimelineOverviewPane.Mode.Memory:return new WebInspector.TimelineMemoryOverview(this._model);}
|
| +throw new Error("Invalid overview mode: "+this._currentMode);},_onCategoryVisibilityChanged:function(event)
|
| +{this._overviewControl.categoryVisibilityChanged();},_update:function()
|
| +{delete this._refreshTimeout;this._updateWindow();this._overviewCalculator.setWindow(this._model.minimumRecordTime(),this._model.maximumRecordTime());this._overviewCalculator.setDisplayWindow(0,this._overviewGrid.clientWidth());this._overviewControl.update();this._overviewGrid.updateDividers(this._overviewCalculator);this._updateEventDividers();},_updateEventDividers:function()
|
| +{var records=this._eventDividers;this._overviewGrid.removeEventDividers();var dividers=[];for(var i=0;i<records.length;++i){var record=records[i];var positions=this._overviewCalculator.computeBarGraphPercentages(record);var dividerPosition=Math.round(positions.start*10);if(dividers[dividerPosition])
|
| +continue;var divider=WebInspector.TimelinePresentationModel.createEventDivider(record.type);divider.style.left=positions.start+"%";dividers[dividerPosition]=divider;}
|
| +this._overviewGrid.addEventDividers(dividers);},sidebarResized:function(width)
|
| +{this._overviewGrid.element.style.left=width+"px";this._topPaneSidebarElement.style.width=width+"px";this._update();},addFrame:function(frame)
|
| +{this._overviewControl.addFrame(frame);this._scheduleRefresh();},zoomToFrame:function(frame)
|
| +{var frameOverview=(this._overviewControl);var window=frameOverview.framePosition(frame);if(!window)
|
| +return;this._overviewGrid.setWindowPosition(window.start,window.end);},_onRecordAdded:function(event)
|
| +{var record=event.data;var eventDividers=this._eventDividers;function addEventDividers(record)
|
| +{if(WebInspector.TimelinePresentationModel.isEventDivider(record))
|
| +eventDividers.push(record);}
|
| +WebInspector.TimelinePresentationModel.forAllRecords([record],addEventDividers);this._scheduleRefresh();},_reset:function()
|
| +{this._windowStartTime=0;this._windowEndTime=Infinity;this._overviewCalculator.reset();this._overviewGrid.reset();this._overviewGrid.setResizeEnabled(false);this._eventDividers=[];this._overviewGrid.updateDividers(this._overviewCalculator);this._overviewControl.reset();this._update();},windowStartTime:function()
|
| +{return this._windowStartTime||this._model.minimumRecordTime();},windowEndTime:function()
|
| +{return this._windowEndTime<Infinity?this._windowEndTime:this._model.maximumRecordTime();},windowLeft:function()
|
| +{return this._overviewGrid.windowLeft();},windowRight:function()
|
| +{return this._overviewGrid.windowRight();},_onWindowChanged:function()
|
| +{if(this._ignoreWindowChangedEvent)
|
| +return;var times=this._overviewControl.windowTimes(this.windowLeft(),this.windowRight());this._windowStartTime=times.startTime;this._windowEndTime=times.endTime;this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.WindowChanged);},setWindowTimes:function(startTime,endTime)
|
| +{this._windowStartTime=startTime;this._windowEndTime=endTime;this._updateWindow();},_updateWindow:function()
|
| +{var windowBoundaries=this._overviewControl.windowBoundaries(this._windowStartTime,this._windowEndTime);this._ignoreWindowChangedEvent=true;this._overviewGrid.setWindow(windowBoundaries.left,windowBoundaries.right);this._overviewGrid.setResizeEnabled(this._model.records.length);this._ignoreWindowChangedEvent=false;},_scheduleRefresh:function()
|
| +{if(this._refreshTimeout)
|
| +return;if(!this.isShowing())
|
| +return;this._refreshTimeout=setTimeout(this._update.bind(this),300);},__proto__:WebInspector.View.prototype}
|
| +WebInspector.TimelineOverviewCalculator=function()
|
| +{}
|
| +WebInspector.TimelineOverviewCalculator.prototype={computePosition:function(time)
|
| +{return(time-this._minimumBoundary)/this.boundarySpan()*this._workingArea+this.paddingLeft;},computeBarGraphPercentages:function(record)
|
| +{var start=(WebInspector.TimelineModel.startTimeInSeconds(record)-this._minimumBoundary)/this.boundarySpan()*100;var end=(WebInspector.TimelineModel.endTimeInSeconds(record)-this._minimumBoundary)/this.boundarySpan()*100;return{start:start,end:end};},setWindow:function(minimum,maximum)
|
| +{this._minimumBoundary=minimum>=0?minimum:undefined;this._maximumBoundary=maximum>=0?maximum:undefined;},setDisplayWindow:function(paddingLeft,clientWidth)
|
| +{this._workingArea=clientWidth-paddingLeft;this.paddingLeft=paddingLeft;},reset:function()
|
| +{this.setWindow();},formatTime:function(value)
|
| +{return Number.secondsToString(value);},maximumBoundary:function()
|
| +{return this._maximumBoundary;},minimumBoundary:function()
|
| +{return this._minimumBoundary;},zeroTime:function()
|
| +{return this._minimumBoundary;},boundarySpan:function()
|
| +{return this._maximumBoundary-this._minimumBoundary;}}
|
| +WebInspector.TimelineOverviewBase=function(model)
|
| +{WebInspector.View.call(this);this.element.classList.add("fill");this._model=model;this._canvas=this.element.createChild("canvas","fill");this._context=this._canvas.getContext("2d");}
|
| +WebInspector.TimelineOverviewBase.prototype={update:function(){},reset:function(){},categoryVisibilityChanged:function(){},addFrame:function(frame){},windowTimes:function(windowLeft,windowRight)
|
| +{var absoluteMin=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-absoluteMin;return{startTime:absoluteMin+timeSpan*windowLeft,endTime:absoluteMin+timeSpan*windowRight};},windowBoundaries:function(startTime,endTime)
|
| +{var absoluteMin=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-absoluteMin;var haveRecords=absoluteMin>=0;return{left:haveRecords&&startTime?Math.min((startTime-absoluteMin)/timeSpan,1):0,right:haveRecords&&endTime<Infinity?(endTime-absoluteMin)/timeSpan:1}},_resetCanvas:function()
|
| +{this._canvas.width=this.element.clientWidth*window.devicePixelRatio;this._canvas.height=this.element.clientHeight*window.devicePixelRatio;},__proto__:WebInspector.View.prototype}
|
| +WebInspector.TimelineMemoryOverview=function(model)
|
| +{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-memory";this._maxHeapSizeLabel=this.element.createChild("div","max memory-graph-label");this._minHeapSizeLabel=this.element.createChild("div","min memory-graph-label");}
|
| +WebInspector.TimelineMemoryOverview.prototype={update:function()
|
| +{this._resetCanvas();var records=this._model.records;if(!records.length)
|
| +return;const lowerOffset=3;var maxUsedHeapSize=0;var minUsedHeapSize=100000000000;var minTime=this._model.minimumRecordTime();var maxTime=this._model.maximumRecordTime();WebInspector.TimelinePresentationModel.forAllRecords(records,function(r){maxUsedHeapSize=Math.max(maxUsedHeapSize,r.usedHeapSize||maxUsedHeapSize);minUsedHeapSize=Math.min(minUsedHeapSize,r.usedHeapSize||minUsedHeapSize);});minUsedHeapSize=Math.min(minUsedHeapSize,maxUsedHeapSize);var width=this._canvas.width;var height=this._canvas.height-lowerOffset;var xFactor=width/(maxTime-minTime);var yFactor=height/Math.max(maxUsedHeapSize-minUsedHeapSize,1);var histogram=new Array(width);WebInspector.TimelinePresentationModel.forAllRecords(records,function(r){if(!r.usedHeapSize)
|
| +return;var x=Math.round((WebInspector.TimelineModel.endTimeInSeconds(r)-minTime)*xFactor);var y=Math.round((r.usedHeapSize-minUsedHeapSize)*yFactor);histogram[x]=Math.max(histogram[x]||0,y);});height++;var y=0;var isFirstPoint=true;var ctx=this._context;ctx.beginPath();ctx.moveTo(0,this._canvas.height);for(var x=0;x<histogram.length;x++){if(typeof histogram[x]==="undefined")
|
| +continue;if(isFirstPoint){isFirstPoint=false;y=histogram[x];ctx.lineTo(0,height-y);}
|
| +ctx.lineTo(x,height-y);y=histogram[x];ctx.lineTo(x,height-y);}
|
| +ctx.lineTo(width,height-y);ctx.lineTo(width,this._canvas.height);ctx.lineTo(0,this._canvas.height);ctx.closePath();ctx.lineWidth=0.5;ctx.strokeStyle="rgba(20,0,0,0.8)";ctx.stroke();ctx.fillStyle="rgba(214,225,254, 0.8);";ctx.fill();this._maxHeapSizeLabel.textContent=Number.bytesToString(maxUsedHeapSize);this._minHeapSizeLabel.textContent=Number.bytesToString(minUsedHeapSize);},__proto__:WebInspector.TimelineOverviewBase.prototype}
|
| +WebInspector.TimelineEventOverview=function(model)
|
| +{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-events";this._fillStyles={};var categories=WebInspector.TimelinePresentationModel.categories();for(var category in categories)
|
| +this._fillStyles[category]=WebInspector.TimelinePresentationModel.createFillStyleForCategory(this._context,0,WebInspector.TimelineEventOverview._stripGradientHeight,categories[category]);this._disabledCategoryFillStyle=WebInspector.TimelinePresentationModel.createFillStyle(this._context,0,WebInspector.TimelineEventOverview._stripGradientHeight,"rgb(218, 218, 218)","rgb(170, 170, 170)","rgb(143, 143, 143)");this._disabledCategoryBorderStyle="rgb(143, 143, 143)";}
|
| +WebInspector.TimelineEventOverview._numberOfStrips=3;WebInspector.TimelineEventOverview._stripGradientHeight=120;WebInspector.TimelineEventOverview.prototype={update:function()
|
| +{this._resetCanvas();var stripHeight=Math.round(this._canvas.height/WebInspector.TimelineEventOverview._numberOfStrips);var timeOffset=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-timeOffset;var scale=this._canvas.width/timeSpan;var lastBarByGroup=[];this._context.fillStyle="rgba(0, 0, 0, 0.05)";for(var i=1;i<WebInspector.TimelineEventOverview._numberOfStrips;i+=2)
|
| +this._context.fillRect(0.5,i*stripHeight+0.5,this._canvas.width,stripHeight);function appendRecord(record)
|
| +{if(record.type===WebInspector.TimelineModel.RecordType.BeginFrame)
|
| +return;var recordStart=Math.floor((WebInspector.TimelineModel.startTimeInSeconds(record)-timeOffset)*scale);var recordEnd=Math.ceil((WebInspector.TimelineModel.endTimeInSeconds(record)-timeOffset)*scale);var category=WebInspector.TimelinePresentationModel.categoryForRecord(record);if(category.overviewStripGroupIndex<0)
|
| +return;var bar=lastBarByGroup[category.overviewStripGroupIndex];const barsMergeThreshold=2;if(bar&&bar.category===category&&bar.end+barsMergeThreshold>=recordStart){if(recordEnd>bar.end)
|
| +bar.end=recordEnd;return;}
|
| +if(bar)
|
| +this._renderBar(bar.start,bar.end,stripHeight,bar.category);lastBarByGroup[category.overviewStripGroupIndex]={start:recordStart,end:recordEnd,category:category};}
|
| +WebInspector.TimelinePresentationModel.forAllRecords(this._model.records,appendRecord.bind(this));for(var i=0;i<lastBarByGroup.length;++i){if(lastBarByGroup[i])
|
| +this._renderBar(lastBarByGroup[i].start,lastBarByGroup[i].end,stripHeight,lastBarByGroup[i].category);}},categoryVisibilityChanged:function()
|
| +{this.update();},_renderBar:function(begin,end,height,category)
|
| +{const stripPadding=4*window.devicePixelRatio;const innerStripHeight=height-2*stripPadding;var x=begin+0.5;var y=category.overviewStripGroupIndex*height+stripPadding+0.5;var width=Math.max(end-begin,1);this._context.save();this._context.translate(x,y);this._context.scale(1,innerStripHeight/WebInspector.TimelineEventOverview._stripGradientHeight);this._context.fillStyle=category.hidden?this._disabledCategoryFillStyle:this._fillStyles[category.name];this._context.fillRect(0,0,width,WebInspector.TimelineEventOverview._stripGradientHeight);this._context.strokeStyle=category.hidden?this._disabledCategoryBorderStyle:category.borderColor;this._context.strokeRect(0,0,width,WebInspector.TimelineEventOverview._stripGradientHeight);this._context.restore();},__proto__:WebInspector.TimelineOverviewBase.prototype}
|
| +WebInspector.TimelineFrameOverview=function(model)
|
| +{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-frames";this.reset();this._outerPadding=4*window.devicePixelRatio;this._maxInnerBarWidth=10*window.devicePixelRatio;this._actualPadding=5*window.devicePixelRatio;this._actualOuterBarWidth=this._maxInnerBarWidth+this._actualPadding;this._fillStyles={};var categories=WebInspector.TimelinePresentationModel.categories();for(var category in categories)
|
| +this._fillStyles[category]=WebInspector.TimelinePresentationModel.createFillStyleForCategory(this._context,this._maxInnerBarWidth,0,categories[category]);}
|
| +WebInspector.TimelineFrameOverview.prototype={reset:function()
|
| +{this._recordsPerBar=1;this._barTimes=[];this._frames=[];},update:function()
|
| +{const minBarWidth=4*window.devicePixelRatio;this._resetCanvas();this._framesPerBar=Math.max(1,this._frames.length*minBarWidth/this._canvas.width);this._barTimes=[];var visibleFrames=this._aggregateFrames(this._framesPerBar);const paddingTop=4*window.devicePixelRatio;const targetFPS=30;var fullBarLength=1.0/targetFPS;if(fullBarLength<this._medianFrameLength)
|
| +fullBarLength=Math.min(this._medianFrameLength*2,this._maxFrameLength);var scale=(this._canvas.height-paddingTop)/fullBarLength;this._renderBars(visibleFrames,scale);},addFrame:function(frame)
|
| +{this._frames.push(frame);},framePosition:function(frame)
|
| +{var frameNumber=this._frames.indexOf(frame);if(frameNumber<0)
|
| +return;var barNumber=Math.floor(frameNumber/this._framesPerBar);var firstBar=this._framesPerBar>1?barNumber:Math.max(barNumber-1,0);var lastBar=this._framesPerBar>1?barNumber:Math.min(barNumber+1,this._barTimes.length-1);return{start:Math.ceil(this._barNumberToScreenPosition(firstBar)-this._actualPadding/2),end:Math.floor(this._barNumberToScreenPosition(lastBar+1)-this._actualPadding/2)}},_aggregateFrames:function(framesPerBar)
|
| +{var visibleFrames=[];var durations=[];this._maxFrameLength=0;for(var barNumber=0,currentFrame=0;currentFrame<this._frames.length;++barNumber){var barStartTime=this._frames[currentFrame].startTime;var longestFrame=null;for(var lastFrame=Math.min(Math.floor((barNumber+1)*framesPerBar),this._frames.length);currentFrame<lastFrame;++currentFrame){if(!longestFrame||longestFrame.duration<this._frames[currentFrame].duration)
|
| +longestFrame=this._frames[currentFrame];}
|
| +var barEndTime=this._frames[currentFrame-1].endTime;if(longestFrame){this._maxFrameLength=Math.max(this._maxFrameLength,longestFrame.duration);visibleFrames.push(longestFrame);this._barTimes.push({startTime:barStartTime,endTime:barEndTime});durations.push(longestFrame.duration);}}
|
| +this._medianFrameLength=durations.qselect(Math.floor(durations.length/2));return visibleFrames;},_renderBars:function(frames,scale)
|
| +{const maxPadding=5*window.devicePixelRatio;this._actualOuterBarWidth=Math.min((this._canvas.width-2*this._outerPadding)/frames.length,this._maxInnerBarWidth+maxPadding);this._actualPadding=Math.min(Math.floor(this._actualOuterBarWidth/3),maxPadding);var barWidth=this._actualOuterBarWidth-this._actualPadding;for(var i=0;i<frames.length;++i)
|
| +this._renderBar(this._barNumberToScreenPosition(i),barWidth,frames[i],scale);this._drawFPSMarks(scale);},_barNumberToScreenPosition:function(n)
|
| +{return this._outerPadding+this._actualOuterBarWidth*n;},_drawFPSMarks:function(scale)
|
| +{const fpsMarks=[30,60];this._context.save();this._context.beginPath();this._context.font=(10*window.devicePixelRatio)+"px "+window.getComputedStyle(this.element,null).getPropertyValue("font-family");this._context.textAlign="right";this._context.textBaseline="alphabetic";const labelPadding=4*window.devicePixelRatio;const baselineHeight=3*window.devicePixelRatio;var lineHeight=12*window.devicePixelRatio;var labelTopMargin=0;var labelOffsetY=0;for(var i=0;i<fpsMarks.length;++i){var fps=fpsMarks[i];var y=this._canvas.height-Math.floor(1.0/fps*scale)-0.5;var label=WebInspector.UIString("%d\u2009fps",fps);var labelWidth=this._context.measureText(label).width+2*labelPadding;var labelX=this._canvas.width;if(!i&&labelTopMargin<y-lineHeight)
|
| +labelOffsetY=-lineHeight;var labelY=y+labelOffsetY;if(labelY<labelTopMargin||labelY+lineHeight>this._canvas.height)
|
| +break;this._context.moveTo(0,y);this._context.lineTo(this._canvas.width,y);this._context.fillStyle="rgba(255, 255, 255, 0.5)";this._context.fillRect(labelX-labelWidth,labelY,labelWidth,lineHeight);this._context.fillStyle="black";this._context.fillText(label,labelX-labelPadding,labelY+lineHeight-baselineHeight);labelTopMargin=labelY+lineHeight;}
|
| +this._context.strokeStyle="rgba(128, 128, 128, 0.5)";this._context.stroke();this._context.restore();},_renderBar:function(left,width,frame,scale)
|
| +{var categories=Object.keys(WebInspector.TimelinePresentationModel.categories());if(!categories.length)
|
| +return;var x=Math.floor(left)+0.5;width=Math.floor(width);for(var i=0,bottomOffset=this._canvas.height;i<categories.length;++i){var category=categories[i];var duration=frame.timeByCategory[category];if(!duration)
|
| +continue;var height=duration*scale;var y=Math.floor(bottomOffset-height)+0.5;this._context.save();this._context.translate(x,0);this._context.scale(width/this._maxInnerBarWidth,1);this._context.fillStyle=this._fillStyles[category];this._context.fillRect(0,y,this._maxInnerBarWidth,Math.floor(height));this._context.strokeStyle=WebInspector.TimelinePresentationModel.categories()[category].borderColor;this._context.beginPath();this._context.moveTo(0,y);this._context.lineTo(this._maxInnerBarWidth,y);this._context.stroke();this._context.restore();bottomOffset-=height-1;}
|
| +var y0=Math.floor(this._canvas.height-frame.duration*scale)+0.5;var y1=this._canvas.height+0.5;this._context.strokeStyle="rgba(90, 90, 90, 0.3)";this._context.beginPath();this._context.moveTo(x,y1);this._context.lineTo(x,y0);this._context.lineTo(x+width,y0);this._context.lineTo(x+width,y1);this._context.stroke();},windowTimes:function(windowLeft,windowRight)
|
| +{if(!this._barTimes.length)
|
| +return WebInspector.TimelineOverviewBase.prototype.windowTimes.call(this,windowLeft,windowRight);var windowSpan=this._canvas.width;var leftOffset=windowLeft*windowSpan-this._outerPadding+this._actualPadding;var rightOffset=windowRight*windowSpan-this._outerPadding;var firstBar=Math.floor(Math.max(leftOffset,0)/this._actualOuterBarWidth);var lastBar=Math.min(Math.floor(rightOffset/this._actualOuterBarWidth),this._barTimes.length-1);if(firstBar>=this._barTimes.length)
|
| +return{startTime:Infinity,endTime:Infinity};const snapToRightTolerancePixels=3;return{startTime:this._barTimes[firstBar].startTime,endTime:(rightOffset+snapToRightTolerancePixels>windowSpan)||(lastBar>=this._barTimes.length)?Infinity:this._barTimes[lastBar].endTime}},windowBoundaries:function(startTime,endTime)
|
| +{function barStartComparator(time,barTime)
|
| +{return time-barTime.startTime;}
|
| +function barEndComparator(time,barTime)
|
| +{if(time===barTime.endTime)
|
| +return 1;return time-barTime.endTime;}
|
| +return{left:this._windowBoundaryFromTime(startTime,barEndComparator),right:this._windowBoundaryFromTime(endTime,barStartComparator)}},_windowBoundaryFromTime:function(time,comparator)
|
| +{if(time===Infinity)
|
| +return 1;var index=this._firstBarAfter(time,comparator);if(!index)
|
| +return 0;return(this._barNumberToScreenPosition(index)-this._actualPadding/2)/this._canvas.width;},_firstBarAfter:function(time,comparator)
|
| +{return insertionIndexForObjectInListSortedByFunction(time,this._barTimes,comparator);},__proto__:WebInspector.TimelineOverviewBase.prototype}
|
| +WebInspector.TimelineWindowFilter=function(pane)
|
| +{this._pane=pane;}
|
| +WebInspector.TimelineWindowFilter.prototype={accept:function(record)
|
| +{return record.lastChildEndTime>=this._pane._windowStartTime&&record.startTime<=this._pane._windowEndTime;}};WebInspector.TimelinePresentationModel=function()
|
| +{this._linkifier=new WebInspector.Linkifier();this._glueRecords=false;this._filters=[];this.reset();}
|
| +WebInspector.TimelinePresentationModel.categories=function()
|
| +{if(WebInspector.TimelinePresentationModel._categories)
|
| +return WebInspector.TimelinePresentationModel._categories;WebInspector.TimelinePresentationModel._categories={loading:new WebInspector.TimelineCategory("loading",WebInspector.UIString("Loading"),0,"#5A8BCC","#8EB6E9","#70A2E3"),scripting:new WebInspector.TimelineCategory("scripting",WebInspector.UIString("Scripting"),1,"#D8AA34","#F3D07A","#F1C453"),rendering:new WebInspector.TimelineCategory("rendering",WebInspector.UIString("Rendering"),2,"#8266CC","#AF9AEB","#9A7EE6"),painting:new WebInspector.TimelineCategory("painting",WebInspector.UIString("Painting"),2,"#5FA050","#8DC286","#71B363"),other:new WebInspector.TimelineCategory("other",WebInspector.UIString("Other"),-1,"#BBBBBB","#DDDDDD","#DDDDDD")};return WebInspector.TimelinePresentationModel._categories;};WebInspector.TimelinePresentationModel._initRecordStyles=function()
|
| +{if(WebInspector.TimelinePresentationModel._recordStylesMap)
|
| +return WebInspector.TimelinePresentationModel._recordStylesMap;var recordTypes=WebInspector.TimelineModel.RecordType;var categories=WebInspector.TimelinePresentationModel.categories();var recordStyles={};recordStyles[recordTypes.Root]={title:"#root",category:categories["loading"]};recordStyles[recordTypes.Program]={title:WebInspector.UIString("Other"),category:categories["other"]};recordStyles[recordTypes.EventDispatch]={title:WebInspector.UIString("Event"),category:categories["scripting"]};recordStyles[recordTypes.BeginFrame]={title:WebInspector.UIString("Frame Start"),category:categories["rendering"]};recordStyles[recordTypes.ScheduleStyleRecalculation]={title:WebInspector.UIString("Schedule Style Recalculation"),category:categories["rendering"]};recordStyles[recordTypes.RecalculateStyles]={title:WebInspector.UIString("Recalculate Style"),category:categories["rendering"]};recordStyles[recordTypes.InvalidateLayout]={title:WebInspector.UIString("Invalidate Layout"),category:categories["rendering"]};recordStyles[recordTypes.Layout]={title:WebInspector.UIString("Layout"),category:categories["rendering"]};recordStyles[recordTypes.PaintSetup]={title:WebInspector.UIString("Paint Setup"),category:categories["painting"]};recordStyles[recordTypes.Paint]={title:WebInspector.UIString("Paint"),category:categories["painting"]};recordStyles[recordTypes.Rasterize]={title:WebInspector.UIString("Rasterize"),category:categories["painting"]};recordStyles[recordTypes.ScrollLayer]={title:WebInspector.UIString("Scroll"),category:categories["rendering"]};recordStyles[recordTypes.DecodeImage]={title:WebInspector.UIString("Image Decode"),category:categories["painting"]};recordStyles[recordTypes.ResizeImage]={title:WebInspector.UIString("Image Resize"),category:categories["painting"]};recordStyles[recordTypes.CompositeLayers]={title:WebInspector.UIString("Composite Layers"),category:categories["painting"]};recordStyles[recordTypes.ParseHTML]={title:WebInspector.UIString("Parse HTML"),category:categories["loading"]};recordStyles[recordTypes.TimerInstall]={title:WebInspector.UIString("Install Timer"),category:categories["scripting"]};recordStyles[recordTypes.TimerRemove]={title:WebInspector.UIString("Remove Timer"),category:categories["scripting"]};recordStyles[recordTypes.TimerFire]={title:WebInspector.UIString("Timer Fired"),category:categories["scripting"]};recordStyles[recordTypes.XHRReadyStateChange]={title:WebInspector.UIString("XHR Ready State Change"),category:categories["scripting"]};recordStyles[recordTypes.XHRLoad]={title:WebInspector.UIString("XHR Load"),category:categories["scripting"]};recordStyles[recordTypes.EvaluateScript]={title:WebInspector.UIString("Evaluate Script"),category:categories["scripting"]};recordStyles[recordTypes.ResourceSendRequest]={title:WebInspector.UIString("Send Request"),category:categories["loading"]};recordStyles[recordTypes.ResourceReceiveResponse]={title:WebInspector.UIString("Receive Response"),category:categories["loading"]};recordStyles[recordTypes.ResourceFinish]={title:WebInspector.UIString("Finish Loading"),category:categories["loading"]};recordStyles[recordTypes.FunctionCall]={title:WebInspector.UIString("Function Call"),category:categories["scripting"]};recordStyles[recordTypes.ResourceReceivedData]={title:WebInspector.UIString("Receive Data"),category:categories["loading"]};recordStyles[recordTypes.GCEvent]={title:WebInspector.UIString("GC Event"),category:categories["scripting"]};recordStyles[recordTypes.MarkDOMContent]={title:WebInspector.UIString("DOMContentLoaded event"),category:categories["scripting"]};recordStyles[recordTypes.MarkLoad]={title:WebInspector.UIString("Load event"),category:categories["scripting"]};recordStyles[recordTypes.TimeStamp]={title:WebInspector.UIString("Stamp"),category:categories["scripting"]};recordStyles[recordTypes.Time]={title:WebInspector.UIString("Time"),category:categories["scripting"]};recordStyles[recordTypes.TimeEnd]={title:WebInspector.UIString("Time End"),category:categories["scripting"]};recordStyles[recordTypes.ScheduleResourceRequest]={title:WebInspector.UIString("Schedule Request"),category:categories["loading"]};recordStyles[recordTypes.RequestAnimationFrame]={title:WebInspector.UIString("Request Animation Frame"),category:categories["scripting"]};recordStyles[recordTypes.CancelAnimationFrame]={title:WebInspector.UIString("Cancel Animation Frame"),category:categories["scripting"]};recordStyles[recordTypes.FireAnimationFrame]={title:WebInspector.UIString("Animation Frame Fired"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketCreate]={title:WebInspector.UIString("Create WebSocket"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketSendHandshakeRequest]={title:WebInspector.UIString("Send WebSocket Handshake"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketReceiveHandshakeResponse]={title:WebInspector.UIString("Receive WebSocket Handshake"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketDestroy]={title:WebInspector.UIString("Destroy WebSocket"),category:categories["scripting"]};WebInspector.TimelinePresentationModel._recordStylesMap=recordStyles;return recordStyles;}
|
| +WebInspector.TimelinePresentationModel.recordStyle=function(record)
|
| +{var recordStyles=WebInspector.TimelinePresentationModel._initRecordStyles();var result=recordStyles[record.type];if(!result){result={title:WebInspector.UIString("Unknown: %s",record.type),category:WebInspector.TimelinePresentationModel.categories()["other"]};recordStyles[record.type]=result;}
|
| +return result;}
|
| +WebInspector.TimelinePresentationModel.categoryForRecord=function(record)
|
| +{return WebInspector.TimelinePresentationModel.recordStyle(record).category;}
|
| +WebInspector.TimelinePresentationModel.isEventDivider=function(record)
|
| +{var recordTypes=WebInspector.TimelineModel.RecordType;if(record.type===recordTypes.TimeStamp)
|
| +return true;if(record.type===recordTypes.MarkDOMContent||record.type===recordTypes.MarkLoad){if(record.data&&((typeof record.data.isMainFrame)==="boolean"))
|
| +return record.data.isMainFrame;}
|
| +return false;}
|
| +WebInspector.TimelinePresentationModel.forAllRecords=function(recordsArray,preOrderCallback,postOrderCallback)
|
| +{if(!recordsArray)
|
| +return;var stack=[{array:recordsArray,index:0}];while(stack.length){var entry=stack[stack.length-1];var records=entry.array;if(entry.index<records.length){var record=records[entry.index];if(preOrderCallback&&preOrderCallback(record))
|
| +return;if(record.children)
|
| +stack.push({array:record.children,index:0,record:record});else if(postOrderCallback&&postOrderCallback(record))
|
| +return;++entry.index;}else{if(entry.record&&postOrderCallback&&postOrderCallback(entry.record))
|
| +return;stack.pop();}}}
|
| +WebInspector.TimelinePresentationModel.needsPreviewElement=function(recordType)
|
| +{if(!recordType)
|
| +return false;const recordTypes=WebInspector.TimelineModel.RecordType;switch(recordType){case recordTypes.ScheduleResourceRequest:case recordTypes.ResourceSendRequest:case recordTypes.ResourceReceiveResponse:case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:return true;default:return false;}}
|
| +WebInspector.TimelinePresentationModel.createEventDivider=function(recordType,title)
|
| +{var eventDivider=document.createElement("div");eventDivider.className="resources-event-divider";var recordTypes=WebInspector.TimelineModel.RecordType;if(recordType===recordTypes.MarkDOMContent)
|
| +eventDivider.className+=" resources-blue-divider";else if(recordType===recordTypes.MarkLoad)
|
| +eventDivider.className+=" resources-red-divider";else if(recordType===recordTypes.TimeStamp)
|
| +eventDivider.className+=" resources-orange-divider";else if(recordType===recordTypes.BeginFrame)
|
| +eventDivider.className+=" timeline-frame-divider";if(title)
|
| +eventDivider.title=title;return eventDivider;}
|
| +WebInspector.TimelinePresentationModel._hiddenRecords={}
|
| +WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkDOMContent]=1;WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkLoad]=1;WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation]=1;WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.InvalidateLayout]=1;WebInspector.TimelinePresentationModel.prototype={addFilter:function(filter)
|
| +{this._filters.push(filter);},setSearchFilter:function(filter)
|
| +{this._searchFilter=filter;},rootRecord:function()
|
| +{return this._rootRecord;},frames:function()
|
| +{return this._frames;},reset:function()
|
| +{this._linkifier.reset();this._rootRecord=new WebInspector.TimelinePresentationModel.Record(this,{type:WebInspector.TimelineModel.RecordType.Root},null,null,null,false);this._sendRequestRecords={};this._scheduledResourceRequests={};this._timerRecords={};this._requestAnimationFrameRecords={};this._eventDividerRecords=[];this._timeRecords={};this._timeRecordStack=[];this._frames=[];this._minimumRecordTime=-1;this._layoutInvalidateStack={};this._lastScheduleStyleRecalculation={};this._webSocketCreateRecords={};this._coalescingBuckets={};},addFrame:function(frame)
|
| +{this._frames.push(frame);},addRecord:function(record)
|
| +{if(this._minimumRecordTime===-1||record.startTime<this._minimumRecordTime)
|
| +this._minimumRecordTime=WebInspector.TimelineModel.startTimeInSeconds(record);var records;if(record.type===WebInspector.TimelineModel.RecordType.Program)
|
| +records=record.children;else
|
| +records=[record];var formattedRecords=[];var recordsCount=records.length;for(var i=0;i<recordsCount;++i)
|
| +formattedRecords.push(this._innerAddRecord(records[i],this._rootRecord));return formattedRecords;},_innerAddRecord:function(record,parentRecord)
|
| +{const recordTypes=WebInspector.TimelineModel.RecordType;var isHiddenRecord=record.type in WebInspector.TimelinePresentationModel._hiddenRecords;var origin;var coalescingBucket;if(!isHiddenRecord){var newParentRecord=this._findParentRecord(record);if(newParentRecord){origin=parentRecord;parentRecord=newParentRecord;}
|
| +if(parentRecord===this._rootRecord)
|
| +coalescingBucket=record.thread?record.type:"mainThread";var coalescedRecord=this._findCoalescedParent(record,parentRecord,coalescingBucket);if(coalescedRecord){if(!origin)
|
| +origin=parentRecord;parentRecord=coalescedRecord;}}
|
| +var children=record.children;var scriptDetails;if(record.data&&record.data["scriptName"]){scriptDetails={scriptName:record.data["scriptName"],scriptLine:record.data["scriptLine"]}};if((record.type===recordTypes.TimerFire||record.type===recordTypes.FireAnimationFrame)&&children&&children.length){var childRecord=children[0];if(childRecord.type===recordTypes.FunctionCall){scriptDetails={scriptName:childRecord.data["scriptName"],scriptLine:childRecord.data["scriptLine"]};children=childRecord.children.concat(children.slice(1));}}
|
| +var formattedRecord=new WebInspector.TimelinePresentationModel.Record(this,record,parentRecord,origin,scriptDetails,isHiddenRecord);if(WebInspector.TimelinePresentationModel.isEventDivider(formattedRecord))
|
| +this._eventDividerRecords.push(formattedRecord);if(isHiddenRecord)
|
| +return formattedRecord;formattedRecord.collapsed=parentRecord===this._rootRecord;if(coalescingBucket)
|
| +this._coalescingBuckets[coalescingBucket]=formattedRecord;var childrenCount=children?children.length:0;for(var i=0;i<childrenCount;++i)
|
| +this._innerAddRecord(children[i],formattedRecord);formattedRecord.calculateAggregatedStats();if(origin)
|
| +this._updateAncestorStats(formattedRecord);if(parentRecord.coalesced&&parentRecord.startTime>formattedRecord.startTime)
|
| +parentRecord._record.startTime=record.startTime;origin=formattedRecord.origin();if(!origin.isRoot()&&!origin.coalesced)
|
| +origin.selfTime-=formattedRecord.endTime-formattedRecord.startTime;return formattedRecord;},_updateAncestorStats:function(record)
|
| +{var lastChildEndTime=record.lastChildEndTime;var aggregatedStats=record.aggregatedStats;for(var currentRecord=record.parent;currentRecord&&!currentRecord.isRoot();currentRecord=currentRecord.parent){currentRecord._cpuTime+=record._cpuTime;if(currentRecord.lastChildEndTime<lastChildEndTime)
|
| +currentRecord.lastChildEndTime=lastChildEndTime;for(var category in aggregatedStats)
|
| +currentRecord.aggregatedStats[category]+=aggregatedStats[category];}},_findCoalescedParent:function(record,newParent,bucket)
|
| +{const coalescingThresholdSeconds=0.005;var lastRecord=bucket?this._coalescingBuckets[bucket]:newParent.children.peekLast();if(lastRecord&&lastRecord.coalesced)
|
| +lastRecord=lastRecord.children.peekLast();var startTime=WebInspector.TimelineModel.startTimeInSeconds(record);var endTime=WebInspector.TimelineModel.endTimeInSeconds(record);if(!lastRecord)
|
| +return null;if(lastRecord.type!==record.type)
|
| +return null;if(lastRecord.endTime+coalescingThresholdSeconds<startTime)
|
| +return null;if(endTime+coalescingThresholdSeconds<lastRecord.startTime)
|
| +return null;if(WebInspector.TimelinePresentationModel.coalescingKeyForRecord(record)!==WebInspector.TimelinePresentationModel.coalescingKeyForRecord(lastRecord._record))
|
| +return null;if(lastRecord.parent.coalesced)
|
| +return lastRecord.parent;return this._replaceWithCoalescedRecord(lastRecord);},_replaceWithCoalescedRecord:function(record)
|
| +{var rawRecord={type:record._record.type,startTime:record._record.startTime,endTime:record._record.endTime,data:{}};if(record._record.thread)
|
| +rawRecord.thread="aggregated";if(record.type===WebInspector.TimelineModel.RecordType.TimeStamp)
|
| +rawRecord.data.message=record.data.message;var coalescedRecord=new WebInspector.TimelinePresentationModel.Record(this,rawRecord,null,null,null,false);var parent=record.parent;coalescedRecord.coalesced=true;coalescedRecord.collapsed=true;coalescedRecord._children.push(record);record.parent=coalescedRecord;coalescedRecord.calculateAggregatedStats();if(record.hasWarning||record.childHasWarning)
|
| +coalescedRecord.childHasWarning=true;coalescedRecord.parent=parent;parent._children[parent._children.indexOf(record)]=coalescedRecord;return coalescedRecord;},_findParentRecord:function(record)
|
| +{if(!this._glueRecords)
|
| +return null;var recordTypes=WebInspector.TimelineModel.RecordType;switch(record.type){case recordTypes.ResourceReceiveResponse:case recordTypes.ResourceFinish:case recordTypes.ResourceReceivedData:return this._sendRequestRecords[record.data["requestId"]];case recordTypes.ResourceSendRequest:return this._rootRecord;case recordTypes.TimerFire:return this._timerRecords[record.data["timerId"]];case recordTypes.ResourceSendRequest:return this._scheduledResourceRequests[record.data["url"]];case recordTypes.FireAnimationFrame:return this._requestAnimationFrameRecords[record.data["id"]];case recordTypes.Time:return this._rootRecord;case recordTypes.TimeEnd:return this._timeRecords[record.data["message"]];}},setGlueRecords:function(glue)
|
| +{this._glueRecords=glue;},invalidateFilteredRecords:function()
|
| +{delete this._filteredRecords;},filteredRecords:function()
|
| +{if(this._filteredRecords)
|
| +return this._filteredRecords;var recordsInWindow=[];var stack=[{children:this._rootRecord.children,index:0,parentIsCollapsed:false,parentRecord:{}}];var revealedDepth=0;function revealRecordsInStack(){for(var depth=revealedDepth+1;depth<stack.length;++depth){if(stack[depth-1].parentIsCollapsed){stack[depth].parentRecord.parent._expandable=true;return;}
|
| +stack[depth-1].parentRecord.collapsed=false;recordsInWindow.push(stack[depth].parentRecord);stack[depth].windowLengthBeforeChildrenTraversal=recordsInWindow.length;stack[depth].parentIsRevealed=true;revealedDepth=depth;}}
|
| +while(stack.length){var entry=stack[stack.length-1];var records=entry.children;if(records&&entry.index<records.length){var record=records[entry.index];++entry.index;if(this.isVisible(record)){record.parent._expandable=true;if(this._searchFilter)
|
| +revealRecordsInStack();if(!entry.parentIsCollapsed){recordsInWindow.push(record);revealedDepth=stack.length;entry.parentRecord.collapsed=false;}}
|
| +record._expandable=false;stack.push({children:record.children,index:0,parentIsCollapsed:(entry.parentIsCollapsed||(record.collapsed&&(!this._searchFilter||record.clicked))),parentRecord:record,windowLengthBeforeChildrenTraversal:recordsInWindow.length});}else{stack.pop();revealedDepth=Math.min(revealedDepth,stack.length-1);entry.parentRecord._visibleChildrenCount=recordsInWindow.length-entry.windowLengthBeforeChildrenTraversal;}}
|
| +this._filteredRecords=recordsInWindow;return recordsInWindow;},filteredFrames:function(startTime,endTime)
|
| +{function compareStartTime(value,object)
|
| +{return value-object.startTime;}
|
| +function compareEndTime(value,object)
|
| +{return value-object.endTime;}
|
| +var firstFrame=insertionIndexForObjectInListSortedByFunction(startTime,this._frames,compareStartTime);var lastFrame=insertionIndexForObjectInListSortedByFunction(endTime,this._frames,compareEndTime);while(lastFrame<this._frames.length&&this._frames[lastFrame].endTime<=endTime)
|
| +++lastFrame;return this._frames.slice(firstFrame,lastFrame);},eventDividerRecords:function()
|
| +{return this._eventDividerRecords;},isVisible:function(record)
|
| +{for(var i=0;i<this._filters.length;++i){if(!this._filters[i].accept(record))
|
| +return false;}
|
| +return!this._searchFilter||this._searchFilter.accept(record);},generateMainThreadBarPopupContent:function(info)
|
| +{var firstTaskIndex=info.firstTaskIndex;var lastTaskIndex=info.lastTaskIndex;var tasks=info.tasks;var messageCount=lastTaskIndex-firstTaskIndex+1;var cpuTime=0;for(var i=firstTaskIndex;i<=lastTaskIndex;++i){var task=tasks[i];cpuTime+=task.endTime-task.startTime;}
|
| +var startTime=tasks[firstTaskIndex].startTime;var endTime=tasks[lastTaskIndex].endTime;var duration=endTime-startTime;var offset=this._minimumRecordTime;var contentHelper=new WebInspector.PopoverContentHelper(WebInspector.UIString("CPU"));var durationText=WebInspector.UIString("%s (at %s)",Number.secondsToString(duration,true),Number.secondsToString(startTime-offset,true));contentHelper.appendTextRow(WebInspector.UIString("Duration"),durationText);contentHelper.appendTextRow(WebInspector.UIString("CPU time"),Number.secondsToString(cpuTime,true));contentHelper.appendTextRow(WebInspector.UIString("Message Count"),messageCount);return contentHelper.contentTable();},__proto__:WebInspector.Object.prototype}
|
| +WebInspector.TimelinePresentationModel.Record=function(presentationModel,record,parentRecord,origin,scriptDetails,hidden)
|
| +{this._linkifier=presentationModel._linkifier;this._aggregatedStats={};this._record=record;this._children=[];if(!hidden&&parentRecord){this.parent=parentRecord;if(this.isBackground)
|
| +WebInspector.TimelinePresentationModel.insertRetrospectiveRecord(parentRecord,this);else
|
| +parentRecord.children.push(this);}
|
| +if(origin)
|
| +this._origin=origin;this._selfTime=this.endTime-this.startTime;this._lastChildEndTime=this.endTime;this._startTimeOffset=this.startTime-presentationModel._minimumRecordTime;if(record.data){if(record.data["url"])
|
| +this.url=record.data["url"];if(record.data["layerRootNode"])
|
| +this._relatedBackendNodeId=record.data["layerRootNode"];else if(record.data["elementId"])
|
| +this._relatedBackendNodeId=record.data["elementId"];}
|
| +if(scriptDetails){this.scriptName=scriptDetails.scriptName;this.scriptLine=scriptDetails.scriptLine;}
|
| +if(parentRecord&&parentRecord.callSiteStackTrace)
|
| +this.callSiteStackTrace=parentRecord.callSiteStackTrace;var recordTypes=WebInspector.TimelineModel.RecordType;switch(record.type){case recordTypes.ResourceSendRequest:presentationModel._sendRequestRecords[record.data["requestId"]]=this;break;case recordTypes.ScheduleResourceRequest:presentationModel._scheduledResourceRequests[record.data["url"]]=this;break;case recordTypes.ResourceReceiveResponse:var sendRequestRecord=presentationModel._sendRequestRecords[record.data["requestId"]];if(sendRequestRecord){this.url=sendRequestRecord.url;sendRequestRecord._refreshDetails();if(sendRequestRecord.parent!==presentationModel._rootRecord&&sendRequestRecord.parent.type===recordTypes.ScheduleResourceRequest)
|
| +sendRequestRecord.parent._refreshDetails();}
|
| +break;case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:var sendRequestRecord=presentationModel._sendRequestRecords[record.data["requestId"]];if(sendRequestRecord)
|
| +this.url=sendRequestRecord.url;break;case recordTypes.TimerInstall:this.timeout=record.data["timeout"];this.singleShot=record.data["singleShot"];presentationModel._timerRecords[record.data["timerId"]]=this;break;case recordTypes.TimerFire:var timerInstalledRecord=presentationModel._timerRecords[record.data["timerId"]];if(timerInstalledRecord){this.callSiteStackTrace=timerInstalledRecord.stackTrace;this.timeout=timerInstalledRecord.timeout;this.singleShot=timerInstalledRecord.singleShot;}
|
| +break;case recordTypes.RequestAnimationFrame:presentationModel._requestAnimationFrameRecords[record.data["id"]]=this;break;case recordTypes.FireAnimationFrame:var requestAnimationRecord=presentationModel._requestAnimationFrameRecords[record.data["id"]];if(requestAnimationRecord)
|
| +this.callSiteStackTrace=requestAnimationRecord.stackTrace;break;case recordTypes.Time:var message=record.data["message"];var oldReference=presentationModel._timeRecords[message];if(oldReference)
|
| +break;presentationModel._timeRecords[message]=this;if(origin)
|
| +presentationModel._timeRecordStack.push(this);break;case recordTypes.TimeEnd:var message=record.data["message"];var timeRecord=presentationModel._timeRecords[message];delete presentationModel._timeRecords[message];if(timeRecord){this.timeRecord=timeRecord;timeRecord.timeEndRecord=this;var intervalDuration=this.startTime-timeRecord.startTime;this.intervalDuration=intervalDuration;timeRecord.intervalDuration=intervalDuration;if(!origin)
|
| +break;var recordStack=presentationModel._timeRecordStack;recordStack.splice(recordStack.indexOf(timeRecord),1);for(var index=recordStack.length;index;--index){var openRecord=recordStack[index-1];if(openRecord.startTime>timeRecord.startTime)
|
| +continue;WebInspector.TimelinePresentationModel.adoptRecord(openRecord,timeRecord);break;}}
|
| +break;case recordTypes.ScheduleStyleRecalculation:presentationModel._lastScheduleStyleRecalculation[this.frameId]=this;break;case recordTypes.RecalculateStyles:var scheduleStyleRecalculationRecord=presentationModel._lastScheduleStyleRecalculation[this.frameId];if(!scheduleStyleRecalculationRecord)
|
| +break;this.callSiteStackTrace=scheduleStyleRecalculationRecord.stackTrace;break;case recordTypes.InvalidateLayout:var styleRecalcStack;if(!presentationModel._layoutInvalidateStack[this.frameId]){for(var outerRecord=parentRecord;outerRecord;outerRecord=record.parent){if(outerRecord.type===recordTypes.RecalculateStyles){styleRecalcStack=outerRecord.callSiteStackTrace;break;}}}
|
| +presentationModel._layoutInvalidateStack[this.frameId]=styleRecalcStack||this.stackTrace;break;case recordTypes.Layout:var layoutInvalidateStack=presentationModel._layoutInvalidateStack[this.frameId];if(layoutInvalidateStack)
|
| +this.callSiteStackTrace=layoutInvalidateStack;if(this.stackTrace)
|
| +this.setHasWarning();presentationModel._layoutInvalidateStack[this.frameId]=null;this.highlightQuad=record.data.root||WebInspector.TimelinePresentationModel.quadFromRectData(record.data);this._relatedBackendNodeId=record.data["rootNode"];break;case recordTypes.Paint:this.highlightQuad=record.data.clip||WebInspector.TimelinePresentationModel.quadFromRectData(record.data);break;case recordTypes.WebSocketCreate:this.webSocketURL=record.data["url"];if(typeof record.data["webSocketProtocol"]!=="undefined")
|
| +this.webSocketProtocol=record.data["webSocketProtocol"];presentationModel._webSocketCreateRecords[record.data["identifier"]]=this;break;case recordTypes.WebSocketSendHandshakeRequest:case recordTypes.WebSocketReceiveHandshakeResponse:case recordTypes.WebSocketDestroy:var webSocketCreateRecord=presentationModel._webSocketCreateRecords[record.data["identifier"]];if(webSocketCreateRecord){this.webSocketURL=webSocketCreateRecord.webSocketURL;if(typeof webSocketCreateRecord.webSocketProtocol!=="undefined")
|
| +this.webSocketProtocol=webSocketCreateRecord.webSocketProtocol;}
|
| +break;}}
|
| +WebInspector.TimelinePresentationModel.adoptRecord=function(newParent,record)
|
| +{record.parent.children.splice(record.parent.children.indexOf(record));WebInspector.TimelinePresentationModel.insertRetrospectiveRecord(newParent,record);record.parent=newParent;}
|
| +WebInspector.TimelinePresentationModel.insertRetrospectiveRecord=function(parent,record)
|
| +{function compareStartTime(value,record)
|
| +{return value<record.startTime?-1:1;}
|
| +parent.children.splice(insertionIndexForObjectInListSortedByFunction(record.startTime,parent.children,compareStartTime),0,record);}
|
| +WebInspector.TimelinePresentationModel.Record.prototype={get lastChildEndTime()
|
| +{return this._lastChildEndTime;},set lastChildEndTime(time)
|
| +{this._lastChildEndTime=time;},get selfTime()
|
| +{return this.coalesced?this._lastChildEndTime-this.startTime:this._selfTime;},set selfTime(time)
|
| +{this._selfTime=time;},get cpuTime()
|
| +{return this._cpuTime;},isRoot:function()
|
| +{return this.type===WebInspector.TimelineModel.RecordType.Root;},origin:function()
|
| +{return this._origin||this.parent;},get children()
|
| +{return this._children;},get visibleChildrenCount()
|
| +{return this._visibleChildrenCount||0;},get expandable()
|
| +{return!!this._expandable;},get category()
|
| +{return WebInspector.TimelinePresentationModel.recordStyle(this._record).category},get title()
|
| +{return this.type===WebInspector.TimelineModel.RecordType.TimeStamp?this._record.data["message"]:WebInspector.TimelinePresentationModel.recordStyle(this._record).title;},get startTime()
|
| +{return WebInspector.TimelineModel.startTimeInSeconds(this._record);},get endTime()
|
| +{return WebInspector.TimelineModel.endTimeInSeconds(this._record);},get isBackground()
|
| +{return!!this._record.thread;},get data()
|
| +{return this._record.data;},get type()
|
| +{return this._record.type;},get frameId()
|
| +{return this._record.frameId;},get usedHeapSizeDelta()
|
| +{return this._record.usedHeapSizeDelta||0;},get usedHeapSize()
|
| +{return this._record.usedHeapSize;},get stackTrace()
|
| +{if(this._record.stackTrace&&this._record.stackTrace.length)
|
| +return this._record.stackTrace;return null;},containsTime:function(time)
|
| +{return this.startTime<=time&&time<=this.endTime;},generatePopupContent:function(callback)
|
| +{var barrier=new CallbackBarrier();if(WebInspector.TimelinePresentationModel.needsPreviewElement(this.type)&&!this._imagePreviewElement)
|
| +WebInspector.DOMPresentationUtils.buildImagePreviewContents(this.url,false,barrier.createCallback(this._setImagePreviewElement.bind(this)));if(this._relatedBackendNodeId&&!this._relatedNode)
|
| +WebInspector.domAgent.pushNodeByBackendIdToFrontend(this._relatedBackendNodeId,barrier.createCallback(this._setRelatedNode.bind(this)));barrier.callWhenDone(callbackWrapper.bind(this));function callbackWrapper()
|
| +{callback(this._generatePopupContentSynchronously());}},_setImagePreviewElement:function(element)
|
| +{this._imagePreviewElement=element;},_setRelatedNode:function(nodeId)
|
| +{if(typeof nodeId==="number")
|
| +this._relatedNode=WebInspector.domAgent.nodeForId(nodeId);},_generatePopupContentSynchronously:function()
|
| +{var contentHelper=new WebInspector.PopoverContentHelper(this.title);var text=WebInspector.UIString("%s (at %s)",Number.secondsToString(this._lastChildEndTime-this.startTime,true),Number.secondsToString(this._startTimeOffset));contentHelper.appendTextRow(WebInspector.UIString("Duration"),text);if(this._children.length){if(!this.coalesced)
|
| +contentHelper.appendTextRow(WebInspector.UIString("Self Time"),Number.secondsToString(this._selfTime,true));contentHelper.appendTextRow(WebInspector.UIString("CPU Time"),Number.secondsToString(this._cpuTime,true));contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"),WebInspector.TimelinePresentationModel._generateAggregatedInfo(this._aggregatedStats));}
|
| +if(this.coalesced)
|
| +return contentHelper.contentTable();const recordTypes=WebInspector.TimelineModel.RecordType;var callSiteStackTraceLabel;var callStackLabel;switch(this.type){case recordTypes.GCEvent:contentHelper.appendTextRow(WebInspector.UIString("Collected"),Number.bytesToString(this.data["usedHeapSizeDelta"]));break;case recordTypes.TimerFire:callSiteStackTraceLabel=WebInspector.UIString("Timer installed");case recordTypes.TimerInstall:case recordTypes.TimerRemove:contentHelper.appendTextRow(WebInspector.UIString("Timer ID"),this.data["timerId"]);if(typeof this.timeout==="number"){contentHelper.appendTextRow(WebInspector.UIString("Timeout"),Number.secondsToString(this.timeout/1000));contentHelper.appendTextRow(WebInspector.UIString("Repeats"),!this.singleShot);}
|
| +break;case recordTypes.FireAnimationFrame:callSiteStackTraceLabel=WebInspector.UIString("Animation frame requested");contentHelper.appendTextRow(WebInspector.UIString("Callback ID"),this.data["id"]);break;case recordTypes.FunctionCall:contentHelper.appendElementRow(WebInspector.UIString("Location"),this._linkifyScriptLocation());break;case recordTypes.ScheduleResourceRequest:case recordTypes.ResourceSendRequest:case recordTypes.ResourceReceiveResponse:case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:contentHelper.appendElementRow(WebInspector.UIString("Resource"),WebInspector.linkifyResourceAsNode(this.url));if(this._imagePreviewElement)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Preview"),this._imagePreviewElement);if(this.data["requestMethod"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("Request Method"),this.data["requestMethod"]);if(typeof this.data["statusCode"]==="number")
|
| +contentHelper.appendTextRow(WebInspector.UIString("Status Code"),this.data["statusCode"]);if(this.data["mimeType"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("MIME Type"),this.data["mimeType"]);if(this.data["encodedDataLength"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("Encoded Data Length"),WebInspector.UIString("%d Bytes",this.data["encodedDataLength"]));break;case recordTypes.EvaluateScript:if(this.data&&this.url)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Script"),this._linkifyLocation(this.url,this.data["lineNumber"]));break;case recordTypes.Paint:var clip=this.data["clip"];if(clip){contentHelper.appendTextRow(WebInspector.UIString("Location"),WebInspector.UIString("(%d, %d)",clip[0],clip[1]));var clipWidth=WebInspector.TimelinePresentationModel.quadWidth(clip);var clipHeight=WebInspector.TimelinePresentationModel.quadHeight(clip);contentHelper.appendTextRow(WebInspector.UIString("Dimensions"),WebInspector.UIString("%d × %d",clipWidth,clipHeight));}else{if(typeof this.data["x"]!=="undefined"&&typeof this.data["y"]!=="undefined")
|
| +contentHelper.appendTextRow(WebInspector.UIString("Location"),WebInspector.UIString("(%d, %d)",this.data["x"],this.data["y"]));if(typeof this.data["width"]!=="undefined"&&typeof this.data["height"]!=="undefined")
|
| +contentHelper.appendTextRow(WebInspector.UIString("Dimensions"),WebInspector.UIString("%d\u2009\u00d7\u2009%d",this.data["width"],this.data["height"]));}
|
| +case recordTypes.PaintSetup:case recordTypes.Rasterize:case recordTypes.ScrollLayer:if(this._relatedNode)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Layer root"),this._createNodeAnchor(this._relatedNode));break;case recordTypes.DecodeImage:case recordTypes.ResizeImage:if(this._relatedNode)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Image element"),this._createNodeAnchor(this._relatedNode));if(this.url)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Image URL"),WebInspector.linkifyResourceAsNode(this.url));break;case recordTypes.RecalculateStyles:if(this.data["elementCount"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("Elements affected"),this.data["elementCount"]);callStackLabel=WebInspector.UIString("Styles recalculation forced");break;case recordTypes.Layout:if(this.data["dirtyObjects"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layout"),this.data["dirtyObjects"]);if(this.data["totalObjects"])
|
| +contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"),this.data["totalObjects"]);if(typeof this.data["partialLayout"]==="boolean"){contentHelper.appendTextRow(WebInspector.UIString("Layout scope"),this.data["partialLayout"]?WebInspector.UIString("Partial"):WebInspector.UIString("Whole document"));}
|
| +callSiteStackTraceLabel=WebInspector.UIString("Layout invalidated");if(this.stackTrace){callStackLabel=WebInspector.UIString("Layout forced");contentHelper.appendTextRow(WebInspector.UIString("Note"),WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck."));}
|
| +if(this._relatedNode)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Layout root"),this._createNodeAnchor(this._relatedNode));break;case recordTypes.Time:case recordTypes.TimeEnd:contentHelper.appendTextRow(WebInspector.UIString("Message"),this.data["message"]);if(typeof this.intervalDuration==="number")
|
| +contentHelper.appendTextRow(WebInspector.UIString("Interval Duration"),Number.secondsToString(this.intervalDuration,true));break;case recordTypes.WebSocketCreate:case recordTypes.WebSocketSendHandshakeRequest:case recordTypes.WebSocketReceiveHandshakeResponse:case recordTypes.WebSocketDestroy:if(typeof this.webSocketURL!=="undefined")
|
| +contentHelper.appendTextRow(WebInspector.UIString("URL"),this.webSocketURL);if(typeof this.webSocketProtocol!=="undefined")
|
| +contentHelper.appendTextRow(WebInspector.UIString("WebSocket Protocol"),this.webSocketProtocol);if(typeof this.data["message"]!=="undefined")
|
| +contentHelper.appendTextRow(WebInspector.UIString("Message"),this.data["message"])
|
| +break;default:if(this.detailsNode())
|
| +contentHelper.appendElementRow(WebInspector.UIString("Details"),this.detailsNode().childNodes[1].cloneNode());break;}
|
| +if(this.scriptName&&this.type!==recordTypes.FunctionCall)
|
| +contentHelper.appendElementRow(WebInspector.UIString("Function Call"),this._linkifyScriptLocation());if(this.usedHeapSize){if(this.usedHeapSizeDelta){var sign=this.usedHeapSizeDelta>0?"+":"-";contentHelper.appendTextRow(WebInspector.UIString("Used Heap Size"),WebInspector.UIString("%s (%s%s)",Number.bytesToString(this.usedHeapSize),sign,Number.bytesToString(Math.abs(this.usedHeapSizeDelta))));}else if(this.category===WebInspector.TimelinePresentationModel.categories().scripting)
|
| +contentHelper.appendTextRow(WebInspector.UIString("Used Heap Size"),Number.bytesToString(this.usedHeapSize));}
|
| +if(this.callSiteStackTrace)
|
| +contentHelper.appendStackTrace(callSiteStackTraceLabel||WebInspector.UIString("Call Site stack"),this.callSiteStackTrace,this._linkifyCallFrame.bind(this));if(this.stackTrace)
|
| +contentHelper.appendStackTrace(callStackLabel||WebInspector.UIString("Call Stack"),this.stackTrace,this._linkifyCallFrame.bind(this));return contentHelper.contentTable();},_createNodeAnchor:function(node)
|
| +{var span=document.createElement("span");span.classList.add("node-link");span.addEventListener("click",onClick,false);WebInspector.DOMPresentationUtils.decorateNodeLabel(node,span);function onClick()
|
| +{WebInspector.showPanel("elements").revealAndSelectNode(node.id);}
|
| +return span;},_refreshDetails:function()
|
| +{delete this._detailsNode;},detailsNode:function()
|
| +{if(typeof this._detailsNode==="undefined"){this._detailsNode=this._getRecordDetails();if(this._detailsNode&&!this.coalesced){this._detailsNode.insertBefore(document.createTextNode("("),this._detailsNode.firstChild);this._detailsNode.appendChild(document.createTextNode(")"));}}
|
| +return this._detailsNode;},_createSpanWithText:function(textContent)
|
| +{var node=document.createElement("span");node.textContent=textContent;return node;},_getRecordDetails:function()
|
| +{var details;if(this.coalesced)
|
| +return this._createSpanWithText(WebInspector.UIString("× %d",this.children.length));switch(this.type){case WebInspector.TimelineModel.RecordType.GCEvent:details=WebInspector.UIString("%s collected",Number.bytesToString(this.data["usedHeapSizeDelta"]));break;case WebInspector.TimelineModel.RecordType.TimerFire:details=this._linkifyScriptLocation(this.data["timerId"]);break;case WebInspector.TimelineModel.RecordType.FunctionCall:details=this._linkifyScriptLocation();break;case WebInspector.TimelineModel.RecordType.FireAnimationFrame:details=this._linkifyScriptLocation(this.data["id"]);break;case WebInspector.TimelineModel.RecordType.EventDispatch:details=this.data?this.data["type"]:null;break;case WebInspector.TimelineModel.RecordType.Paint:var width=this.data.clip?WebInspector.TimelinePresentationModel.quadWidth(this.data.clip):this.data.width;var height=this.data.clip?WebInspector.TimelinePresentationModel.quadHeight(this.data.clip):this.data.height;if(width&&height)
|
| +details=WebInspector.UIString("%d\u2009\u00d7\u2009%d",width,height);break;case WebInspector.TimelineModel.RecordType.TimerInstall:case WebInspector.TimelineModel.RecordType.TimerRemove:details=this._linkifyTopCallFrame(this.data["timerId"]);break;case WebInspector.TimelineModel.RecordType.RequestAnimationFrame:case WebInspector.TimelineModel.RecordType.CancelAnimationFrame:details=this._linkifyTopCallFrame(this.data["id"]);break;case WebInspector.TimelineModel.RecordType.ParseHTML:case WebInspector.TimelineModel.RecordType.RecalculateStyles:details=this._linkifyTopCallFrame();break;case WebInspector.TimelineModel.RecordType.EvaluateScript:details=this.url?this._linkifyLocation(this.url,this.data["lineNumber"],0):null;break;case WebInspector.TimelineModel.RecordType.XHRReadyStateChange:case WebInspector.TimelineModel.RecordType.XHRLoad:case WebInspector.TimelineModel.RecordType.ScheduleResourceRequest:case WebInspector.TimelineModel.RecordType.ResourceSendRequest:case WebInspector.TimelineModel.RecordType.ResourceReceivedData:case WebInspector.TimelineModel.RecordType.ResourceReceiveResponse:case WebInspector.TimelineModel.RecordType.ResourceFinish:case WebInspector.TimelineModel.RecordType.DecodeImage:case WebInspector.TimelineModel.RecordType.ResizeImage:details=WebInspector.displayNameForURL(this.url);break;case WebInspector.TimelineModel.RecordType.Time:case WebInspector.TimelineModel.RecordType.TimeEnd:details=this.data["message"];break;default:details=this._linkifyScriptLocation()||this._linkifyTopCallFrame()||null;break;}
|
| +if(details){if(details instanceof Node)
|
| +details.tabIndex=-1;else
|
| +return this._createSpanWithText(""+details);}
|
| +return details||null;},_linkifyLocation:function(url,lineNumber,columnNumber)
|
| +{columnNumber=columnNumber?columnNumber-1:0;return this._linkifier.linkifyLocation(url,lineNumber-1,columnNumber,"timeline-details");},_linkifyCallFrame:function(callFrame)
|
| +{return this._linkifyLocation(callFrame.url,callFrame.lineNumber,callFrame.columnNumber);},_linkifyTopCallFrame:function(defaultValue)
|
| +{if(this.stackTrace)
|
| +return this._linkifyCallFrame(this.stackTrace[0]);if(this.callSiteStackTrace)
|
| +return this._linkifyCallFrame(this.callSiteStackTrace[0]);return defaultValue;},_linkifyScriptLocation:function(defaultValue)
|
| +{if(this.scriptName)
|
| +return this._linkifyLocation(this.scriptName,this.scriptLine,0);else
|
| +return defaultValue?""+defaultValue:null;},calculateAggregatedStats:function()
|
| +{this._aggregatedStats={};this._cpuTime=this._selfTime;for(var index=this._children.length;index;--index){var child=this._children[index-1];for(var category in child._aggregatedStats)
|
| +this._aggregatedStats[category]=(this._aggregatedStats[category]||0)+child._aggregatedStats[category];}
|
| +for(var category in this._aggregatedStats)
|
| +this._cpuTime+=this._aggregatedStats[category];this._aggregatedStats[this.category.name]=(this._aggregatedStats[this.category.name]||0)+this._selfTime;},get aggregatedStats()
|
| +{return this._aggregatedStats;},setHasWarning:function()
|
| +{this.hasWarning=true;for(var parent=this.parent;parent&&!parent.childHasWarning;parent=parent.parent)
|
| +parent.childHasWarning=true;}}
|
| +WebInspector.TimelinePresentationModel._generateAggregatedInfo=function(aggregatedStats)
|
| +{var cell=document.createElement("span");cell.className="timeline-aggregated-info";for(var index in aggregatedStats){var label=document.createElement("div");label.className="timeline-aggregated-category timeline-"+index;cell.appendChild(label);var text=document.createElement("span");text.textContent=Number.secondsToString(aggregatedStats[index],true);cell.appendChild(text);}
|
| +return cell;}
|
| +WebInspector.TimelinePresentationModel.generatePopupContentForFrame=function(frame)
|
| +{var contentHelper=new WebInspector.PopoverContentHelper(WebInspector.UIString("Frame"));var durationInSeconds=frame.endTime-frame.startTime;var durationText=WebInspector.UIString("%s (at %s)",Number.secondsToString(frame.endTime-frame.startTime,true),Number.secondsToString(frame.startTimeOffset,true));contentHelper.appendTextRow(WebInspector.UIString("Duration"),durationText);contentHelper.appendTextRow(WebInspector.UIString("FPS"),Math.floor(1/durationInSeconds));contentHelper.appendTextRow(WebInspector.UIString("CPU time"),Number.secondsToString(frame.cpuTime,true));contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"),WebInspector.TimelinePresentationModel._generateAggregatedInfo(frame.timeByCategory));return contentHelper.contentTable();}
|
| +WebInspector.TimelinePresentationModel.generatePopupContentForFrameStatistics=function(statistics)
|
| +{function formatTimeAndFPS(time)
|
| +{return WebInspector.UIString("%s (%.0f FPS)",Number.secondsToString(time,true),1/time);}
|
| +var contentHelper=new WebInspector.PopoverContentHelper(WebInspector.UIString("Selected Range"));contentHelper.appendTextRow(WebInspector.UIString("Selected range"),WebInspector.UIString("%s\u2013%s (%d frames)",Number.secondsToString(statistics.startOffset,true),Number.secondsToString(statistics.endOffset,true),statistics.frameCount));contentHelper.appendTextRow(WebInspector.UIString("Minimum Time"),formatTimeAndFPS(statistics.minDuration));contentHelper.appendTextRow(WebInspector.UIString("Average Time"),formatTimeAndFPS(statistics.average));contentHelper.appendTextRow(WebInspector.UIString("Maximum Time"),formatTimeAndFPS(statistics.maxDuration));contentHelper.appendTextRow(WebInspector.UIString("Standard Deviation"),Number.secondsToString(statistics.stddev,true));contentHelper.appendElementRow(WebInspector.UIString("Time by category"),WebInspector.TimelinePresentationModel._generateAggregatedInfo(statistics.timeByCategory));return contentHelper.contentTable();}
|
| +WebInspector.TimelinePresentationModel.createFillStyle=function(context,width,height,color0,color1,color2)
|
| +{var gradient=context.createLinearGradient(0,0,width,height);gradient.addColorStop(0,color0);gradient.addColorStop(0.25,color1);gradient.addColorStop(0.75,color1);gradient.addColorStop(1,color2);return gradient;}
|
| +WebInspector.TimelinePresentationModel.createFillStyleForCategory=function(context,width,height,category)
|
| +{return WebInspector.TimelinePresentationModel.createFillStyle(context,width,height,category.fillColorStop0,category.fillColorStop1,category.borderColor);}
|
| +WebInspector.TimelinePresentationModel.createStyleRuleForCategory=function(category)
|
| +{var selector=".timeline-category-"+category.name+" .timeline-graph-bar, "+".timeline-category-statusbar-item.timeline-category-"+category.name+" .timeline-category-checkbox, "+".popover .timeline-"+category.name+", "+".timeline-category-"+category.name+" .timeline-tree-icon"
|
| +return selector+" { background-image: -webkit-linear-gradient("+
|
| +category.fillColorStop0+", "+category.fillColorStop1+" 25%, "+category.fillColorStop1+" 25%, "+category.fillColorStop1+");"+" border-color: "+category.borderColor+"}";}
|
| +WebInspector.TimelinePresentationModel.coalescingKeyForRecord=function(rawRecord)
|
| +{var recordTypes=WebInspector.TimelineModel.RecordType;switch(rawRecord.type)
|
| +{case recordTypes.EventDispatch:return rawRecord.data["type"];case recordTypes.TimeStamp:return rawRecord.data["message"];default:return null;}}
|
| +WebInspector.TimelinePresentationModel.quadWidth=function(quad)
|
| +{return Math.round(Math.sqrt(Math.pow(quad[0]-quad[2],2)+Math.pow(quad[1]-quad[3],2)));}
|
| +WebInspector.TimelinePresentationModel.quadHeight=function(quad)
|
| +{return Math.round(Math.sqrt(Math.pow(quad[0]-quad[6],2)+Math.pow(quad[1]-quad[7],2)));}
|
| +WebInspector.TimelinePresentationModel.quadFromRectData=function(data)
|
| +{if(typeof data["x"]==="undefined"||typeof data["y"]==="undefined")
|
| +return null;var x0=data["x"];var x1=data["x"]+data["width"];var y0=data["y"];var y1=data["y"]+data["height"];return[x0,y0,x1,y0,x1,y1,x0,y1];}
|
| +WebInspector.TimelinePresentationModel.Filter=function()
|
| +{}
|
| +WebInspector.TimelinePresentationModel.Filter.prototype={accept:function(record){return false;}}
|
| +WebInspector.TimelineCategory=function(name,title,overviewStripGroupIndex,borderColor,fillColorStop0,fillColorStop1)
|
| +{this.name=name;this.title=title;this.overviewStripGroupIndex=overviewStripGroupIndex;this.borderColor=borderColor;this.fillColorStop0=fillColorStop0;this.fillColorStop1=fillColorStop1;this.hidden=false;}
|
| +WebInspector.TimelineCategory.Events={VisibilityChanged:"VisibilityChanged"};WebInspector.TimelineCategory.prototype={get hidden()
|
| +{return this._hidden;},set hidden(hidden)
|
| +{this._hidden=hidden;this.dispatchEventToListeners(WebInspector.TimelineCategory.Events.VisibilityChanged,this);},__proto__:WebInspector.Object.prototype};WebInspector.TimelineFrameController=function(model,overviewPane,presentationModel)
|
| +{this._lastFrame=null;this._model=model;this._overviewPane=overviewPane;this._presentationModel=presentationModel;this._model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onRecordAdded,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._onRecordsCleared,this);var records=model.records;for(var i=0;i<records.length;++i)
|
| +this._addRecord(records[i]);}
|
| +WebInspector.TimelineFrameController.prototype={_onRecordAdded:function(event)
|
| +{this._addRecord(event.data);},_onRecordsCleared:function()
|
| +{this._lastFrame=null;},_addRecord:function(record)
|
| +{if(record.isBackground)
|
| +return;var records;var programRecord;if(record.type===WebInspector.TimelineModel.RecordType.Program){programRecord=record;if(this._lastFrame)
|
| +this._lastFrame.timeByCategory["other"]+=WebInspector.TimelineModel.durationInSeconds(programRecord);records=record["children"]||[];}else
|
| +records=[record];records.forEach(this._innerAddRecord.bind(this,programRecord));},_innerAddRecord:function(programRecord,record)
|
| +{var isFrameRecord=record.type===WebInspector.TimelineModel.RecordType.BeginFrame;var programTimeCarryover=isFrameRecord&&programRecord?WebInspector.TimelineModel.endTimeInSeconds(programRecord)-WebInspector.TimelineModel.startTimeInSeconds(record):0;if(isFrameRecord&&this._lastFrame)
|
| +this._flushFrame(record,programTimeCarryover);else{if(!this._lastFrame)
|
| +this._lastFrame=this._createFrame(record,programTimeCarryover);if(!record.thread)
|
| +WebInspector.TimelineModel.aggregateTimeForRecord(this._lastFrame.timeByCategory,record);var duration=WebInspector.TimelineModel.durationInSeconds(record);this._lastFrame.cpuTime+=duration;this._lastFrame.timeByCategory["other"]-=duration;}},_flushFrame:function(record,programTimeCarryover)
|
| +{this._lastFrame.endTime=WebInspector.TimelineModel.startTimeInSeconds(record);this._lastFrame.duration=this._lastFrame.endTime-this._lastFrame.startTime;this._lastFrame.timeByCategory["other"]-=programTimeCarryover;this._lastFrame.cpuTime+=this._lastFrame.timeByCategory["other"];this._overviewPane.addFrame(this._lastFrame);this._presentationModel.addFrame(this._lastFrame);this._lastFrame=this._createFrame(record,programTimeCarryover);},_createFrame:function(record,programTimeCarryover)
|
| +{var frame=new WebInspector.TimelineFrame();frame.startTime=WebInspector.TimelineModel.startTimeInSeconds(record);frame.startTimeOffset=this._model.recordOffsetInSeconds(record);frame.timeByCategory["other"]=programTimeCarryover;return frame;},dispose:function()
|
| +{this._model.removeEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onRecordAdded,this);this._model.removeEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._onRecordsCleared,this);}}
|
| +WebInspector.FrameStatistics=function(frames)
|
| +{this.frameCount=frames.length;this.minDuration=Infinity;this.maxDuration=0;this.timeByCategory={};this.startOffset=frames[0].startTimeOffset;var lastFrame=frames[this.frameCount-1];this.endOffset=lastFrame.startTimeOffset+lastFrame.duration;var totalDuration=0;var sumOfSquares=0;for(var i=0;i<this.frameCount;++i){var duration=frames[i].duration;totalDuration+=duration;sumOfSquares+=duration*duration;this.minDuration=Math.min(this.minDuration,duration);this.maxDuration=Math.max(this.maxDuration,duration);WebInspector.TimelineModel.aggregateTimeByCategory(this.timeByCategory,frames[i].timeByCategory);}
|
| +this.average=totalDuration/this.frameCount;var variance=sumOfSquares/this.frameCount-this.average*this.average;this.stddev=Math.sqrt(variance);}
|
| +WebInspector.TimelineFrame=function()
|
| +{this.timeByCategory={};this.cpuTime=0;};WebInspector.TimelinePanel=function()
|
| +{WebInspector.Panel.call(this,"timeline");this.registerRequiredCSS("timelinePanel.css");this._model=new WebInspector.TimelineModel();this._presentationModel=new WebInspector.TimelinePresentationModel();this._overviewModeSetting=WebInspector.settings.createSetting("timelineOverviewMode",WebInspector.TimelineOverviewPane.Mode.Events);this._glueRecordsSetting=WebInspector.settings.createSetting("timelineGlueRecords",false);this._overviewPane=new WebInspector.TimelineOverviewPane(this._model);this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.WindowChanged,this._invalidateAndScheduleRefresh.bind(this,false,true));this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.ModeChanged,this._overviewModeChanged,this);this._overviewPane.show(this.element);this.element.addEventListener("contextmenu",this._contextMenu.bind(this),false);this.createSidebarViewWithTree();this._containerElement=this.splitView.element;this._containerElement.tabIndex=0;this._containerElement.id="timeline-container";this._containerElement.addEventListener("scroll",this._onScroll.bind(this),false);this._timelineMemorySplitter=this.element.createChild("div");this._timelineMemorySplitter.id="timeline-memory-splitter";WebInspector.installDragHandle(this._timelineMemorySplitter,this._startSplitterDragging.bind(this),this._splitterDragging.bind(this),this._endSplitterDragging.bind(this),"ns-resize");this._timelineMemorySplitter.addStyleClass("hidden");this._includeDomCounters=false;this._memoryStatistics=new WebInspector.DOMCountersGraph(this,this._model,this.splitView.sidebarWidth());this._includeDomCounters=true;WebInspector.settings.memoryCounterGraphsHeight=WebInspector.settings.createSetting("memoryCounterGraphsHeight",150);var itemsTreeElement=new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"),{},true);this.sidebarTree.appendChild(itemsTreeElement);this.sidebarTree.setFocusable(false);this._sidebarListElement=document.createElement("div");this.sidebarElement.appendChild(this._sidebarListElement);this._containerContentElement=this.splitView.mainElement;this._containerContentElement.id="resources-container-content";this._timelineGrid=new WebInspector.TimelineGrid();this._itemsGraphsElement=this._timelineGrid.itemsGraphsElement;this._itemsGraphsElement.id="timeline-graphs";this._containerContentElement.appendChild(this._timelineGrid.element);this._timelineGrid.gridHeaderElement.id="timeline-grid-header";this._memoryStatistics.setMainTimelineGrid(this._timelineGrid);this.element.appendChild(this._timelineGrid.gridHeaderElement);this._topGapElement=document.createElement("div");this._topGapElement.className="timeline-gap";this._itemsGraphsElement.appendChild(this._topGapElement);this._graphRowsElement=document.createElement("div");this._itemsGraphsElement.appendChild(this._graphRowsElement);this._bottomGapElement=document.createElement("div");this._bottomGapElement.className="timeline-gap";this._itemsGraphsElement.appendChild(this._bottomGapElement);this._expandElements=document.createElement("div");this._expandElements.id="orphan-expand-elements";this._itemsGraphsElement.appendChild(this._expandElements);this._calculator=new WebInspector.TimelineCalculator(this._model);this._createStatusBarItems();this._frameMode=false;this._boundariesAreValid=true;this._scrollTop=0;this._popoverHelper=new WebInspector.PopoverHelper(this.element,this._getPopoverAnchor.bind(this),this._showPopover.bind(this));this.element.addEventListener("mousemove",this._mouseMove.bind(this),false);this.element.addEventListener("mouseout",this._mouseOut.bind(this),false);this._durationFilter=new WebInspector.TimelineIsLongFilter();this._expandOffset=15;this._headerLineCount=1;this._adjustHeaderHeight();this._mainThreadTasks=([]);this._cpuBarsElement=this._timelineGrid.gridHeaderElement.createChild("div","timeline-cpu-bars");this._mainThreadMonitoringEnabled=WebInspector.settings.showCpuOnTimelineRuler.get();WebInspector.settings.showCpuOnTimelineRuler.addChangeListener(this._showCpuOnTimelineRulerChanged,this);this._createFileSelector();this._model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onTimelineEventRecorded,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._onRecordsCleared,this);this._registerShortcuts();this._allRecordsCount=0;this._presentationModel.addFilter(new WebInspector.TimelineWindowFilter(this._overviewPane));this._presentationModel.addFilter(new WebInspector.TimelineCategoryFilter());this._presentationModel.addFilter(this._durationFilter);}
|
| +WebInspector.TimelinePanel.rowHeight=18;WebInspector.TimelinePanel.durationFilterPresetsMs=[0,1,15];WebInspector.TimelinePanel.prototype={_showCpuOnTimelineRulerChanged:function()
|
| +{var mainThreadMonitoringEnabled=WebInspector.settings.showCpuOnTimelineRuler.get();if(this._mainThreadMonitoringEnabled!==mainThreadMonitoringEnabled){this._mainThreadMonitoringEnabled=mainThreadMonitoringEnabled;this._refreshMainThreadBars();}},_startSplitterDragging:function(event)
|
| +{this._dragOffset=this._timelineMemorySplitter.offsetTop+2-event.pageY;return true;},_splitterDragging:function(event)
|
| +{var top=event.pageY+this._dragOffset
|
| +this._setSplitterPosition(top);event.preventDefault();},_endSplitterDragging:function(event)
|
| +{delete this._dragOffset;this._memoryStatistics.show();WebInspector.settings.memoryCounterGraphsHeight.set(this.splitView.element.offsetHeight);},_setSplitterPosition:function(top)
|
| +{const overviewHeight=90;const sectionMinHeight=100;top=Number.constrain(top,overviewHeight+sectionMinHeight,this.element.offsetHeight-sectionMinHeight);this.splitView.element.style.height=(top-overviewHeight)+"px";this._timelineMemorySplitter.style.top=(top-2)+"px";this._memoryStatistics.setTopPosition(top);this._containerElementHeight=this._containerElement.clientHeight;this.onResize();},get calculator()
|
| +{return this._calculator;},get statusBarItems()
|
| +{return this._statusBarItems.select("element").concat([this._miscStatusBarItems]);},defaultFocusedElement:function()
|
| +{return this.element;},_createStatusBarItems:function()
|
| +{this._statusBarItems=([]);this.toggleTimelineButton=new WebInspector.StatusBarButton(WebInspector.UIString("Record"),"record-profile-status-bar-item");this.toggleTimelineButton.addEventListener("click",this._toggleTimelineButtonClicked,this);this._statusBarItems.push(this.toggleTimelineButton);this.clearButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear"),"clear-status-bar-item");this.clearButton.addEventListener("click",this._clearPanel,this);this._statusBarItems.push(this.clearButton);this.garbageCollectButton=new WebInspector.StatusBarButton(WebInspector.UIString("Collect Garbage"),"garbage-collect-status-bar-item");this.garbageCollectButton.addEventListener("click",this._garbageCollectButtonClicked,this);this._statusBarItems.push(this.garbageCollectButton);this._glueParentButton=new WebInspector.StatusBarButton(WebInspector.UIString("Glue asynchronous events to causes"),"glue-async-status-bar-item");this._glueParentButton.toggled=this._glueRecordsSetting.get();this._presentationModel.setGlueRecords(this._glueParentButton.toggled);this._glueParentButton.addEventListener("click",this._glueParentButtonClicked,this);this._statusBarItems.push(this._glueParentButton);this._durationFilterSelector=new WebInspector.StatusBarComboBox(this._durationFilterChanged.bind(this));for(var presetIndex=0;presetIndex<WebInspector.TimelinePanel.durationFilterPresetsMs.length;++presetIndex){var durationMs=WebInspector.TimelinePanel.durationFilterPresetsMs[presetIndex];var option=document.createElement("option");if(!durationMs){option.text=WebInspector.UIString("All");option.title=WebInspector.UIString("Show all records");}else{option.text=WebInspector.UIString("\u2265 %dms",durationMs);option.title=WebInspector.UIString("Hide records shorter than %dms",durationMs);}
|
| +option._durationMs=durationMs;this._durationFilterSelector.addOption(option);this._durationFilterSelector.element.title=this._durationFilterSelector.selectedOption().title;}
|
| +this._statusBarItems.push(this._durationFilterSelector);this._miscStatusBarItems=document.createElement("div");this._miscStatusBarItems.className="status-bar-items timeline-misc-status-bar-items";this._statusBarFilters=this._miscStatusBarItems.createChild("div","timeline-misc-status-bar-filters");var categories=WebInspector.TimelinePresentationModel.categories();for(var categoryName in categories){var category=categories[categoryName];if(category.overviewStripGroupIndex<0)
|
| +continue;this._statusBarFilters.appendChild(this._createTimelineCategoryStatusBarCheckbox(category));}
|
| +var statsContainer=this._statusBarFilters.createChild("div","timeline-records-stats-container");this.recordsCounter=statsContainer.createChild("div","timeline-records-stats");this.frameStatistics=statsContainer.createChild("div","timeline-records-stats hidden");function getAnchor()
|
| +{return this.frameStatistics;}
|
| +this._frameStatisticsPopoverHelper=new WebInspector.PopoverHelper(this.frameStatistics,getAnchor.bind(this),this._showFrameStatistics.bind(this));},_createTimelineCategoryStatusBarCheckbox:function(category)
|
| +{var labelContainer=document.createElement("div");labelContainer.addStyleClass("timeline-category-statusbar-item");labelContainer.addStyleClass("timeline-category-"+category.name);labelContainer.addStyleClass("status-bar-item");var label=labelContainer.createChild("label");var checkBorder=label.createChild("div","timeline-category-checkbox");var checkElement=checkBorder.createChild("div","timeline-category-checkbox-check timeline-category-checkbox-checked");checkElement.type="checkbox";checkElement.checked=true;labelContainer.addEventListener("click",listener.bind(this),false);function listener(event)
|
| +{var checked=!checkElement.checked;checkElement.checked=checked;category.hidden=!checked;checkElement.enableStyleClass("timeline-category-checkbox-checked",checkElement.checked);this._invalidateAndScheduleRefresh(true,true);}
|
| +var typeElement=label.createChild("span","type");typeElement.textContent=category.title;return labelContainer;},_setOperationInProgress:function(indicator)
|
| +{this._operationInProgress=!!indicator;for(var i=0;i<this._statusBarItems.length;++i)
|
| +this._statusBarItems[i].setEnabled(!this._operationInProgress);this._glueParentButton.setEnabled(!this._operationInProgress&&!this._frameController);this._miscStatusBarItems.removeChildren();this._miscStatusBarItems.appendChild(indicator?indicator.element:this._statusBarFilters);},_registerShortcuts:function()
|
| +{this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.StartStopRecording,this._toggleTimelineButtonClicked.bind(this));this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.SaveToFile,this._saveToFile.bind(this));this.registerShortcuts(WebInspector.TimelinePanelDescriptor.ShortcutKeys.LoadFromFile,this._selectFileToLoad.bind(this));},_createFileSelector:function()
|
| +{if(this._fileSelectorElement)
|
| +this.element.removeChild(this._fileSelectorElement);this._fileSelectorElement=WebInspector.createFileSelectorElement(this._loadFromFile.bind(this));this.element.appendChild(this._fileSelectorElement);},_contextMenu:function(event)
|
| +{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Save Timeline data\u2026":"Save Timeline Data\u2026"),this._saveToFile.bind(this),this._operationInProgress);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Load Timeline data\u2026":"Load Timeline Data\u2026"),this._selectFileToLoad.bind(this),this._operationInProgress);contextMenu.show();},_saveToFile:function(event)
|
| +{if(this._operationInProgress)
|
| +return true;this._model.saveToFile();return true;},_selectFileToLoad:function(event){this._fileSelectorElement.click();return true;},_loadFromFile:function(file)
|
| +{var progressIndicator=this._prepareToLoadTimeline();if(!progressIndicator)
|
| +return;this._model.loadFromFile(file,progressIndicator);this._createFileSelector();},loadFromURL:function(url)
|
| +{var progressIndicator=this._prepareToLoadTimeline();if(!progressIndicator)
|
| +return;this._model.loadFromURL(url,progressIndicator);},_prepareToLoadTimeline:function()
|
| +{if(this._operationInProgress)
|
| +return null;if(this.toggleTimelineButton.toggled){this.toggleTimelineButton.toggled=false;this._model.stopRecord();}
|
| +var progressIndicator=new WebInspector.ProgressIndicator();progressIndicator.addEventListener(WebInspector.ProgressIndicator.Events.Done,this._setOperationInProgress.bind(this,null));this._setOperationInProgress(progressIndicator);return progressIndicator;},_rootRecord:function()
|
| +{return this._presentationModel.rootRecord();},_updateRecordsCounter:function(recordsInWindowCount)
|
| +{this.recordsCounter.textContent=WebInspector.UIString("%d of %d records shown",recordsInWindowCount,this._allRecordsCount);},_updateFrameStatistics:function(frames)
|
| +{if(frames.length){this._lastFrameStatistics=new WebInspector.FrameStatistics(frames);var details=WebInspector.UIString("avg: %s, \u03c3: %s",Number.secondsToString(this._lastFrameStatistics.average,true),Number.secondsToString(this._lastFrameStatistics.stddev,true));}else
|
| +this._lastFrameStatistics=null;this.frameStatistics.textContent=WebInspector.UIString("%d of %d frames shown",frames.length,this._presentationModel.frames().length);if(details){this.frameStatistics.appendChild(document.createTextNode(" ("));this.frameStatistics.createChild("span","timeline-frames-stats").textContent=details;this.frameStatistics.appendChild(document.createTextNode(")"));}},_showFrameStatistics:function(anchor,popover)
|
| +{popover.show(WebInspector.TimelinePresentationModel.generatePopupContentForFrameStatistics(this._lastFrameStatistics),anchor);},_updateEventDividers:function()
|
| +{this._timelineGrid.removeEventDividers();var clientWidth=this._graphRowsElementWidth;var dividers=[];var eventDividerRecords=this._presentationModel.eventDividerRecords();for(var i=0;i<eventDividerRecords.length;++i){var record=eventDividerRecords[i];var positions=this._calculator.computeBarGraphWindowPosition(record);var dividerPosition=Math.round(positions.left);if(dividerPosition<0||dividerPosition>=clientWidth||dividers[dividerPosition])
|
| +continue;var divider=WebInspector.TimelinePresentationModel.createEventDivider(record.type,record.title);divider.style.left=dividerPosition+"px";dividers[dividerPosition]=divider;}
|
| +this._timelineGrid.addEventDividers(dividers);},_updateFrameBars:function(frames)
|
| +{var clientWidth=this._graphRowsElementWidth;if(this._frameContainer)
|
| +this._frameContainer.removeChildren();else{const frameContainerBorderWidth=1;this._frameContainer=document.createElement("div");this._frameContainer.addStyleClass("fill");this._frameContainer.addStyleClass("timeline-frame-container");this._frameContainer.style.height=this._headerLineCount*WebInspector.TimelinePanel.rowHeight+frameContainerBorderWidth+"px";this._frameContainer.addEventListener("dblclick",this._onFrameDoubleClicked.bind(this),false);}
|
| +var dividers=[this._frameContainer];for(var i=0;i<frames.length;++i){var frame=frames[i];var frameStart=this._calculator.computePosition(frame.startTime);var frameEnd=this._calculator.computePosition(frame.endTime);var frameStrip=document.createElement("div");frameStrip.className="timeline-frame-strip";var actualStart=Math.max(frameStart,0);var width=frameEnd-actualStart;frameStrip.style.left=actualStart+"px";frameStrip.style.width=width+"px";frameStrip._frame=frame;const minWidthForFrameInfo=60;if(width>minWidthForFrameInfo)
|
| +frameStrip.textContent=Number.secondsToString(frame.endTime-frame.startTime,true);this._frameContainer.appendChild(frameStrip);if(actualStart>0){var frameMarker=WebInspector.TimelinePresentationModel.createEventDivider(WebInspector.TimelineModel.RecordType.BeginFrame);frameMarker.style.left=frameStart+"px";dividers.push(frameMarker);}}
|
| +this._timelineGrid.addEventDividers(dividers);},_onFrameDoubleClicked:function(event)
|
| +{var frameBar=event.target.enclosingNodeOrSelfWithClass("timeline-frame-strip");if(!frameBar)
|
| +return;this._overviewPane.zoomToFrame(frameBar._frame);},_overviewModeChanged:function(event)
|
| +{var mode=event.data;var shouldShowMemory=mode===WebInspector.TimelineOverviewPane.Mode.Memory;var frameMode=mode===WebInspector.TimelineOverviewPane.Mode.Frames;this._overviewModeSetting.set(mode);if(frameMode!==this._frameMode){this._frameMode=frameMode;this._glueParentButton.setEnabled(!frameMode);this._presentationModel.setGlueRecords(this._glueParentButton.toggled&&!frameMode);this._repopulateRecords();if(frameMode){this.element.addStyleClass("timeline-frame-overview");this.recordsCounter.addStyleClass("hidden");this.frameStatistics.removeStyleClass("hidden");this._frameController=new WebInspector.TimelineFrameController(this._model,this._overviewPane,this._presentationModel);}else{this._frameController.dispose();this._frameController=null;this.element.removeStyleClass("timeline-frame-overview");this.recordsCounter.removeStyleClass("hidden");this.frameStatistics.addStyleClass("hidden");}}
|
| +if(shouldShowMemory===this._memoryStatistics.visible())
|
| +return;if(!shouldShowMemory){this._timelineMemorySplitter.addStyleClass("hidden");this._memoryStatistics.hide();this.splitView.element.style.height="auto";this.splitView.element.style.bottom="0";this.onResize();}else{this._timelineMemorySplitter.removeStyleClass("hidden");this._memoryStatistics.show();this.splitView.element.style.bottom="auto";this._setSplitterPosition(WebInspector.settings.memoryCounterGraphsHeight.get());}},_toggleTimelineButtonClicked:function()
|
| +{if(this._operationInProgress)
|
| +return true;if(this.toggleTimelineButton.toggled){this._model.stopRecord();this.toggleTimelineButton.title=WebInspector.UIString("Record");}else{this._model.startRecord(this._includeDomCounters);this.toggleTimelineButton.title=WebInspector.UIString("Stop");WebInspector.userMetrics.TimelineStarted.record();}
|
| +this.toggleTimelineButton.toggled=!this.toggleTimelineButton.toggled;return true;},_durationFilterChanged:function()
|
| +{var option=this._durationFilterSelector.selectedOption();var minimumRecordDuration=+option._durationMs/1000.0;this._durationFilter.setMinimumRecordDuration(minimumRecordDuration);this._durationFilterSelector.element.title=option.title;this._invalidateAndScheduleRefresh(true,true);},_garbageCollectButtonClicked:function()
|
| +{HeapProfilerAgent.collectGarbage();},_glueParentButtonClicked:function()
|
| +{var newValue=!this._glueParentButton.toggled;this._glueParentButton.toggled=newValue;this._presentationModel.setGlueRecords(newValue);this._glueRecordsSetting.set(newValue);this._repopulateRecords();},_repopulateRecords:function()
|
| +{this._resetPanel();this._automaticallySizeWindow=false;var records=this._model.records;for(var i=0;i<records.length;++i)
|
| +this._innerAddRecordToTimeline(records[i]);this._invalidateAndScheduleRefresh(false,false);},_onTimelineEventRecorded:function(event)
|
| +{if(this._innerAddRecordToTimeline(event.data))
|
| +this._invalidateAndScheduleRefresh(false,false);},_innerAddRecordToTimeline:function(record)
|
| +{if(record.type===WebInspector.TimelineModel.RecordType.Program){this._mainThreadTasks.push({startTime:WebInspector.TimelineModel.startTimeInSeconds(record),endTime:WebInspector.TimelineModel.endTimeInSeconds(record)});}
|
| +var records=this._presentationModel.addRecord(record);this._allRecordsCount+=records.length;var hasVisibleRecords=false;var presentationModel=this._presentationModel;function checkVisible(record)
|
| +{hasVisibleRecords|=presentationModel.isVisible(record);}
|
| +WebInspector.TimelinePresentationModel.forAllRecords(records,checkVisible);function isAdoptedRecord(record)
|
| +{return record.parent!==presentationModel.rootRecord;}
|
| +return hasVisibleRecords||records.some(isAdoptedRecord);},sidebarResized:function(event)
|
| +{var width=event.data;this._resize(width);this._overviewPane.sidebarResized(width);this._memoryStatistics.setSidebarWidth(width);this._timelineGrid.gridHeaderElement.style.left=width+"px";},onResize:function()
|
| +{this._resize(this.splitView.sidebarWidth());},_resize:function(sidebarWidth)
|
| +{this._closeRecordDetails();this._graphRowsElementWidth=this._graphRowsElement.offsetWidth;this._containerElementHeight=this._containerElement.clientHeight;this._scheduleRefresh(false,true);var lastItemElement=this._statusBarItems[this._statusBarItems.length-1].element;var minFloatingStatusBarItemsOffset=lastItemElement.totalOffsetLeft()+lastItemElement.offsetWidth;this._timelineGrid.gridHeaderElement.style.width=this._itemsGraphsElement.offsetWidth+"px";this._miscStatusBarItems.style.left=Math.max(minFloatingStatusBarItemsOffset,sidebarWidth)+"px";},_clearPanel:function()
|
| +{this._model.reset();},_onRecordsCleared:function()
|
| +{this._resetPanel();this._invalidateAndScheduleRefresh(true,true);},_resetPanel:function()
|
| +{this._presentationModel.reset();this._boundariesAreValid=false;this._adjustScrollPosition(0);this._closeRecordDetails();this._allRecordsCount=0;this._automaticallySizeWindow=true;this._mainThreadTasks=[];},elementsToRestoreScrollPositionsFor:function()
|
| +{return[this._containerElement];},wasShown:function()
|
| +{WebInspector.Panel.prototype.wasShown.call(this);if(!WebInspector.TimelinePanel._categoryStylesInitialized){WebInspector.TimelinePanel._categoryStylesInitialized=true;this._injectCategoryStyles();}
|
| +this._overviewPane.setMode(this._overviewModeSetting.get());this._refresh();},willHide:function()
|
| +{this._closeRecordDetails();WebInspector.Panel.prototype.willHide.call(this);},_onScroll:function(event)
|
| +{this._closeRecordDetails();this._scrollTop=this._containerElement.scrollTop;var dividersTop=Math.max(0,this._scrollTop);this._timelineGrid.setScrollAndDividerTop(this._scrollTop,dividersTop);this._scheduleRefresh(true,true);},_invalidateAndScheduleRefresh:function(preserveBoundaries,userGesture)
|
| +{this._presentationModel.invalidateFilteredRecords();delete this._searchResults;this._scheduleRefresh(preserveBoundaries,userGesture);},_scheduleRefresh:function(preserveBoundaries,userGesture)
|
| +{this._closeRecordDetails();this._boundariesAreValid&=preserveBoundaries;if(!this.isShowing())
|
| +return;if(preserveBoundaries||userGesture)
|
| +this._refresh();else{if(!this._refreshTimeout)
|
| +this._refreshTimeout=setTimeout(this._refresh.bind(this),300);}},_refresh:function()
|
| +{if(this._refreshTimeout){clearTimeout(this._refreshTimeout);delete this._refreshTimeout;}
|
| +this._timelinePaddingLeft=this._expandOffset;this._calculator.setWindow(this._overviewPane.windowStartTime(),this._overviewPane.windowEndTime());this._calculator.setDisplayWindow(this._timelinePaddingLeft,this._graphRowsElementWidth);var recordsInWindowCount=this._refreshRecords();this._updateRecordsCounter(recordsInWindowCount);if(!this._boundariesAreValid){this._updateEventDividers();var frames=this._frameController&&this._presentationModel.filteredFrames(this._overviewPane.windowStartTime(),this._overviewPane.windowEndTime());if(frames){this._updateFrameStatistics(frames);const maxFramesForFrameBars=30;if(frames.length&&frames.length<maxFramesForFrameBars){this._timelineGrid.removeDividers();this._updateFrameBars(frames);}else
|
| +this._timelineGrid.updateDividers(this._calculator);}else
|
| +this._timelineGrid.updateDividers(this._calculator);if(this._mainThreadMonitoringEnabled)
|
| +this._refreshMainThreadBars();}
|
| +if(this._memoryStatistics.visible())
|
| +this._memoryStatistics.refresh();this._boundariesAreValid=true;},revealRecordAt:function(time)
|
| +{var recordToReveal;function findRecordToReveal(record)
|
| +{if(record.containsTime(time)){recordToReveal=record;return true;}
|
| +if(!recordToReveal||record.endTime<time&&recordToReveal.endTime<record.endTime)
|
| +recordToReveal=record;return false;}
|
| +WebInspector.TimelinePresentationModel.forAllRecords(this._presentationModel.rootRecord().children,null,findRecordToReveal);if(!recordToReveal){this._containerElement.scrollTop=0;return;}
|
| +this._revealRecord(recordToReveal);},_revealRecord:function(recordToReveal)
|
| +{for(var parent=recordToReveal.parent;parent!==this._rootRecord();parent=parent.parent){if(!parent.collapsed)
|
| +continue;this._presentationModel.invalidateFilteredRecords();parent.collapsed=false;}
|
| +var recordsInWindow=this._presentationModel.filteredRecords();var index=recordsInWindow.indexOf(recordToReveal);this._recordToHighlight=recordToReveal;var oldScrollTop=this._containerElement.scrollTop;this._containerElement.scrollTop=index*WebInspector.TimelinePanel.rowHeight;if(this._containerElement.scrollTop===oldScrollTop)
|
| +this._refresh();},_refreshRecords:function()
|
| +{var recordsInWindow=this._presentationModel.filteredRecords();var visibleTop=this._scrollTop;var visibleBottom=visibleTop+this._containerElementHeight;const rowHeight=WebInspector.TimelinePanel.rowHeight;var startIndex=Math.max(0,Math.min(Math.floor(visibleTop/rowHeight)-this._headerLineCount,recordsInWindow.length-1));var endIndex=Math.min(recordsInWindow.length,Math.ceil(visibleBottom/rowHeight));var lastVisibleLine=Math.max(0,Math.floor(visibleBottom/rowHeight)-this._headerLineCount);if(this._automaticallySizeWindow&&recordsInWindow.length>lastVisibleLine){this._automaticallySizeWindow=false;var windowStartTime=startIndex?recordsInWindow[startIndex].startTime:this._model.minimumRecordTime();this._overviewPane.setWindowTimes(windowStartTime,recordsInWindow[Math.max(0,lastVisibleLine-1)].endTime);recordsInWindow=this._presentationModel.filteredRecords();endIndex=Math.min(recordsInWindow.length,lastVisibleLine);}
|
| +this._topGapElement.style.height=(startIndex*rowHeight)+"px";this.sidebarTreeElement.style.height=((startIndex+this._headerLineCount)*rowHeight)+"px";this._bottomGapElement.style.height=(recordsInWindow.length-endIndex)*rowHeight+"px";var listRowElement=this._sidebarListElement.firstChild;var width=this._graphRowsElementWidth;this._itemsGraphsElement.removeChild(this._graphRowsElement);var graphRowElement=this._graphRowsElement.firstChild;var scheduleRefreshCallback=this._invalidateAndScheduleRefresh.bind(this,true,true);this._itemsGraphsElement.removeChild(this._expandElements);this._expandElements.removeChildren();var highlightedRecord=this._recordToHighlight;delete this._recordToHighlight;var highlightedListRowElement;var highlightedGraphRowElement;for(var i=0;i<endIndex;++i){var record=recordsInWindow[i];var isEven=!(i%2);if(i<startIndex){var lastChildIndex=i+record.visibleChildrenCount;if(lastChildIndex>=startIndex&&lastChildIndex<endIndex){var expandElement=new WebInspector.TimelineExpandableElement(this._expandElements);var positions=this._calculator.computeBarGraphWindowPosition(record);expandElement._update(record,i,positions.left-this._expandOffset,positions.width);}}else{if(!listRowElement){listRowElement=new WebInspector.TimelineRecordListRow().element;this._sidebarListElement.appendChild(listRowElement);}
|
| +if(!graphRowElement){graphRowElement=new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement,scheduleRefreshCallback).element;this._graphRowsElement.appendChild(graphRowElement);}
|
| +if(highlightedRecord===record){highlightedListRowElement=listRowElement;highlightedGraphRowElement=graphRowElement;}
|
| +listRowElement.row.update(record,isEven,visibleTop);graphRowElement.row.update(record,isEven,this._calculator,this._expandOffset,i);listRowElement=listRowElement.nextSibling;graphRowElement=graphRowElement.nextSibling;}}
|
| +while(listRowElement){var nextElement=listRowElement.nextSibling;listRowElement.row.dispose();listRowElement=nextElement;}
|
| +while(graphRowElement){var nextElement=graphRowElement.nextSibling;graphRowElement.row.dispose();graphRowElement=nextElement;}
|
| +this._itemsGraphsElement.insertBefore(this._graphRowsElement,this._bottomGapElement);this._itemsGraphsElement.appendChild(this._expandElements);this._adjustScrollPosition((recordsInWindow.length+this._headerLineCount)*rowHeight);this._updateSearchHighlight(false,true);if(highlightedListRowElement){highlightedListRowElement.addStyleClass("highlighted-timeline-record");highlightedGraphRowElement.addStyleClass("highlighted-timeline-record");}
|
| +return recordsInWindow.length;},_refreshMainThreadBars:function()
|
| +{const barOffset=3;const minGap=3;var minWidth=WebInspector.TimelineCalculator._minWidth;var widthAdjustment=minWidth/2;var width=this._graphRowsElementWidth;var boundarySpan=this._overviewPane.windowEndTime()-this._overviewPane.windowStartTime();var scale=boundarySpan/(width-minWidth-this._timelinePaddingLeft);var startTime=this._overviewPane.windowStartTime()-this._timelinePaddingLeft*scale;var endTime=startTime+width*scale;var tasks=this._mainThreadMonitoringEnabled?this._mainThreadTasks:[];function compareEndTime(value,task)
|
| +{return value<task.endTime?-1:1;}
|
| +var taskIndex=insertionIndexForObjectInListSortedByFunction(startTime,tasks,compareEndTime);var container=this._cpuBarsElement;var element=container.firstChild;var lastElement;var lastLeft;var lastRight;for(;taskIndex<tasks.length;++taskIndex){var task=tasks[taskIndex];if(task.startTime>endTime)
|
| +break;var left=Math.max(0,this._calculator.computePosition(task.startTime)+barOffset-widthAdjustment);var right=Math.min(width,this._calculator.computePosition(task.endTime)+barOffset+widthAdjustment);if(lastElement){var gap=Math.floor(left)-Math.ceil(lastRight);if(gap<minGap){lastRight=right;lastElement._tasksInfo.lastTaskIndex=taskIndex;continue;}
|
| +lastElement.style.width=(lastRight-lastLeft)+"px";}
|
| +if(!element)
|
| +element=container.createChild("div","timeline-graph-bar");element.style.left=left+"px";element._tasksInfo={tasks:tasks,firstTaskIndex:taskIndex,lastTaskIndex:taskIndex};lastLeft=left;lastRight=right;lastElement=element;element=element.nextSibling;}
|
| +if(lastElement)
|
| +lastElement.style.width=(lastRight-lastLeft)+"px";while(element){var nextElement=element.nextSibling;element._tasksInfo=null;container.removeChild(element);element=nextElement;}},_adjustHeaderHeight:function()
|
| +{const headerBorderWidth=1;const headerMargin=2;var headerHeight=this._headerLineCount*WebInspector.TimelinePanel.rowHeight;this.sidebarElement.firstChild.style.height=headerHeight+"px";this._timelineGrid.dividersLabelBarElement.style.height=headerHeight+headerMargin+"px";this._itemsGraphsElement.style.top=headerHeight+headerBorderWidth+"px";},_adjustScrollPosition:function(totalHeight)
|
| +{if((this._scrollTop+this._containerElementHeight)>totalHeight+1)
|
| +this._containerElement.scrollTop=(totalHeight-this._containerElement.offsetHeight);},_getPopoverAnchor:function(element)
|
| +{return element.enclosingNodeOrSelfWithClass("timeline-graph-bar")||element.enclosingNodeOrSelfWithClass("timeline-tree-item")||element.enclosingNodeOrSelfWithClass("timeline-frame-strip");},_mouseOut:function(e)
|
| +{this._hideQuadHighlight();},_mouseMove:function(e)
|
| +{var anchor=this._getPopoverAnchor(e.target);if(anchor&&anchor.row&&anchor.row._record.highlightQuad)
|
| +this._highlightQuad(anchor.row._record.highlightQuad);else
|
| +this._hideQuadHighlight();if(anchor&&anchor._tasksInfo){var offset=anchor.offsetLeft;this._timelineGrid.showCurtains(offset>=0?offset:0,anchor.offsetWidth);}else
|
| +this._timelineGrid.hideCurtains();},_highlightQuad:function(quad)
|
| +{if(this._highlightedQuad===quad)
|
| +return;this._highlightedQuad=quad;DOMAgent.highlightQuad(quad,WebInspector.Color.PageHighlight.Content.toProtocolRGBA(),WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());},_hideQuadHighlight:function()
|
| +{if(this._highlightedQuad){delete this._highlightedQuad;DOMAgent.hideHighlight();}},_showPopover:function(anchor,popover)
|
| +{if(anchor.hasStyleClass("timeline-frame-strip")){var frame=anchor._frame;popover.show(WebInspector.TimelinePresentationModel.generatePopupContentForFrame(frame),anchor);}else{if(anchor.row&&anchor.row._record)
|
| +anchor.row._record.generatePopupContent(showCallback);else if(anchor._tasksInfo)
|
| +popover.show(this._presentationModel.generateMainThreadBarPopupContent(anchor._tasksInfo),anchor,null,null,WebInspector.Popover.Orientation.Bottom);}
|
| function showCallback(popupContent)
|
| -{
|
| -popover.show(popupContent, anchor);
|
| -}
|
| -},
|
| -
|
| -_closeRecordDetails: function()
|
| -{
|
| -this._popoverHelper.hidePopover();
|
| -},
|
| -
|
| -_injectCategoryStyles: function()
|
| -{
|
| -var style = document.createElement("style");
|
| -var categories = WebInspector.TimelinePresentationModel.categories();
|
| -
|
| -style.textContent = Object.values(categories).map(WebInspector.TimelinePresentationModel.createStyleRuleForCategory).join("\n");
|
| -document.head.appendChild(style);
|
| -},
|
| -
|
| -jumpToNextSearchResult: function()
|
| -{
|
| -this._jumpToAdjacentRecord(1);
|
| -},
|
| -
|
| -jumpToPreviousSearchResult: function()
|
| -{
|
| -this._jumpToAdjacentRecord(-1);
|
| -},
|
| -
|
| -_jumpToAdjacentRecord: function(offset)
|
| -{
|
| -if (!this._searchResults || !this._searchResults.length || !this._selectedSearchResult)
|
| -return;
|
| -var index = this._searchResults.indexOf(this._selectedSearchResult);
|
| -index = (index + offset + this._searchResults.length) % this._searchResults.length;
|
| -this._selectSearchResult(index);
|
| -this._highlightSelectedSearchResult(true);
|
| -},
|
| -
|
| -_selectSearchResult: function(index)
|
| -{
|
| -this._selectedSearchResult = this._searchResults[index];
|
| -WebInspector.searchController.updateCurrentMatchIndex(index, this);
|
| -},
|
| -
|
| -_highlightSelectedSearchResult: function(revealRecord)
|
| -{
|
| -this._clearHighlight();
|
| -if (this._searchFilter)
|
| -return;
|
| -
|
| -var record = this._selectedSearchResult;
|
| -if (!record)
|
| -return;
|
| -
|
| -for (var element = this._sidebarListElement.firstChild; element; element = element.nextSibling) {
|
| -if (element.row._record === record) {
|
| -element.row.highlight(this._searchRegExp, this._highlightDomChanges);
|
| -return;
|
| -}
|
| -}
|
| -
|
| -if (revealRecord)
|
| -this._revealRecord(record);
|
| -},
|
| -
|
| -_clearHighlight: function()
|
| -{
|
| -if (this._highlightDomChanges)
|
| -WebInspector.revertDomChanges(this._highlightDomChanges);
|
| -this._highlightDomChanges = [];
|
| -},
|
| -
|
| -
|
| -_updateSearchHighlight: function(revealRecord)
|
| -{
|
| -if (this._searchFilter || !this._searchRegExp) {
|
| -this._clearHighlight();
|
| -return;
|
| -}
|
| -
|
| -if (!this._searchResults)
|
| -this._updateSearchResults();
|
| -
|
| -this._highlightSelectedSearchResult(revealRecord);
|
| -},
|
| -
|
| -_updateSearchResults: function()
|
| -{
|
| -var searchRegExp = this._searchRegExp;
|
| -if (!searchRegExp)
|
| -return;
|
| -
|
| -var matches = [];
|
| -var presentationModel = this._presentationModel;
|
| -
|
| -function processRecord(record)
|
| -{
|
| -if (presentationModel.isVisible(record) && WebInspector.TimelineRecordListRow.testContentMatching(record, searchRegExp))
|
| -matches.push(record);
|
| -return false;
|
| -}
|
| -WebInspector.TimelinePresentationModel.forAllRecords(presentationModel.rootRecord().children, processRecord);
|
| -
|
| -var matchesCount = matches.length;
|
| -if (matchesCount) {
|
| -this._searchResults = matches;
|
| -WebInspector.searchController.updateSearchMatchesCount(matchesCount, this);
|
| -
|
| -var selectedIndex = matches.indexOf(this._selectedSearchResult);
|
| -if (selectedIndex === -1)
|
| -selectedIndex = 0;
|
| -this._selectSearchResult(selectedIndex);
|
| -} else {
|
| -WebInspector.searchController.updateSearchMatchesCount(0, this);
|
| -delete this._selectedSearchResult;
|
| -}
|
| -},
|
| -
|
| -searchCanceled: function()
|
| -{
|
| -this._clearHighlight();
|
| -delete this._searchResults;
|
| -delete this._selectedSearchResult;
|
| -delete this._searchRegExp;
|
| -},
|
| -
|
| -
|
| -canFilter: function()
|
| -{
|
| -return true;
|
| -},
|
| -
|
| -performFilter: function(searchQuery)
|
| -{
|
| -this._presentationModel.removeFilter(this._searchFilter);
|
| -delete this._searchFilter;
|
| -this.searchCanceled();
|
| -if (searchQuery) {
|
| -this._searchFilter = new WebInspector.TimelineSearchFilter(createPlainTextSearchRegex(searchQuery, "i"));
|
| -this._presentationModel.addFilter(this._searchFilter);
|
| -}
|
| -this._invalidateAndScheduleRefresh(true, true);
|
| -},
|
| -
|
| -performSearch: function(searchQuery)
|
| -{
|
| -this._searchRegExp = createPlainTextSearchRegex(searchQuery, "i");
|
| -delete this._searchResults;
|
| -this._updateSearchHighlight(true);
|
| -},
|
| -
|
| -__proto__: WebInspector.Panel.prototype
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineCalculator = function(model)
|
| -{
|
| -this._model = model;
|
| -}
|
| -
|
| -WebInspector.TimelineCalculator._minWidth = 5;
|
| -
|
| -WebInspector.TimelineCalculator.prototype = {
|
| -
|
| -computePosition: function(time)
|
| -{
|
| -return (time - this._minimumBoundary) / this.boundarySpan() * this._workingArea + this.paddingLeft;
|
| -},
|
| -
|
| -computeBarGraphPercentages: function(record)
|
| -{
|
| -var start = (record.startTime - this._minimumBoundary) / this.boundarySpan() * 100;
|
| -var end = (record.startTime + record.selfTime - this._minimumBoundary) / this.boundarySpan() * 100;
|
| -var endWithChildren = (record.lastChildEndTime - this._minimumBoundary) / this.boundarySpan() * 100;
|
| -var cpuWidth = record.coalesced ? endWithChildren - start : record.cpuTime / this.boundarySpan() * 100;
|
| -return {start: start, end: end, endWithChildren: endWithChildren, cpuWidth: cpuWidth};
|
| -},
|
| -
|
| -computeBarGraphWindowPosition: function(record)
|
| -{
|
| -var percentages = this.computeBarGraphPercentages(record);
|
| -var widthAdjustment = 0;
|
| -
|
| -var left = this.computePosition(record.startTime);
|
| -var width = (percentages.end - percentages.start) / 100 * this._workingArea;
|
| -if (width < WebInspector.TimelineCalculator._minWidth) {
|
| -widthAdjustment = WebInspector.TimelineCalculator._minWidth - width;
|
| -left -= widthAdjustment / 2;
|
| -width += widthAdjustment;
|
| -}
|
| -var widthWithChildren = (percentages.endWithChildren - percentages.start) / 100 * this._workingArea + widthAdjustment;
|
| -var cpuWidth = percentages.cpuWidth / 100 * this._workingArea + widthAdjustment;
|
| -if (percentages.endWithChildren > percentages.end)
|
| -widthWithChildren += widthAdjustment;
|
| -return {left: left, width: width, widthWithChildren: widthWithChildren, cpuWidth: cpuWidth};
|
| -},
|
| -
|
| -setWindow: function(minimumBoundary, maximumBoundary)
|
| -{
|
| -this._minimumBoundary = minimumBoundary;
|
| -this._maximumBoundary = maximumBoundary;
|
| -},
|
| -
|
| -
|
| -setDisplayWindow: function(paddingLeft, clientWidth)
|
| -{
|
| -this._workingArea = clientWidth - WebInspector.TimelineCalculator._minWidth - paddingLeft;
|
| -this.paddingLeft = paddingLeft;
|
| -},
|
| -
|
| -formatTime: function(value)
|
| -{
|
| -return Number.secondsToString(value + this._minimumBoundary - this._model.minimumRecordTime());
|
| -},
|
| -
|
| -maximumBoundary: function()
|
| -{
|
| -return this._maximumBoundary;
|
| -},
|
| -
|
| -minimumBoundary: function()
|
| -{
|
| -return this._minimumBoundary;
|
| -},
|
| -
|
| -zeroTime: function()
|
| -{
|
| -return this._model.minimumRecordTime();
|
| -},
|
| -
|
| -boundarySpan: function()
|
| -{
|
| -return this._maximumBoundary - this._minimumBoundary;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineRecordListRow = function()
|
| -{
|
| -this.element = document.createElement("div");
|
| -this.element.row = this;
|
| -this.element.style.cursor = "pointer";
|
| -var iconElement = document.createElement("span");
|
| -iconElement.className = "timeline-tree-icon";
|
| -this.element.appendChild(iconElement);
|
| -
|
| -this._typeElement = document.createElement("span");
|
| -this._typeElement.className = "type";
|
| -this.element.appendChild(this._typeElement);
|
| -
|
| -var separatorElement = document.createElement("span");
|
| -separatorElement.className = "separator";
|
| -separatorElement.textContent = " ";
|
| -
|
| -this._dataElement = document.createElement("span");
|
| -this._dataElement.className = "data dimmed";
|
| -
|
| -this.element.appendChild(separatorElement);
|
| -this.element.appendChild(this._dataElement);
|
| -}
|
| -
|
| -WebInspector.TimelineRecordListRow.prototype = {
|
| -update: function(record, isEven, offset)
|
| -{
|
| -this._record = record;
|
| -this._offset = offset;
|
| -
|
| -this.element.className = "timeline-tree-item timeline-category-" + record.category.name;
|
| -if (isEven)
|
| -this.element.addStyleClass("even");
|
| -if (record.hasWarning)
|
| -this.element.addStyleClass("warning");
|
| -else if (record.childHasWarning)
|
| -this.element.addStyleClass("child-warning");
|
| -if (record.isBackground)
|
| -this.element.addStyleClass("background");
|
| -
|
| -this._typeElement.textContent = record.title;
|
| -
|
| -if (this._dataElement.firstChild)
|
| -this._dataElement.removeChildren();
|
| -
|
| -if (record.detailsNode())
|
| -this._dataElement.appendChild(record.detailsNode());
|
| -},
|
| -
|
| -highlight: function(regExp, domChanges)
|
| -{
|
| -var matchInfo = this.element.textContent.match(regExp);
|
| -if (matchInfo)
|
| -WebInspector.highlightSearchResult(this.element, matchInfo.index, matchInfo[0].length, domChanges);
|
| -},
|
| -
|
| -dispose: function()
|
| -{
|
| -this.element.parentElement.removeChild(this.element);
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineRecordListRow.testContentMatching = function(record, regExp)
|
| -{
|
| -var toSearchText = record.title;
|
| -if (record.detailsNode())
|
| -toSearchText += " " + record.detailsNode().textContent;
|
| -return regExp.test(toSearchText);
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineRecordGraphRow = function(graphContainer, scheduleRefresh)
|
| -{
|
| -this.element = document.createElement("div");
|
| -this.element.row = this;
|
| -
|
| -this._barAreaElement = document.createElement("div");
|
| -this._barAreaElement.className = "timeline-graph-bar-area";
|
| -this.element.appendChild(this._barAreaElement);
|
| -
|
| -this._barWithChildrenElement = document.createElement("div");
|
| -this._barWithChildrenElement.className = "timeline-graph-bar with-children";
|
| -this._barWithChildrenElement.row = this;
|
| -this._barAreaElement.appendChild(this._barWithChildrenElement);
|
| -
|
| -this._barCpuElement = document.createElement("div");
|
| -this._barCpuElement.className = "timeline-graph-bar cpu"
|
| -this._barCpuElement.row = this;
|
| -this._barAreaElement.appendChild(this._barCpuElement);
|
| -
|
| -this._barElement = document.createElement("div");
|
| -this._barElement.className = "timeline-graph-bar";
|
| -this._barElement.row = this;
|
| -this._barAreaElement.appendChild(this._barElement);
|
| -
|
| -this._expandElement = new WebInspector.TimelineExpandableElement(graphContainer);
|
| -this._expandElement._element.addEventListener("click", this._onClick.bind(this));
|
| -
|
| -this._scheduleRefresh = scheduleRefresh;
|
| -}
|
| -
|
| -WebInspector.TimelineRecordGraphRow.prototype = {
|
| -update: function(record, isEven, calculator, expandOffset, index)
|
| -{
|
| -this._record = record;
|
| -this.element.className = "timeline-graph-side timeline-category-" + record.category.name;
|
| -if (isEven)
|
| -this.element.addStyleClass("even");
|
| -if (record.isBackground)
|
| -this.element.addStyleClass("background");
|
| -
|
| -var barPosition = calculator.computeBarGraphWindowPosition(record);
|
| -this._barWithChildrenElement.style.left = barPosition.left + "px";
|
| -this._barWithChildrenElement.style.width = barPosition.widthWithChildren + "px";
|
| -this._barElement.style.left = barPosition.left + "px";
|
| -this._barElement.style.width = barPosition.width + "px";
|
| -this._barCpuElement.style.left = barPosition.left + "px";
|
| -this._barCpuElement.style.width = barPosition.cpuWidth + "px";
|
| -this._expandElement._update(record, index, barPosition.left - expandOffset, barPosition.width);
|
| -},
|
| -
|
| -_onClick: function(event)
|
| -{
|
| -this._record.collapsed = !this._record.collapsed;
|
| -this._scheduleRefresh(false, true);
|
| -},
|
| -
|
| -dispose: function()
|
| -{
|
| -this.element.parentElement.removeChild(this.element);
|
| -this._expandElement._dispose();
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineExpandableElement = function(container)
|
| -{
|
| -this._element = container.createChild("div", "timeline-expandable");
|
| -this._element.createChild("div", "timeline-expandable-left");
|
| -this._element.createChild("div", "timeline-expandable-arrow");
|
| -}
|
| -
|
| -WebInspector.TimelineExpandableElement.prototype = {
|
| -_update: function(record, index, left, width)
|
| -{
|
| -const rowHeight = WebInspector.TimelinePanel.rowHeight;
|
| -if (record.visibleChildrenCount || record.invisibleChildrenCount) {
|
| -this._element.style.top = index * rowHeight + "px";
|
| -this._element.style.left = left + "px";
|
| -this._element.style.width = Math.max(12, width + 25) + "px";
|
| -if (!record.collapsed) {
|
| -this._element.style.height = (record.visibleChildrenCount + 1) * rowHeight + "px";
|
| -this._element.addStyleClass("timeline-expandable-expanded");
|
| -this._element.removeStyleClass("timeline-expandable-collapsed");
|
| -} else {
|
| -this._element.style.height = rowHeight + "px";
|
| -this._element.addStyleClass("timeline-expandable-collapsed");
|
| -this._element.removeStyleClass("timeline-expandable-expanded");
|
| -}
|
| -this._element.removeStyleClass("hidden");
|
| -} else
|
| -this._element.addStyleClass("hidden");
|
| -},
|
| -
|
| -_dispose: function()
|
| -{
|
| -this._element.parentElement.removeChild(this._element);
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineCategoryFilter = function()
|
| -{
|
| -}
|
| -
|
| -WebInspector.TimelineCategoryFilter.prototype = {
|
| -
|
| -accept: function(record)
|
| -{
|
| -return !record.category.hidden && record.type !== WebInspector.TimelineModel.RecordType.BeginFrame;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineIsLongFilter = function()
|
| -{
|
| -this._minimumRecordDuration = 0;
|
| -}
|
| -
|
| -WebInspector.TimelineIsLongFilter.prototype = {
|
| -
|
| -setMinimumRecordDuration: function(value)
|
| -{
|
| -this._minimumRecordDuration = value;
|
| -},
|
| -
|
| -
|
| -accept: function(record)
|
| -{
|
| -return this._minimumRecordDuration ? ((record.lastChildEndTime - record.startTime) >= this._minimumRecordDuration) : true;
|
| -}
|
| -}
|
| -
|
| -
|
| -WebInspector.TimelineSearchFilter = function(regExp)
|
| -{
|
| -this._regExp = regExp;
|
| -}
|
| -
|
| -WebInspector.TimelineSearchFilter.prototype = {
|
| -
|
| -
|
| -accept: function(record)
|
| -{
|
| -return WebInspector.TimelineRecordListRow.testContentMatching(record, this._regExp);
|
| -}
|
| -}
|
| +{popover.show(popupContent,anchor);}},_closeRecordDetails:function()
|
| +{this._popoverHelper.hidePopover();},_injectCategoryStyles:function()
|
| +{var style=document.createElement("style");var categories=WebInspector.TimelinePresentationModel.categories();style.textContent=Object.values(categories).map(WebInspector.TimelinePresentationModel.createStyleRuleForCategory).join("\n");document.head.appendChild(style);},jumpToNextSearchResult:function()
|
| +{if(!this._searchResults||!this._searchResults.length)
|
| +return;var index=this._selectedSearchResult?this._searchResults.indexOf(this._selectedSearchResult):-1;this._jumpToSearchResult(index+1);},jumpToPreviousSearchResult:function()
|
| +{if(!this._searchResults||!this._searchResults.length)
|
| +return;var index=this._selectedSearchResult?this._searchResults.indexOf(this._selectedSearchResult):0;this._jumpToSearchResult(index-1);},_jumpToSearchResult:function(index)
|
| +{this._selectSearchResult((index+this._searchResults.length)%this._searchResults.length);this._highlightSelectedSearchResult(true);},_selectSearchResult:function(index)
|
| +{this._selectedSearchResult=this._searchResults[index];WebInspector.searchController.updateCurrentMatchIndex(index,this);},_highlightSelectedSearchResult:function(revealRecord)
|
| +{this._clearHighlight();if(this._searchFilter)
|
| +return;var record=this._selectedSearchResult;if(!record)
|
| +return;for(var element=this._sidebarListElement.firstChild;element;element=element.nextSibling){if(element.row._record===record){element.row.highlight(this._searchRegExp,this._highlightDomChanges);return;}}
|
| +if(revealRecord)
|
| +this._revealRecord(record);},_clearHighlight:function()
|
| +{if(this._highlightDomChanges)
|
| +WebInspector.revertDomChanges(this._highlightDomChanges);this._highlightDomChanges=[];},_updateSearchHighlight:function(revealRecord,shouldJump)
|
| +{if(this._searchFilter||!this._searchRegExp){this._clearHighlight();return;}
|
| +if(!this._searchResults)
|
| +this._updateSearchResults(shouldJump);this._highlightSelectedSearchResult(revealRecord);},_updateSearchResults:function(shouldJump)
|
| +{var searchRegExp=this._searchRegExp;if(!searchRegExp)
|
| +return;var matches=[];var presentationModel=this._presentationModel;function processRecord(record)
|
| +{if(presentationModel.isVisible(record)&&WebInspector.TimelineRecordListRow.testContentMatching(record,searchRegExp))
|
| +matches.push(record);return false;}
|
| +WebInspector.TimelinePresentationModel.forAllRecords(presentationModel.rootRecord().children,processRecord);var matchesCount=matches.length;if(matchesCount){this._searchResults=matches;WebInspector.searchController.updateSearchMatchesCount(matchesCount,this);var selectedIndex=matches.indexOf(this._selectedSearchResult);if(shouldJump&&selectedIndex===-1)
|
| +selectedIndex=0;this._selectSearchResult(selectedIndex);}else{WebInspector.searchController.updateSearchMatchesCount(0,this);delete this._selectedSearchResult;}},searchCanceled:function()
|
| +{this._clearHighlight();delete this._searchResults;delete this._selectedSearchResult;delete this._searchRegExp;},canFilter:function()
|
| +{return true;},performFilter:function(searchQuery)
|
| +{this._presentationModel.setSearchFilter(null);delete this._searchFilter;function cleanRecord(record)
|
| +{delete record.clicked;}
|
| +WebInspector.TimelinePresentationModel.forAllRecords(this._presentationModel.rootRecord().children,cleanRecord);this.searchCanceled();if(searchQuery){this._searchFilter=new WebInspector.TimelineSearchFilter(createPlainTextSearchRegex(searchQuery,"i"));this._presentationModel.setSearchFilter(this._searchFilter);}
|
| +this._invalidateAndScheduleRefresh(true,true);},performSearch:function(query,shouldJump)
|
| +{this._searchRegExp=createPlainTextSearchRegex(query,"i");delete this._searchResults;this._updateSearchHighlight(true,shouldJump);},__proto__:WebInspector.Panel.prototype}
|
| +WebInspector.TimelineCalculator=function(model)
|
| +{this._model=model;}
|
| +WebInspector.TimelineCalculator._minWidth=5;WebInspector.TimelineCalculator.prototype={computePosition:function(time)
|
| +{return(time-this._minimumBoundary)/this.boundarySpan()*this._workingArea+this.paddingLeft;},computeBarGraphPercentages:function(record)
|
| +{var start=(record.startTime-this._minimumBoundary)/this.boundarySpan()*100;var end=(record.startTime+record.selfTime-this._minimumBoundary)/this.boundarySpan()*100;var endWithChildren=(record.lastChildEndTime-this._minimumBoundary)/this.boundarySpan()*100;var cpuWidth=record.coalesced?endWithChildren-start:record.cpuTime/this.boundarySpan()*100;return{start:start,end:end,endWithChildren:endWithChildren,cpuWidth:cpuWidth};},computeBarGraphWindowPosition:function(record)
|
| +{var percentages=this.computeBarGraphPercentages(record);var widthAdjustment=0;var left=this.computePosition(record.startTime);var width=(percentages.end-percentages.start)/100*this._workingArea;if(width<WebInspector.TimelineCalculator._minWidth){widthAdjustment=WebInspector.TimelineCalculator._minWidth-width;width=WebInspector.TimelineCalculator._minWidth;}
|
| +var widthWithChildren=(percentages.endWithChildren-percentages.start)/100*this._workingArea+widthAdjustment;var cpuWidth=percentages.cpuWidth/100*this._workingArea+widthAdjustment;if(percentages.endWithChildren>percentages.end)
|
| +widthWithChildren+=widthAdjustment;return{left:left,width:width,widthWithChildren:widthWithChildren,cpuWidth:cpuWidth};},setWindow:function(minimumBoundary,maximumBoundary)
|
| +{this._minimumBoundary=minimumBoundary;this._maximumBoundary=maximumBoundary;},setDisplayWindow:function(paddingLeft,clientWidth)
|
| +{this._workingArea=clientWidth-WebInspector.TimelineCalculator._minWidth-paddingLeft;this.paddingLeft=paddingLeft;},formatTime:function(value)
|
| +{return Number.secondsToString(value+this._minimumBoundary-this._model.minimumRecordTime());},maximumBoundary:function()
|
| +{return this._maximumBoundary;},minimumBoundary:function()
|
| +{return this._minimumBoundary;},zeroTime:function()
|
| +{return this._model.minimumRecordTime();},boundarySpan:function()
|
| +{return this._maximumBoundary-this._minimumBoundary;}}
|
| +WebInspector.TimelineRecordListRow=function()
|
| +{this.element=document.createElement("div");this.element.row=this;this.element.style.cursor="pointer";var iconElement=document.createElement("span");iconElement.className="timeline-tree-icon";this.element.appendChild(iconElement);this._typeElement=document.createElement("span");this._typeElement.className="type";this.element.appendChild(this._typeElement);var separatorElement=document.createElement("span");separatorElement.className="separator";separatorElement.textContent=" ";this._dataElement=document.createElement("span");this._dataElement.className="data dimmed";this.element.appendChild(separatorElement);this.element.appendChild(this._dataElement);}
|
| +WebInspector.TimelineRecordListRow.prototype={update:function(record,isEven,offset)
|
| +{this._record=record;this._offset=offset;this.element.className="timeline-tree-item timeline-category-"+record.category.name;if(isEven)
|
| +this.element.addStyleClass("even");if(record.hasWarning)
|
| +this.element.addStyleClass("warning");else if(record.childHasWarning)
|
| +this.element.addStyleClass("child-warning");if(record.isBackground)
|
| +this.element.addStyleClass("background");this._typeElement.textContent=record.title;if(this._dataElement.firstChild)
|
| +this._dataElement.removeChildren();if(record.detailsNode())
|
| +this._dataElement.appendChild(record.detailsNode());},highlight:function(regExp,domChanges)
|
| +{var matchInfo=this.element.textContent.match(regExp);if(matchInfo)
|
| +WebInspector.highlightSearchResult(this.element,matchInfo.index,matchInfo[0].length,domChanges);},dispose:function()
|
| +{this.element.remove();}}
|
| +WebInspector.TimelineRecordListRow.testContentMatching=function(record,regExp)
|
| +{var toSearchText=record.title;if(record.detailsNode())
|
| +toSearchText+=" "+record.detailsNode().textContent;return regExp.test(toSearchText);}
|
| +WebInspector.TimelineRecordGraphRow=function(graphContainer,scheduleRefresh)
|
| +{this.element=document.createElement("div");this.element.row=this;this._barAreaElement=document.createElement("div");this._barAreaElement.className="timeline-graph-bar-area";this.element.appendChild(this._barAreaElement);this._barWithChildrenElement=document.createElement("div");this._barWithChildrenElement.className="timeline-graph-bar with-children";this._barWithChildrenElement.row=this;this._barAreaElement.appendChild(this._barWithChildrenElement);this._barCpuElement=document.createElement("div");this._barCpuElement.className="timeline-graph-bar cpu"
|
| +this._barCpuElement.row=this;this._barAreaElement.appendChild(this._barCpuElement);this._barElement=document.createElement("div");this._barElement.className="timeline-graph-bar";this._barElement.row=this;this._barAreaElement.appendChild(this._barElement);this._expandElement=new WebInspector.TimelineExpandableElement(graphContainer);this._expandElement._element.addEventListener("click",this._onClick.bind(this));this._scheduleRefresh=scheduleRefresh;}
|
| +WebInspector.TimelineRecordGraphRow.prototype={update:function(record,isEven,calculator,expandOffset,index)
|
| +{this._record=record;this.element.className="timeline-graph-side timeline-category-"+record.category.name;if(isEven)
|
| +this.element.addStyleClass("even");if(record.isBackground)
|
| +this.element.addStyleClass("background");var barPosition=calculator.computeBarGraphWindowPosition(record);this._barWithChildrenElement.style.left=barPosition.left+"px";this._barWithChildrenElement.style.width=barPosition.widthWithChildren+"px";this._barElement.style.left=barPosition.left+"px";this._barElement.style.width=barPosition.width+"px";this._barCpuElement.style.left=barPosition.left+"px";this._barCpuElement.style.width=barPosition.cpuWidth+"px";this._expandElement._update(record,index,barPosition.left-expandOffset,barPosition.width);},_onClick:function(event)
|
| +{this._record.collapsed=!this._record.collapsed;this._record.clicked=true;this._scheduleRefresh(false,true);},dispose:function()
|
| +{this.element.remove();this._expandElement._dispose();}}
|
| +WebInspector.TimelineExpandableElement=function(container)
|
| +{this._element=container.createChild("div","timeline-expandable");this._element.createChild("div","timeline-expandable-left");this._element.createChild("div","timeline-expandable-arrow");}
|
| +WebInspector.TimelineExpandableElement.prototype={_update:function(record,index,left,width)
|
| +{const rowHeight=WebInspector.TimelinePanel.rowHeight;if(record.visibleChildrenCount||record.expandable){this._element.style.top=index*rowHeight+"px";this._element.style.left=left+"px";this._element.style.width=Math.max(12,width+25)+"px";if(!record.collapsed){this._element.style.height=(record.visibleChildrenCount+1)*rowHeight+"px";this._element.addStyleClass("timeline-expandable-expanded");this._element.removeStyleClass("timeline-expandable-collapsed");}else{this._element.style.height=rowHeight+"px";this._element.addStyleClass("timeline-expandable-collapsed");this._element.removeStyleClass("timeline-expandable-expanded");}
|
| +this._element.removeStyleClass("hidden");}else
|
| +this._element.addStyleClass("hidden");},_dispose:function()
|
| +{this._element.remove();}}
|
| +WebInspector.TimelineCategoryFilter=function()
|
| +{}
|
| +WebInspector.TimelineCategoryFilter.prototype={accept:function(record)
|
| +{return!record.category.hidden&&record.type!==WebInspector.TimelineModel.RecordType.BeginFrame;}}
|
| +WebInspector.TimelineIsLongFilter=function()
|
| +{this._minimumRecordDuration=0;}
|
| +WebInspector.TimelineIsLongFilter.prototype={setMinimumRecordDuration:function(value)
|
| +{this._minimumRecordDuration=value;},accept:function(record)
|
| +{return this._minimumRecordDuration?((record.lastChildEndTime-record.startTime)>=this._minimumRecordDuration):true;}}
|
| +WebInspector.TimelineSearchFilter=function(regExp)
|
| +{this._regExp=regExp;}
|
| +WebInspector.TimelineSearchFilter.prototype={accept:function(record)
|
| +{return WebInspector.TimelineRecordListRow.testContentMatching(record,this._regExp);}}
|
|
|