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,
|
xhr: *@import("../xhr/xhr.zig").XMLHttpRequest,
|
||||||
plain: *parser.EventTarget,
|
plain: *parser.EventTarget,
|
||||||
message_port: *@import("MessageChannel.zig").MessagePort,
|
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
|
// EventTarget implementation
|
||||||
@@ -67,7 +71,18 @@ pub const EventTarget = struct {
|
|||||||
.message_port => {
|
.message_port => {
|
||||||
return .{ .message_port = @fieldParentPtr("proto", @as(*parser.EventTargetTBase, @ptrCast(et))) };
|
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");
|
const testing = @import("../../testing.zig");
|
||||||
test "Browser.HTML.ErrorEvent" {
|
test "Browser: HTML.ErrorEvent" {
|
||||||
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "<div id=c></div>" });
|
try testing.htmlRunner("html/error_event.html");
|
||||||
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!" },
|
|
||||||
}, .{});
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const parser = @import("../netsurf.zig");
|
||||||
const EventTarget = @import("../dom/event_target.zig").EventTarget;
|
const EventTarget = @import("../dom/event_target.zig").EventTarget;
|
||||||
|
|
||||||
pub const Interfaces = .{
|
pub const Interfaces = .{
|
||||||
@@ -29,6 +30,8 @@ pub const Interfaces = .{
|
|||||||
pub const Screen = struct {
|
pub const Screen = struct {
|
||||||
pub const prototype = *EventTarget;
|
pub const prototype = *EventTarget;
|
||||||
|
|
||||||
|
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen },
|
||||||
|
|
||||||
height: u32 = 1080,
|
height: u32 = 1080,
|
||||||
width: u32 = 1920,
|
width: u32 = 1920,
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDepth
|
// https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDepth
|
||||||
@@ -83,6 +86,7 @@ pub const ScreenOrientation = struct {
|
|||||||
|
|
||||||
angle: u32 = 0,
|
angle: u32 = 0,
|
||||||
type: ScreenOrientationType,
|
type: ScreenOrientationType,
|
||||||
|
proto: parser.EventTargetTBase = .{ .internal_target_type = .screen_orientation },
|
||||||
|
|
||||||
pub fn get_angle(self: *const ScreenOrientation) u32 {
|
pub fn get_angle(self: *const ScreenOrientation) u32 {
|
||||||
return self.angle;
|
return self.angle;
|
||||||
@@ -94,16 +98,6 @@ pub const ScreenOrientation = struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const testing = @import("../../testing.zig");
|
const testing = @import("../../testing.zig");
|
||||||
test "Browser.HTML.Screen" {
|
test "Browser: HTML.Screen" {
|
||||||
var runner = try testing.jsRunner(testing.tracking_allocator, .{});
|
try testing.htmlRunner("html/screen.html");
|
||||||
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" },
|
|
||||||
}, .{});
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -677,8 +677,9 @@ pub fn eventTargetHasListener(
|
|||||||
var lst: ?*EventListener = null;
|
var lst: ?*EventListener = null;
|
||||||
|
|
||||||
// iterate over the EventTarget's listeners
|
// iterate over the EventTarget's listeners
|
||||||
|
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
|
||||||
while (true) {
|
while (true) {
|
||||||
const err = eventTargetVtable(et).iter_event_listener.?(
|
const err = iter_event_listener(
|
||||||
et,
|
et,
|
||||||
str,
|
str,
|
||||||
capture,
|
capture,
|
||||||
@@ -728,8 +729,9 @@ pub fn eventTargetRemoveAllEventListeners(et: *EventTarget) !void {
|
|||||||
var lst: ?*EventListener = null;
|
var lst: ?*EventListener = null;
|
||||||
|
|
||||||
// iterate over the EventTarget's listeners
|
// iterate over the EventTarget's listeners
|
||||||
|
const iter_event_listener = eventTargetVtable(et).iter_event_listener.?;
|
||||||
while (true) {
|
while (true) {
|
||||||
const errIter = eventTargetVtable(et).iter_event_listener.?(
|
const errIter = iter_event_listener(
|
||||||
et,
|
et,
|
||||||
null,
|
null,
|
||||||
false,
|
false,
|
||||||
@@ -806,6 +808,8 @@ pub const EventTargetTBase = extern struct {
|
|||||||
performance = 5,
|
performance = 5,
|
||||||
media_query_list = 6,
|
media_query_list = 6,
|
||||||
message_port = 7,
|
message_port = 7,
|
||||||
|
screen = 8,
|
||||||
|
screen_orientation = 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{
|
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