1 |
|
2 |
|
3 |
|
4 |
|
5 | import * as Common from '../../core/common/common.js';
|
6 | import * as SDK from '../../core/sdk/sdk.js';
|
7 | import * as Protocol from '../../generated/protocol.js';
|
8 |
|
9 | import {NetworkLog} from './NetworkLog.js';
|
10 |
|
11 | const modelToEventListeners = new WeakMap<SDK.LogModel.LogModel, Common.EventTarget.EventDescriptor[]>();
|
12 |
|
13 | let instance: LogManager|null = null;
|
14 |
|
15 | export 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 |
|
64 |
|
65 |
|
66 |
|
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 | }
|