diff --git a/src/browser/Session.zig b/src/browser/Session.zig index 9639335c..d5be2442 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -258,6 +258,10 @@ fn installNewActivePage(self: *Session, frame_id: u32) !*Frame { // the pointer on Frame is just returned as a convenience pub fn createPage(self: *Session) !*Frame { lp.assert(self._active == null, "Session.createPage - page not null", .{}); + + // Drain any pending Page deinits now, while we're at a known-safe point + self.processQueuedDestroyed(); + if (comptime IS_DEBUG) { log.debug(.browser, "create page", .{}); } diff --git a/src/browser/StyleManager.zig b/src/browser/StyleManager.zig index 723a9a51..fbe59356 100644 --- a/src/browser/StyleManager.zig +++ b/src/browser/StyleManager.zig @@ -89,7 +89,13 @@ fn parseSheet(self: *StyleManager, sheet: *CSSStyleSheet) !void { const text = try style.asNode().getTextContentAlloc(self.arena); var it = CssParser.parseStylesheet(text); while (it.next()) |parsed_rule| { - try self.addRawRule(parsed_rule.selector, parsed_rule.block); + // StyleManager only filters on regular style rules (display, + // visibility, opacity). At-rules don't carry top-level + // declarations relevant here -- skip them. + switch (parsed_rule) { + .style => |s| try self.addRawRule(s.selector, s.block), + .at_rule => {}, + } } } } diff --git a/src/browser/css/Parser.zig b/src/browser/css/Parser.zig index 53488d96..a403aba3 100644 --- a/src/browser/css/Parser.zig +++ b/src/browser/css/Parser.zig @@ -294,11 +294,36 @@ fn isBang(token: Tokenizer.Token) bool { }; } -pub const Rule = struct { +pub const StyleRule = struct { selector: []const u8, block: []const u8, }; +/// An at-rule (`@keyframes`, `@media`, `@supports`, `@font-face`, etc.). +/// +/// We don't apply at-rules to the page (the CSS engine doesn't process them +/// yet), but we do surface them so that JS-side reads via `cssRules` see +/// what was inserted. CSS-in-JS libraries (styled-components, emotion, +/// Stitches, Mantine) deduplicate their stylesheets by reading back +/// `cssRules` after `insertRule` -- if the rule is missing they fall back to +/// per-render `