OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @constructor | 6 * @constructor |
7 * @param {!WebInspector.TimelineLifecycleDelegate} delegate | 7 * @param {!WebInspector.TimelineLifecycleDelegate} delegate |
8 * @param {!WebInspector.TracingModel} tracingModel | 8 * @param {!WebInspector.TracingModel} tracingModel |
9 * @implements {WebInspector.TargetManager.Observer} | 9 * @implements {WebInspector.TargetManager.Observer} |
10 * @implements {WebInspector.TracingManagerClient} | 10 * @implements {WebInspector.TracingManagerClient} |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
63 } | 63 } |
64 if (captureFilmStrip) | 64 if (captureFilmStrip) |
65 categoriesArray.push(disabledByDefault("devtools.screenshot")); | 65 categoriesArray.push(disabledByDefault("devtools.screenshot")); |
66 | 66 |
67 var categories = categoriesArray.join(","); | 67 var categories = categoriesArray.join(","); |
68 this._startRecordingWithCategories(categories, enableJSSampling); | 68 this._startRecordingWithCategories(categories, enableJSSampling); |
69 }, | 69 }, |
70 | 70 |
71 stopRecording: function() | 71 stopRecording: function() |
72 { | 72 { |
73 this._allProfilesStoppedPromise = this._stopProfilingOnAllTargets(); | |
74 var mainTarget = WebInspector.targetManager.mainTarget(); | |
75 if (mainTarget) | |
76 mainTarget.tracingManager.stop(); | |
73 WebInspector.targetManager.resumeAllTargets(); | 77 WebInspector.targetManager.resumeAllTargets(); |
74 this._allProfilesStoppedPromise = this._stopProfilingOnAllTargets(); | |
75 if (this._targets[0]) | |
76 this._targets[0].tracingManager.stop(); | |
77 this._delegate.loadingStarted(); | 78 this._delegate.loadingStarted(); |
78 }, | 79 }, |
79 | 80 |
80 /** | 81 /** |
81 * @override | 82 * @override |
82 * @param {!WebInspector.Target} target | 83 * @param {!WebInspector.Target} target |
83 */ | 84 */ |
84 targetAdded: function(target) | 85 targetAdded: function(target) |
85 { | 86 { |
86 this._targets.push(target); | 87 this._targets.push(target); |
(...skipping 20 matching lines...) Expand all Loading... | |
107 { | 108 { |
108 return target.profilerAgent().start(); | 109 return target.profilerAgent().start(); |
109 }, | 110 }, |
110 | 111 |
111 /** | 112 /** |
112 * @return {!Promise} | 113 * @return {!Promise} |
113 */ | 114 */ |
114 _startProfilingOnAllTargets: function() | 115 _startProfilingOnAllTargets: function() |
115 { | 116 { |
116 var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling" ).get() ? 100 : 1000; | 117 var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling" ).get() ? 100 : 1000; |
117 this._targets[0].profilerAgent().setSamplingInterval(intervalUs); | 118 var mainTarget = WebInspector.targetManager.mainTarget(); |
119 if (mainTarget) | |
120 mainTarget.profilerAgent().setSamplingInterval(intervalUs); | |
118 this._profiling = true; | 121 this._profiling = true; |
119 return Promise.all(this._targets.map(this._startProfilingOnTarget)); | 122 return Promise.all(this._targets.map(this._startProfilingOnTarget)); |
120 }, | 123 }, |
121 | 124 |
122 /** | 125 /** |
123 * @param {!WebInspector.Target} target | 126 * @param {!WebInspector.Target} target |
124 * @return {!Promise} | 127 * @return {!Promise} |
125 */ | 128 */ |
126 _stopProfilingOnTarget: function(target) | 129 _stopProfilingOnTarget: function(target) |
127 { | 130 { |
128 /** | 131 return target.profilerAgent().stop(this._addCpuProfile.bind(this, target .id())); |
129 * @param {?Protocol.Error} error | |
130 * @param {?ProfilerAgent.CPUProfile} profile | |
131 * @return {?ProfilerAgent.CPUProfile} | |
132 */ | |
133 function extractProfile(error, profile) | |
134 { | |
135 return !error && profile ? profile : null; | |
136 } | |
137 return target.profilerAgent().stop(extractProfile).then(this._addCpuProf ile.bind(this, target.id())); | |
138 }, | 132 }, |
139 | 133 |
140 /** | 134 /** |
135 * @param {number} targetId | |
136 * @param {?Protocol.Error} error | |
137 * @param {?ProfilerAgent.CPUProfile} cpuProfile | |
138 */ | |
139 _addCpuProfile: function(targetId, error, cpuProfile) | |
140 { | |
141 if (!cpuProfile) { | |
142 WebInspector.console.log(WebInspector.UIString("CPU profile for a ta rget is not available. %s", error || "")); | |
pfeldman
2016/03/17 19:04:04
this could be a warning.
alph
2016/03/17 21:12:39
Done.
| |
143 return; | |
144 } | |
145 if (!this._cpuProfiles) | |
146 this._cpuProfiles = new Map(); | |
147 this._cpuProfiles.set(targetId, cpuProfile); | |
148 }, | |
149 | |
150 /** | |
141 * @return {!Promise} | 151 * @return {!Promise} |
142 */ | 152 */ |
143 _stopProfilingOnAllTargets: function() | 153 _stopProfilingOnAllTargets: function() |
144 { | 154 { |
145 var targets = this._profiling ? this._targets : []; | 155 var targets = this._profiling ? this._targets : []; |
146 this._profiling = false; | 156 this._profiling = false; |
147 return Promise.all(targets.map(this._stopProfilingOnTarget, this)); | 157 return Promise.all(targets.map(this._stopProfilingOnTarget, this)); |
148 }, | 158 }, |
149 | 159 |
150 /** | 160 /** |
151 * @param {string} categories | 161 * @param {string} categories |
152 * @param {boolean=} enableJSSampling | 162 * @param {boolean=} enableJSSampling |
153 * @param {function(?string)=} callback | 163 * @param {function(?string)=} callback |
154 */ | 164 */ |
155 _startRecordingWithCategories: function(categories, enableJSSampling, callba ck) | 165 _startRecordingWithCategories: function(categories, enableJSSampling, callba ck) |
156 { | 166 { |
157 if (!this._targets.length) | 167 if (!this._targets.length) |
158 return; | 168 return; |
159 WebInspector.targetManager.suspendAllTargets(); | 169 WebInspector.targetManager.suspendAllTargets(); |
160 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.i sEnabled("timelineTracingJSProfile") ? | 170 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.i sEnabled("timelineTracingJSProfile") ? |
161 this._startProfilingOnAllTargets() : Promise.resolve(); | 171 this._startProfilingOnAllTargets() : Promise.resolve(); |
162 var samplingFrequencyHz = WebInspector.moduleSetting("highResolutionCpuP rofiling").get() ? 10000 : 1000; | 172 var samplingFrequencyHz = WebInspector.moduleSetting("highResolutionCpuP rofiling").get() ? 10000 : 1000; |
163 var options = "sampling-frequency=" + samplingFrequencyHz; | 173 var options = "sampling-frequency=" + samplingFrequencyHz; |
164 var mainTarget = this._targets[0]; | 174 var mainTarget = WebInspector.targetManager.mainTarget(); |
165 var tracingManager = mainTarget.tracingManager; | 175 var tracingManager = mainTarget.tracingManager; |
166 mainTarget.resourceTreeModel.suspendReload(); | 176 mainTarget.resourceTreeModel.suspendReload(); |
167 profilingStartedPromise.then(tracingManager.start.bind(tracingManager, t his, categories, options, onTraceStarted)); | 177 profilingStartedPromise.then(tracingManager.start.bind(tracingManager, t his, categories, options, onTraceStarted)); |
168 /** | 178 /** |
169 * @param {?string} error | 179 * @param {?string} error |
170 */ | 180 */ |
171 function onTraceStarted(error) | 181 function onTraceStarted(error) |
172 { | 182 { |
173 mainTarget.resourceTreeModel.resumeReload(); | 183 mainTarget.resourceTreeModel.resumeReload(); |
174 if (callback) | 184 if (callback) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
240 if (!this._cpuProfiles) | 250 if (!this._cpuProfiles) |
241 return; | 251 return; |
242 | 252 |
243 var metadataEventTypes = WebInspector.TimelineModel.DevToolsMetadataEven t; | 253 var metadataEventTypes = WebInspector.TimelineModel.DevToolsMetadataEven t; |
244 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); | 254 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); |
245 var mainMetaEvent = metadataEvents.filter(event => event.name === metada taEventTypes.TracingStartedInPage).peekLast(); | 255 var mainMetaEvent = metadataEvents.filter(event => event.name === metada taEventTypes.TracingStartedInPage).peekLast(); |
246 if (!mainMetaEvent) | 256 if (!mainMetaEvent) |
247 return; | 257 return; |
248 | 258 |
249 var pid = mainMetaEvent.thread.process().id(); | 259 var pid = mainMetaEvent.thread.process().id(); |
250 var mainTarget = this._targets[0]; | 260 var mainTarget = WebInspector.targetManager.mainTarget(); |
251 var mainCpuProfile = this._cpuProfiles.get(mainTarget.id()); | 261 var mainCpuProfile = this._cpuProfiles.get(mainTarget.id()); |
252 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfi le); | 262 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfi le); |
253 | 263 |
254 var workerMetaEvents = metadataEvents.filter(event => event.name === met adataEventTypes.TracingSessionIdForWorker); | 264 var workerMetaEvents = metadataEvents.filter(event => event.name === met adataEventTypes.TracingSessionIdForWorker); |
255 for (var metaEvent of workerMetaEvents) { | 265 for (var metaEvent of workerMetaEvents) { |
256 var workerId = metaEvent.args["data"]["workerId"]; | 266 var workerId = metaEvent.args["data"]["workerId"]; |
257 var target = mainTarget.workerManager ? mainTarget.workerManager.tar getByWorkerId(workerId) : null; | 267 var target = mainTarget.workerManager ? mainTarget.workerManager.tar getByWorkerId(workerId) : null; |
258 if (!target) | 268 if (!target) |
259 continue; | 269 continue; |
260 var cpuProfile = this._cpuProfiles.get(target.id()); | 270 var cpuProfile = this._cpuProfiles.get(target.id()); |
(...skipping 11 matching lines...) Expand all Loading... | |
272 this._delegate.recordingProgress(usage); | 282 this._delegate.recordingProgress(usage); |
273 }, | 283 }, |
274 | 284 |
275 /** | 285 /** |
276 * @param {number} progress | 286 * @param {number} progress |
277 * @override | 287 * @override |
278 */ | 288 */ |
279 eventsRetrievalProgress: function(progress) | 289 eventsRetrievalProgress: function(progress) |
280 { | 290 { |
281 this._delegate.loadingProgress(progress); | 291 this._delegate.loadingProgress(progress); |
282 }, | |
283 | |
284 /** | |
285 * @param {number} targetId | |
286 * @param {?ProfilerAgent.CPUProfile} cpuProfile | |
287 */ | |
288 _addCpuProfile: function(targetId, cpuProfile) | |
289 { | |
290 if (!cpuProfile) | |
291 return; | |
292 if (!this._cpuProfiles) | |
293 this._cpuProfiles = new Map(); | |
294 this._cpuProfiles.set(targetId, cpuProfile); | |
295 } | 292 } |
296 } | 293 } |
OLD | NEW |