Chromium Code Reviews| 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 |