UNPKG

@angular/benchpress

Version:

Benchpress - a framework for e2e performance tests

124 lines 16.1 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ var IOsDriverExtension_1; import { __decorate, __metadata } from "tslib"; import { Injectable } from '@angular/core'; import { WebDriverAdapter } from '../web_driver_adapter'; import { PerfLogFeatures, WebDriverExtension } from '../web_driver_extension'; let IOsDriverExtension = IOsDriverExtension_1 = class IOsDriverExtension extends WebDriverExtension { constructor(_driver) { super(); this._driver = _driver; } gc() { throw new Error('Force GC is not supported on iOS'); } timeBegin(name) { return this._driver.executeScript(`console.time('${name}');`); } timeEnd(name, restartName = null) { let script = `console.timeEnd('${name}');`; if (restartName != null) { script += `console.time('${restartName}');`; } return this._driver.executeScript(script); } // See https://github.com/WebKit/webkit/tree/master/Source/WebInspectorUI/Versions readPerfLog() { // TODO(tbosch): Bug in IOsDriver: Need to execute at least one command // so that the browser logs can be read out! return this._driver.executeScript('1+1') .then((_) => this._driver.logs('performance')) .then((entries) => { const records = []; entries.forEach((entry) => { const message = JSON.parse(entry['message'])['message']; if (message['method'] === 'Timeline.eventRecorded') { records.push(message['params']['record']); } }); return this._convertPerfRecordsToEvents(records); }); } /** @internal */ _convertPerfRecordsToEvents(records, events = null) { if (!events) { events = []; } records.forEach((record) => { let endEvent = null; const type = record['type']; const data = record['data']; const startTime = record['startTime']; const endTime = record['endTime']; if (type === 'FunctionCall' && (data == null || data['scriptName'] !== 'InjectedScript')) { events.push(createStartEvent('script', startTime)); endEvent = createEndEvent('script', endTime); } else if (type === 'Time') { events.push(createMarkStartEvent(data['message'], startTime)); } else if (type === 'TimeEnd') { events.push(createMarkEndEvent(data['message'], startTime)); } else if (type === 'RecalculateStyles' || type === 'Layout' || type === 'UpdateLayerTree' || type === 'Paint' || type === 'Rasterize' || type === 'CompositeLayers') { events.push(createStartEvent('render', startTime)); endEvent = createEndEvent('render', endTime); } // Note: ios used to support GCEvent up until iOS 6 :-( if (record['children'] != null) { this._convertPerfRecordsToEvents(record['children'], events); } if (endEvent != null) { events.push(endEvent); } }); return events; } perfLogFeatures() { return new PerfLogFeatures({ render: true }); } supports(capabilities) { return capabilities['browserName'].toLowerCase() === 'safari'; } }; IOsDriverExtension.PROVIDERS = [{ provide: IOsDriverExtension_1, deps: [WebDriverAdapter] }]; IOsDriverExtension = IOsDriverExtension_1 = __decorate([ Injectable(), __metadata("design:paramtypes", [WebDriverAdapter]) ], IOsDriverExtension); export { IOsDriverExtension }; function createEvent(ph, name, time, args = null) { const result = { 'cat': 'timeline', 'name': name, 'ts': time, 'ph': ph, // The ios protocol does not support the notions of multiple processes in // the perflog... 'pid': 'pid0' }; if (args != null) { result['args'] = args; } return result; } function createStartEvent(name, time, args = null) { return createEvent('B', name, time, args); } function createEndEvent(name, time, args = null) { return createEvent('E', name, time, args); } function createMarkStartEvent(name, time) { return createEvent('B', name, time); } function createMarkEndEvent(name, time) { return createEvent('E', name, time); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9zX2RyaXZlcl9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iZW5jaHByZXNzL3NyYy93ZWJkcml2ZXIvaW9zX2RyaXZlcl9leHRlbnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxlQUFlLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUcxRixJQUFhLGtCQUFrQiwwQkFBL0IsTUFBYSxrQkFBbUIsU0FBUSxrQkFBa0I7SUFHeEQsWUFBb0IsT0FBeUI7UUFDM0MsS0FBSyxFQUFFLENBQUM7UUFEVSxZQUFPLEdBQVAsT0FBTyxDQUFrQjtJQUU3QyxDQUFDO0lBRVEsRUFBRTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRVEsU0FBUyxDQUFDLElBQVk7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVEsT0FBTyxDQUFDLElBQVksRUFBRSxjQUEyQixJQUFJO1FBQzVELElBQUksTUFBTSxHQUFHLG9CQUFvQixJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGlCQUFpQixXQUFXLEtBQUssQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGtGQUFrRjtJQUN6RSxXQUFXO1FBQ2xCLHVFQUF1RTtRQUN2RSw0Q0FBNEM7UUFDNUMsT0FB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QUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBWSxJQUFJO0lBQ2xFLE9BQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLElBQVksRUFBRSxJQUFZO0lBQ3RELE9BQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDcEQsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7V2ViRHJpdmVyQWRhcHRlcn0gZnJvbSAnLi4vd2ViX2RyaXZlcl9hZGFwdGVyJztcbmltcG9ydCB7UGVyZkxvZ0V2ZW50LCBQZXJmTG9nRmVhdHVyZXMsIFdlYkRyaXZlckV4dGVuc2lvbn0gZnJvbSAnLi4vd2ViX2RyaXZlcl9leHRlbnNpb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSU9zRHJpdmVyRXh0ZW5zaW9uIGV4dGVuZHMgV2ViRHJpdmVyRXh0ZW5zaW9uIHtcbiAgc3RhdGljIFBST1ZJREVSUyA9IFt7cHJvdmlkZTogSU9zRHJpdmVyRXh0ZW5zaW9uLCBkZXBzOiBbV2ViRHJpdmVyQWRhcHRlcl19XTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kcml2ZXI6IFdlYkRyaXZlckFkYXB0ZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvcmNlIEdDIGlzIG5vdCBzdXBwb3J0ZWQgb24gaU9TJyk7XG4gIH1cblxuICBvdmVycmlkZSB0aW1lQmVnaW4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJpdmVyLmV4ZWN1dGVTY3JpcHQoYGNvbnNvbGUudGltZSgnJHtuYW1lfScpO2ApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGltZUVuZChuYW1lOiBzdHJpbmcsIHJlc3RhcnROYW1lOiBzdHJpbmd8bnVsbCA9IG51bGwpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBzY3JpcHQgPSBgY29uc29sZS50aW1lRW5kKCcke25hbWV9Jyk7YDtcbiAgICBpZiAocmVzdGFydE5hbWUgIT0gbnVsbCkge1xuICAgICAgc2NyaXB0ICs9IGBjb25zb2xlLnRpbWUoJyR7cmVzdGFydE5hbWV9Jyk7YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RyaXZlci5leGVjdXRlU2NyaXB0KHNjcmlwdCk7XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1dlYktpdC93ZWJraXQvdHJlZS9tYXN0ZXIvU291cmNlL1dlYkluc3BlY3RvclVJL1ZlcnNpb25zXG4gIG92ZXJyaWRlIHJlYWRQZXJmTG9nKCkge1xuICAgIC8vIFRPRE8odGJvc2NoKTogQnVnIGluIElPc0RyaXZlcjogTmVlZCB0byBleGVjdXRlIGF0IGxlYXN0IG9uZSBjb21tYW5kXG4gICAgLy8gc28gdGhhdCB0aGUgYnJvd3NlciBsb2dzIGNhbiBiZSByZWFkIG91dCFcbiAgICByZXR1cm4gdGhpcy5fZHJpdmVyLmV4ZWN1dGVTY3JpcHQoJzErMScpXG4gICAgICAgIC50aGVuKChfKSA9PiB0aGlzLl9kcml2ZXIubG9ncygncGVyZm9ybWFuY2UnKSlcbiAgICAgICAgLnRoZW4oKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZWNvcmRzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnk6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgKEpTT04ucGFyc2UoZW50cnlbJ21lc3NhZ2UnXSkgYXNcbiAgICAgICAgICAgICAgICAge21lc3NhZ2U6IHttZXRob2Q6IHN0cmluZywgcGFyYW1zOiBQZXJmTG9nRXZlbnR9fSlbJ21lc3NhZ2UnXTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlWydtZXRob2QnXSA9PT0gJ1RpbWVsaW5lLmV2ZW50UmVjb3JkZWQnKSB7XG4gICAgICAgICAgICAgIHJlY29yZHMucHVzaChtZXNzYWdlWydwYXJhbXMnXVsncmVjb3JkJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRzKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NvbnZlcnRQZXJmUmVjb3Jkc1RvRXZlbnRzKHJlY29yZHM6IGFueVtdLCBldmVudHM6IFBlcmZMb2dFdmVudFtdfG51bGwgPSBudWxsKSB7XG4gICAgaWYgKCFldmVudHMpIHtcbiAgICAgIGV2ZW50cyA9IFtdO1xuICAgIH1cbiAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgbGV0IGVuZEV2ZW50OiBQZXJmTG9nRXZlbnR8bnVsbCA9IG51bGw7XG4gICAgICBjb25zdCB0eXBlID0gcmVjb3JkWyd0eXBlJ107XG4gICAgICBjb25zdCBkYXRhID0gcmVjb3JkWydkYXRhJ107XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSByZWNvcmRbJ3N0YXJ0VGltZSddO1xuICAgICAgY29uc3QgZW5kVGltZSA9IHJlY29yZFsnZW5kVGltZSddO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ0Z1bmN0aW9uQ2FsbCcgJiYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhWydzY3JpcHROYW1lJ10gIT09ICdJbmplY3RlZFNjcmlwdCcpKSB7XG4gICAgICAgIGV2ZW50cyEucHVzaChjcmVhdGVTdGFydEV2ZW50KCdzY3JpcHQnLCBzdGFydFRpbWUpKTtcbiAgICAgICAgZW5kRXZlbnQgPSBjcmVhdGVFbmRFdmVudCgnc2NyaXB0JywgZW5kVGltZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdUaW1lJykge1xuICAgICAgICBldmVudHMhLnB1c2goY3JlYXRlTWFya1N0YXJ0RXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1RpbWVFbmQnKSB7XG4gICAgICAgIGV2ZW50cyEucHVzaChjcmVhdGVNYXJrRW5kRXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZSA9PT0gJ1JlY2FsY3VsYXRlU3R5bGVzJyB8fCB0eXBlID09PSAnTGF5b3V0JyB8fCB0eXBlID09PSAnVXBkYXRlTGF5ZXJUcmVlJyB8fFxuICAgICAgICAgIHR5cGUgPT09ICdQYWludCcgfHwgdHlwZSA9PT0gJ1Jhc3Rlcml6ZScgfHwgdHlwZSA9PT0gJ0NvbXBvc2l0ZUxheWVycycpIHtcbiAgICAgICAgZXZlbnRzIS5wdXNoKGNyZWF0ZVN0YXJ0RXZlbnQoJ3JlbmRlcicsIHN0YXJ0VGltZSkpO1xuICAgICAgICBlbmRFdmVudCA9IGNyZWF0ZUVuZEV2ZW50KCdyZW5kZXInLCBlbmRUaW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGU6IGlvcyB1c2VkIHRvIHN1cHBvcnQgR0NFdmVudCB1cCB1bnRpbCBpT1MgNiA6LShcbiAgICAgIGlmIChyZWNvcmRbJ2NoaWxkcmVuJ10gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRbJ2NoaWxkcmVuJ10sIGV2ZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kRXZlbnQgIT0gbnVsbCkge1xuICAgICAgICBldmVudHMhLnB1c2goZW5kRXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cblxuICBvdmVycmlkZSBwZXJmTG9nRmVhdHVyZXMoKTogUGVyZkxvZ0ZlYXR1cmVzIHtcbiAgICByZXR1cm4gbmV3IFBlcmZMb2dGZWF0dXJlcyh7cmVuZGVyOiB0cnVlfSk7XG4gIH1cblxuICBvdmVycmlkZSBzdXBwb3J0cyhjYXBhYmlsaXRpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhcGFiaWxpdGllc1snYnJvd3Nlck5hbWUnXS50b0xvd2VyQ2FzZSgpID09PSAnc2FmYXJpJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudChwaDogJ1gnfCdCJ3wnRSd8J0InfCdFJywgbmFtZTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0OiBQZXJmTG9nRXZlbnQgPSB7XG4gICAgJ2NhdCc6ICd0aW1lbGluZScsXG4gICAgJ25hbWUnOiBuYW1lLFxuICAgICd0cyc6IHRpbWUsXG4gICAgJ3BoJzogcGgsXG4gICAgLy8gVGhlIGlvcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBub3Rpb25zIG9mIG11bHRpcGxlIHByb2Nlc3NlcyBpblxuICAgIC8vIHRoZSBwZXJmbG9nLi4uXG4gICAgJ3BpZCc6ICdwaWQwJ1xuICB9O1xuICBpZiAoYXJncyAhPSBudWxsKSB7XG4gICAgcmVzdWx0WydhcmdzJ10gPSBhcmdzO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXJ0RXZlbnQobmFtZTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgcmV0dXJuIGNyZWF0ZUV2ZW50KCdCJywgbmFtZSwgdGltZSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVuZEV2ZW50KG5hbWU6IHN0cmluZywgdGltZTogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnRScsIG5hbWUsIHRpbWUsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrU3RhcnRFdmVudChuYW1lOiBzdHJpbmcsIHRpbWU6IG51bWJlcikge1xuICByZXR1cm4gY3JlYXRlRXZlbnQoJ0InLCBuYW1lLCB0aW1lKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya0VuZEV2ZW50KG5hbWU6IHN0cmluZywgdGltZTogbnVtYmVyKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnRScsIG5hbWUsIHRpbWUpO1xufVxuIl19