| 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 0a768dfee48b297b2e9f2f7b585eae4f5208c946..63a05eda5e606c06bc9ef4649570f6f8467ced33 100644
|
| --- a/Source/devtools/front_end/timeline/TimelineModel.js
|
| +++ b/Source/devtools/front_end/timeline/TimelineModel.js
|
| @@ -404,8 +404,6 @@ WebInspector.TimelineModel.prototype = {
|
| ];
|
| if (captureCauses || enableJSSampling)
|
| categoriesArray.push(disabledByDefault("devtools.timeline.stack"));
|
| - if (enableJSSampling)
|
| - this._startCpuProfilingOnAllTargets();
|
| if (captureCauses && Runtime.experiments.isEnabled("timelineInvalidationTracking"))
|
| categoriesArray.push(disabledByDefault("devtools.timeline.invalidationTracking"));
|
| if (capturePictures) {
|
| @@ -415,7 +413,7 @@ WebInspector.TimelineModel.prototype = {
|
| disabledByDefault("blink.graphics_context_annotations")]);
|
| }
|
| var categories = categoriesArray.join(",");
|
| - this._startRecordingWithCategories(categories);
|
| + this._startRecordingWithCategories(categories, enableJSSampling);
|
| },
|
|
|
| stopRecording: function()
|
| @@ -556,9 +554,12 @@ WebInspector.TimelineModel.prototype = {
|
|
|
| /**
|
| * @param {string} categories
|
| + * @param {boolean=} enableJSSampling
|
| */
|
| - _startRecordingWithCategories: function(categories)
|
| + _startRecordingWithCategories: function(categories, enableJSSampling)
|
| {
|
| + if (enableJSSampling)
|
| + this._startCpuProfilingOnAllTargets();
|
| this._tracingManager.start(categories, "");
|
| },
|
|
|
| @@ -606,33 +607,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();
|
| @@ -762,8 +773,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;
|
| @@ -791,20 +803,24 @@ 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 = thread === mainThread ? WebInspector.targetManager.mainTarget() : WebInspector.workerTargetManager.targetByWorkerId(workerId);
|
| + 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);
|
| },
|
|
|
| /**
|
|
|