Skip to content

Commit 15b64d5

Browse files
committed
Improve window scroll
scroll alias for scrollTo add get_scrollX and get_scrollY, along with their aliases: pageXOffset and pageYOffset. These always return 0, unless scroll or scrollTo are called.
1 parent c891322 commit 15b64d5

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

src/browser/html/window.zig

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ pub const Window = struct {
6868
performance: Performance,
6969
screen: Screen = .{},
7070
css: Css = .{},
71+
scroll_x: u32 = 0,
72+
scroll_y: u32 = 0,
7173
onload_callback: ?Function = null,
7274

7375
pub fn create(target: ?[]const u8, navigator: ?Navigator) !Window {
@@ -388,12 +390,20 @@ pub const Window = struct {
388390
const Opts = struct {
389391
top: i32,
390392
left: i32,
391-
behavior: []const u8,
393+
behavior: []const u8 = "",
392394
};
393395
};
394-
pub fn _scrollTo(self: *Window, opts: ScrollToOpts, y: ?u32) !void {
395-
_ = opts;
396-
_ = y;
396+
pub fn _scrollTo(self: *Window, opts: ScrollToOpts, y: ?i32) !void {
397+
switch (opts) {
398+
.x => |x| {
399+
self.scroll_x = @intCast(@max(x, 0));
400+
self.scroll_y = @intCast(@max(0, y orelse 0));
401+
},
402+
.opts => |o| {
403+
self.scroll_y = @intCast(@max(0, o.top));
404+
self.scroll_x = @intCast(@max(0, o.left));
405+
},
406+
}
397407

398408
{
399409
const scroll_event = try parser.eventCreate();
@@ -417,6 +427,28 @@ pub const Window = struct {
417427
);
418428
}
419429
}
430+
pub fn _scroll(self: *Window, opts: ScrollToOpts, y: ?i32) !void {
431+
// just an alias for scrollTo
432+
return self._scrollTo(opts, y);
433+
}
434+
435+
pub fn get_scrollX(self: *const Window) u32 {
436+
return self.scroll_x;
437+
}
438+
439+
pub fn get_scrollY(self: *const Window) u32 {
440+
return self.scroll_y;
441+
}
442+
443+
pub fn get_pageXOffset(self: *const Window) u32 {
444+
// just an alias for scrollX
445+
return self.get_scrollX();
446+
}
447+
448+
pub fn get_pageYOffset(self: *const Window) u32 {
449+
// just an alias for scrollY
450+
return self.get_scrollY();
451+
}
420452

421453
// libdom's document doesn't have a parent, which is correct, but
422454
// breaks the event bubbling that happens for many events from

src/tests/window/window.html

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!DOCTYPE html>
22
<script src="../testing.js"></script>
3-
<body></body>
3+
<body style=height:4000px;width:4000px></body>
44
<script id=aliases>
55
testing.expectEqual(window, window.self);
66
testing.expectEqual(window, window.parent);
@@ -82,12 +82,41 @@
8282
<script id=scroll>
8383
let scroll = false;
8484
let scrollend = false
85+
8586
window.addEventListener('scroll', () => {scroll = true});
8687
document.addEventListener('scrollend', () => {scrollend = true});
8788
window.scrollTo(0, 0);
89+
testing.expectEqual(0, scrollX);
90+
testing.expectEqual(0, pageXOffset);
91+
testing.expectEqual(0, scrollY);
92+
testing.expectEqual(0, pageYOffset);
8893

8994
testing.expectEqual(true, scroll);
9095
testing.expectEqual(true, scrollend);
96+
97+
window.scrollTo(10, 20);
98+
testing.expectEqual(10, scrollX);
99+
testing.expectEqual(10, pageXOffset);
100+
testing.expectEqual(20, scrollY);
101+
testing.expectEqual(20, pageYOffset);
102+
103+
window.scrollTo(-10, -20);
104+
testing.expectEqual(0, scrollX);
105+
testing.expectEqual(0, pageXOffset);
106+
testing.expectEqual(0, scrollY);
107+
testing.expectEqual(0, pageYOffset);
108+
109+
window.scrollTo({top: 30, left: 40});
110+
testing.expectEqual(40, scrollX);
111+
testing.expectEqual(40, pageXOffset);
112+
testing.expectEqual(30, scrollY);
113+
testing.expectEqual(30, pageYOffset);
114+
115+
window.scrollTo({top: -30, left: -40});
116+
testing.expectEqual(0, scrollX);
117+
testing.expectEqual(0, pageXOffset);
118+
testing.expectEqual(0, scrollY);
119+
testing.expectEqual(0, pageYOffset);
91120
</script>
92121

93122
<script id=queueMicroTask>

0 commit comments

Comments
 (0)