Index: Source/devtools/front_end/timeline/TimelineModel.js |
diff --git a/Source/devtools/front_end/timeline/TimelineModel.js b/Source/devtools/front_end/timeline/TimelineModel.js |
index eb1a1bc431de541eaadaaa79e947f0163d0eb72c..81a0beb09b93caea7a9bd186cf0d9d23ce423b76 100644 |
--- a/Source/devtools/front_end/timeline/TimelineModel.js |
+++ b/Source/devtools/front_end/timeline/TimelineModel.js |
@@ -405,7 +405,7 @@ WebInspector.TimelineModel.prototype = { |
if (captureCauses || enableJSSampling) |
categoriesArray.push(disabledByDefault("devtools.timeline.stack")); |
if (enableJSSampling) |
- this._startCpuProfilingOnAllTargets(); |
+ categoriesArray.push(disabledByDefault("devtools.js.profile")); |
if (captureCauses && Runtime.experiments.isEnabled("timelineInvalidationTracking")) |
categoriesArray.push(disabledByDefault("devtools.timeline.invalidationTracking")); |
if (capturePictures) { |
@@ -550,6 +550,8 @@ WebInspector.TimelineModel.prototype = { |
*/ |
_startRecordingWithCategories: function(categories) |
{ |
+ if (categories.indexOf("devtools.js.profile") >= 0) |
yurys
2014/11/14 13:25:26
Let's pass it as explicit enableJSSampling paramet
alph
2014/11/14 15:01:59
Done.
|
+ this._startCpuProfilingOnAllTargets(); |
this._tracingManager.start(categories, ""); |
}, |
@@ -597,33 +599,43 @@ WebInspector.TimelineModel.prototype = { |
if (error) |
WebInspector.console.error(error); |
if (!this._cpuProfiles) |
- this._cpuProfiles = {}; |
- this._cpuProfiles[target.id()] = cpuProfile; |
+ this._cpuProfiles = new Map(); |
+ this._cpuProfiles.set(target.id(), cpuProfile); |
}, |
_didStopRecordingTraceEvents: function() |
{ |
this._tracingModel.tracingComplete(); |
- var events = this._tracingModel.devtoolsPageMetadataEvents(); |
+ var metaEvents = this._tracingModel.devtoolsPageMetadataEvents(); |
var workerMetadataEvents = this._tracingModel.devtoolsWorkerMetadataEvents(); |
this._resetProcessingState(); |
- for (var i = 0, length = events.length; i < length; i++) { |
- var event = events[i]; |
- var process = event.thread.process(); |
- var startTime = event.startTime; |
+ for (var i = 0, length = metaEvents.length; i < length; i++) { |
+ var metaEvent = metaEvents[i]; |
+ var process = metaEvent.thread.process(); |
+ var startTime = metaEvent.startTime; |
var endTime = Infinity; |
if (i + 1 < length) |
- endTime = events[i + 1].startTime; |
+ endTime = metaEvents[i + 1].startTime; |
var threads = process.sortedThreads(); |
for (var j = 0; j < threads.length; j++) { |
var thread = threads[j]; |
- if (thread.name() === "WebCore: Worker" && workerMetadataEvents.every(function(e) { return e.args["data"]["workerThreadId"] !== thread.id(); })) |
- continue; |
- this._processThreadEvents(startTime, endTime, event.thread, thread); |
+ var workerId = 0; |
+ if (thread.name() === "WebCore: Worker") { |
+ for (var k = 0; k < workerMetadataEvents.length; ++k) { |
+ var eventData = workerMetadataEvents[k].args["data"]; |
+ if (eventData["workerThreadId"] === thread.id()) { |
+ workerId = eventData["workerId"]; |
+ break; |
+ } |
+ } |
+ if (!workerId) |
+ continue; |
+ } |
+ this._processThreadEvents(startTime, endTime, metaEvent.thread, thread, workerId); |
} |
} |
this._resetProcessingState(); |
@@ -753,8 +765,9 @@ WebInspector.TimelineModel.prototype = { |
* @param {?number} endTime |
* @param {!WebInspector.TracingModel.Thread} mainThread |
* @param {!WebInspector.TracingModel.Thread} thread |
+ * @param {number} workerId |
*/ |
- _processThreadEvents: function(startTime, endTime, mainThread, thread) |
+ _processThreadEvents: function(startTime, endTime, mainThread, thread, workerId) |
{ |
var events = thread.events(); |
var length = events.length; |
@@ -782,20 +795,28 @@ WebInspector.TimelineModel.prototype = { |
this._inspectedTargetEvents.push(event); |
} |
- if (this._cpuProfiles && thread.target()) { |
- var cpuProfile = this._cpuProfiles[thread.target().id()]; |
- if (cpuProfile) { |
- var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile(cpuProfile, thread); |
- var mergedEvents = threadEvents.mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime); |
- var jsFrameEvents = WebInspector.TimelineJSProfileProcessor.generateJSFrameEvents(mergedEvents); |
- mergedEvents = jsFrameEvents.mergeOrdered(mergedEvents, WebInspector.TracingModel.Event.orderedCompareStartTime); |
- if (virtualThread) |
- virtualThread.events = mergedEvents; |
- else |
- this._mainThreadEvents = mergedEvents; |
- this._inspectedTargetEvents = this._inspectedTargetEvents.concat(jsSamples, jsFrameEvents); |
- } |
- } |
+ if (!this._cpuProfiles) |
+ return; |
+ var target; |
+ if (thread === mainThread) |
+ target = WebInspector.targetManager.mainTarget(); |
+ else |
+ target = WebInspector.workerTargetManager && WebInspector.workerTargetManager.targetByWorkerId(workerId); |
yurys
2014/11/14 13:25:26
When can WebInspector.workerTargetManager be null?
alph
2014/11/14 15:01:59
before the main target is created. It is obviously
|
+ if (!target) |
+ return; |
+ var cpuProfile = this._cpuProfiles.get(target.id()); |
+ if (!cpuProfile) |
+ return; |
+ this._cpuProfiles.delete(target.id()); |
+ var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile(cpuProfile, thread); |
+ var mergedEvents = threadEvents.mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime); |
+ var jsFrameEvents = WebInspector.TimelineJSProfileProcessor.generateJSFrameEvents(mergedEvents); |
+ mergedEvents = jsFrameEvents.mergeOrdered(mergedEvents, WebInspector.TracingModel.Event.orderedCompareStartTime); |
+ if (virtualThread) |
+ virtualThread.events = mergedEvents; |
+ else |
+ this._mainThreadEvents = mergedEvents; |
+ this._inspectedTargetEvents = this._inspectedTargetEvents.concat(jsSamples, jsFrameEvents); |
}, |
/** |