diff --git a/src/browser/tests/element/html/style.html b/src/browser/tests/element/html/style.html
index 6c406d8a..713d8e2e 100644
--- a/src/browser/tests/element/html/style.html
+++ b/src/browser/tests/element/html/style.html
@@ -3,7 +3,46 @@
diff --git a/src/browser/webapi/css/CSSStyleSheet.zig b/src/browser/webapi/css/CSSStyleSheet.zig
index 493e6506..5500f63c 100644
--- a/src/browser/webapi/css/CSSStyleSheet.zig
+++ b/src/browser/webapi/css/CSSStyleSheet.zig
@@ -1,6 +1,7 @@
const std = @import("std");
const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
+const Element = @import("../Element.zig");
const CSSRuleList = @import("CSSRuleList.zig");
const CSSRule = @import("CSSRule.zig");
@@ -11,14 +12,18 @@ _title: []const u8 = "",
_disabled: bool = false,
_css_rules: ?*CSSRuleList = null,
_owner_rule: ?*CSSRule = null,
+_owner_node: ?*Element = null,
pub fn init(page: *Page) !*CSSStyleSheet {
return page._factory.create(CSSStyleSheet{});
}
-pub fn getOwnerNode(self: *const CSSStyleSheet) ?*CSSStyleSheet {
- _ = self;
- return null;
+pub fn initWithOwner(owner: *Element, page: *Page) !*CSSStyleSheet {
+ return page._factory.create(CSSStyleSheet{ ._owner_node = owner });
+}
+
+pub fn getOwnerNode(self: *const CSSStyleSheet) ?*Element {
+ return self._owner_node;
}
pub fn getHref(self: *const CSSStyleSheet) ?[]const u8 {
diff --git a/src/browser/webapi/element/html/Style.zig b/src/browser/webapi/element/html/Style.zig
index 483d07f7..a46f1dde 100644
--- a/src/browser/webapi/element/html/Style.zig
+++ b/src/browser/webapi/element/html/Style.zig
@@ -16,6 +16,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
+const std = @import("std");
const js = @import("../../../js/js.zig");
const Page = @import("../../../Page.zig");
@@ -25,6 +26,7 @@ const HtmlElement = @import("../Html.zig");
const Style = @This();
_proto: *HtmlElement,
+_sheet: ?*CSSStyleSheet = null,
pub fn asElement(self: *Style) *Element {
return self._proto._proto;
@@ -75,9 +77,24 @@ pub fn setDisabled(self: *Style, disabled: bool, page: *Page) !void {
}
const CSSStyleSheet = @import("../../css/CSSStyleSheet.zig");
-pub fn getSheet(_: *const Style) ?*CSSStyleSheet {
- // TODO?
- return null;
+pub fn getSheet(self: *Style, page: *Page) !?*CSSStyleSheet {
+ // Per spec, sheet is null for disconnected elements or non-CSS types.
+ // Valid types: absent (defaults to "text/css"), empty string, or
+ // case-insensitive match for "text/css".
+ if (!self.asNode().isConnected()) {
+ self._sheet = null;
+ return null;
+ }
+ const t = self.getType();
+ if (t.len != 0 and !std.ascii.eqlIgnoreCase(t, "text/css")) {
+ self._sheet = null;
+ return null;
+ }
+
+ if (self._sheet) |sheet| return sheet;
+ const sheet = try CSSStyleSheet.initWithOwner(self.asElement(), page);
+ self._sheet = sheet;
+ return sheet;
}
pub const JsApi = struct {