mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-02-04 14:33:47 +00:00
try to improve page re-navigate (reset) memory usage
This commit is contained in:
@@ -178,7 +178,6 @@ pub fn init(arena: Allocator, call_arena: Allocator, session: *Session) !*Page {
|
|||||||
page.call_arena = call_arena;
|
page.call_arena = call_arena;
|
||||||
page._session = session;
|
page._session = session;
|
||||||
|
|
||||||
page.scheduler = Scheduler.init(page.arena);
|
|
||||||
try page.reset(true);
|
try page.reset(true);
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
@@ -207,32 +206,33 @@ pub fn deinit(self: *Page) void {
|
|||||||
|
|
||||||
fn reset(self: *Page, comptime initializing: bool) !void {
|
fn reset(self: *Page, comptime initializing: bool) !void {
|
||||||
if (comptime initializing == false) {
|
if (comptime initializing == false) {
|
||||||
self.scheduler.reset();
|
self._session.executor.removeContext();
|
||||||
|
self._script_manager.shutdown = true;
|
||||||
|
self._session.browser.http_client.abort();
|
||||||
|
self._script_manager.deinit();
|
||||||
|
_ = self._session.browser.page_arena.reset(.{ .retain_with_limit = 1 * 1024 * 1024 });
|
||||||
}
|
}
|
||||||
|
|
||||||
self._factory = Factory.init(self);
|
self._factory = Factory.init(self);
|
||||||
|
self.scheduler = Scheduler.init(self.arena);
|
||||||
|
|
||||||
self.version = 0;
|
self.version = 0;
|
||||||
self.url = "about:blank";
|
self.url = "about:blank";
|
||||||
|
|
||||||
self.document = (try self._factory.document(Node.Document.HTMLDocument{ ._proto = undefined })).asDocument();
|
self.document = (try self._factory.document(Node.Document.HTMLDocument{ ._proto = undefined })).asDocument();
|
||||||
|
|
||||||
if (comptime initializing == true) {
|
const storage_bucket = try self._factory.create(storage.Bucket{});
|
||||||
const storage_bucket = try self._factory.create(storage.Bucket{});
|
const screen = try Screen.init(self);
|
||||||
const screen = try Screen.init(self);
|
self.window = try self._factory.eventTarget(Window{
|
||||||
self.window = try self._factory.eventTarget(Window{
|
._document = self.document,
|
||||||
._document = self.document,
|
._storage_bucket = storage_bucket,
|
||||||
._storage_bucket = storage_bucket,
|
._performance = Performance.init(),
|
||||||
._performance = Performance.init(),
|
._proto = undefined,
|
||||||
._proto = undefined,
|
._location = &default_location,
|
||||||
._location = &default_location,
|
._screen = screen,
|
||||||
._screen = screen,
|
});
|
||||||
});
|
self.window._document = self.document;
|
||||||
} else {
|
self.window._location = &default_location;
|
||||||
self.window._document = self.document;
|
|
||||||
self.window._location = &default_location;
|
|
||||||
// TODO reset _custom_elements?
|
|
||||||
}
|
|
||||||
|
|
||||||
self._parse_state = .pre;
|
self._parse_state = .pre;
|
||||||
self._load_state = .parsing;
|
self._load_state = .parsing;
|
||||||
@@ -245,10 +245,8 @@ fn reset(self: *Page, comptime initializing: bool) !void {
|
|||||||
self._script_manager = ScriptManager.init(self);
|
self._script_manager = ScriptManager.init(self);
|
||||||
errdefer self._script_manager.deinit();
|
errdefer self._script_manager.deinit();
|
||||||
|
|
||||||
if (comptime initializing == true) {
|
self.js = try self._session.executor.createContext(self, true);
|
||||||
self.js = try self._session.executor.createContext(self, true);
|
errdefer self.js.deinit();
|
||||||
errdefer self.js.deinit();
|
|
||||||
}
|
|
||||||
|
|
||||||
self._element_styles = .{};
|
self._element_styles = .{};
|
||||||
self._element_datasets = .{};
|
self._element_datasets = .{};
|
||||||
@@ -310,24 +308,6 @@ pub fn isSameOrigin(self: *const Page, url: [:0]const u8) !bool {
|
|||||||
pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !void {
|
pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !void {
|
||||||
const session = self._session;
|
const session = self._session;
|
||||||
|
|
||||||
const resolved_url = try URL.resolve(
|
|
||||||
self.arena,
|
|
||||||
self.url,
|
|
||||||
request_url,
|
|
||||||
.{ .always_dupe = true },
|
|
||||||
);
|
|
||||||
|
|
||||||
// setting opts.force = true will force a page load.
|
|
||||||
// otherwise, we will need to ensure this is a true (not document) navigation.
|
|
||||||
if (!opts.force and URL.eqlDocument(self.url, resolved_url)) {
|
|
||||||
// update page url
|
|
||||||
self.url = resolved_url;
|
|
||||||
self.window._location = try Location.init(self.url, self);
|
|
||||||
self.document._location = self.window._location;
|
|
||||||
try session.navigation.updateEntries(resolved_url, opts.kind, self, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self._parse_state != .pre) {
|
if (self._parse_state != .pre) {
|
||||||
// it's possible for navigate to be called multiple times on the
|
// it's possible for navigate to be called multiple times on the
|
||||||
// same page (via CDP). We want to reset the page between each call.
|
// same page (via CDP). We want to reset the page between each call.
|
||||||
|
|||||||
@@ -47,14 +47,6 @@ pub fn init(allocator: std.mem.Allocator) Scheduler {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reset(self: *Scheduler) void {
|
|
||||||
self.low_priority.cap = 0;
|
|
||||||
self.low_priority.items.len = 0;
|
|
||||||
|
|
||||||
self.high_priority.cap = 0;
|
|
||||||
self.high_priority.items.len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AddOpts = struct {
|
const AddOpts = struct {
|
||||||
name: []const u8 = "",
|
name: []const u8 = "",
|
||||||
low_priority: bool = false,
|
low_priority: bool = false,
|
||||||
|
|||||||
Reference in New Issue
Block a user