mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 23:23:28 +00:00
Merge pull request #1018 from lightpanda-io/fix_screen_event_target_prototype
Fix the Screen and ScreenOrientation prototype
This commit is contained in:
@@ -31,6 +31,10 @@ pub const Union = union(enum) {
|
||||
xhr: *@import("../xhr/xhr.zig").XMLHttpRequest,
|
||||
plain: *parser.EventTarget,
|
||||
message_port: *@import("MessageChannel.zig").MessagePort,
|
||||
screen: *@import("../html/screen.zig").Screen,
|
||||
screen_orientation: *@import("../html/screen.zig").ScreenOrientation,
|
||||
performance: *@import("performance.zig").Performance,
|
||||
media_query_list: *@import("../html/media_query_list.zig").MediaQueryList,
|
||||
};
|
||||
|
||||
// EventTarget implementation
|
||||
@@ -67,7 +71,18 @@ pub const EventTarget = struct {
|
||||
.message_port => {
|
||||
return .{ .message_port = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
||||
},
|
||||
else => return error.MissingEventTargetType,
|
||||
.screen => {
|
||||
return .{ .screen = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
||||
},
|
||||
.screen_orientation => {
|
||||
return .{ .screen_orientation = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
||||
},
|
||||
.performance => {
|
||||
return .{ .performance = @fieldParentPtr("base", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
||||
},
|
||||
.media_query_list => {
|
||||
return .{ .media_query_list = @fieldParentPtr("base", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,34 +81,6 @@ pub const ErrorEvent = struct {
|
||||
};
|
||||
|
||||
const testing = @import("../../testing.zig");
|
||||
test "Browser.HTML.ErrorEvent" {
|
||||
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "<div id=c></div>" });
|
||||
defer runner.deinit();
|
||||
|
||||
try runner.testCases(&.{
|
||||
.{ "let e1 = new ErrorEvent('err1')", null },
|
||||
.{ "e1.message", "" },
|
||||
.{ "e1.filename", "" },
|
||||
.{ "e1.lineno", "0" },
|
||||
.{ "e1.colno", "0" },
|
||||
.{ "e1.error", "undefined" },
|
||||
|
||||
.{
|
||||
\\ let e2 = new ErrorEvent('err1', {
|
||||
\\ message: 'm1',
|
||||
\\ filename: 'fx19',
|
||||
\\ lineno: 443,
|
||||
\\ colno: 8999,
|
||||
\\ error: 'under 9000!',
|
||||
\\
|
||||
\\})
|
||||
,
|
||||
null,
|
||||
},
|
||||
.{ "e2.message", "m1" },
|
||||
.{ "e2.filename", "fx19" },
|
||||
.{ "e2.lineno", "443" },
|
||||
.{ "e2.colno", "8999" },
|
||||
.{ "e2.error", "under 9000!" },
|
||||
}, .{});
|
||||
test "Browser: HTML.ErrorEvent" {
|
||||
try testing.htmlRunner("html/error_event.html");
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
const std = @import("std");
|
||||
|
||||
const parser = @import("../netsurf.zig");
|
||||
const EventTarget = @import("../dom/event_target.zig").EventTarget;
|
||||
|
||||
pub const Interfaces = .{
|
||||
@@ -29,6 +30,8 @@ pub const Interfaces = .{
|
||||
pub const Screen = struct {
|
||||
pub const prototype = *EventTarget;
|
||||
|
||||
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen },
|
||||
|
||||
height: u32 = 1080,
|
||||
width: u32 = 1920,
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDepth
|
||||
@@ -83,6 +86,7 @@ pub const ScreenOrientation = struct {
|
||||
|
||||
angle: u32 = 0,
|
||||
type: ScreenOrientationType,
|
||||
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen_orientation },
|
||||
|
||||
pub fn get_angle(self: *const ScreenOrientation) u32 {
|
||||
return self.angle;
|
||||
@@ -94,16 +98,6 @@ pub const ScreenOrientation = struct {
|
||||
};
|
||||
|
||||
const testing = @import("../../testing.zig");
|
||||
test "Browser.HTML.Screen" {
|
||||
var runner = try testing.jsRunner(testing.tracking_allocator, .{});
|
||||
defer runner.deinit();
|
||||
|
||||
try runner.testCases(&.{
|
||||
.{ "let screen = window.screen", "undefined" },
|
||||
.{ "screen.width === 1920", "true" },
|
||||
.{ "screen.height === 1080", "true" },
|
||||
.{ "let orientation = screen.orientation", "undefined" },
|
||||
.{ "orientation.angle === 0", "true" },
|
||||
.{ "orientation.type === \"landscape-primary\"", "true" },
|
||||
}, .{});
|
||||
test "Browser: HTML.Screen" {
|
||||
try testing.htmlRunner("html/screen.html");
|
||||
}
|
||||
|
||||
@@ -677,8 +677,9 @@ pub fn eventTargetHasListener(
|
||||
var lst: ?*EventListener = null;
|
||||
|
||||
// iterate over the EventTarget's listeners
|
||||
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
|
||||
while (true) {
|
||||
const err = eventTargetVtable(et).iter_event_listener.?(
|
||||
const err = iter_event_listener(
|
||||
et,
|
||||
str,
|
||||
capture,
|
||||
@@ -728,8 +729,9 @@ pub fn eventTargetRemoveAllEventListeners(et: *EventTarget) !void {
|
||||
var lst: ?*EventListener = null;
|
||||
|
||||
// iterate over the EventTarget's listeners
|
||||
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
|
||||
while (true) {
|
||||
const errIter = eventTargetVtable(et).iter_event_listener.?(
|
||||
const errIter = iter_event_listener(
|
||||
et,
|
||||
null,
|
||||
false,
|
||||
@@ -806,6 +808,8 @@ pub const EventTargetTBase = extern struct {
|
||||
performance = 5,
|
||||
media_query_list = 6,
|
||||
message_port = 7,
|
||||
screen = 8,
|
||||
screen_orientation = 9,
|
||||
};
|
||||
|
||||
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{
|
||||
|
||||
29
src/tests/html/error_event.html
Normal file
29
src/tests/html/error_event.html
Normal file
@@ -0,0 +1,29 @@
|
||||
<script src="../testing.js"></script>
|
||||
|
||||
<script id=ErrorEvent>
|
||||
let e1 = new ErrorEvent('err1')
|
||||
testing.expectEqual('', e1.message);
|
||||
testing.expectEqual('', e1.filename);
|
||||
testing.expectEqual(0, e1.lineno);
|
||||
testing.expectEqual(0, e1.colno);
|
||||
testing.expectEqual(undefined, e1.error);
|
||||
|
||||
let e2 = new ErrorEvent('err1', {
|
||||
message: 'm1',
|
||||
filename: 'fx19',
|
||||
lineno: 443,
|
||||
colno: 8999,
|
||||
error: 'under 9000!',
|
||||
});
|
||||
|
||||
testing.expectEqual('m1', e2.message);
|
||||
testing.expectEqual('fx19', e2.filename);
|
||||
testing.expectEqual(443, e2.lineno);
|
||||
testing.expectEqual(8999, e2.colno);
|
||||
testing.expectEqual('under 9000!', e2.error);
|
||||
</script>
|
||||
|
||||
<script id=ErrorEvent>
|
||||
let e3 = new ErrorEvent('err3')
|
||||
e3.addEventListener('change', () => {});
|
||||
</script>
|
||||
20
src/tests/html/screen.html
Normal file
20
src/tests/html/screen.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<script src="../testing.js"></script>
|
||||
|
||||
<script id=screen>
|
||||
let screen = window.screen;
|
||||
testing.expectEqual(1920, screen.width);
|
||||
testing.expectEqual(1080, screen.height);
|
||||
|
||||
let orientation = screen.orientation;
|
||||
testing.expectEqual(0, orientation.angle);
|
||||
testing.expectEqual('landscape-primary', orientation.type);
|
||||
|
||||
// this shouldn't crash (it used to)
|
||||
screen.addEventListener('change', () => {});
|
||||
</script>
|
||||
|
||||
<script id=orientation>
|
||||
screen.orientation.addEventListener('change', () => {})
|
||||
// above shouldn't crash (it used to)
|
||||
testing.skip();
|
||||
</script>
|
||||
Reference in New Issue
Block a user