From aa3a402f70a4901a7d8f57885a37c15c7edc74f8 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 4 Dec 2025 15:38:47 +0800 Subject: [PATCH] Link get/set rel Include stack trace on console.error Don't unnecessarily copy request header on fetch --- src/browser/webapi/Console.zig | 18 ++++++++++++------ src/browser/webapi/element/html/Link.zig | 9 +++++++++ src/browser/webapi/net/Request.zig | 7 ++++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/browser/webapi/Console.zig b/src/browser/webapi/Console.zig index 3563f1c5..81fdc54b 100644 --- a/src/browser/webapi/Console.zig +++ b/src/browser/webapi/Console.zig @@ -19,6 +19,7 @@ const std = @import("std"); const js = @import("../js/js.zig"); +const Page = @import("../Page.zig"); const logger = @import("../../log.zig"); const Console = @This(); @@ -26,25 +27,30 @@ _pad: bool = false, pub const init: Console = .{}; -pub fn log(_: *const Console, values: []js.Object) void { - logger.info(.js, "console.log", .{ValueWriter{ .values = values }}); +pub fn log(_: *const Console, values: []js.Object, page: *Page) void { + logger.info(.js, "console.log", .{ValueWriter{ .page = page, .values = values }}); } -pub fn warn(_: *const Console, values: []js.Object) void { - logger.warn(.js, "console.warn", .{ValueWriter{ .values = values }}); +pub fn warn(_: *const Console, values: []js.Object, page: *Page) void { + logger.warn(.js, "console.warn", .{ValueWriter{ .page = page, .values = values }}); } -pub fn @"error"(_: *const Console, values: []js.Object) void { - logger.warn(.js, "console.error", .{ValueWriter{ .values = values }}); +pub fn @"error"(_: *const Console, values: []js.Object, page: *Page) void { + logger.warn(.js, "console.error", .{ValueWriter{ .page = page, .values = values, .include_stack = true }}); } const ValueWriter = struct { + page: *Page, values: []js.Object, + include_stack: bool = false, pub fn format(self: ValueWriter, writer: *std.io.Writer) !void { for (self.values, 1..) |value, i| { try writer.print("\n arg({d}): {f}", .{ i, value }); } + if (self.include_stack) { + try writer.print("\n stack: {s}", .{self.page.js.stackTrace() catch |err| @errorName(err) orelse "???"}); + } } pub fn jsonStringify(self: ValueWriter, writer: *std.json.Stringify) !void { try writer.beginArray(); diff --git a/src/browser/webapi/element/html/Link.zig b/src/browser/webapi/element/html/Link.zig index 65e87917..b9db1e53 100644 --- a/src/browser/webapi/element/html/Link.zig +++ b/src/browser/webapi/element/html/Link.zig @@ -43,6 +43,14 @@ pub fn setHref(self: *Link, value: []const u8, page: *Page) !void { try self.asElement().setAttributeSafe("href", value, page); } +pub fn getRel(self: *Link) []const u8 { + return self.asElement().getAttributeSafe("rel") orelse return ""; +} + +pub fn setRel(self: *Link, value: []const u8, page: *Page) !void { + try self.asElement().setAttributeSafe("rel", value, page); +} + pub const JsApi = struct { pub const bridge = js.Bridge(Link); @@ -52,5 +60,6 @@ pub const JsApi = struct { pub var class_id: bridge.ClassId = undefined; }; + pub const rel = bridge.accessor(Link.getRel, Link.setRel, .{}); pub const href = bridge.accessor(Link.getHref, Link.setHref, .{}); }; diff --git a/src/browser/webapi/net/Request.zig b/src/browser/webapi/net/Request.zig index 9ca84c41..8dea853f 100644 --- a/src/browser/webapi/net/Request.zig +++ b/src/browser/webapi/net/Request.zig @@ -57,9 +57,10 @@ pub fn init(input: Input, opts_: ?InitOpts, page: *Page) !*Request { .request => |r| r._method, }; - const headers = if (opts.headers) |header_init| - try Headers.init(header_init, page) - else switch (input) { + const headers = if (opts.headers) |headers_init| switch (headers_init) { + .obj => |h| h, + else => try Headers.init(headers_init, page), + } else switch (input) { .url => null, .request => |r| r._headers, };