{"version":3,"sources":["controllers/core/digestHudModule.js"],"names":["angular","module","provider","$provide","WatchTiming","key","this","reset","flushTimingCycle","timingStack","length","endCycle","percentage","value","toFixed","slice","formatExpression","watchExpression","isString","exp","name","toString","wrapExpression","expression","timing","counter","flushCycle","$parse","injector","invoke","parse","actualExpression","inDigest","apply","arguments","start","Date","now","startCycle","countTime","wrapListener","listener","createTiming","watchTimings","prototype","watch","handle","overhead","total","cycleTotal","cycleStart","subTotal","summaryElement","text","push","duration","pop","overheadTiming","sum","format","grandTotal","hudElement","customHudPosition","digestTimings","digestHud","defaultHudPosition","numTopWatches","numDigestStats","enable","refreshDetails","topTotal","topWatchTimings","Object","keys","map","k","sort","a","b","x","y","lines","rows","row","$","css","overflow","textOverflow","replace","attr","detailsElement","empty","borderBottom","appendTo","append","footer","detailsText","join","resetTimings","forEach","watchTiming","toggle","buttonsElement","showDetails","on","ev","originalEvent","clipboardData","setData","preventDefault","find","stopPropagation","position","backgroundColor","color","padding","fontSize","cursor","zIndex","setHudPosition","float","display","children","whiteSpace","minWidth","maxWidth","decorator","$delegate","instrumentedDigest","$$postDigest","originalDigest","call","shift","len","sorted","median","Math","round","description","i","min","instrumentedEvalAsync","locals","originalEvalAsync","instrumentedApplyAsync","originalApplyAsync","instrumentedPostDigest","fn","originalPostDigest","instrumentedWatch","objectEquality","watchTimingSet","$$watchDelegate","originalWatch","instrumentedWatchGroup","watchExpressions","originalWatchGroup","proto","getPrototypeOf","$digest","$evalAsync","$applyAsync","$watch","$watchGroup","result","instrumentedThen","onFulfilled","onRejected","progressBack","originalThen","instrumentedFinally","callback","originalFinally","defer","promise","then","originalBind","bind","self","args","clearSummaryStats","styles","top","right","bottom","left","split","prop","$get"],"mappings":"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","file":"digestHud-52f1719a5a.js","sourcesContent":["angular.module('digestHud', [])\r\n.provider('digestHud', ['$provide', function ($provide) {\r\n 'use strict';\r\n\r\n function WatchTiming(key) {\r\n this.key = key;\r\n this.reset();\r\n }\r\n\r\n WatchTiming.prototype.reset = function () {\r\n this.watch = 0;\r\n this.handle = 0;\r\n this.overhead = 0;\r\n this.total = 0;\r\n this.cycleTotal = 0;\r\n this.cycleStart = null;\r\n this.subTotal = 0;\r\n\r\n if (summaryElement) summaryElement.text(\"No data\");\r\n };\r\n\r\n WatchTiming.prototype.startCycle = function (start) {\r\n timingStack.push(this);\r\n this.cycleStart = start;\r\n this.cycleTotal = 0;\r\n this.subTotal = 0;\r\n };\r\n\r\n WatchTiming.prototype.countTime = function (counter, duration) {\r\n this[counter] += duration - this.subTotal;\r\n this.cycleTotal += duration;\r\n this.subTotal = 0;\r\n };\r\n\r\n WatchTiming.prototype.endCycle = function () {\r\n if (!this.cycleStart) return;\r\n var duration = Date.now() - this.cycleStart;\r\n this.overhead += duration - this.cycleTotal;\r\n this.cycleStart = null;\r\n timingStack.pop();\r\n if (timingStack.length) {\r\n timingStack[timingStack.length - 1].subTotal += duration;\r\n } else {\r\n overheadTiming.overhead -= duration;\r\n }\r\n };\r\n\r\n WatchTiming.prototype.sum = function () {\r\n this.total = this.watch + this.handle + this.overhead;\r\n };\r\n\r\n WatchTiming.prototype.format = function (grandTotal) {\r\n return percentage(this.total / grandTotal) + '\\u2003(' +\r\n percentage(this.watch / grandTotal) + ' + ' +\r\n percentage(this.handle / grandTotal) + ' + ' +\r\n percentage(this.overhead / grandTotal) +\r\n ')\\u2003' + this.key;\r\n };\r\n\r\n function flushTimingCycle() {\r\n if (timingStack.length) timingStack[timingStack.length - 1].endCycle();\r\n }\r\n\r\n var digestTimings = [];\r\n var watchTimings = {};\r\n var timingStack;\r\n var overheadTiming = createTiming('$$ng-overhead');\r\n var digestHud = this;\r\n var inDigest = false;\r\n var hudElement;\r\n\r\n var defaultHudPosition = 'bottom right';\r\n var customHudPosition;\r\n var $parse;\r\n var summaryElement;\r\n\r\n this.numTopWatches = 20;\r\n this.numDigestStats = 25;\r\n\r\n this.enable = function () {\r\n var toggle = false;\r\n var detailsText = '';\r\n\r\n hudElement = $('
');\r\n var buttonsElement = $(\r\n '
' +\r\n 'refresh • ' +\r\n 'reset ' +\r\n '
').appendTo(hudElement);\r\n summaryElement = $('
').appendTo(hudElement);\r\n var detailsElement = $('
').appendTo(hudElement);\r\n var showDetails = false;\r\n hudElement.on('click', function () {\r\n showDetails = !showDetails;\r\n buttonsElement.toggle(showDetails);\r\n detailsElement.toggle(showDetails);\r\n if (showDetails) refreshDetails();\r\n });\r\n\r\n hudElement.on('copy', function (ev) {\r\n ev.originalEvent.clipboardData.setData('text/plain', detailsText);\r\n ev.preventDefault();\r\n });\r\n\r\n buttonsElement.find('#digestHud-refresh').on('click', refreshDetails);\r\n buttonsElement.find('#digestHud-reset').on('click', resetTimings);\r\n buttonsElement.on('click', function (ev) { ev.stopPropagation(); });\r\n\r\n hudElement.on('mousedown mouseup click', function (ev) { ev.stopPropagation(); });\r\n hudElement.css({\r\n position: 'fixed',\r\n backgroundColor: 'rgba(0, 0, 0, 0.65)',\r\n color: 'white',\r\n padding: '2px 5px',\r\n fontSize: 'small',\r\n cursor: 'default',\r\n zIndex: '1000000'\r\n });\r\n\r\n this.setHudPosition(customHudPosition || defaultHudPosition);\r\n\r\n buttonsElement.css({\r\n float: 'right',\r\n display: 'none'\r\n });\r\n buttonsElement.children().css({\r\n cursor: 'pointer'\r\n });\r\n detailsElement.css({\r\n whiteSpace: 'pre',\r\n minWidth: '30em',\r\n maxWidth: '50em',\r\n display: 'none'\r\n });\r\n $('body').append(hudElement);\r\n\r\n function refreshDetails() {\r\n var grandTotal = 0, topTotal = 0;\r\n\r\n var topWatchTimings = Object.keys(watchTimings).map(function (k) {\r\n return watchTimings[k];\r\n }).map(function (timing) {\r\n timing.sum(); grandTotal += timing.total;\r\n return timing;\r\n }).sort(function (a, b) {\r\n var x = a.total; var y = b.total;\r\n return ((x < y) ? 1 : ((x > y) ? -1 : 0));\r\n }).slice(0, digestHud.numTopWatches);\r\n\r\n var lines = topWatchTimings.map(function (timing) {\r\n topTotal += timing.total;\r\n return timing.format(grandTotal);\r\n });\r\n var rows = lines.map(function (text) {\r\n var row = $('
');\r\n row.css({\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis'\r\n });\r\n row.text(text.replace(/[ \\n]+/g, ' '));\r\n row.attr('title', text.slice(29));\r\n return row;\r\n });\r\n detailsElement.empty();\r\n $('
\\u2007Total\\u2007\\u2007\\u2007Watch\\u2007Work\\u2007Overhead\\u2007\\u2007Function
')\r\n .css({ borderBottom: '1px solid' }).appendTo(detailsElement);\r\n detailsElement.append(rows);\r\n var footer = 'Top ' + topWatchTimings.length + ' items account for ' +\r\n percentage(topTotal / grandTotal) + ' of ' + grandTotal + 'ms of digest processing time.';\r\n $('
').text(footer).appendTo(detailsElement);\r\n detailsText = 'Total Watch Work Overhead Function\\n' + lines.map(function (text) {\r\n return text.replace(/[ \\n]+/g, ' ');\r\n }).join('\\n') + '\\n' + footer + '\\n';\r\n }\r\n\r\n function resetTimings() {\r\n digestTimings = [];\r\n\r\n Object.keys(watchTimings).map(function (k) {\r\n return watchTimings[k];\r\n }).forEach(function (watchTiming) {\r\n watchTiming.reset();\r\n });\r\n }\r\n\r\n $provide.decorator('$rootScope', ['$delegate', function ($delegate) {\r\n var proto = Object.getPrototypeOf($delegate);\r\n var originalDigest = proto.$digest;\r\n var originalEvalAsync = proto.$evalAsync;\r\n var originalApplyAsync = proto.$applyAsync;\r\n var originalPostDigest = proto.$$postDigest;\r\n var originalWatch = proto.$watch;\r\n var originalWatchGroup = proto.$watchGroup;\r\n // $watchCollection delegates to $watch, no extra processing necessary\r\n proto.$digest = instrumentedDigest;\r\n proto.$evalAsync = instrumentedEvalAsync;\r\n proto.$applyAsync = instrumentedApplyAsync;\r\n proto.$$postDigest = instrumentedPostDigest;\r\n proto.$watch = instrumentedWatch;\r\n proto.$watchGroup = instrumentedWatchGroup;\r\n\r\n var watchTiming;\r\n\r\n function instrumentedDigest() {\r\n // jshint validthis:true\r\n timingStack = [];\r\n this.$$postDigest(flushTimingCycle);\r\n var start = Date.now();\r\n inDigest = true;\r\n try {\r\n originalDigest.call(this);\r\n } finally {\r\n inDigest = false;\r\n }\r\n var duration = Date.now() - start;\r\n overheadTiming.overhead += duration;\r\n toggle = !toggle;\r\n digestTimings.push(duration);\r\n if (digestTimings.length > digestHud.numDigestStats) digestTimings.shift();\r\n var len = digestTimings.length;\r\n var sorted = digestTimings.slice().sort(function (a, b) { return a - b; });\r\n var median = len % 2 ?\r\n sorted[(len - 1) / 2] : Math.round((sorted[len / 2] + sorted[len / 2 - 1]) / 2);\r\n var description =\r\n 'digests stats ' + len + ': ' + sorted[0] + 'ms ' + median + 'ms ' + sorted[len - 1] + 'ms ' +\r\n (toggle ? '\\u25cf' : '\\u25cb');\r\n\r\n for (var i = Math.min(5, len) - 1; i >= 0; i--) description += \" \" + digestTimings[i] + \"ms\";\r\n\r\n summaryElement.text(description);\r\n }\r\n\r\n function instrumentedEvalAsync(expression, locals) {\r\n // jshint validthis:true\r\n var timing = createTiming('$evalAsync(' + formatExpression(expression) + ')');\r\n originalEvalAsync.call(\r\n this, wrapExpression(expression, timing, 'handle', true, true), locals);\r\n }\r\n\r\n function instrumentedApplyAsync(expression) {\r\n // jshint validthis:true\r\n var timing = createTiming('$applyAsync(' + formatExpression(expression) + ')');\r\n originalApplyAsync.call(this, wrapExpression(expression, timing, 'handle', false, true));\r\n }\r\n\r\n function instrumentedPostDigest(fn) {\r\n // jshint validthis:true\r\n if (timingStack.length) {\r\n fn = wrapExpression(fn, timingStack[timingStack.length - 1], 'overhead', true, true);\r\n }\r\n originalPostDigest.call(this, fn);\r\n }\r\n\r\n function instrumentedWatch(watchExpression, listener, objectEquality) {\r\n // jshint validthis:true\r\n var watchTimingSet = false;\r\n if (!watchTiming) {\r\n // Capture watch timing (and its key) once, before we descend in $$watchDelegates.\r\n watchTiming = createTiming(formatExpression(watchExpression));\r\n watchTimingSet = true;\r\n }\r\n try {\r\n if (angular.isString(watchExpression)) {\r\n if (!$parse) {\r\n angular.injector(['ng']).invoke(['$parse', function (parse) { $parse = parse; }]);\r\n }\r\n watchExpression = $parse(watchExpression);\r\n }\r\n if (watchExpression && watchExpression.$$watchDelegate) {\r\n return originalWatch.call(this, watchExpression, listener, objectEquality);\r\n } else {\r\n return originalWatch.call(\r\n this, wrapExpression(watchExpression, watchTiming, 'watch', true, false),\r\n wrapListener(listener, watchTiming), objectEquality);\r\n }\r\n } finally {\r\n if (watchTimingSet) watchTiming = null;\r\n }\r\n }\r\n\r\n function instrumentedWatchGroup(watchExpressions, listener) {\r\n // jshint validthis:true\r\n var watchTimingSet = false;\r\n if (!watchTiming) {\r\n // $watchGroup delegates to $watch for each expression, so just make sure to set the group's\r\n // aggregate key as the override first.\r\n watchTiming = createTiming(\r\n '[' + watchExpressions.map(formatExpression).join(', ') + ']');\r\n watchTimingSet = true;\r\n }\r\n try {\r\n return originalWatchGroup.call(this, watchExpressions, listener);\r\n } finally {\r\n if (watchTimingSet) watchTiming = null;\r\n }\r\n }\r\n\r\n return $delegate;\r\n }]);\r\n\r\n $provide.decorator('$parse', ['$delegate', function ($delegate) {\r\n return function (expression) {\r\n var result = $delegate.apply(this, arguments);\r\n if (angular.isString(expression)) result.exp = expression;\r\n return result;\r\n };\r\n }]);\r\n\r\n $provide.decorator('$q', ['$delegate', function ($delegate) {\r\n var proto = Object.getPrototypeOf($delegate.defer().promise);\r\n var originalThen = proto.then;\r\n var originalFinally = proto.finally;\r\n proto.then = instrumentedThen;\r\n proto.finally = instrumentedFinally;\r\n\r\n function instrumentedThen(onFulfilled, onRejected, progressBack) {\r\n // jshint validthis:true\r\n return originalThen.call(\r\n this,\r\n wrapExpression(\r\n onFulfilled, createTiming('$q(' + formatExpression(onFulfilled) + ')'), 'handle',\r\n false, true),\r\n wrapExpression(\r\n onRejected, createTiming('$q(' + formatExpression(onRejected) + ')'), 'handle',\r\n false, true),\r\n wrapExpression(\r\n progressBack, createTiming('$q(' + formatExpression(progressBack) + ')'), 'handle',\r\n false, true)\r\n );\r\n }\r\n\r\n function instrumentedFinally(callback, progressBack) {\r\n // jshint validthis:true\r\n return originalFinally.call(\r\n this,\r\n wrapExpression(\r\n callback, createTiming('$q(' + formatExpression(callback) + ')'), 'handle',\r\n false, true),\r\n wrapExpression(\r\n progressBack, createTiming('$q(' + formatExpression(callback) + ')'), 'handle',\r\n false, true)\r\n );\r\n }\r\n\r\n return $delegate;\r\n }]);\r\n\r\n var originalBind = angular.bind;\r\n angular.bind = function (self, fn, args) {\r\n var result = originalBind.apply(this, arguments);\r\n result.exp = formatExpression(fn);\r\n return result;\r\n };\r\n };\r\n\r\n this.clearSummaryStats = function () {\r\n if (summaryElement) summaryElement.text(\"No data\");\r\n };\r\n\r\n this.setHudPosition = function (position) {\r\n if (hudElement) {\r\n // reset all to defaults\r\n var styles = {\r\n top: 'auto',\r\n right: 'auto',\r\n bottom: 'auto',\r\n left: 'auto'\r\n };\r\n position = position ? '' + position : defaultHudPosition;\r\n position.split(' ').map(function (prop) { styles[prop] = 0; });\r\n hudElement.css(styles);\r\n } else {\r\n // save and apply on enabled\r\n customHudPosition = position;\r\n }\r\n };\r\n\r\n function percentage(value) {\r\n if (value >= 1) return (value * 100).toFixed(1) + '%';\r\n return ('\\u2007\\u2007' + (value * 100).toFixed(1) + '%').slice(-5);\r\n }\r\n\r\n function formatExpression(watchExpression) {\r\n if (!watchExpression) return '';\r\n if (angular.isString(watchExpression)) return watchExpression;\r\n if (angular.isString(watchExpression.exp)) return watchExpression.exp;\r\n if (watchExpression.name) return 'function ' + watchExpression.name + '() {\\u2026}';\r\n return watchExpression.toString();\r\n }\r\n\r\n function wrapExpression(expression, timing, counter, flushCycle, endCycle) {\r\n if (!expression && !flushCycle) return expression;\r\n if (!$parse) angular.injector(['ng']).invoke(['$parse', function (parse) { $parse = parse; }]);\r\n var actualExpression = angular.isString(expression) ? $parse(expression) : expression;\r\n return function instrumentedExpression() {\r\n if (flushCycle) flushTimingCycle();\r\n if (!actualExpression) return;\r\n if (!inDigest) return actualExpression.apply(this, arguments);\r\n var start = Date.now();\r\n timing.startCycle(start);\r\n try {\r\n return actualExpression.apply(this, arguments);\r\n } finally {\r\n timing.countTime(counter, Date.now() - start);\r\n if (endCycle) timing.endCycle();\r\n }\r\n };\r\n }\r\n\r\n function wrapListener(listener, timing) {\r\n if (!listener) return listener;\r\n return function instrumentedListener() {\r\n var start = Date.now();\r\n try {\r\n return listener.apply(this, arguments);\r\n } finally {\r\n timing.countTime('handle', Date.now() - start);\r\n }\r\n };\r\n }\r\n\r\n function createTiming(key) {\r\n var timing = watchTimings[key];\r\n if (!timing) timing = watchTimings[key] = new WatchTiming(key);\r\n return timing;\r\n }\r\n\r\n this.$get = function () { };\r\n}]);"],"sourceRoot":"/source/"}