From fec212ab94c80e57d548691d9cf35931b3ce4d05 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 26 Feb 2024 10:57:51 +0100 Subject: [PATCH] window: use window as global object --- src/browser/browser.zig | 4 +--- src/html/window.zig | 1 + src/main.zig | 10 ++++------ src/main_get.zig | 1 + src/main_shell.zig | 10 ++++------ src/main_wpt.zig | 1 + src/run_tests.zig | 10 ++++------ src/wpt/run.zig | 26 +++++--------------------- vendor/jsruntime-lib | 2 +- 9 files changed, 22 insertions(+), 43 deletions(-) diff --git a/src/browser/browser.zig b/src/browser/browser.zig index da44f684..f901b2c3 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -240,9 +240,7 @@ pub const Page = struct { // add global objects log.debug("setup global env", .{}); - try self.session.env.addObject(self.session.window, "window"); - try self.session.env.addObject(self.session.window, "self"); - try self.session.env.addObject(html_doc, "document"); + try self.session.env.bindGlobal(self.session.window); // browse the DOM tree to retrieve scripts // TODO execute the synchronous scripts during the HTL parsing. diff --git a/src/html/window.zig b/src/html/window.zig index b61c11f0..e1080267 100644 --- a/src/html/window.zig +++ b/src/html/window.zig @@ -9,6 +9,7 @@ const EventTarget = @import("../dom/event_target.zig").EventTarget; pub const Window = struct { pub const prototype = *EventTarget; pub const mem_guarantied = true; + pub const global_type = true; // Extend libdom event target for pure zig struct. base: parser.EventTargetTBase = parser.EventTargetTBase{}, diff --git a/src/main.zig b/src/main.zig index 4469cddb..7bb1a24d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -4,6 +4,7 @@ const jsruntime = @import("jsruntime"); const parser = @import("netsurf.zig"); const apiweb = @import("apiweb.zig"); +const Window = @import("html/window.zig").Window; pub const Types = jsruntime.reflect(apiweb.Interfaces); @@ -16,17 +17,14 @@ fn execJS( alloc: std.mem.Allocator, js_env: *jsruntime.Env, ) anyerror!void { - // start JS env try js_env.start(alloc); defer js_env.stop(); // alias global as self and window - try js_env.attachObject(try js_env.getGlobal(), "self", null); - try js_env.attachObject(try js_env.getGlobal(), "window", null); - - // add document object - try js_env.addObject(doc, "document"); + var window = Window.create(null); + window.replaceDocument(parser.documentHTMLToDocument(doc)); + try js_env.bindGlobal(window); while (true) { diff --git a/src/main_get.zig b/src/main_get.zig index bb84b0d8..33a7d11e 100644 --- a/src/main_get.zig +++ b/src/main_get.zig @@ -3,6 +3,7 @@ const Browser = @import("browser/browser.zig").Browser; const jsruntime = @import("jsruntime"); const apiweb = @import("apiweb.zig"); + pub const Types = jsruntime.reflect(apiweb.Interfaces); pub const std_options = struct { diff --git a/src/main_shell.zig b/src/main_shell.zig index 920c77bf..c1971f9f 100644 --- a/src/main_shell.zig +++ b/src/main_shell.zig @@ -4,6 +4,7 @@ const jsruntime = @import("jsruntime"); const parser = @import("netsurf.zig"); const apiweb = @import("apiweb.zig"); +const Window = @import("html/window.zig").Window; const html_test = @import("html_test.zig").html; @@ -15,17 +16,14 @@ fn execJS( alloc: std.mem.Allocator, js_env: *jsruntime.Env, ) anyerror!void { - // start JS env try js_env.start(alloc); defer js_env.stop(); // alias global as self and window - try js_env.attachObject(try js_env.getGlobal(), "self", null); - try js_env.attachObject(try js_env.getGlobal(), "window", null); - - // add document object - try js_env.addObject(doc, "document"); + var window = Window.create(null); + window.replaceDocument(parser.documentHTMLToDocument(doc)); + try js_env.bindGlobal(window); // launch shellExec try jsruntime.shellExec(alloc, js_env); diff --git a/src/main_wpt.zig b/src/main_wpt.zig index 4d4dde57..15133e6e 100644 --- a/src/main_wpt.zig +++ b/src/main_wpt.zig @@ -30,6 +30,7 @@ const Out = enum { }; pub const Types = jsruntime.reflect(apiweb.Interfaces); +pub const GlobalType = apiweb.GlobalType; // TODO For now the WPT tests run is specific to WPT. // It manually load js framwork libs, and run the first script w/ js content in diff --git a/src/run_tests.zig b/src/run_tests.zig index db7baa52..9341b640 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -41,10 +41,6 @@ fn testExecFn( try js_env.start(alloc); defer js_env.stop(); - // alias global as self and window - try js_env.attachObject(try js_env.getGlobal(), "self", null); - try js_env.attachObject(try js_env.getGlobal(), "window", null); - // document const file = try std.fs.cwd().openFile("test.html", .{}); defer file.close(); @@ -54,8 +50,10 @@ fn testExecFn( std.debug.print("documentHTMLClose error: {s}\n", .{@errorName(err)}); }; - // add document object - try js_env.addObject(doc, "document"); + // alias global as self and window + var window = Window.create(null); + window.replaceDocument(parser.documentHTMLToDocument(doc)); + try js_env.bindGlobal(window); // run test try execFn(alloc, js_env); diff --git a/src/wpt/run.zig b/src/wpt/run.zig index ae7e18e2..09fdc1b9 100644 --- a/src/wpt/run.zig +++ b/src/wpt/run.zig @@ -8,6 +8,7 @@ const parser = @import("../netsurf.zig"); const jsruntime = @import("jsruntime"); const Loop = jsruntime.Loop; const Env = jsruntime.Env; +const Window = @import("../html/window.zig").Window; const Types = @import("../main_wpt.zig").Types; @@ -50,31 +51,14 @@ pub fn run(arena: *std.heap.ArenaAllocator, comptime dir: []const u8, f: []const } // setup global env vars. - try js_env.attachObject(try js_env.getGlobal(), "self", null); - try js_env.attachObject(try js_env.getGlobal(), "window", null); - try js_env.addObject(html_doc, "document"); + var window = Window.create(null); + window.replaceDocument(doc); + try js_env.bindGlobal(window); // thanks to the arena, we don't need to deinit res. var res: jsruntime.JSResult = undefined; const init = - \\window.listeners = []; - \\window.document = document; - \\window.parent = window; - \\window.addEventListener = function (type, listener, options) { - \\ window.listeners.push({type: type, listener: listener, options: options}); - \\}; - \\window.dispatchEvent = function (event) { - \\ len = window.listeners.length; - \\ for (var i = 0; i < len; i++) { - \\ if (window.listeners[i].type == event.target) { - \\ window.listeners[i].listener(event); - \\ } - \\ } - \\ return true; - \\}; - \\window.removeEventListener = function () {}; - \\ \\console = []; \\console.log = function () { \\ console.push(...arguments); @@ -116,7 +100,7 @@ pub fn run(arena: *std.heap.ArenaAllocator, comptime dir: []const u8, f: []const } // Mark tests as ready to run. - res = try evalJS(js_env, alloc, "window.dispatchEvent({target: 'load'});", "ready"); + res = try evalJS(js_env, alloc, "window.dispatchEvent(new Event('load'));", "ready"); if (!res.success) { return res; } diff --git a/vendor/jsruntime-lib b/vendor/jsruntime-lib index 1456575d..77a014c7 160000 --- a/vendor/jsruntime-lib +++ b/vendor/jsruntime-lib @@ -1 +1 @@ -Subproject commit 1456575dbfd074cf690b8beff6a8764118534174 +Subproject commit 77a014c7c26079c28258fe2dbcf3bbfc695c67bc