UNPKG

3.11 kBPlain TextView Raw
1// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import * as Common from '../../core/common/common.js';
6import * as SDK from '../../core/sdk/sdk.js';
7import * as Protocol from '../../generated/protocol.js';
8
9import {NetworkLog} from './NetworkLog.js';
10
11const modelToEventListeners = new WeakMap<SDK.LogModel.LogModel, Common.EventTarget.EventDescriptor[]>();
12
13let instance: LogManager|null = null;
14
15export class LogManager implements SDK.TargetManager.SDKModelObserver<SDK.LogModel.LogModel> {
16 private constructor() {
17 SDK.TargetManager.TargetManager.instance().observeModels(SDK.LogModel.LogModel, this);
18 }
19
20 static instance({forceNew}: {forceNew: boolean} = {forceNew: false}): LogManager {
21 if (!instance || forceNew) {
22 instance = new LogManager();
23 }
24
25 return instance;
26 }
27
28 modelAdded(logModel: SDK.LogModel.LogModel): void {
29 const eventListeners = [];
30 eventListeners.push(logModel.addEventListener(SDK.LogModel.Events.EntryAdded, this.logEntryAdded, this));
31 modelToEventListeners.set(logModel, eventListeners);
32 }
33
34 modelRemoved(logModel: SDK.LogModel.LogModel): void {
35 const eventListeners = modelToEventListeners.get(logModel);
36 if (eventListeners) {
37 Common.EventTarget.removeEventListeners(eventListeners);
38 }
39 }
40
41 private logEntryAdded(event: Common.EventTarget.EventTargetEvent<SDK.LogModel.EntryAddedEvent>): void {
42 const {logModel, entry} = event.data;
43 const target = logModel.target();
44 const details = {
45 url: entry.url,
46 line: entry.lineNumber,
47 parameters: [entry.text, ...(entry.args ?? [])],
48 stackTrace: entry.stackTrace,
49 timestamp: entry.timestamp,
50 workerId: entry.workerId,
51 category: entry.category,
52 affectedResources: entry.networkRequestId ? {requestId: entry.networkRequestId} : undefined,
53 };
54 const consoleMessage = new SDK.ConsoleModel.ConsoleMessage(
55 target.model(SDK.RuntimeModel.RuntimeModel), entry.source, entry.level, entry.text, details);
56
57 if (entry.networkRequestId) {
58 NetworkLog.instance().associateConsoleMessageWithRequest(consoleMessage, entry.networkRequestId);
59 }
60
61 if (consoleMessage.source === Protocol.Log.LogEntrySource.Worker) {
62 const workerId = consoleMessage.workerId || '';
63 // We have a copy of worker messages reported through the page, so that
64 // user can see messages from the worker which has been already destroyed.
65 // When opening DevTools, give us some time to connect to the worker and
66 // not report the message twice if the worker is still alive.
67 if (SDK.TargetManager.TargetManager.instance().targetById(workerId)) {
68 return;
69 }
70 setTimeout(() => {
71 if (!SDK.TargetManager.TargetManager.instance().targetById(workerId)) {
72 SDK.ConsoleModel.ConsoleModel.instance().addMessage(consoleMessage);
73 }
74 }, 1000);
75 } else {
76 SDK.ConsoleModel.ConsoleModel.instance().addMessage(consoleMessage);
77 }
78 }
79}