diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 333240ab..9075c2a5 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -1035,47 +1035,6 @@ pub fn iframeAddedCallback(self: *Page, iframe: *Element.Html.IFrame) !void { } } -pub fn linkAddedCallback(self: *Page, link: *Element.Html.Link) !void { - // if we're planning on navigating to another page, don't trigger load event. - if (self.isGoingAway()) { - return; - } - - const element = link.asElement(); - // Exit if rel not set. - const rel = element.getAttributeSafe(comptime .wrap("rel")) orelse return; - // Exit if rel is not stylesheet. - if (!std.mem.eql(u8, rel, "stylesheet")) return; - // Exit if href not set. - const href = element.getAttributeSafe(comptime .wrap("href")) orelse return; - if (href.len == 0) return; - - try self._to_load.append(self.arena, link._proto); -} - -pub fn styleAddedCallback(self: *Page, style: *Element.Html.Style) !void { - // if we're planning on navigating to another page, don't trigger load event. - if (self.isGoingAway()) { - return; - } - - try self._to_load.append(self.arena, style._proto); -} - -pub fn imageAddedCallback(self: *Page, image: *Element.Html.Image) !void { - // if we're planning on navigating to another page, don't trigger load event. - if (self.isGoingAway()) { - return; - } - - const element = image.asElement(); - // Exit if src not set. - const src = element.getAttributeSafe(comptime .wrap("src")) orelse return; - if (src.len == 0) return; - - try self._to_load.append(self.arena, image._proto); -} - pub fn domChanged(self: *Page) void { self.version += 1; @@ -2886,12 +2845,12 @@ fn nodeIsReady(self: *Page, comptime from_parser: bool, node: *Node) !void { return err; }; } else if (node.is(Element.Html.Link)) |link| { - self.linkAddedCallback(link) catch |err| { + link.linkAddedCallback(self) catch |err| { log.err(.page, "page.nodeIsReady", .{ .err = err, .element = "link", .type = self._type }); return error.LinkLoadError; }; } else if (node.is(Element.Html.Style)) |style| { - self.styleAddedCallback(style) catch |err| { + style.styleAddedCallback(self) catch |err| { log.err(.page, "page.nodeIsReady", .{ .err = err, .element = "style", .type = self._type }); return error.StyleLoadError; }; diff --git a/src/browser/webapi/element/html/Image.zig b/src/browser/webapi/element/html/Image.zig index 6277a613..c8fba91e 100644 --- a/src/browser/webapi/element/html/Image.zig +++ b/src/browser/webapi/element/html/Image.zig @@ -53,7 +53,7 @@ pub fn setSrc(self: *Image, value: []const u8, page: *Page) !void { const element = self.asElement(); try element.setAttributeSafe(comptime .wrap("src"), .wrap(value), page); // No need to check if `Image` is connected to DOM; this is a special case. - return page.imageAddedCallback(self); + return self.imageAddedCallback(page); } pub fn getAlt(self: *const Image) []const u8 { @@ -123,6 +123,21 @@ pub fn getComplete(_: *const Image) bool { return true; } +/// Used in `Page.nodeIsReady`. +pub fn imageAddedCallback(self: *Image, page: *Page) !void { + // if we're planning on navigating to another page, don't trigger load event. + if (page.isGoingAway()) { + return; + } + + const element = self.asElement(); + // Exit if src not set. + const src = element.getAttributeSafe(comptime .wrap("src")) orelse return; + if (src.len == 0) return; + + try page._to_load.append(page.arena, self._proto); +} + pub const JsApi = struct { pub const bridge = js.Bridge(Image); @@ -148,7 +163,7 @@ pub const JsApi = struct { pub const Build = struct { pub fn created(node: *Node, page: *Page) !void { const self = node.as(Image); - return page.imageAddedCallback(self); + return self.imageAddedCallback(page); } }; diff --git a/src/browser/webapi/element/html/Link.zig b/src/browser/webapi/element/html/Link.zig index ca2b0cbe..fe56bd89 100644 --- a/src/browser/webapi/element/html/Link.zig +++ b/src/browser/webapi/element/html/Link.zig @@ -54,7 +54,7 @@ pub fn setHref(self: *Link, value: []const u8, page: *Page) !void { try element.setAttributeSafe(comptime .wrap("href"), .wrap(value), page); if (element.asNode().isConnected()) { - try page.linkAddedCallback(self); + try self.linkAddedCallback(page); } } @@ -86,6 +86,24 @@ pub fn setCrossOrigin(self: *Link, value: []const u8, page: *Page) !void { return self.asElement().setAttributeSafe(comptime .wrap("crossOrigin"), .wrap(normalized), page); } +pub fn linkAddedCallback(self: *Link, page: *Page) !void { + // if we're planning on navigating to another page, don't trigger load event. + if (page.isGoingAway()) { + return; + } + + const element = self.asElement(); + // Exit if rel not set. + const rel = element.getAttributeSafe(comptime .wrap("rel")) orelse return; + // Exit if rel is not stylesheet. + if (!std.mem.eql(u8, rel, "stylesheet")) return; + // Exit if href not set. + const href = element.getAttributeSafe(comptime .wrap("href")) orelse return; + if (href.len == 0) return; + + try page._to_load.append(page.arena, self._proto); +} + pub const JsApi = struct { pub const bridge = js.Bridge(Link); diff --git a/src/browser/webapi/element/html/Style.zig b/src/browser/webapi/element/html/Style.zig index 9d97e2cc..131b7634 100644 --- a/src/browser/webapi/element/html/Style.zig +++ b/src/browser/webapi/element/html/Style.zig @@ -97,6 +97,15 @@ pub fn getSheet(self: *Style, page: *Page) !?*CSSStyleSheet { return sheet; } +pub fn styleAddedCallback(self: *Style, page: *Page) !void { + // if we're planning on navigating to another page, don't trigger load event. + if (page.isGoingAway()) { + return; + } + + try page._to_load.append(page.arena, self._proto); +} + pub const JsApi = struct { pub const bridge = js.Bridge(Style);