Skip to content

Commit d5363e5

Browse files
Merge pull request #1018 from lightpanda-io/fix_screen_event_target_prototype
Fix the Screen and ScreenOrientation prototype
2 parents 80adee8 + afd278c commit d5363e5

File tree

6 files changed

+79
-45
lines changed

6 files changed

+79
-45
lines changed

src/browser/dom/event_target.zig

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ pub const Union = union(enum) {
3131
xhr: *@import("../xhr/xhr.zig").XMLHttpRequest,
3232
plain: *parser.EventTarget,
3333
message_port: *@import("MessageChannel.zig").MessagePort,
34+
screen: *@import("../html/screen.zig").Screen,
35+
screen_orientation: *@import("../html/screen.zig").ScreenOrientation,
36+
performance: *@import("performance.zig").Performance,
37+
media_query_list: *@import("../html/media_query_list.zig").MediaQueryList,
3438
};
3539

3640
// EventTarget implementation
@@ -67,7 +71,18 @@ pub const EventTarget = struct {
6771
.message_port => {
6872
return .{ .message_port = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
6973
},
70-
else => return error.MissingEventTargetType,
74+
.screen => {
75+
return .{ .screen = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
76+
},
77+
.screen_orientation => {
78+
return .{ .screen_orientation = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
79+
},
80+
.performance => {
81+
return .{ .performance = @fieldParentPtr("base", @as(*parser.EventTargetTBase, @ptrCast(et))) };
82+
},
83+
.media_query_list => {
84+
return .{ .media_query_list = @fieldParentPtr("base", @as(*parser.EventTargetTBase, @ptrCast(et))) };
85+
},
7186
}
7287
}
7388

src/browser/html/error_event.zig

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -81,34 +81,6 @@ pub const ErrorEvent = struct {
8181
};
8282

8383
const testing = @import("../../testing.zig");
84-
test "Browser.HTML.ErrorEvent" {
85-
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "<div id=c></div>" });
86-
defer runner.deinit();
87-
88-
try runner.testCases(&.{
89-
.{ "let e1 = new ErrorEvent('err1')", null },
90-
.{ "e1.message", "" },
91-
.{ "e1.filename", "" },
92-
.{ "e1.lineno", "0" },
93-
.{ "e1.colno", "0" },
94-
.{ "e1.error", "undefined" },
95-
96-
.{
97-
\\ let e2 = new ErrorEvent('err1', {
98-
\\ message: 'm1',
99-
\\ filename: 'fx19',
100-
\\ lineno: 443,
101-
\\ colno: 8999,
102-
\\ error: 'under 9000!',
103-
\\
104-
\\})
105-
,
106-
null,
107-
},
108-
.{ "e2.message", "m1" },
109-
.{ "e2.filename", "fx19" },
110-
.{ "e2.lineno", "443" },
111-
.{ "e2.colno", "8999" },
112-
.{ "e2.error", "under 9000!" },
113-
}, .{});
84+
test "Browser: HTML.ErrorEvent" {
85+
try testing.htmlRunner("html/error_event.html");
11486
}

src/browser/html/screen.zig

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
const std = @import("std");
2020

21+
const parser = @import("../netsurf.zig");
2122
const EventTarget = @import("../dom/event_target.zig").EventTarget;
2223

2324
pub const Interfaces = .{
@@ -29,6 +30,8 @@ pub const Interfaces = .{
2930
pub const Screen = struct {
3031
pub const prototype = *EventTarget;
3132

33+
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen },
34+
3235
height: u32 = 1080,
3336
width: u32 = 1920,
3437
// https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDepth
@@ -83,6 +86,7 @@ pub const ScreenOrientation = struct {
8386

8487
angle: u32 = 0,
8588
type: ScreenOrientationType,
89+
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen_orientation },
8690

8791
pub fn get_angle(self: *const ScreenOrientation) u32 {
8892
return self.angle;
@@ -94,16 +98,6 @@ pub const ScreenOrientation = struct {
9498
};
9599

96100
const testing = @import("../../testing.zig");
97-
test "Browser.HTML.Screen" {
98-
var runner = try testing.jsRunner(testing.tracking_allocator, .{});
99-
defer runner.deinit();
100-
101-
try runner.testCases(&.{
102-
.{ "let screen = window.screen", "undefined" },
103-
.{ "screen.width === 1920", "true" },
104-
.{ "screen.height === 1080", "true" },
105-
.{ "let orientation = screen.orientation", "undefined" },
106-
.{ "orientation.angle === 0", "true" },
107-
.{ "orientation.type === \"landscape-primary\"", "true" },
108-
}, .{});
101+
test "Browser: HTML.Screen" {
102+
try testing.htmlRunner("html/screen.html");
109103
}

src/browser/netsurf.zig

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,8 +677,9 @@ pub fn eventTargetHasListener(
677677
var lst: ?*EventListener = null;
678678

679679
// iterate over the EventTarget's listeners
680+
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
680681
while (true) {
681-
const err = eventTargetVtable(et).iter_event_listener.?(
682+
const err = iter_event_listener(
682683
et,
683684
str,
684685
capture,
@@ -728,8 +729,9 @@ pub fn eventTargetRemoveAllEventListeners(et: *EventTarget) !void {
728729
var lst: ?*EventListener = null;
729730

730731
// iterate over the EventTarget's listeners
732+
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
731733
while (true) {
732-
const errIter = eventTargetVtable(et).iter_event_listener.?(
734+
const errIter = iter_event_listener(
733735
et,
734736
null,
735737
false,
@@ -806,6 +808,8 @@ pub const EventTargetTBase = extern struct {
806808
performance = 5,
807809
media_query_list = 6,
808810
message_port = 7,
811+
screen = 8,
812+
screen_orientation = 9,
809813
};
810814

811815
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{

src/tests/html/error_event.html

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<script src="../testing.js"></script>
2+
3+
<script id=ErrorEvent>
4+
let e1 = new ErrorEvent('err1')
5+
testing.expectEqual('', e1.message);
6+
testing.expectEqual('', e1.filename);
7+
testing.expectEqual(0, e1.lineno);
8+
testing.expectEqual(0, e1.colno);
9+
testing.expectEqual(undefined, e1.error);
10+
11+
let e2 = new ErrorEvent('err1', {
12+
message: 'm1',
13+
filename: 'fx19',
14+
lineno: 443,
15+
colno: 8999,
16+
error: 'under 9000!',
17+
});
18+
19+
testing.expectEqual('m1', e2.message);
20+
testing.expectEqual('fx19', e2.filename);
21+
testing.expectEqual(443, e2.lineno);
22+
testing.expectEqual(8999, e2.colno);
23+
testing.expectEqual('under 9000!', e2.error);
24+
</script>
25+
26+
<script id=ErrorEvent>
27+
let e3 = new ErrorEvent('err3')
28+
e3.addEventListener('change', () => {});
29+
</script>

src/tests/html/screen.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script src="../testing.js"></script>
2+
3+
<script id=screen>
4+
let screen = window.screen;
5+
testing.expectEqual(1920, screen.width);
6+
testing.expectEqual(1080, screen.height);
7+
8+
let orientation = screen.orientation;
9+
testing.expectEqual(0, orientation.angle);
10+
testing.expectEqual('landscape-primary', orientation.type);
11+
12+
// this shouldn't crash (it used to)
13+
screen.addEventListener('change', () => {});
14+
</script>
15+
16+
<script id=orientation>
17+
screen.orientation.addEventListener('change', () => {})
18+
// above shouldn't crash (it used to)
19+
testing.skip();
20+
</script>

0 commit comments

Comments
 (0)