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 {