@@ -22,7 +22,6 @@ import {
2222 hasCounters
2323} from '../modules/counter.js'
2424import { snapFetch } from './snapFetch.js'
25- import { cache } from '../core/cache.js'
2625
2726/** Weak memo for per-document preflight results keyed by a cheap style fingerprint */
2827const __preflightMemo = new WeakMap ( )
@@ -221,9 +220,6 @@ export function shouldProcessPseudos(doc = document, fp = styleFingerprint(doc))
221220 return false
222221}
223222
224- /** Acumulador de contadores por padre para propagar increments en pseudos entre hermanos */
225- var __siblingCounters = new WeakMap ( ) // parentElement -> Map<counterName, number>
226-
227223/**
228224 * True if any single side paints a border. The `border-width`/`border-style` shorthands
229225 * can't be parsed with parseFloat: a `border-bottom` resolves to "0px 0px 1px 0px", whose
@@ -239,7 +235,6 @@ function hasPaintedBorder(style) {
239235 }
240236 return false
241237}
242- var __pseudoEpoch = - 1
243238
244239/**
245240 * Wraps buildCounterContext(doc) — an O(document) walk — behind a memoizing
@@ -310,9 +305,9 @@ function collapseCssContent(raw) {
310305 * @param {Element } node
311306 * @param {{get:Function, getStack:Function} } base
312307 */
313- function withSiblingOverrides ( node , base ) {
308+ function withSiblingOverrides ( node , base , siblingCounters ) {
314309 const parent = node . parentElement
315- const map = parent ? __siblingCounters . get ( parent ) : null
310+ const map = parent && siblingCounters ? siblingCounters . get ( parent ) : null
316311 if ( ! map ) return base
317312 return {
318313 get ( n , name ) {
@@ -417,15 +412,15 @@ function deriveCounterCtxForPseudo(node, pseudoStyle, baseCtx) {
417412 * @param {{get:Function, getStack:Function} } baseCtx
418413 * @returns {{ text: string, incs: Array<{name:string,num:number|undefined}> } }
419414 */
420- function resolvePseudoContentAndIncs ( node , pseudo , baseCtx ) {
415+ function resolvePseudoContentAndIncs ( node , pseudo , baseCtx , siblingCounters ) {
421416 let ps
422417 try { ps = getStyle ( node , pseudo ) } catch { }
423418 let raw = ps ?. content
424419 if ( ! raw || raw === 'none' || raw === 'normal' ) return { text : '' , incs : [ ] }
425420 raw = stripContentAltText ( raw )
426421
427422 // 1) aplicar overrides de hermanos
428- const baseWithSiblings = withSiblingOverrides ( node , baseCtx )
423+ const baseWithSiblings = withSiblingOverrides ( node , baseCtx , siblingCounters )
429424
430425 // 2) derivar (aplica reset/increment del pseudo)
431426 const derived = deriveCounterCtxForPseudo ( node , ps , baseWithSiblings )
@@ -461,13 +456,10 @@ export async function inlinePseudoElements(source, clone, sessionCache, options)
461456 return
462457 }
463458
464- // Reset per-capture: si cambió el epoch, limpiamos overrides de hermanos
465- const epoch = ( cache ?. session ?. __counterEpoch ?? 0 )
466- if ( __pseudoEpoch !== epoch ) {
467- __siblingCounters = new WeakMap ( )
468- if ( sessionCache ) sessionCache . __counterCtx = null
469- __pseudoEpoch = epoch
470- }
459+ // Sibling-counter overrides are per-capture state: they live on sessionCache (whose
460+ // lifetime is exactly one capture), not on a module global — a concurrently starting
461+ // capture used to wipe the shared global mid-traversal via an epoch bump.
462+ if ( ! sessionCache . __siblingCounters ) sessionCache . __siblingCounters = new WeakMap ( )
471463
472464 // buildCounterContext walks the whole document once — defer it behind a lazy
473465 // wrapper so that cost is only paid the first time a pseudo actually declares
@@ -546,7 +538,7 @@ export async function inlinePseudoElements(source, clone, sessionCache, options)
546538const isNoExplicitContent =
547539 rawContent === '' || rawContent === 'none' || rawContent === 'normal'
548540const { text : cleanContent , incs } =
549- resolvePseudoContentAndIncs ( source , pseudo , counterCtx )
541+ resolvePseudoContentAndIncs ( source , pseudo , counterCtx , sessionCache . __siblingCounters )
550542
551543 const bg = style . backgroundImage
552544 const bgColor = style . backgroundColor
@@ -587,18 +579,18 @@ const hasExplicitContent = !isNoExplicitContent && cleanContent !== ''
587579 if ( ! shouldRender ) {
588580 // Aun si no renderizamos caja, si el pseudo tenía increments, propagar a hermanos
589581 if ( incs && incs . length && source . parentElement ) {
590- const map = __siblingCounters . get ( source . parentElement ) || new Map ( )
582+ const map = sessionCache . __siblingCounters . get ( source . parentElement ) || new Map ( )
591583 // Para cada counter incrementado en el pseudo, guardar el valor resuelto final
592584 for ( const { name } of incs ) {
593585 if ( ! name ) continue
594586 // reconstruir valor final desde derived: volvemos a pedirlo
595587 // Usamos withSiblingOverrides + derive para ser consistentes
596- const baseWithSibs = withSiblingOverrides ( source , counterCtx )
588+ const baseWithSibs = withSiblingOverrides ( source , counterCtx , sessionCache . __siblingCounters )
597589 const derived = deriveCounterCtxForPseudo ( source , getStyle ( source , pseudo ) , baseWithSibs )
598590 const finalVal = derived . get ( source , name )
599591 map . set ( name , finalVal )
600592 }
601- __siblingCounters . set ( source . parentElement , map )
593+ sessionCache . __siblingCounters . set ( source . parentElement , map )
602594 }
603595 continue
604596 }
@@ -717,15 +709,15 @@ const hasExplicitContent = !isNoExplicitContent && cleanContent !== ''
717709
718710 // Antes de insertar, si hubo increments en el pseudo, propagar valor final a los hermanos
719711 if ( incs && incs . length && source . parentElement ) {
720- const map = __siblingCounters . get ( source . parentElement ) || new Map ( )
721- const baseWithSibs = withSiblingOverrides ( source , counterCtx )
712+ const map = sessionCache . __siblingCounters . get ( source . parentElement ) || new Map ( )
713+ const baseWithSibs = withSiblingOverrides ( source , counterCtx , sessionCache . __siblingCounters )
722714 const derived = deriveCounterCtxForPseudo ( source , getStyle ( source , pseudo ) , baseWithSibs )
723715 for ( const { name } of incs ) {
724716 if ( ! name ) continue
725717 const finalVal = derived . get ( source , name )
726718 map . set ( name , finalVal )
727719 }
728- __siblingCounters . set ( source . parentElement , map )
720+ sessionCache . __siblingCounters . set ( source . parentElement , map )
729721 }
730722
731723 if ( ! hasVisibleBox ) continue
0 commit comments