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 @@
return;
++workerMetadataEventCount;
TestRunner.assertEquals(PerformanceTestRunner.timelineModel()._sessionId, event.args['data']['sessionId']);
TestRunner.addResult('Got DevTools worker metadata event(' + workerMetadataEventCount + '): ' + event.name);
}
})();
......@@ -1255,10 +1255,10 @@ std::unique_ptr<TracedValue> InspectorTimeStampEvent::Data(
}
std::unique_ptr<TracedValue> InspectorTracingSessionIdForWorkerEvent::Data(
const String& session_id,
LocalFrame* frame,
WorkerThread* worker_thread) {
std::unique_ptr<TracedValue> value = TracedValue::Create();
value->SetString("sessionId", session_id);
value->SetString("frame", IdentifiersFactory::FrameId(frame));
value->SetString("workerId", IdentifiersFactory::IdFromToken(
worker_thread->GetDevToolsWorkerToken()));
value->SetDouble("workerThreadId", worker_thread->GetPlatformThreadId());
......
......@@ -449,8 +449,7 @@ std::unique_ptr<TracedValue> Data(ExecutionContext*, const String& message);
}
namespace InspectorTracingSessionIdForWorkerEvent {
std::unique_ptr<TracedValue> Data(const String& session_id,
WorkerThread*);
std::unique_ptr<TracedValue> Data(LocalFrame*, WorkerThread*);
}
namespace InspectorTracingStartedInFrame {
......
......@@ -42,7 +42,10 @@ void InspectorTracingAgent::Trace(blink::Visitor* visitor) {
void InspectorTracingAgent::Restore() {
state_->getString(TracingAgentState::kSessionId, &session_id_);
EmitMetadataEvents();
if (IsStarted()) {
instrumenting_agents_->addInspectorTracingAgent(this);
EmitMetadataEvents();
}
}
void InspectorTracingAgent::FrameStartedLoading(LocalFrame* frame,
......@@ -58,7 +61,16 @@ void InspectorTracingAgent::FrameStoppedLoading(LocalFrame* frame) {
}
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,
......@@ -105,24 +117,8 @@ void InspectorTracingAgent::EmitMetadataEvents() {
TRACE_EVENT_SCOPE_THREAD, "data",
InspectorTracingStartedInFrame::Data(
session_id_, inspected_frames_->Root()));
for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies()) {
// For now we assume this is document. TODO(kinuko): Fix this.
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));
for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies())
DidStartWorker(proxy, false);
}
void InspectorTracingAgent::RootLayerCleared() {
......
......@@ -18,7 +18,6 @@ namespace blink {
class InspectedFrames;
class WorkerInspectorProxy;
class WorkerThread;
class CORE_EXPORT InspectorTracingAgent final
: public InspectorBaseAgent<protocol::Tracing::Metainfo> {
......@@ -62,7 +61,6 @@ class CORE_EXPORT InspectorTracingAgent final
void EmitMetadataEvents();
void InnerDisable();
bool IsStarted() const;
void WriteTimelineStartedEventForWorker(WorkerThread*);
Client* client_;
String session_id_;
......
......@@ -183,8 +183,16 @@ TimelineModel.TimelineModel = class {
const endTime = i + 1 < length ? metadataEvents.page[i + 1].startTime : Infinity;
this._legacyCurrentPage = metaEvent.args['data'] && metaEvent.args['data']['page'];
for (const thread of process.sortedThreads()) {
if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName) {
const workerMetaEvent = metadataEvents.workers.find(e => e.args['data']['workerThreadId'] === thread.id());
if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName ||
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)
continue;
const workerId = workerMetaEvent.args['data']['workerId'];
......@@ -262,7 +270,7 @@ TimelineModel.TimelineModel = class {
}
const result = {
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) {
Common.console.error(
......@@ -1237,7 +1245,8 @@ TimelineModel.TimelineModel.WarningType = {
};
TimelineModel.TimelineModel.MainThreadName = 'main';
TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker Thread';
TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker thread';
TimelineModel.TimelineModel.WorkerThreadNameLegacy = 'DedicatedWorker Thread';
TimelineModel.TimelineModel.RendererMainThreadName = 'CrRendererMain';
/**
......@@ -1283,7 +1292,8 @@ TimelineModel.TimelineModel.VirtualThread = class {
* @return {boolean}
*/
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