From 3fd506a8127cdea6988ef3ac106447bfe8a57162 Mon Sep 17 00:00:00 2001 From: Andrey Babushkin <55714097+reyand43@users.noreply.github.com> Date: Tue, 22 Apr 2025 17:59:25 +0200 Subject: [PATCH] Css batching (#3326) * tracker: initial css inlining functionality * tracker: add tests, adjust sheet id, stagger rule sending * ui: rereoute custom html component fragments * removed sorting --------- Co-authored-by: nick-delirium --- frontend/app/player/web/MessageLoader.ts | 24 +- .../app/player/web/managers/DOM/DOMManager.ts | 50 ++-- tracker/tracker/package.json | 27 +-- tracker/tracker/src/main/app/index.ts | 5 +- .../src/main/app/observer/cssInliner.ts | 87 +++++++ .../tracker/src/main/app/observer/observer.ts | 83 ++++++- .../src/main/app/observer/top_observer.ts | 9 + tracker/tracker/src/tests/cssInliner.test.ts | 229 ++++++++++++++++++ 8 files changed, 462 insertions(+), 52 deletions(-) create mode 100644 tracker/tracker/src/main/app/observer/cssInliner.ts create mode 100644 tracker/tracker/src/tests/cssInliner.test.ts diff --git a/frontend/app/player/web/MessageLoader.ts b/frontend/app/player/web/MessageLoader.ts index 7f217be02..e77f82822 100644 --- a/frontend/app/player/web/MessageLoader.ts +++ b/frontend/app/player/web/MessageLoader.ts @@ -43,6 +43,7 @@ export default class MessageLoader { this.session = session; } + rawMessages: any[] = [] createNewParser( shouldDecrypt = true, onMessagesDone: (msgs: PlayerMsg[], file?: string) => void, @@ -69,6 +70,7 @@ export default class MessageLoader { while (!finished) { const msg = fileReader.readNext(); if (msg) { + this.rawMessages.push(msg) msgs.push(msg); } else { finished = true; @@ -343,7 +345,6 @@ const DOMMessages = [ MType.CreateElementNode, MType.CreateTextNode, MType.MoveNode, - MType.RemoveNode, MType.CreateIFrameDocument, ]; @@ -351,20 +352,25 @@ const DOMMessages = [ function brokenDomSorter(m1: PlayerMsg, m2: PlayerMsg) { if (m1.time !== m2.time) return m1.time - m2.time; - if (m1.tp === MType.CreateDocument && m2.tp !== MType.CreateDocument) - return -1; - if (m1.tp !== MType.CreateDocument && m2.tp === MType.CreateDocument) - return 1; + // if (m1.tp === MType.CreateDocument && m2.tp !== MType.CreateDocument) + // return -1; + // if (m1.tp !== MType.CreateDocument && m2.tp === MType.CreateDocument) + // return 1; - const m1IsDOM = DOMMessages.includes(m1.tp); - const m2IsDOM = DOMMessages.includes(m2.tp); + // if (m1.tp === MType.RemoveNode) + // return 1; + // if (m2.tp === MType.RemoveNode) + // return -1; + + // const m1IsDOM = DOMMessages.includes(m1.tp); + // const m2IsDOM = DOMMessages.includes(m2.tp); // if (m1IsDOM && m2IsDOM) { // // @ts-ignore DOM msg has id but checking for 'id' in m is expensive // return m1.id - m2.id; // } - if (m1IsDOM && !m2IsDOM) return -1; - if (!m1IsDOM && m2IsDOM) return 1; + // if (m1IsDOM && !m2IsDOM) return -1; + // if (!m1IsDOM && m2IsDOM) return 1; return 0; } diff --git a/frontend/app/player/web/managers/DOM/DOMManager.ts b/frontend/app/player/web/managers/DOM/DOMManager.ts index 1d15d050c..76e194916 100644 --- a/frontend/app/player/web/managers/DOM/DOMManager.ts +++ b/frontend/app/player/web/managers/DOM/DOMManager.ts @@ -52,6 +52,8 @@ export default class DOMManager extends ListWalker { /** required to keep track of iframes, frameId : vnodeId */ private readonly iframeRoots: Record = {}; + private shadowRootParentMap: Map = new Map(); + /** Constructed StyleSheets https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets * as well as