Merge pull request #2052 from lightpanda-io/xhr_expand_ref

Expand the lifetime of the XHR reference
This commit is contained in:
Karl Seguin
2026-03-31 20:59:28 +08:00
committed by GitHub
2 changed files with 18 additions and 4 deletions

View File

@@ -44,6 +44,7 @@ _page: *Page,
_proto: *XMLHttpRequestEventTarget,
_arena: Allocator,
_transfer: ?*HttpClient.Transfer = null,
_active_request: bool = false,
_url: [:0]const u8 = "",
_method: net_http.Method = .GET,
@@ -136,6 +137,14 @@ pub fn deinit(self: *XMLHttpRequest, session: *Session) void {
session.releaseArena(self._arena);
}
fn releaseSelfRef(self: *XMLHttpRequest) void {
if (self._active_request == false) {
return;
}
self.releaseRef(self._page._session);
self._active_request = false;
}
pub fn releaseRef(self: *XMLHttpRequest, session: *Session) void {
self._rc.release(self, session);
}
@@ -252,6 +261,8 @@ pub fn send(self: *XMLHttpRequest, body_: ?[]const u8) !void {
.error_callback = httpErrorCallback,
.shutdown_callback = httpShutdownCallback,
});
self.acquireRef();
self._active_request = true;
}
fn handleBlobUrl(self: *XMLHttpRequest, page: *Page) !void {
@@ -393,7 +404,6 @@ fn httpStartCallback(transfer: *HttpClient.Transfer) !void {
log.debug(.http, "request start", .{ .method = self._method, .url = self._url, .source = "xhr" });
}
self._transfer = transfer;
self.acquireRef();
}
fn httpHeaderCallback(transfer: *HttpClient.Transfer, header: net_http.Header) !void {
@@ -492,7 +502,7 @@ fn httpDoneCallback(ctx: *anyopaque) !void {
.loaded = loaded,
}, page);
self.releaseRef(page._session);
self.releaseSelfRef();
}
fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
@@ -501,8 +511,8 @@ fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
self.handleError(err);
if (self._transfer != null) {
self._transfer = null;
self.releaseRef(self._page._session);
}
self.releaseSelfRef();
}
fn httpShutdownCallback(ctx: *anyopaque) void {
@@ -515,8 +525,8 @@ pub fn abort(self: *XMLHttpRequest) void {
if (self._transfer) |transfer| {
self._transfer = null;
transfer.abort(error.Abort);
self.releaseRef(self._page._session);
}
self.releaseSelfRef();
}
fn handleError(self: *XMLHttpRequest, err: anyerror) void {

View File

@@ -237,6 +237,10 @@ pub fn RC(comptime T: type) type {
session.releaseArena(kv.value.arena);
}
}
pub fn format(self: @This(), writer: *std.Io.Writer) !void {
return writer.print("{d}", .{self._refs});
}
};
}