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); |
| 87 if (this._profiling) | 88 if (this._profiling) |
| 88 this._startProfilingOnTarget(target); | 89 this._startProfilingOnTarget(target); |
| 89 }, | 90 }, |
| 90 | 91 |
| 91 /** | 92 /** |
| 92 * @override | 93 * @override |
| 93 * @param {!WebInspector.Target} target | 94 * @param {!WebInspector.Target} target |
| 94 */ | 95 */ |
| 95 targetRemoved: function(target) | 96 targetRemoved: function(target) |
| 96 { | 97 { |
| 97 this._targets.remove(target, true); | 98 this._targets.remove(target, true); |
| 98 // FIXME: We'd like to stop profiling on the target and retrieve a profi le | 99 // FIXME: We'd like to stop profiling on the target and retrieve a profi le |
| 99 // but it's too late. Backend connection is closed. | 100 // but it's too late. Backend connection is closed. |
| 101 if (this._profiling) | |
| 102 WebInspector.console.log(WebInspector.UIString("A target is disconne cted while profiling. Its profile will not be retrieved.")); | |
|
pfeldman
2016/03/17 00:34:31
Don't output this message - it jumps at the user i
alph
2016/03/17 01:10:08
Done.
| |
| 100 }, | 103 }, |
| 101 | 104 |
| 102 /** | 105 /** |
| 103 * @param {!WebInspector.Target} target | 106 * @param {!WebInspector.Target} target |
| 104 * @return {!Promise} | 107 * @return {!Promise} |
| 105 */ | 108 */ |
| 106 _startProfilingOnTarget: function(target) | 109 _startProfilingOnTarget: function(target) |
| 107 { | 110 { |
| 108 return target.profilerAgent().start(); | 111 return target.profilerAgent().start(); |
| 109 }, | 112 }, |
| 110 | 113 |
| 111 /** | 114 /** |
| 112 * @return {!Promise} | 115 * @return {!Promise} |
| 113 */ | 116 */ |
| 114 _startProfilingOnAllTargets: function() | 117 _startProfilingOnAllTargets: function() |
| 115 { | 118 { |
| 116 var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling" ).get() ? 100 : 1000; | 119 var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling" ).get() ? 100 : 1000; |
| 117 this._targets[0].profilerAgent().setSamplingInterval(intervalUs); | 120 var mainTarget = WebInspector.targetManager.mainTarget(); |
| 121 if (mainTarget) | |
| 122 mainTarget.profilerAgent().setSamplingInterval(intervalUs); | |
| 118 this._profiling = true; | 123 this._profiling = true; |
| 119 return Promise.all(this._targets.map(this._startProfilingOnTarget)); | 124 return Promise.all(this._targets.map(this._startProfilingOnTarget)); |
| 120 }, | 125 }, |
| 121 | 126 |
| 122 /** | 127 /** |
| 123 * @param {!WebInspector.Target} target | 128 * @param {!WebInspector.Target} target |
| 124 * @return {!Promise} | 129 * @return {!Promise} |
| 125 */ | 130 */ |
| 126 _stopProfilingOnTarget: function(target) | 131 _stopProfilingOnTarget: function(target) |
| 127 { | 132 { |
| 128 /** | 133 return target.profilerAgent().stop((error, profile) => !error && profile ? profile : null) |
| 129 * @param {?Protocol.Error} error | 134 .then(this._addCpuProfile.bind(this, target.id())); |
| 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 }, | 135 }, |
| 139 | 136 |
| 140 /** | 137 /** |
| 141 * @return {!Promise} | 138 * @return {!Promise} |
| 142 */ | 139 */ |
| 143 _stopProfilingOnAllTargets: function() | 140 _stopProfilingOnAllTargets: function() |
| 144 { | 141 { |
| 145 var targets = this._profiling ? this._targets : []; | 142 var targets = this._profiling ? this._targets : []; |
| 146 this._profiling = false; | 143 this._profiling = false; |
| 147 return Promise.all(targets.map(this._stopProfilingOnTarget, this)); | 144 return Promise.all(targets.map(this._stopProfilingOnTarget, this)); |
| 148 }, | 145 }, |
| 149 | 146 |
| 150 /** | 147 /** |
| 151 * @param {string} categories | 148 * @param {string} categories |
| 152 * @param {boolean=} enableJSSampling | 149 * @param {boolean=} enableJSSampling |
| 153 * @param {function(?string)=} callback | 150 * @param {function(?string)=} callback |
| 154 */ | 151 */ |
| 155 _startRecordingWithCategories: function(categories, enableJSSampling, callba ck) | 152 _startRecordingWithCategories: function(categories, enableJSSampling, callba ck) |
| 156 { | 153 { |
| 157 if (!this._targets.length) | 154 if (!this._targets.length) |
| 158 return; | 155 return; |
| 159 WebInspector.targetManager.suspendAllTargets(); | 156 WebInspector.targetManager.suspendAllTargets(); |
| 160 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.i sEnabled("timelineTracingJSProfile") ? | 157 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.i sEnabled("timelineTracingJSProfile") ? |
| 161 this._startProfilingOnAllTargets() : Promise.resolve(); | 158 this._startProfilingOnAllTargets() : Promise.resolve(); |
| 162 var samplingFrequencyHz = WebInspector.moduleSetting("highResolutionCpuP rofiling").get() ? 10000 : 1000; | 159 var samplingFrequencyHz = WebInspector.moduleSetting("highResolutionCpuP rofiling").get() ? 10000 : 1000; |
| 163 var options = "sampling-frequency=" + samplingFrequencyHz; | 160 var options = "sampling-frequency=" + samplingFrequencyHz; |
| 164 var mainTarget = this._targets[0]; | 161 var mainTarget = WebInspector.targetManager.mainTarget(); |
| 165 var tracingManager = mainTarget.tracingManager; | 162 var tracingManager = mainTarget.tracingManager; |
| 166 mainTarget.resourceTreeModel.suspendReload(); | 163 mainTarget.resourceTreeModel.suspendReload(); |
| 167 profilingStartedPromise.then(tracingManager.start.bind(tracingManager, t his, categories, options, onTraceStarted)); | 164 profilingStartedPromise.then(tracingManager.start.bind(tracingManager, t his, categories, options, onTraceStarted)); |
| 168 /** | 165 /** |
| 169 * @param {?string} error | 166 * @param {?string} error |
| 170 */ | 167 */ |
| 171 function onTraceStarted(error) | 168 function onTraceStarted(error) |
| 172 { | 169 { |
| 173 mainTarget.resourceTreeModel.resumeReload(); | 170 mainTarget.resourceTreeModel.resumeReload(); |
| 174 if (callback) | 171 if (callback) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 if (!this._cpuProfiles) | 237 if (!this._cpuProfiles) |
| 241 return; | 238 return; |
| 242 | 239 |
| 243 var metadataEventTypes = WebInspector.TimelineModel.DevToolsMetadataEven t; | 240 var metadataEventTypes = WebInspector.TimelineModel.DevToolsMetadataEven t; |
| 244 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); | 241 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); |
| 245 var mainMetaEvent = metadataEvents.filter(event => event.name === metada taEventTypes.TracingStartedInPage).peekLast(); | 242 var mainMetaEvent = metadataEvents.filter(event => event.name === metada taEventTypes.TracingStartedInPage).peekLast(); |
| 246 if (!mainMetaEvent) | 243 if (!mainMetaEvent) |
| 247 return; | 244 return; |
| 248 | 245 |
| 249 var pid = mainMetaEvent.thread.process().id(); | 246 var pid = mainMetaEvent.thread.process().id(); |
| 250 var mainTarget = this._targets[0]; | 247 var mainTarget = WebInspector.targetManager.mainTarget(); |
| 251 var mainCpuProfile = this._cpuProfiles.get(mainTarget.id()); | 248 var mainCpuProfile = this._cpuProfiles.get(mainTarget.id()); |
| 252 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfi le); | 249 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfi le); |
| 253 | 250 |
| 254 var workerMetaEvents = metadataEvents.filter(event => event.name === met adataEventTypes.TracingSessionIdForWorker); | 251 var workerMetaEvents = metadataEvents.filter(event => event.name === met adataEventTypes.TracingSessionIdForWorker); |
| 255 for (var metaEvent of workerMetaEvents) { | 252 for (var metaEvent of workerMetaEvents) { |
| 256 var workerId = metaEvent.args["data"]["workerId"]; | 253 var workerId = metaEvent.args["data"]["workerId"]; |
| 257 var target = mainTarget.workerManager ? mainTarget.workerManager.tar getByWorkerId(workerId) : null; | 254 var target = mainTarget.workerManager ? mainTarget.workerManager.tar getByWorkerId(workerId) : null; |
| 258 if (!target) | 255 if (!target) |
| 259 continue; | 256 continue; |
| 260 var cpuProfile = this._cpuProfiles.get(target.id()); | 257 var cpuProfile = this._cpuProfiles.get(target.id()); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 287 */ | 284 */ |
| 288 _addCpuProfile: function(targetId, cpuProfile) | 285 _addCpuProfile: function(targetId, cpuProfile) |
| 289 { | 286 { |
| 290 if (!cpuProfile) | 287 if (!cpuProfile) |
| 291 return; | 288 return; |
| 292 if (!this._cpuProfiles) | 289 if (!this._cpuProfiles) |
| 293 this._cpuProfiles = new Map(); | 290 this._cpuProfiles = new Map(); |
| 294 this._cpuProfiles.set(targetId, cpuProfile); | 291 this._cpuProfiles.set(targetId, cpuProfile); |
| 295 } | 292 } |
| 296 } | 293 } |
| OLD | NEW |