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 |