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

Unified Diff: chrome_linux/resources/inspector/TimelinePanel.js

Issue 23466010: Roll reference builds to r221697. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/reference_builds/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome_linux/resources/inspector/ScriptsPanel.js ('k') | chrome_linux/resources/inspector/auditsPanel.css » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);}}
« no previous file with comments | « chrome_linux/resources/inspector/ScriptsPanel.js ('k') | chrome_linux/resources/inspector/auditsPanel.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698