Skip to content

Commit 14eeffd

Browse files
committed
EventTarget internal type for all
1 parent 6b1eb4a commit 14eeffd

File tree

8 files changed

+34
-32
lines changed

8 files changed

+34
-32
lines changed

src/browser/dom/event_target.zig

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// You should have received a copy of the GNU Affero General Public License
1717
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818

19+
const std = @import("std");
1920
const Env = @import("../env.zig").Env;
2021
const parser = @import("../netsurf.zig");
2122
const Page = @import("../page.zig").Page;
@@ -39,33 +40,30 @@ pub const EventTarget = struct {
3940
// Extend libdom event target for pure zig struct.
4041
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .plain },
4142

42-
pub fn toInterface(e: *parser.Event, et: *parser.EventTarget, page: *Page) !Union {
43+
pub fn toInterface(et: *parser.EventTarget, page: *Page) !Union {
4344
// libdom assumes that all event targets are libdom nodes. They are not.
4445

45-
// The window is a common non-node target, but it's easy to handle as
46-
// its a singleton.
47-
if (@intFromPtr(et) == @intFromPtr(&page.window.base)) {
48-
return .{ .node = .{ .Window = &page.window } };
49-
}
50-
51-
if (try parser.eventTargetInternalType(et) == .plain) {
52-
return .{ .plain = et };
53-
}
54-
55-
// AbortSignal is another non-node target. It has a distinct usage though
56-
// so we hijack the event internal type to identity if.
57-
switch (try parser.eventGetInternalType(e)) {
46+
switch (try parser.eventTargetInternalType(et)) {
47+
.libdom_node => {
48+
return .{ .node = try nod.Node.toInterface(@as(*parser.Node, @ptrCast(et))) };
49+
},
50+
.plain => return .{ .plain = et },
5851
.abort_signal => {
52+
// AbortSignal is a special case, it has its own internal type.
53+
// We return it as a node, but we need to handle it differently.
5954
return .{ .node = .{ .AbortSignal = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) } };
6055
},
61-
.xhr_event => {
56+
.window => {
57+
// The window is a common non-node target, but it's easy to handle as its a singleton.
58+
std.debug.assert(@intFromPtr(et) == @intFromPtr(&page.window.base));
59+
return .{ .node = .{ .Window = &page.window } };
60+
},
61+
.xhr => {
6262
const XMLHttpRequestEventTarget = @import("../xhr/event_target.zig").XMLHttpRequestEventTarget;
6363
const base: *XMLHttpRequestEventTarget = @fieldParentPtr("base", @as(*parser.EventTargetTBase, @ptrCast(et)));
6464
return .{ .xhr = @fieldParentPtr("proto", base) };
6565
},
66-
else => {
67-
return .{ .node = try nod.Node.toInterface(@as(*parser.Node, @ptrCast(et))) };
68-
},
66+
else => return error.MissingEventTargetType,
6967
}
7068
}
7169

src/browser/dom/performance.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub const Performance = struct {
3939
pub const prototype = *EventTarget;
4040

4141
// Extend libdom event target for pure zig struct.
42-
base: parser.EventTargetTBase = parser.EventTargetTBase{},
42+
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .performance },
4343

4444
time_origin: std.time.Timer,
4545
// if (Window.crossOriginIsolated) -> Resolution in isolated contexts: 5 microseconds

src/browser/events/event.zig

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ pub const Event = struct {
7878
pub fn get_target(self: *parser.Event, page: *Page) !?EventTargetUnion {
7979
const et = try parser.eventTarget(self);
8080
if (et == null) return null;
81-
return try EventTarget.toInterface(self, et.?, page);
81+
return try EventTarget.toInterface(et.?, page);
8282
}
8383

8484
pub fn get_currentTarget(self: *parser.Event, page: *Page) !?EventTargetUnion {
8585
const et = try parser.eventCurrentTarget(self);
8686
if (et == null) return null;
87-
return try EventTarget.toInterface(self, et.?, page);
87+
return try EventTarget.toInterface(et.?, page);
8888
}
8989

9090
pub fn get_eventPhase(self: *parser.Event) !u8 {
@@ -215,7 +215,7 @@ pub const EventHandler = struct {
215215
.typ = try allocator.dupe(u8, typ),
216216
.signal_target = signal_target,
217217
.signal_listener = undefined,
218-
.node = .{.func = SignalCallback.handle },
218+
.node = .{ .func = SignalCallback.handle },
219219
};
220220

221221
scb.signal_listener = try parser.eventTargetAddEventListener(
@@ -285,7 +285,7 @@ const SignalCallback = struct {
285285
typ: []const u8,
286286
capture: bool,
287287
callback_id: usize,
288-
node : parser.EventNode,
288+
node: parser.EventNode,
289289
target: *parser.EventTarget,
290290
signal_target: *parser.EventTarget,
291291
signal_listener: *parser.EventListener,
@@ -435,11 +435,11 @@ test "Browser.Event" {
435435

436436
try runner.testCases(&.{
437437
.{ "nb = 0; function cbk(event) { nb ++; }", null },
438-
.{ "let ac = new AbortController()", null},
438+
.{ "let ac = new AbortController()", null },
439439
.{ "document.addEventListener('count', cbk, {signal: ac.signal})", null },
440440
.{ "document.dispatchEvent(new Event('count'))", "true" },
441441
.{ "document.dispatchEvent(new Event('count'))", "true" },
442-
.{ "ac.abort()", null},
442+
.{ "ac.abort()", null },
443443
.{ "document.dispatchEvent(new Event('count'))", "true" },
444444
.{ "nb", "2" },
445445
.{ "document.removeEventListener('count', cbk)", "undefined" },

src/browser/html/AbortController.zig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ pub const AbortSignal = struct {
5656
const DEFAULT_REASON = "AbortError";
5757

5858
pub const prototype = *EventTarget;
59-
proto: parser.EventTargetTBase = .{},
59+
proto: parser.EventTargetTBase = .{ .internal_target_type = .abort_signal },
6060

6161
aborted: bool,
6262
reason: ?[]const u8,
6363

6464
pub const init: AbortSignal = .{
65-
.proto = .{},
6665
.reason = null,
6766
.aborted = false,
6867
};

src/browser/html/media_query_list.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub const MediaQueryList = struct {
2626

2727
// Extend libdom event target for pure zig struct.
2828
// This is not safe as it relies on a structure layout that isn't guaranteed
29-
base: parser.EventTargetTBase = parser.EventTargetTBase{},
29+
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .media_query_list },
3030

3131
matches: bool,
3232
media: []const u8,

src/browser/html/window.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub const Window = struct {
4545
pub const prototype = *EventTarget;
4646

4747
// Extend libdom event target for pure zig struct.
48-
base: parser.EventTargetTBase = parser.EventTargetTBase{},
48+
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .window },
4949

5050
document: *parser.DocumentHTML,
5151
target: []const u8 = "",

src/browser/netsurf.zig

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,8 +779,13 @@ pub fn eventTargetTBaseFieldName(comptime T: type) ?[]const u8 {
779779
pub const EventTargetTBase = extern struct {
780780
const Self = @This();
781781
const InternalType = enum(u32) {
782-
libdom = 0,
782+
libdom_node = 0,
783783
plain = 1,
784+
abort_signal = 2,
785+
xhr = 3,
786+
window = 4,
787+
performance = 5,
788+
media_query_list = 6,
784789
};
785790

786791
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{
@@ -802,7 +807,7 @@ pub const EventTargetTBase = extern struct {
802807
refcnt: u32 = 0,
803808

804809
eti: c.dom_event_target_internal = c.dom_event_target_internal{ .listeners = null },
805-
internal_target_type: InternalType = .libdom,
810+
internal_target_type: InternalType,
806811

807812
pub fn add_event_listener(et: [*c]c.dom_event_target, t: [*c]c.dom_string, l: ?*c.struct_dom_event_listener, capture: bool) callconv(.C) c.dom_exception {
808813
const self = @as(*Self, @ptrCast(et));

src/browser/xhr/event_target.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub const XMLHttpRequestEventTarget = struct {
3131
pub const prototype = *EventTarget;
3232

3333
// Extend libdom event target for pure zig struct.
34-
base: parser.EventTargetTBase = parser.EventTargetTBase{},
34+
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .xhr },
3535

3636
onloadstart_cbk: ?Function = null,
3737
onprogress_cbk: ?Function = null,

0 commit comments

Comments
 (0)