Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineController.js

Issue 1807093002: DevTools: Resume targets *after* stopping timeline recording. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698