diff --git a/src/browser/tests/window/window.html b/src/browser/tests/window/window.html
index b9d3d1d8..290f9874 100644
--- a/src/browser/tests/window/window.html
+++ b/src/browser/tests/window/window.html
@@ -5,6 +5,7 @@
testing.expectEqual(window, globalThis);
testing.expectEqual(window, self);
testing.expectEqual(window, window.self);
+ testing.expectEqual(null, window.opener);
testing.expectEqual(1080, innerHeight);
testing.expectEqual(1920, innerWidth);
diff --git a/src/browser/webapi/Window.zig b/src/browser/webapi/Window.zig
index bbcaa3b0..00b0ea2c 100644
--- a/src/browser/webapi/Window.zig
+++ b/src/browser/webapi/Window.zig
@@ -1,4 +1,4 @@
-// Copyright (C) 2023-2025 Lightpanda (Selecy SAS)
+// Copyright (C) 2023-2026 Lightpanda (Selecy SAS)
//
// Francis Bouvier
// Pierre Tachoire
@@ -421,6 +421,12 @@ pub fn getScrollY(self: *const Window) u32 {
return self._scroll_pos.y;
}
+pub fn getOpener(_: *const Window) ?*Window {
+ // This should return a window-like object in specific conditions. Would be
+ // pretty complicated to properly support I think.
+ return null;
+}
+
const ScrollToOpts = union(enum) {
x: i32,
opts: Opts,
@@ -749,6 +755,7 @@ pub const JsApi = struct {
pub const pageYOffset = bridge.accessor(Window.getScrollY, null, .{ .cache = "pageYOffset" });
pub const scrollTo = bridge.function(Window.scrollTo, .{});
pub const scroll = bridge.function(Window.scrollTo, .{});
+ pub const opener = bridge.accessor(Window.getOpener, null, .{});
};
const testing = @import("../../testing.zig");