Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 71 additions & 47 deletions src/html/history.zig
Original file line number Diff line number Diff line change
Expand Up @@ -28,62 +28,70 @@ const checkCases = jsruntime.test_utils.checkCases;
pub const History = struct {
pub const mem_guarantied = true;

const ScrollRestaurationMode = enum {
const ScrollRestorationMode = enum {
auto,
manual,
};

scrollRestauration: ScrollRestaurationMode = .audio,
scrollRestoration: ScrollRestorationMode = .auto,
state: std.json.Value = .null,

pub fn get_length(_: *History) u64 {
return 0;
}
// count tracks the history length until we implement correctly pushstate.
count: u32 = 0,

pub fn get_appCodeName(_: *Navigator) []const u8 {
return "Mozilla";
}
pub fn get_appName(_: *Navigator) []const u8 {
return "Netscape";
}
pub fn get_appVersion(self: *Navigator) []const u8 {
return self.version;
}
pub fn get_platform(self: *Navigator) []const u8 {
return self.platform;
}
pub fn get_product(_: *Navigator) []const u8 {
return "Gecko";
}
pub fn get_productSub(_: *Navigator) []const u8 {
return "20030107";
pub fn get_length(self: *History) u32 {
// TODO return the real history length value.
return self.count;
}
pub fn get_vendor(self: *Navigator) []const u8 {
return self.vendor;
}
pub fn get_vendorSub(_: *Navigator) []const u8 {
return "";

pub fn get_scrollRestoration(self: *History) []const u8 {
return switch (self.scrollRestoration) {
.auto => "auto",
.manual => "manual",
};
}
pub fn get_language(self: *Navigator) []const u8 {
return self.language;

pub fn set_scrollRestoration(self: *History, mode: []const u8) void {
if (std.mem.eql(u8, "manual", mode)) self.scrollRestoration = .manual;
if (std.mem.eql(u8, "auto", mode)) self.scrollRestoration = .auto;
}
// TODO wait for arrays.
//pub fn get_languages(self: *Navigator) [][]const u8 {
// return .{self.language};
//}
pub fn get_online(_: *Navigator) bool {
return true;

pub fn get_state(self: *History) std.json.Value {
return self.state;
}
pub fn _registerProtocolHandler(_: *Navigator, scheme: []const u8, url: []const u8) void {
_ = scheme;

// TODO implement the function
// data must handle any argument. We could expect a std.json.Value but
// https://github.com/lightpanda-io/zig-js-runtime/issues/267 is missing.
pub fn _pushState(self: *History, data: []const u8, _: ?[]const u8, url: ?[]const u8) void {
self.count += 1;
_ = url;
_ = data;
}
pub fn _unregisterProtocolHandler(_: *Navigator, scheme: []const u8, url: []const u8) void {
_ = scheme;

// TODO implement the function
// data must handle any argument. We could expect a std.json.Value but
// https://github.com/lightpanda-io/zig-js-runtime/issues/267 is missing.
pub fn _replaceState(self: *History, data: []const u8, _: ?[]const u8, url: ?[]const u8) void {
_ = self;
_ = url;
_ = data;
}

pub fn get_cookieEnabled(_: *Navigator) bool {
return true;
// TODO implement the function
pub fn _go(self: *History, delta: ?i32) void {
_ = self;
_ = delta;
}

// TODO implement the function
pub fn _back(self: *History) void {
_ = self;
}

// TODO implement the function
pub fn _forward(self: *History) void {
_ = self;
}
};

Expand All @@ -94,11 +102,27 @@ pub fn testExecFn(
_: std.mem.Allocator,
js_env: *jsruntime.Env,
) anyerror!void {
var navigator = [_]Case{
.{ .src = "navigator.userAgent", .ex = "Lightpanda/1.0" },
.{ .src = "navigator.appVersion", .ex = "1.0" },
.{ .src = "navigator.language", .ex = "en-US" },
var history = [_]Case{
.{ .src = "history.scrollRestoration", .ex = "auto" },
.{ .src = "history.scrollRestoration = 'manual'", .ex = "manual" },
.{ .src = "history.scrollRestoration = 'foo'", .ex = "foo" },
.{ .src = "history.scrollRestoration", .ex = "manual" },
.{ .src = "history.scrollRestoration = 'auto'", .ex = "auto" },
.{ .src = "history.scrollRestoration", .ex = "auto" },

.{ .src = "history.state", .ex = "null" },

.{ .src = "history.pushState({}, null, '')", .ex = "undefined" },

.{ .src = "history.replaceState({}, null, '')", .ex = "undefined" },

.{ .src = "history.go()", .ex = "undefined" },
.{ .src = "history.go(1)", .ex = "undefined" },
.{ .src = "history.go(-1)", .ex = "undefined" },

.{ .src = "history.forward()", .ex = "undefined" },

.{ .src = "history.back()", .ex = "undefined" },
};
try checkCases(js_env, &navigator);
try checkCases(js_env, &history);
}

2 changes: 2 additions & 0 deletions src/html/html.zig
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const HTMLDocument = @import("document.zig").HTMLDocument;
const HTMLElem = @import("elements.zig");
const Window = @import("window.zig").Window;
const Navigator = @import("navigator.zig").Navigator;
const History = @import("history.zig").History;

pub const Interfaces = generate.Tuple(.{
HTMLDocument,
Expand All @@ -30,4 +31,5 @@ pub const Interfaces = generate.Tuple(.{
HTMLElem.Interfaces,
Window,
Navigator,
History,
});
6 changes: 6 additions & 0 deletions src/html/window.zig
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const Loop = jsruntime.Loop;

const EventTarget = @import("../dom/event_target.zig").EventTarget;
const Navigator = @import("navigator.zig").Navigator;
const History = @import("history.zig").History;

const storage = @import("../storage/storage.zig");

Expand All @@ -41,6 +42,7 @@ pub const Window = struct {

document: ?*parser.DocumentHTML = null,
target: []const u8,
history: History = .{},

storageShelf: ?*storage.Shelf = null,

Expand Down Expand Up @@ -86,6 +88,10 @@ pub const Window = struct {
return self.document;
}

pub fn get_history(self: *Window) *History {
return &self.history;
}

pub fn get_name(self: *Window) []const u8 {
return self.target;
}
Expand Down
1 change: 1 addition & 0 deletions src/run_tests.zig
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ fn testsAllExecFn(
MutationObserverTestExecFn,
@import("polyfill/fetch.zig").testExecFn,
@import("html/navigator.zig").testExecFn,
@import("html/history.zig").testExecFn,
};

inline for (testFns) |testFn| {
Expand Down
2 changes: 1 addition & 1 deletion src/storage/storage.zig
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ pub const Bottle = struct {
// > context of another document.
// https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event
//
// So for now, we won't impement the feature.
// So for now, we won't implement the feature.
}

pub fn _removeItem(self: *Bottle, k: []const u8) !void {
Expand Down
Loading