mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 23:23:28 +00:00
Merge pull request #790 from lightpanda-io/css-stylesheet
Some checks failed
e2e-test / zig build release (push) Has been cancelled
e2e-test / puppeteer-perf (push) Has been cancelled
e2e-test / demo-scripts (push) Has been cancelled
e2e-test / cdp-and-hyperfine-bench (push) Has been cancelled
e2e-test / perf-fmt (push) Has been cancelled
zig-test / zig build dev (push) Has been cancelled
zig-test / browser fetch (push) Has been cancelled
zig-test / zig test (push) Has been cancelled
zig-test / perf-fmt (push) Has been cancelled
nightly build / build-linux-x86_64 (push) Has been cancelled
nightly build / build-linux-aarch64 (push) Has been cancelled
nightly build / build-macos-aarch64 (push) Has been cancelled
nightly build / build-macos-x86_64 (push) Has been cancelled
wpt / web platform tests json output (push) Has been cancelled
wpt / perf-fmt (push) Has been cancelled
Some checks failed
e2e-test / zig build release (push) Has been cancelled
e2e-test / puppeteer-perf (push) Has been cancelled
e2e-test / demo-scripts (push) Has been cancelled
e2e-test / cdp-and-hyperfine-bench (push) Has been cancelled
e2e-test / perf-fmt (push) Has been cancelled
zig-test / zig build dev (push) Has been cancelled
zig-test / browser fetch (push) Has been cancelled
zig-test / zig test (push) Has been cancelled
zig-test / perf-fmt (push) Has been cancelled
nightly build / build-linux-x86_64 (push) Has been cancelled
nightly build / build-linux-aarch64 (push) Has been cancelled
nightly build / build-macos-aarch64 (push) Has been cancelled
nightly build / build-macos-x86_64 (push) Has been cancelled
wpt / web platform tests json output (push) Has been cancelled
wpt / perf-fmt (push) Has been cancelled
Minimal CSSStyleSheet
This commit is contained in:
42
src/browser/cssom/css_rule.zig
Normal file
42
src/browser/cssom/css_rule.zig
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const CSSStyleSheet = @import("css_stylesheet.zig").CSSStyleSheet;
|
||||||
|
|
||||||
|
pub const Interfaces = .{
|
||||||
|
CSSRule,
|
||||||
|
CSSImportRule,
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/CSSRule
|
||||||
|
pub const CSSRule = struct {
|
||||||
|
css_text: []const u8,
|
||||||
|
parent_rule: ?*CSSRule = null,
|
||||||
|
parent_stylesheet: ?*CSSStyleSheet = null,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const CSSImportRule = struct {
|
||||||
|
pub const prototype = *CSSRule;
|
||||||
|
href: []const u8,
|
||||||
|
layer_name: ?[]const u8,
|
||||||
|
media: void,
|
||||||
|
style_sheet: CSSStyleSheet,
|
||||||
|
supports_text: ?[]const u8,
|
||||||
|
};
|
||||||
60
src/browser/cssom/css_rule_list.zig
Normal file
60
src/browser/cssom/css_rule_list.zig
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const StyleSheet = @import("stylesheet.zig").StyleSheet;
|
||||||
|
const CSSRule = @import("css_rule.zig").CSSRule;
|
||||||
|
const CSSImportRule = @import("css_rule.zig").CSSImportRule;
|
||||||
|
|
||||||
|
pub const CSSRuleList = struct {
|
||||||
|
list: std.ArrayListUnmanaged([]const u8),
|
||||||
|
|
||||||
|
pub fn constructor() CSSRuleList {
|
||||||
|
return .{ .list = .empty };
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn _item(self: *CSSRuleList, _index: u32) ?CSSRule {
|
||||||
|
const index: usize = @intCast(_index);
|
||||||
|
|
||||||
|
if (index > self.list.items.len) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: for now, just return null.
|
||||||
|
// this depends on properly parsing CSSRule
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_length(self: *CSSRuleList) u32 {
|
||||||
|
return @intCast(self.list.items.len);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const testing = @import("../../testing.zig");
|
||||||
|
test "Browser.CSS.CSSRuleList" {
|
||||||
|
var runner = try testing.jsRunner(testing.tracking_allocator, .{});
|
||||||
|
defer runner.deinit();
|
||||||
|
|
||||||
|
try runner.testCases(&.{
|
||||||
|
.{ "let list = new CSSRuleList()", "undefined" },
|
||||||
|
.{ "list instanceof CSSRuleList", "true" },
|
||||||
|
.{ "list.length", "0" },
|
||||||
|
.{ "list.item(0)", "null" },
|
||||||
|
}, .{});
|
||||||
|
}
|
||||||
@@ -20,15 +20,9 @@ const std = @import("std");
|
|||||||
|
|
||||||
const CSSParser = @import("./css_parser.zig").CSSParser;
|
const CSSParser = @import("./css_parser.zig").CSSParser;
|
||||||
const CSSValueAnalyzer = @import("./css_value_analyzer.zig").CSSValueAnalyzer;
|
const CSSValueAnalyzer = @import("./css_value_analyzer.zig").CSSValueAnalyzer;
|
||||||
|
const CSSRule = @import("css_rule.zig").CSSRule;
|
||||||
const Page = @import("../page.zig").Page;
|
const Page = @import("../page.zig").Page;
|
||||||
|
|
||||||
pub const Interfaces = .{
|
|
||||||
CSSStyleDeclaration,
|
|
||||||
CSSRule,
|
|
||||||
};
|
|
||||||
|
|
||||||
const CSSRule = struct {};
|
|
||||||
|
|
||||||
pub const CSSStyleDeclaration = struct {
|
pub const CSSStyleDeclaration = struct {
|
||||||
store: std.StringHashMapUnmanaged(Property),
|
store: std.StringHashMapUnmanaged(Property),
|
||||||
order: std.ArrayListUnmanaged([]const u8),
|
order: std.ArrayListUnmanaged([]const u8),
|
||||||
|
|||||||
91
src/browser/cssom/css_stylesheet.zig
Normal file
91
src/browser/cssom/css_stylesheet.zig
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const Page = @import("../page.zig").Page;
|
||||||
|
const StyleSheet = @import("stylesheet.zig").StyleSheet;
|
||||||
|
|
||||||
|
const CSSRuleList = @import("css_rule_list.zig").CSSRuleList;
|
||||||
|
const CSSImportRule = @import("css_rule.zig").CSSImportRule;
|
||||||
|
|
||||||
|
pub const CSSStyleSheet = struct {
|
||||||
|
pub const prototype = *StyleSheet;
|
||||||
|
|
||||||
|
proto: StyleSheet,
|
||||||
|
css_rules: CSSRuleList,
|
||||||
|
owner_rule: ?*CSSImportRule,
|
||||||
|
|
||||||
|
const CSSStyleSheetOpts = struct {
|
||||||
|
base_url: ?[]const u8 = null,
|
||||||
|
// TODO: Suupport media
|
||||||
|
disabled: bool = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn constructor(_opts: ?CSSStyleSheetOpts) !CSSStyleSheet {
|
||||||
|
const opts = _opts orelse CSSStyleSheetOpts{};
|
||||||
|
return .{
|
||||||
|
.proto = StyleSheet{ .disabled = opts.disabled },
|
||||||
|
.css_rules = .constructor(),
|
||||||
|
.owner_rule = null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_ownerRule(_: *CSSStyleSheet) ?*CSSImportRule {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_cssRules(self: *CSSStyleSheet) *CSSRuleList {
|
||||||
|
return &self.css_rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn _insertRule(self: *CSSStyleSheet, rule: []const u8, _index: ?usize, page: *Page) !usize {
|
||||||
|
const index = _index orelse 0;
|
||||||
|
if (index > self.css_rules.list.items.len) {
|
||||||
|
return error.IndexSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
const arena = page.arena;
|
||||||
|
try self.css_rules.list.insert(arena, index, try arena.dupe(u8, rule));
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn _deleteRule(self: *CSSStyleSheet, index: usize) !void {
|
||||||
|
if (index > self.css_rules.list.items.len) {
|
||||||
|
return error.IndexSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = self.css_rules.list.orderedRemove(index);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const testing = @import("../../testing.zig");
|
||||||
|
test "Browser.CSS.StyleSheet" {
|
||||||
|
var runner = try testing.jsRunner(testing.tracking_allocator, .{});
|
||||||
|
defer runner.deinit();
|
||||||
|
|
||||||
|
try runner.testCases(&.{
|
||||||
|
.{ "let css = new CSSStyleSheet()", "undefined" },
|
||||||
|
.{ "css instanceof CSSStyleSheet", "true" },
|
||||||
|
.{ "css.cssRules.length", "0" },
|
||||||
|
.{ "css.ownerRule", "null" },
|
||||||
|
.{ "let index1 = css.insertRule('body { color: red; }', 0)", "undefined" },
|
||||||
|
.{ "index1", "0" },
|
||||||
|
.{ "css.cssRules.length", "1" },
|
||||||
|
}, .{});
|
||||||
|
}
|
||||||
30
src/browser/cssom/cssom.zig
Normal file
30
src/browser/cssom/cssom.zig
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
pub const Stylesheet = @import("stylesheet.zig").StyleSheet;
|
||||||
|
pub const CSSStylesheet = @import("css_stylesheet.zig").CSSStyleSheet;
|
||||||
|
pub const CSSStyleDeclaration = @import("css_style_declaration.zig").CSSStyleDeclaration;
|
||||||
|
pub const CSSRuleList = @import("css_rule_list.zig").CSSRuleList;
|
||||||
|
|
||||||
|
pub const Interfaces = .{
|
||||||
|
Stylesheet,
|
||||||
|
CSSStylesheet,
|
||||||
|
CSSStyleDeclaration,
|
||||||
|
CSSRuleList,
|
||||||
|
@import("css_rule.zig").Interfaces,
|
||||||
|
};
|
||||||
55
src/browser/cssom/stylesheet.zig
Normal file
55
src/browser/cssom/stylesheet.zig
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
const parser = @import("../netsurf.zig");
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/StyleSheet#specifications
|
||||||
|
pub const StyleSheet = struct {
|
||||||
|
disabled: bool = false,
|
||||||
|
href: []const u8 = "",
|
||||||
|
owner_node: ?*parser.Node = null,
|
||||||
|
parent_stylesheet: ?*StyleSheet = null,
|
||||||
|
title: []const u8 = "",
|
||||||
|
type: []const u8 = "text/css",
|
||||||
|
|
||||||
|
pub fn get_disabled(self: *const StyleSheet) bool {
|
||||||
|
return self.disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_href(self: *const StyleSheet) []const u8 {
|
||||||
|
return self.href;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: media
|
||||||
|
|
||||||
|
pub fn get_ownerNode(self: *const StyleSheet) ?*parser.Node {
|
||||||
|
return self.owner_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_parentStyleSheet(self: *const StyleSheet) ?*StyleSheet {
|
||||||
|
return self.parent_stylesheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_title(self: *const StyleSheet) []const u8 {
|
||||||
|
return self.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_type(self: *const StyleSheet) []const u8 {
|
||||||
|
return self.type;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -22,7 +22,7 @@ const WebApis = struct {
|
|||||||
pub const Interfaces = generate.Tuple(.{
|
pub const Interfaces = generate.Tuple(.{
|
||||||
@import("crypto/crypto.zig").Crypto,
|
@import("crypto/crypto.zig").Crypto,
|
||||||
@import("console/console.zig").Console,
|
@import("console/console.zig").Console,
|
||||||
@import("cssom/css_style_declaration.zig").Interfaces,
|
@import("cssom/cssom.zig").Interfaces,
|
||||||
@import("dom/dom.zig").Interfaces,
|
@import("dom/dom.zig").Interfaces,
|
||||||
@import("encoding/text_encoder.zig").Interfaces,
|
@import("encoding/text_encoder.zig").Interfaces,
|
||||||
@import("events/event.zig").Interfaces,
|
@import("events/event.zig").Interfaces,
|
||||||
|
|||||||
Reference in New Issue
Block a user