diff --git a/src/browser/webapi/element/html/Image.zig b/src/browser/webapi/element/html/Image.zig index fa6357eb..4a675e6b 100644 --- a/src/browser/webapi/element/html/Image.zig +++ b/src/browser/webapi/element/html/Image.zig @@ -36,14 +36,6 @@ pub fn asNode(self: *Image) *Node { return self.asElement().asNode(); } -pub fn getOnLoad(self: *Image, page: *Page) ?js.Function.Global { - return page._event_manager.getInlineListener(self.asElement().asEventTarget(), .load); -} - -pub fn setOnLoad(self: *Image, callback: js.Function.Global, page: *Page) !void { - return page._event_manager.setInlineListener(self.asElement().asEventTarget(), .load, callback); -} - pub fn getSrc(self: *const Image, page: *Page) ![]const u8 { const element = self.asConstElement(); const src = element.getAttributeSafe(comptime .wrap("src")) orelse return ""; @@ -152,7 +144,6 @@ pub const JsApi = struct { }; pub const constructor = bridge.constructor(Image.constructor, .{}); - pub const onload = bridge.accessor(Image.getOnLoad, Image.setOnLoad, .{}); pub const src = bridge.accessor(Image.getSrc, Image.setSrc, .{}); pub const alt = bridge.accessor(Image.getAlt, Image.setAlt, .{}); pub const width = bridge.accessor(Image.getWidth, Image.setWidth, .{}); @@ -195,84 +186,6 @@ fn dispatchLoadEvent(raw: *anyopaque) !?u32 { return null; } -pub const Build = struct { - pub fn created(node: *Node, page: *Page) !void { - const self = node.as(Image); - const image = self.asElement(); - // Exit if src not set. We might want to check if src point to valid image. - _ = image.getAttributeSafe("src") orelse return; - - // Set `onload` if provided. - blk: { - // Exit if there's no `onload`. - const on_load_str = image.getAttributeSafe("onload") orelse break :blk; - // Derive function from string. - const on_load_func = page.js.stringToPersistedFunction(on_load_str) catch |err| { - log.err(.js, "Image.onload", .{ .err = err, .str = on_load_str }); - break :blk; - }; - // Set onload. - try self.setOnLoad(on_load_func, page); - } - - // Since src set, we should send dispatch operation to Scheduler. - const args = try page._factory.create(CallbackParams{ - .page = page, - .element = image, - }); - errdefer page._factory.destroy(args); - - // Execute it asynchronously; Chrome and FF seem to do like this. - // We may change the behavior if its inconsistent. - // - // I'm well aware that such scenario is possible: - // imageElement.onload = () => console.warn("HA HA HA overwritten!"); - // - // this is allowed both in Chrome and FF. Honestly it makes the logic - // quite easier, which might be the reason. - return page.scheduler.add( - args, - dispatchLoadEvent, - 0, - .{ - .low_priority = false, - .name = "Image.Build.created", - }, - ); - } - - pub fn attributeChange( - element: *Element, - attr_name: []const u8, - attr_value: []const u8, - page: *Page, - ) !void { - const self = element.as(Image); - const image = self.asElement(); - - const src_changed = std.mem.eql(u8, attr_name, "src") and attr_value.len > 0; - if (src_changed) { - // Have to do this since `Scheduler` only allow passing a single arg. - const args = try page._factory.create(CallbackParams{ - .page = page, - .element = image, - }); - errdefer page._factory.destroy(args); - - // We don't actually fetch the media, here we fake the load call. - try page.scheduler.add( - args, - dispatchLoadEvent, - 0, - .{ - .low_priority = false, - .name = "Image.Build.attributeChange", - }, - ); - } - } -}; - const testing = @import("../../../../testing.zig"); test "WebApi: HTML.Image" { try testing.htmlRunner("element/html/image.html", .{});