blob: b15272bf2e523e11848d220e699170f955e66607 [file] [log] [blame]
Andrew Top286dd782018-10-02 16:52:45 -07001/*
2 * Copyright 2014 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
Andrew Top286dd782018-10-02 16:52:45 -07006
7/**
8 * @unrestricted
9 */
Kaido Kertf585e262020-06-08 11:42:28 -070010export default class TracingManager extends SDK.SDKModel {
Andrew Top286dd782018-10-02 16:52:45 -070011 /**
12 * @param {!SDK.Target} target
13 */
14 constructor(target) {
15 super(target);
16 this._tracingAgent = target.tracingAgent();
Kaido Kertf585e262020-06-08 11:42:28 -070017 target.registerTracingDispatcher(new TracingDispatcher(this));
Andrew Top286dd782018-10-02 16:52:45 -070018
Kaido Kertf585e262020-06-08 11:42:28 -070019 /** @type {?TracingManagerClient} */
Andrew Top286dd782018-10-02 16:52:45 -070020 this._activeClient = null;
21 this._eventBufferSize = 0;
22 this._eventsRetrieved = 0;
23 }
24
25 /**
26 * @param {number=} usage
27 * @param {number=} eventCount
28 * @param {number=} percentFull
29 */
30 _bufferUsage(usage, eventCount, percentFull) {
31 this._eventBufferSize = eventCount;
32 this._activeClient.tracingBufferUsage(usage || percentFull || 0);
33 }
34
35 /**
36 * @param {!Array.<!SDK.TracingManager.EventPayload>} events
37 */
38 _eventsCollected(events) {
39 this._activeClient.traceEventsCollected(events);
40 this._eventsRetrieved += events.length;
Kaido Kertf585e262020-06-08 11:42:28 -070041 if (!this._eventBufferSize) {
42 this._activeClient.eventsRetrievalProgress(0);
Andrew Top286dd782018-10-02 16:52:45 -070043 return;
Kaido Kertf585e262020-06-08 11:42:28 -070044 }
45
46 if (this._eventsRetrieved > this._eventBufferSize) {
Andrew Top286dd782018-10-02 16:52:45 -070047 this._eventsRetrieved = this._eventBufferSize;
Kaido Kertf585e262020-06-08 11:42:28 -070048 }
Andrew Top286dd782018-10-02 16:52:45 -070049 this._activeClient.eventsRetrievalProgress(this._eventsRetrieved / this._eventBufferSize);
50 }
51
52 _tracingComplete() {
53 this._eventBufferSize = 0;
54 this._eventsRetrieved = 0;
55 this._activeClient.tracingComplete();
56 this._activeClient = null;
57 this._finishing = false;
58 }
59
60 /**
Kaido Kertf585e262020-06-08 11:42:28 -070061 * @param {!TracingManagerClient} client
Andrew Top286dd782018-10-02 16:52:45 -070062 * @param {string} categoryFilter
63 * @param {string} options
Kaido Kertf585e262020-06-08 11:42:28 -070064 * @return {!Promise<!Object>}
Andrew Top286dd782018-10-02 16:52:45 -070065 */
Kaido Kertf585e262020-06-08 11:42:28 -070066 async start(client, categoryFilter, options) {
67 if (this._activeClient) {
Andrew Top286dd782018-10-02 16:52:45 -070068 throw new Error('Tracing is already started');
Kaido Kertf585e262020-06-08 11:42:28 -070069 }
Andrew Top286dd782018-10-02 16:52:45 -070070 const bufferUsageReportingIntervalMs = 500;
71 this._activeClient = client;
Kaido Kertf585e262020-06-08 11:42:28 -070072 const args = {
73 bufferUsageReportingInterval: bufferUsageReportingIntervalMs,
74 categories: categoryFilter,
75 options: options,
76 transferMode: TransferMode.ReportEvents
77 };
78 const response = await this._tracingAgent.invoke_start(args);
79 if (response[Protocol.Error]) {
80 this._activeClient = null;
81 }
82 return response;
Andrew Top286dd782018-10-02 16:52:45 -070083 }
84
85 stop() {
Kaido Kertf585e262020-06-08 11:42:28 -070086 if (!this._activeClient) {
Andrew Top286dd782018-10-02 16:52:45 -070087 throw new Error('Tracing is not started');
Kaido Kertf585e262020-06-08 11:42:28 -070088 }
89 if (this._finishing) {
Andrew Top286dd782018-10-02 16:52:45 -070090 throw new Error('Tracing is already being stopped');
Kaido Kertf585e262020-06-08 11:42:28 -070091 }
Andrew Top286dd782018-10-02 16:52:45 -070092 this._finishing = true;
93 this._tracingAgent.end();
94 }
Kaido Kertf585e262020-06-08 11:42:28 -070095}
Andrew Top286dd782018-10-02 16:52:45 -070096
Kaido Kertf585e262020-06-08 11:42:28 -070097const TransferMode = {
Andrew Top286dd782018-10-02 16:52:45 -070098 ReportEvents: 'ReportEvents',
99 ReturnAsStream: 'ReturnAsStream'
100};
101
102/**
Kaido Kertf585e262020-06-08 11:42:28 -0700103 * @interface
104 */
105export class TracingManagerClient {
106 /**
107 * @param {!Array.<!SDK.TracingManager.EventPayload>} events
108 */
109 traceEventsCollected(events) {
110 }
111
112 tracingComplete() {
113 }
114 /**
115 * @param {number} usage
116 */
117 tracingBufferUsage(usage) {
118 }
119 /**
120 * @param {number} progress
121 */
122 eventsRetrievalProgress(progress) {
123 }
124}
125
126/**
Andrew Top286dd782018-10-02 16:52:45 -0700127 * @implements {Protocol.TracingDispatcher}
128 * @unrestricted
129 */
Kaido Kertf585e262020-06-08 11:42:28 -0700130class TracingDispatcher {
Andrew Top286dd782018-10-02 16:52:45 -0700131 /**
Kaido Kertf585e262020-06-08 11:42:28 -0700132 * @param {!TracingManager} tracingManager
Andrew Top286dd782018-10-02 16:52:45 -0700133 */
134 constructor(tracingManager) {
135 this._tracingManager = tracingManager;
136 }
137
138 /**
139 * @override
140 * @param {number=} usage
141 * @param {number=} eventCount
142 * @param {number=} percentFull
143 */
144 bufferUsage(usage, eventCount, percentFull) {
145 this._tracingManager._bufferUsage(usage, eventCount, percentFull);
146 }
147
148 /**
149 * @override
150 * @param {!Array.<!SDK.TracingManager.EventPayload>} data
151 */
152 dataCollected(data) {
153 this._tracingManager._eventsCollected(data);
154 }
155
156 /**
157 * @override
158 */
159 tracingComplete() {
160 this._tracingManager._tracingComplete();
161 }
Kaido Kertf585e262020-06-08 11:42:28 -0700162}
163
164/* Legacy exported object */
165self.SDK = self.SDK || {};
166
167/* Legacy exported object */
168SDK = SDK || {};
169
170/** @constructor */
171SDK.TracingManager = TracingManager;
172
173/** @interface */
174SDK.TracingManagerClient = TracingManagerClient;
175
176/** @typedef {!{
177 cat: (string|undefined),
178 pid: number,
179 tid: number,
180 ts: number,
181 ph: string,
182 name: string,
183 args: !Object,
184 dur: number,
185 id: string,
186 id2: (!{global: (string|undefined), local: (string|undefined)}|undefined),
187 scope: string,
188 bind_id: string,
189 s: string
190 }}
191 */
192SDK.TracingManager.EventPayload;
193
194SDK.SDKModel.register(SDK.TracingManager, SDK.Target.Capability.Tracing, false);