Commit 38b8c3de authored by Dmitry Gozman's avatar Dmitry Gozman Committed by Commit Bot

[DevTools] Switch WorkerStartedInPage from session id to frame id

Bug: 820250
Change-Id: I102e083d01c66e374dc345345363dc2ef5ade62d
Reviewed-on: https://chromium-review.googlesource.com/965390
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: default avatarAlexei Filippov <alph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#544888}
parent 1eab1994
Tests that worker events are properly filtered in timeline.
Got 2 worker metadata events
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`Tests that worker events are properly filtered in timeline.\n`);
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
await TestRunner.evaluateInPagePromise(`
// Save references to the worker objects to make sure they are not GC'ed.
var worker1;
var worker2;
function startFirstWorker()
{
worker1 = new Worker("resources/worker.js");
worker1.postMessage("");
return new Promise((fulfill) => worker1.onmessage = fulfill);
}
function startSecondWorker()
{
worker2 = new Worker("resources/worker.js");
worker2.postMessage("");
return new Promise((fulfill) => worker2.onmessage = fulfill);
}
`);
await TestRunner.evaluateInPageAsync(`startFirstWorker()`);
await PerformanceTestRunner.invokeAsyncWithTimeline('startSecondWorker');
var workerMetadataEventCount = 0;
var allEvents = PerformanceTestRunner.timelineModel().inspectedTargetEvents();
var workerEvents = allEvents.filter(e => e.name === TimelineModel.TimelineModel.DevToolsMetadataEvent.TracingSessionIdForWorker);
TestRunner.addResult(`Got ${workerEvents.length} worker metadata events`);
TestRunner.completeTest();
})();
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
return; return;
++workerMetadataEventCount; ++workerMetadataEventCount;
TestRunner.assertEquals(PerformanceTestRunner.timelineModel()._sessionId, event.args['data']['sessionId']);
TestRunner.addResult('Got DevTools worker metadata event(' + workerMetadataEventCount + '): ' + event.name); TestRunner.addResult('Got DevTools worker metadata event(' + workerMetadataEventCount + '): ' + event.name);
} }
})(); })();
...@@ -1255,10 +1255,10 @@ std::unique_ptr<TracedValue> InspectorTimeStampEvent::Data( ...@@ -1255,10 +1255,10 @@ std::unique_ptr<TracedValue> InspectorTimeStampEvent::Data(
} }
std::unique_ptr<TracedValue> InspectorTracingSessionIdForWorkerEvent::Data( std::unique_ptr<TracedValue> InspectorTracingSessionIdForWorkerEvent::Data(
const String& session_id, LocalFrame* frame,
WorkerThread* worker_thread) { WorkerThread* worker_thread) {
std::unique_ptr<TracedValue> value = TracedValue::Create(); std::unique_ptr<TracedValue> value = TracedValue::Create();
value->SetString("sessionId", session_id); value->SetString("frame", IdentifiersFactory::FrameId(frame));
value->SetString("workerId", IdentifiersFactory::IdFromToken( value->SetString("workerId", IdentifiersFactory::IdFromToken(
worker_thread->GetDevToolsWorkerToken())); worker_thread->GetDevToolsWorkerToken()));
value->SetDouble("workerThreadId", worker_thread->GetPlatformThreadId()); value->SetDouble("workerThreadId", worker_thread->GetPlatformThreadId());
......
...@@ -449,8 +449,7 @@ std::unique_ptr<TracedValue> Data(ExecutionContext*, const String& message); ...@@ -449,8 +449,7 @@ std::unique_ptr<TracedValue> Data(ExecutionContext*, const String& message);
} }
namespace InspectorTracingSessionIdForWorkerEvent { namespace InspectorTracingSessionIdForWorkerEvent {
std::unique_ptr<TracedValue> Data(const String& session_id, std::unique_ptr<TracedValue> Data(LocalFrame*, WorkerThread*);
WorkerThread*);
} }
namespace InspectorTracingStartedInFrame { namespace InspectorTracingStartedInFrame {
......
...@@ -42,7 +42,10 @@ void InspectorTracingAgent::Trace(blink::Visitor* visitor) { ...@@ -42,7 +42,10 @@ void InspectorTracingAgent::Trace(blink::Visitor* visitor) {
void InspectorTracingAgent::Restore() { void InspectorTracingAgent::Restore() {
state_->getString(TracingAgentState::kSessionId, &session_id_); state_->getString(TracingAgentState::kSessionId, &session_id_);
if (IsStarted()) {
instrumenting_agents_->addInspectorTracingAgent(this);
EmitMetadataEvents(); EmitMetadataEvents();
}
} }
void InspectorTracingAgent::FrameStartedLoading(LocalFrame* frame, void InspectorTracingAgent::FrameStartedLoading(LocalFrame* frame,
...@@ -58,7 +61,16 @@ void InspectorTracingAgent::FrameStoppedLoading(LocalFrame* frame) { ...@@ -58,7 +61,16 @@ void InspectorTracingAgent::FrameStoppedLoading(LocalFrame* frame) {
} }
void InspectorTracingAgent::DidStartWorker(WorkerInspectorProxy* proxy, bool) { void InspectorTracingAgent::DidStartWorker(WorkerInspectorProxy* proxy, bool) {
WriteTimelineStartedEventForWorker(proxy->GetWorkerThread()); // For now we assume this is document. TODO(kinuko): Fix this.
DCHECK(proxy->GetExecutionContext()->IsDocument());
LocalFrame* frame = ToDocument(proxy->GetExecutionContext())->GetFrame();
if (proxy->GetWorkerThread() && frame && inspected_frames_->Contains(frame)) {
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
"TracingSessionIdForWorker", TRACE_EVENT_SCOPE_THREAD,
"data",
InspectorTracingSessionIdForWorkerEvent::Data(
frame, proxy->GetWorkerThread()));
}
} }
void InspectorTracingAgent::start(Maybe<String> categories, void InspectorTracingAgent::start(Maybe<String> categories,
...@@ -105,24 +117,8 @@ void InspectorTracingAgent::EmitMetadataEvents() { ...@@ -105,24 +117,8 @@ void InspectorTracingAgent::EmitMetadataEvents() {
TRACE_EVENT_SCOPE_THREAD, "data", TRACE_EVENT_SCOPE_THREAD, "data",
InspectorTracingStartedInFrame::Data( InspectorTracingStartedInFrame::Data(
session_id_, inspected_frames_->Root())); session_id_, inspected_frames_->Root()));
for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies()) { for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies())
// For now we assume this is document. TODO(kinuko): Fix this. DidStartWorker(proxy, false);
DCHECK(proxy->GetExecutionContext()->IsDocument());
Document* document = ToDocument(proxy->GetExecutionContext());
if (proxy->GetWorkerThread() && document->GetFrame() &&
inspected_frames_->Contains(document->GetFrame())) {
WriteTimelineStartedEventForWorker(proxy->GetWorkerThread());
}
}
}
void InspectorTracingAgent::WriteTimelineStartedEventForWorker(
WorkerThread* worker_thread) {
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
"TracingSessionIdForWorker", TRACE_EVENT_SCOPE_THREAD,
"data",
InspectorTracingSessionIdForWorkerEvent::Data(
session_id_, worker_thread));
} }
void InspectorTracingAgent::RootLayerCleared() { void InspectorTracingAgent::RootLayerCleared() {
......
...@@ -18,7 +18,6 @@ namespace blink { ...@@ -18,7 +18,6 @@ namespace blink {
class InspectedFrames; class InspectedFrames;
class WorkerInspectorProxy; class WorkerInspectorProxy;
class WorkerThread;
class CORE_EXPORT InspectorTracingAgent final class CORE_EXPORT InspectorTracingAgent final
: public InspectorBaseAgent<protocol::Tracing::Metainfo> { : public InspectorBaseAgent<protocol::Tracing::Metainfo> {
...@@ -62,7 +61,6 @@ class CORE_EXPORT InspectorTracingAgent final ...@@ -62,7 +61,6 @@ class CORE_EXPORT InspectorTracingAgent final
void EmitMetadataEvents(); void EmitMetadataEvents();
void InnerDisable(); void InnerDisable();
bool IsStarted() const; bool IsStarted() const;
void WriteTimelineStartedEventForWorker(WorkerThread*);
Client* client_; Client* client_;
String session_id_; String session_id_;
......
...@@ -183,8 +183,16 @@ TimelineModel.TimelineModel = class { ...@@ -183,8 +183,16 @@ TimelineModel.TimelineModel = class {
const endTime = i + 1 < length ? metadataEvents.page[i + 1].startTime : Infinity; const endTime = i + 1 < length ? metadataEvents.page[i + 1].startTime : Infinity;
this._legacyCurrentPage = metaEvent.args['data'] && metaEvent.args['data']['page']; this._legacyCurrentPage = metaEvent.args['data'] && metaEvent.args['data']['page'];
for (const thread of process.sortedThreads()) { for (const thread of process.sortedThreads()) {
if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName) { if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName ||
const workerMetaEvent = metadataEvents.workers.find(e => e.args['data']['workerThreadId'] === thread.id()); thread.name() === TimelineModel.TimelineModel.WorkerThreadNameLegacy) {
const workerMetaEvent = metadataEvents.workers.find(e => {
if (e.args['data']['workerThreadId'] !== thread.id())
return false;
// This is to support old traces.
if (e.args['data']['sessionId'] === this._sessionId)
return true;
return !!this._pageFrames.get(TimelineModel.TimelineModel.eventFrameId(e));
});
if (!workerMetaEvent) if (!workerMetaEvent)
continue; continue;
const workerId = workerMetaEvent.args['data']['workerId']; const workerId = workerMetaEvent.args['data']['workerId'];
...@@ -262,7 +270,7 @@ TimelineModel.TimelineModel = class { ...@@ -262,7 +270,7 @@ TimelineModel.TimelineModel = class {
} }
const result = { const result = {
page: pageDevToolsMetadataEvents.filter(checkSessionId).sort(SDK.TracingModel.Event.compareStartTime), page: pageDevToolsMetadataEvents.filter(checkSessionId).sort(SDK.TracingModel.Event.compareStartTime),
workers: workersDevToolsMetadataEvents.filter(checkSessionId).sort(SDK.TracingModel.Event.compareStartTime) workers: workersDevToolsMetadataEvents.sort(SDK.TracingModel.Event.compareStartTime)
}; };
if (mismatchingIds.size) { if (mismatchingIds.size) {
Common.console.error( Common.console.error(
...@@ -1237,7 +1245,8 @@ TimelineModel.TimelineModel.WarningType = { ...@@ -1237,7 +1245,8 @@ TimelineModel.TimelineModel.WarningType = {
}; };
TimelineModel.TimelineModel.MainThreadName = 'main'; TimelineModel.TimelineModel.MainThreadName = 'main';
TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker Thread'; TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker thread';
TimelineModel.TimelineModel.WorkerThreadNameLegacy = 'DedicatedWorker Thread';
TimelineModel.TimelineModel.RendererMainThreadName = 'CrRendererMain'; TimelineModel.TimelineModel.RendererMainThreadName = 'CrRendererMain';
/** /**
...@@ -1283,7 +1292,8 @@ TimelineModel.TimelineModel.VirtualThread = class { ...@@ -1283,7 +1292,8 @@ TimelineModel.TimelineModel.VirtualThread = class {
* @return {boolean} * @return {boolean}
*/ */
isWorker() { isWorker() {
return this.name === TimelineModel.TimelineModel.WorkerThreadName; return this.name === TimelineModel.TimelineModel.WorkerThreadName ||
this.name === TimelineModel.TimelineModel.WorkerThreadNameLegacy;
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment