diff --git a/src/browser/Page.zig b/src/browser/Page.zig
index a8d063b4..7c6bcac4 100644
--- a/src/browser/Page.zig
+++ b/src/browser/Page.zig
@@ -69,6 +69,7 @@ const ArenaPool = App.ArenaPool;
const timestamp = @import("../datetime.zig").timestamp;
const milliTimestamp = @import("../datetime.zig").milliTimestamp;
+const IFrame = Element.Html.IFrame;
const WebApiURL = @import("webapi/URL.zig");
const GlobalEventHandlersLookup = @import("webapi/global_event_handlers.zig").Lookup;
@@ -223,7 +224,7 @@ _arena_pool_leak_track: (if (IS_DEBUG) std.AutoHashMapUnmanaged(usize, struct {
parent: ?*Page,
window: *Window,
document: *Document,
-iframe: ?*Element.Html.IFrame = null,
+iframe: ?*IFrame = null,
frames: std.ArrayList(*Page) = .{},
frames_sorted: bool = true,
@@ -566,62 +567,76 @@ pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !voi
};
}
-// We cannot navigate immediately as navigating will delete the DOM tree,
-// which holds this event's node.
-// As such we schedule the function to be called as soon as possible.
-pub fn scheduleNavigation(self: *Page, request_url: []const u8, opts: NavigateOpts, priority: NavigationPriority) !void {
- if (self.canScheduleNavigation(priority) == false) {
+// Navigation can happen in many places, such as executing a
-
-
-
+
diff --git a/src/browser/tests/frames/support/with_link.html b/src/browser/tests/frames/support/with_link.html
index 2fd9ca77..bc31b190 100644
--- a/src/browser/tests/frames/support/with_link.html
+++ b/src/browser/tests/frames/support/with_link.html
@@ -1,2 +1,2 @@
-a link
+a link
diff --git a/src/browser/webapi/HTMLDocument.zig b/src/browser/webapi/HTMLDocument.zig
index 9efde318..15ba610b 100644
--- a/src/browser/webapi/HTMLDocument.zig
+++ b/src/browser/webapi/HTMLDocument.zig
@@ -180,8 +180,8 @@ pub fn getLocation(self: *const HTMLDocument) ?*@import("Location.zig") {
return self._proto._location;
}
-pub fn setLocation(_: *const HTMLDocument, url: [:0]const u8, page: *Page) !void {
- return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .script);
+pub fn setLocation(self: *HTMLDocument, url: [:0]const u8, page: *Page) !void {
+ return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .{ .script = self._proto._page });
}
pub fn getAll(self: *HTMLDocument, page: *Page) !*collections.HTMLAllCollection {
diff --git a/src/browser/webapi/Location.zig b/src/browser/webapi/Location.zig
index dbda1e51..9055abbb 100644
--- a/src/browser/webapi/Location.zig
+++ b/src/browser/webapi/Location.zig
@@ -83,19 +83,19 @@ pub fn setHash(_: *const Location, hash: []const u8, page: *Page) !void {
return page.scheduleNavigation(normalized_hash, .{
.reason = .script,
.kind = .{ .replace = null },
- }, .script);
+ }, .{ .script = page });
}
pub fn assign(_: *const Location, url: [:0]const u8, page: *Page) !void {
- return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .script);
+ return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .{ .script = page });
}
pub fn replace(_: *const Location, url: [:0]const u8, page: *Page) !void {
- return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .replace = null } }, .script);
+ return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .replace = null } }, .{ .script = page });
}
pub fn reload(_: *const Location, page: *Page) !void {
- return page.scheduleNavigation(page.url, .{ .reason = .script, .kind = .reload }, .script);
+ return page.scheduleNavigation(page.url, .{ .reason = .script, .kind = .reload }, .{ .script = page });
}
pub fn toString(self: *const Location, page: *const Page) ![:0]const u8 {
diff --git a/src/browser/webapi/Window.zig b/src/browser/webapi/Window.zig
index 91f55b60..2c3e3cd0 100644
--- a/src/browser/webapi/Window.zig
+++ b/src/browser/webapi/Window.zig
@@ -160,8 +160,8 @@ pub fn getSelection(self: *const Window) *Selection {
return &self._document._selection;
}
-pub fn setLocation(_: *const Window, url: [:0]const u8, page: *Page) !void {
- return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .script);
+pub fn setLocation(self: *Window, url: [:0]const u8, page: *Page) !void {
+ return page.scheduleNavigation(url, .{ .reason = .script, .kind = .{ .push = null } }, .{ .script = self._page });
}
pub fn getHistory(_: *Window, page: *Page) *History {
diff --git a/src/browser/webapi/element/html/IFrame.zig b/src/browser/webapi/element/html/IFrame.zig
index e9cffc6e..d912dd41 100644
--- a/src/browser/webapi/element/html/IFrame.zig
+++ b/src/browser/webapi/element/html/IFrame.zig
@@ -30,7 +30,7 @@ const IFrame = @This();
_proto: *HtmlElement,
_src: []const u8 = "",
_executed: bool = false,
-_content_window: ?*Window = null,
+_window: ?*Window = null,
pub fn asElement(self: *IFrame) *Element {
return self._proto._proto;
@@ -40,11 +40,11 @@ pub fn asNode(self: *IFrame) *Node {
}
pub fn getContentWindow(self: *const IFrame) ?*Window {
- return self._content_window;
+ return self._window;
}
pub fn getContentDocument(self: *const IFrame) ?*Document {
- const window = self._content_window orelse return null;
+ const window = self._window orelse return null;
return window._document;
}
diff --git a/src/browser/webapi/navigation/Navigation.zig b/src/browser/webapi/navigation/Navigation.zig
index e81ff46e..447f5e00 100644
--- a/src/browser/webapi/navigation/Navigation.zig
+++ b/src/browser/webapi/navigation/Navigation.zig
@@ -308,7 +308,7 @@ pub fn navigateInner(
_ = try self.pushEntry(url, .{ .source = .navigation, .value = state }, page, true);
} else {
- try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script);
+ try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .{ .script = page });
}
},
.replace => |state| {
@@ -321,7 +321,7 @@ pub fn navigateInner(
_ = try self.replaceEntry(url, .{ .source = .navigation, .value = state }, page, true);
} else {
- try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script);
+ try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .{ .script = page });
}
},
.traverse => |index| {
@@ -334,11 +334,11 @@ pub fn navigateInner(
// todo: Fire navigate event
finished.resolve("navigation traverse", {});
} else {
- try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script);
+ try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .{ .script = page });
}
},
.reload => {
- try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script);
+ try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .{ .script = page });
},
}