[3.2.2] — 2026-03-29
Fixed
- Render crash on page load —
displayBlockswas referenced before itsconstdeclaration inrenderBlocks(), causing an uncaughtReferenceErrorin the popup. Sort and stats code now correctly follow thedisplayBlocksconstruction
Changed
- Block display logic extracted to
computeDisplayBlocks()— pure function with no DOM or global dependencies; fully covered by unit tests - Pi-hole blocklist lookups now parallel —
fetchBlocklistReasonsusesPromise.allSettled()instead of sequentialawaitper domain; significant speedup on popups with many blocked domains - Block objects never mutated during render — display classifications are computed as an immutable derived view; fixes subtle re-render inconsistencies on double
renderBlocks()calls blocklistCacheonly cleared on new data — filter toggles no longer trigger redundant API re-fetches to NextDNS/Pi-hole_activeDBseeded from bundled JSON before asyncinitDB()— eliminates the cold-start window where all domains classified as "Unknown"- DB empty state now visible — settings panel shows
⚠ DB failed to loadwarning instead of silently classifying everything as unknown blocksMap capped at 100 entries per tab — prevents unbounded memory growth on long-lived tracker-heavy pages- DB version only bumps when content changes — SHA-256 hash of compiled entries prevents spurious cache invalidation on code-only rebuilds