From 26c2b258b47d9150c65275dd90d7bf22e6e39584 Mon Sep 17 00:00:00 2001 From: nikneym Date: Wed, 1 Oct 2025 12:29:51 +0300 Subject: [PATCH 1/5] get_protocol: don't allocate for protocol string --- src/browser/html/elements.zig | 2 +- src/browser/html/location.zig | 5 +++-- src/browser/url/url.zig | 7 +++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/browser/html/elements.zig b/src/browser/html/elements.zig index e9e95fdf..a3104fa3 100644 --- a/src/browser/html/elements.zig +++ b/src/browser/html/elements.zig @@ -281,7 +281,7 @@ pub const HTMLAnchorElement = struct { // TODO return a disposable string pub fn get_protocol(self: *parser.Anchor, page: *Page) ![]const u8 { var u = try url(self, page); - return u.get_protocol(page); + return u.get_protocol(); } pub fn set_protocol(self: *parser.Anchor, v: []const u8, page: *Page) !void { diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index 339e62ba..7b1aeb6c 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -41,8 +41,9 @@ pub const Location = struct { return page.navigateFromWebAPI(href, .{ .reason = .script }); } - pub fn get_protocol(self: *Location, page: *Page) ![]const u8 { - return self.url.get_protocol(page); + pub fn get_protocol(self: *Location) []const u8 { + if (self.url) |*u| return u.get_protocol(); + return ""; } pub fn get_host(self: *Location, page: *Page) ![]const u8 { diff --git a/src/browser/url/url.zig b/src/browser/url/url.zig index 1288fea0..08c97bf6 100644 --- a/src/browser/url/url.zig +++ b/src/browser/url/url.zig @@ -164,8 +164,11 @@ pub const URL = struct { return aw.written(); } - pub fn get_protocol(self: *URL, page: *Page) ![]const u8 { - return try std.mem.concat(page.arena, u8, &[_][]const u8{ self.uri.scheme, ":" }); + pub fn get_protocol(self: *const URL) []const u8 { + // std.Uri keeps a pointer to "https", "http" (scheme part) so we know + // its followed by ':'. + const scheme = self.uri.scheme; + return scheme.ptr[0 .. scheme.len + 1]; } pub fn get_username(self: *URL) []const u8 { From 9b4ea7a0406b82e0fae57d0376e7aacd8ec10a84 Mon Sep 17 00:00:00 2001 From: nikneym Date: Wed, 1 Oct 2025 12:30:54 +0300 Subject: [PATCH 2/5] add an invalid url test * this test should not pass; it's related to implementation of `std.Uri` though. --- src/tests/url/url.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tests/url/url.html b/src/tests/url/url.html index a28a980a..f6b8301c 100644 --- a/src/tests/url/url.html +++ b/src/tests/url/url.html @@ -76,3 +76,8 @@ testing.expectEqual("", sk.hostname); testing.expectEqual("sveltekit-internal://", sk.href); + + From cea4f052ba4c6e17083026fef11c647bb406c07b Mon Sep 17 00:00:00 2001 From: nikneym Date: Wed, 1 Oct 2025 14:24:57 +0300 Subject: [PATCH 3/5] location: add `href` setter * `page.navigateFromWebAPI` seem to be not working while testing; `page.navigate` is preferred instead. --- src/browser/html/location.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index 7b1aeb6c..e3e2d871 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -41,6 +41,10 @@ pub const Location = struct { return page.navigateFromWebAPI(href, .{ .reason = .script }); } + pub fn set_href(_: *const Location, href: []const u8, page: *Page) !void { + return page.navigate(href, .{ .reason = .script }); + } + pub fn get_protocol(self: *Location) []const u8 { if (self.url) |*u| return u.get_protocol(); return ""; From 4c2b95d00b84d6ae3b5d18e71ccf40ac136b6d75 Mon Sep 17 00:00:00 2001 From: Halil Durak Date: Thu, 9 Oct 2025 12:43:30 +0300 Subject: [PATCH 4/5] always prefer `navigateFromWebAPI` when navigating from a web API --- src/browser/html/location.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index e3e2d871..d4f66d57 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -42,7 +42,7 @@ pub const Location = struct { } pub fn set_href(_: *const Location, href: []const u8, page: *Page) !void { - return page.navigate(href, .{ .reason = .script }); + return page.navigateFromWebAPI(href, .{ .reason = .script }); } pub fn get_protocol(self: *Location) []const u8 { From b8d4e3ac50b4fa47b47369076ca595d789a0053e Mon Sep 17 00:00:00 2001 From: Halil Durak Date: Fri, 10 Oct 2025 10:43:04 +0300 Subject: [PATCH 5/5] change after rebase --- src/browser/html/location.zig | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index d4f66d57..3e3e593b 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -41,13 +41,8 @@ pub const Location = struct { return page.navigateFromWebAPI(href, .{ .reason = .script }); } - pub fn set_href(_: *const Location, href: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(href, .{ .reason = .script }); - } - pub fn get_protocol(self: *Location) []const u8 { - if (self.url) |*u| return u.get_protocol(); - return ""; + return self.url.get_protocol(); } pub fn get_host(self: *Location, page: *Page) ![]const u8 {