From a26411f2a61f1f72baa8f2af4358dfb482f14253 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 | 2 +- tracker/tracker/src/main/app/index.ts | 5 +- .../src/main/app/observer/cssInliner.ts | 87 +++++++ .../tracker/src/main/app/observer/observer.ts | 54 ++++- .../src/main/app/observer/top_observer.ts | 9 + tracker/tracker/src/tests/cssInliner.test.ts | 229 ++++++++++++++++++ 8 files changed, 421 insertions(+), 39 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 6ef936b09..cf9e2a6f6 100644 --- a/frontend/app/player/web/MessageLoader.ts +++ b/frontend/app/player/web/MessageLoader.ts @@ -352,25 +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; - if (m1.tp === MType.RemoveNode) - return 1; - if (m2.tp === MType.RemoveNode) - return -1; + // 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); + // 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