These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
120 lines
3.5 KiB
JavaScript
120 lines
3.5 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
'use strict';
|
|
|
|
//@ts-check
|
|
|
|
/**
|
|
* @returns {{mark(name:string):void, getMarks():{name:string, startTime:number}[]}}
|
|
*/
|
|
function _definePolyfillMarks(timeOrigin) {
|
|
|
|
const _data = [];
|
|
if (typeof timeOrigin === 'number') {
|
|
_data.push('code/timeOrigin', timeOrigin);
|
|
}
|
|
|
|
function mark(name) {
|
|
_data.push(name, Date.now());
|
|
}
|
|
function getMarks() {
|
|
const result = [];
|
|
for (let i = 0; i < _data.length; i += 2) {
|
|
result.push({
|
|
name: _data[i],
|
|
startTime: _data[i + 1],
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
return { mark, getMarks };
|
|
}
|
|
|
|
/**
|
|
* @returns {{mark(name:string):void, getMarks():{name:string, startTime:number}[]}}
|
|
*/
|
|
function _define() {
|
|
|
|
if (typeof performance === 'object' && typeof performance.mark === 'function') {
|
|
// in a browser context, reuse performance-util
|
|
|
|
if (typeof performance.timeOrigin !== 'number' && !performance.timing) {
|
|
// safari & webworker: because there is no timeOrigin and no workaround
|
|
// we use the `Date.now`-based polyfill.
|
|
return _definePolyfillMarks();
|
|
|
|
} else {
|
|
// use "native" performance for mark and getMarks
|
|
return {
|
|
mark(name) {
|
|
performance.mark(name);
|
|
},
|
|
getMarks() {
|
|
let timeOrigin = performance.timeOrigin;
|
|
if (typeof timeOrigin !== 'number') {
|
|
// safari: there is no timerOrigin but in renderers there is the timing-property
|
|
// see https://bugs.webkit.org/show_bug.cgi?id=174862
|
|
timeOrigin = performance.timing.navigationStart || performance.timing.redirectStart || performance.timing.fetchStart;
|
|
}
|
|
const result = [{ name: 'code/timeOrigin', startTime: Math.round(timeOrigin) }];
|
|
for (const entry of performance.getEntriesByType('mark')) {
|
|
result.push({
|
|
name: entry.name,
|
|
startTime: Math.round(timeOrigin + entry.startTime)
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
}
|
|
|
|
} else if (typeof process === 'object') {
|
|
// node.js: use the normal polyfill but add the timeOrigin
|
|
// from the node perf_hooks API as very first mark
|
|
const timeOrigin = Math.round((require.nodeRequire || require)('perf_hooks').performance.timeOrigin);
|
|
return _definePolyfillMarks(timeOrigin);
|
|
|
|
} else {
|
|
// unknown environment
|
|
console.trace('perf-util loaded in UNKNOWN environment');
|
|
return _definePolyfillMarks();
|
|
}
|
|
}
|
|
|
|
function _factory(sharedObj) {
|
|
if (!sharedObj.MonacoPerformanceMarks) {
|
|
sharedObj.MonacoPerformanceMarks = _define();
|
|
}
|
|
return sharedObj.MonacoPerformanceMarks;
|
|
}
|
|
|
|
// This module can be loaded in an amd and commonjs-context.
|
|
// Because we want both instances to use the same perf-data
|
|
// we store them globally
|
|
|
|
// eslint-disable-next-line no-var
|
|
var sharedObj;
|
|
if (typeof global === 'object') {
|
|
// nodejs
|
|
sharedObj = global;
|
|
} else if (typeof self === 'object') {
|
|
// browser
|
|
sharedObj = self;
|
|
} else {
|
|
sharedObj = {};
|
|
}
|
|
|
|
if (typeof define === 'function') {
|
|
// amd
|
|
define([], function () { return _factory(sharedObj); });
|
|
} else if (typeof module === 'object' && typeof module.exports === 'object') {
|
|
// commonjs
|
|
module.exports = _factory(sharedObj);
|
|
} else {
|
|
console.trace('perf-util defined in UNKNOWN context (neither requirejs or commonjs)');
|
|
sharedObj.perf = _factory(sharedObj);
|
|
}
|