diff --git a/src/browser/tests/css/stylesheet.html b/src/browser/tests/css/stylesheet.html
index ec7928af..84e99658 100644
--- a/src/browser/tests/css/stylesheet.html
+++ b/src/browser/tests/css/stylesheet.html
@@ -419,3 +419,57 @@
testing.expectEqual('anchor-size(--foo width, anchor-size(--bar height))', div.style.width);
}
+
+
+
+
+
+
diff --git a/src/browser/tests/element/html/style.html b/src/browser/tests/element/html/style.html
index 8abbb229..ee393846 100644
--- a/src/browser/tests/element/html/style.html
+++ b/src/browser/tests/element/html/style.html
@@ -131,3 +131,17 @@
testing.eventually(() => testing.expectEqual(true, result));
}
+
+
diff --git a/src/browser/webapi/css/CSSRule.zig b/src/browser/webapi/css/CSSRule.zig
index dcf41db9..6b03c53e 100644
--- a/src/browser/webapi/css/CSSRule.zig
+++ b/src/browser/webapi/css/CSSRule.zig
@@ -2,29 +2,42 @@ const std = @import("std");
const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
+const CSSStyleRule = @import("CSSStyleRule.zig");
+
const CSSRule = @This();
-pub const Type = enum(u16) {
- style = 1,
- charset = 2,
- import = 3,
- media = 4,
- font_face = 5,
- page = 6,
- keyframes = 7,
- keyframe = 8,
- margin = 9,
- namespace = 10,
- counter_style = 11,
- supports = 12,
- document = 13,
- font_feature_values = 14,
- viewport = 15,
- region_style = 16,
+pub const Type = union(enum) {
+ style: *CSSStyleRule,
+ charset: void,
+ import: void,
+ media: void,
+ font_face: void,
+ page: void,
+ keyframes: void,
+ keyframe: void,
+ margin: void,
+ namespace: void,
+ counter_style: void,
+ supports: void,
+ document: void,
+ font_feature_values: void,
+ viewport: void,
+ region_style: void,
};
_type: Type,
+pub fn as(self: *CSSRule, comptime T: type) *T {
+ return self.is(T).?;
+}
+
+pub fn is(self: *CSSRule, comptime T: type) ?*T {
+ switch (self._type) {
+ .style => |r| return if (T == CSSStyleRule) r else null,
+ else => return null,
+ }
+}
+
pub fn init(rule_type: Type, page: *Page) !*CSSRule {
return page._factory.create(CSSRule{
._type = rule_type,
@@ -32,7 +45,7 @@ pub fn init(rule_type: Type, page: *Page) !*CSSRule {
}
pub fn getType(self: *const CSSRule) u16 {
- return @intFromEnum(self._type);
+ return @as(u16, @intFromEnum(std.meta.activeTag(self._type))) + 1;
}
pub fn getCssText(self: *const CSSRule, page: *Page) []const u8 {
diff --git a/src/browser/webapi/css/CSSStyleDeclaration.zig b/src/browser/webapi/css/CSSStyleDeclaration.zig
index ebaafbe0..e18bd459 100644
--- a/src/browser/webapi/css/CSSStyleDeclaration.zig
+++ b/src/browser/webapi/css/CSSStyleDeclaration.zig
@@ -180,8 +180,6 @@ pub fn getCssText(self: *const CSSStyleDeclaration, page: *Page) ![]const u8 {
}
pub fn setCssText(self: *CSSStyleDeclaration, text: []const u8, page: *Page) !void {
- if (self._element == null) return;
-
// Clear existing properties
var node = self._properties.first;
while (node) |n| {
@@ -197,6 +195,7 @@ pub fn setCssText(self: *CSSStyleDeclaration, text: []const u8, page: *Page) !vo
while (it.next()) |declaration| {
try self.setPropertyImpl(declaration.name, declaration.value, declaration.important, page);
}
+
try self.syncStyleAttribute(page);
}
diff --git a/src/browser/webapi/css/CSSStyleRule.zig b/src/browser/webapi/css/CSSStyleRule.zig
index 767ae46e..6d07ab5d 100644
--- a/src/browser/webapi/css/CSSStyleRule.zig
+++ b/src/browser/webapi/css/CSSStyleRule.zig
@@ -2,19 +2,20 @@ const std = @import("std");
const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
const CSSRule = @import("CSSRule.zig");
-const CSSStyleDeclaration = @import("CSSStyleDeclaration.zig");
+const CSSStyleProperties = @import("CSSStyleProperties.zig");
const CSSStyleRule = @This();
_proto: *CSSRule,
_selector_text: []const u8 = "",
-_style: ?*CSSStyleDeclaration = null,
+_style: ?*CSSStyleProperties = null,
pub fn init(page: *Page) !*CSSStyleRule {
- const rule = try CSSRule.init(.style, page);
- return page._factory.create(CSSStyleRule{
- ._proto = rule,
+ const style_rule = try page._factory.create(CSSStyleRule{
+ ._proto = undefined,
});
+ style_rule._proto = try CSSRule.init(.{ .style = style_rule }, page);
+ return style_rule;
}
pub fn getSelectorText(self: *const CSSStyleRule) []const u8 {
@@ -25,17 +26,18 @@ pub fn setSelectorText(self: *CSSStyleRule, text: []const u8, page: *Page) !void
self._selector_text = try page.dupeString(text);
}
-pub fn getStyle(self: *CSSStyleRule, page: *Page) !*CSSStyleDeclaration {
+pub fn getStyle(self: *CSSStyleRule, page: *Page) !*CSSStyleProperties {
if (self._style) |style| {
return style;
}
- const style = try CSSStyleDeclaration.init(null, false, page);
+ const style = try CSSStyleProperties.init(null, false, page);
self._style = style;
return style;
}
pub fn getCssText(self: *CSSStyleRule, page: *Page) ![]const u8 {
- const style = try self.getStyle(page);
+ const style_props = try self.getStyle(page);
+ const style = style_props.asCSSStyleDeclaration();
var buf = std.Io.Writer.Allocating.init(page.call_arena);
try buf.writer.print("{s} {{ ", .{self._selector_text});
try style.format(&buf.writer);
@@ -54,7 +56,7 @@ pub const JsApi = struct {
pub const Meta = struct {
pub const name = "CSSStyleRule";
- pub const prototype_chain = bridge.prototypeChain(CSSRule);
+ pub const prototype_chain = bridge.prototypeChain();
pub var class_id: bridge.ClassId = undefined;
};
diff --git a/src/browser/webapi/css/CSSStyleSheet.zig b/src/browser/webapi/css/CSSStyleSheet.zig
index 673ff370..7474ea50 100644
--- a/src/browser/webapi/css/CSSStyleSheet.zig
+++ b/src/browser/webapi/css/CSSStyleSheet.zig
@@ -62,7 +62,8 @@ pub fn insertRule(self: *CSSStyleSheet, rule: []const u8, index: u32, page: *Pag
const style_rule = try CSSStyleRule.init(page);
try style_rule.setSelectorText(parsed_rule.selector, page);
- const style = try style_rule.getStyle(page);
+ const style_props = try style_rule.getStyle(page);
+ const style = style_props.asCSSStyleDeclaration();
try style.setCssText(parsed_rule.block, page);
const rules = try self.getCssRules(page);
@@ -90,7 +91,8 @@ pub fn replaceSync(self: *CSSStyleSheet, text: []const u8, page: *Page) !void {
const style_rule = try CSSStyleRule.init(page);
try style_rule.setSelectorText(parsed_rule.selector, page);
- const style = try style_rule.getStyle(page);
+ const style_props = try style_rule.getStyle(page);
+ const style = style_props.asCSSStyleDeclaration();
try style.setCssText(parsed_rule.block, page);
try rules.insert(index, style_rule._proto, page);