mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-12-16 08:18:59 +00:00
Fix comment dump, improve dump of shadowroot and slots
This commit is contained in:
@@ -63,25 +63,58 @@ pub fn root(opts: RootOpts, writer: *std.Io.Writer, page: *Page) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn deep(node: *Node, opts: Opts, writer: *std.Io.Writer, page: *Page) error{WriteFailed}!void {
|
pub fn deep(node: *Node, opts: Opts, writer: *std.Io.Writer, page: *Page) error{WriteFailed}!void {
|
||||||
|
return _deep(node, opts, false, writer, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _deep(node: *Node, opts: Opts, comptime force_slot: bool, writer: *std.Io.Writer, page: *Page) error{WriteFailed}!void {
|
||||||
switch (node._type) {
|
switch (node._type) {
|
||||||
.cdata => |cd| try writeEscapedText(cd.getData(), writer),
|
.cdata => |cd| {
|
||||||
|
if (node.is(Node.CData.Comment)) |_| {
|
||||||
|
try writer.writeAll("<!--");
|
||||||
|
try writer.writeAll(cd.getData());
|
||||||
|
try writer.writeAll("-->");
|
||||||
|
} else {
|
||||||
|
try writeEscapedText(cd.getData(), writer);
|
||||||
|
}
|
||||||
|
},
|
||||||
.element => |el| {
|
.element => |el| {
|
||||||
if (shouldStripElement(el, opts)) {
|
if (shouldStripElement(el, opts)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle <slot> elements in rendered mode
|
// When opts.shadow == .rendered, we normally skip any element with
|
||||||
if (opts.shadow == .rendered) {
|
// a slot attribute. Only the "active" element will get rendered into
|
||||||
if (el.is(Slot)) |slot| {
|
// the <slot name="X">. However, the `deep` function is itself used
|
||||||
return dumpSlotContent(slot, opts, writer, page);
|
// to render that "active" content, so when we're trying to render
|
||||||
|
// it, we don't want to skip it.
|
||||||
|
if ((comptime force_slot == false) and opts.shadow == .rendered) {
|
||||||
|
if (el.getAttributeSafe("slot")) |_| {
|
||||||
|
// Skip - will be rendered by the Slot if it's the active container
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try el.format(writer);
|
try el.format(writer);
|
||||||
|
|
||||||
|
if (opts.shadow == .rendered) {
|
||||||
|
if (el.is(Slot)) |slot| {
|
||||||
|
try dumpSlotContent(slot, opts, writer, page);
|
||||||
|
return writer.writeAll("</slot>");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (opts.shadow != .skip) {
|
if (opts.shadow != .skip) {
|
||||||
if (page._element_shadow_roots.get(el)) |shadow| {
|
if (page._element_shadow_roots.get(el)) |shadow| {
|
||||||
try children(shadow.asNode(), opts, writer, page);
|
try children(shadow.asNode(), opts, writer, page);
|
||||||
|
// In rendered mode, light DOM is only shown through slots, not directly
|
||||||
|
if (opts.shadow == .rendered) {
|
||||||
|
// Skip rendering light DOM children
|
||||||
|
if (!isVoidElement(el)) {
|
||||||
|
try writer.writeAll("</");
|
||||||
|
try writer.writeAll(el.getTagNameDump());
|
||||||
|
try writer.writeByte('>');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +184,7 @@ fn dumpSlotContent(slot: *Slot, opts: Opts, writer: *std.Io.Writer, page: *Page)
|
|||||||
|
|
||||||
if (assigned.len > 0) {
|
if (assigned.len > 0) {
|
||||||
for (assigned) |assigned_node| {
|
for (assigned) |assigned_node| {
|
||||||
try deep(assigned_node, opts, writer, page);
|
try _deep(assigned_node, opts, true, writer, page);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try children(slot.asNode(), opts, writer, page);
|
try children(slot.asNode(), opts, writer, page);
|
||||||
|
|||||||
Reference in New Issue
Block a user