Skip to content

Commit 97c6ac0

Browse files
committed
Cleanup and inner dimensions
1 parent 4cb14cd commit 97c6ac0

File tree

3 files changed

+63
-63
lines changed

3 files changed

+63
-63
lines changed

src/browser/dom/element.zig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,7 @@ pub const Element = struct {
390390
return s.match(CssNodeWrap{ .node = parser.elementToNode(self) });
391391
}
392392

393-
pub fn _scrollIntoViewIfNeeded(self: *parser.Element, center_if_needed: ?bool) void {
394-
_ = self;
393+
pub fn _scrollIntoViewIfNeeded(_: *parser.Element, center_if_needed: ?bool) void {
395394
_ = center_if_needed;
396395
}
397396
};

src/browser/html/window.zig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,18 @@ pub const Window = struct {
120120
return &self.history;
121121
}
122122

123+
// The interior height of the window in pixels, including the height of the horizontal scroll bar, if present.
124+
pub fn get_innerHeight(_: *Window, state: *SessionState) u32 {
125+
// We do not have scrollbars or padding so this is the same as Element.clientHeight
126+
return state.renderer.height();
127+
}
128+
129+
// The interior width of the window in pixels. That includes the width of the vertical scroll bar, if one is present.
130+
pub fn get_innerWidth(_: *Window, state: *SessionState) u32 {
131+
// We do not have scrollbars or padding so this is the same as Element.clientWidth
132+
return state.renderer.width();
133+
}
134+
123135
pub fn get_name(self: *Window) []const u8 {
124136
return self.target;
125137
}
@@ -291,4 +303,13 @@ test "Browser.HTML.Window" {
291303
.{ "let request_id = requestAnimationFrame(timestamp => {});", "undefined" },
292304
.{ "cancelAnimationFrame(request_id);", "undefined" },
293305
}, .{});
306+
307+
try runner.testCases(&.{
308+
.{ "innerHeight", "1" },
309+
.{ "innerWidth", "1" }, // Width is 1 even if there are no elements
310+
.{ "document.createElement('div').getClientRects()", "[object Object]" },
311+
.{ "document.createElement('div').getClientRects()", "[object Object]" },
312+
.{ "innerHeight", "1" },
313+
.{ "innerWidth", "2" },
314+
}, .{});
294315
}

src/cdp/domains/dom.zig

Lines changed: 41 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818

1919
const std = @import("std");
20+
const Allocator = std.mem.Allocator;
2021
const Node = @import("../Node.zig");
2122
const css = @import("../../browser/dom/css.zig");
2223
const parser = @import("../../browser/netsurf.zig");
2324
const dom_node = @import("../../browser/dom/node.zig");
25+
const DOMRect = @import("../../browser/dom/element.zig").Element.DOMRect;
2426

2527
pub fn processMessage(cmd: anytype) !void {
2628
const action = std.meta.stringToEnum(enum {
@@ -237,102 +239,80 @@ fn describeNode(cmd: anytype) !void {
237239
depth: u32 = 1,
238240
pierce: bool = false,
239241
})) orelse return error.InvalidParams;
240-
if (params.backendNodeId != null or params.depth != 1 or params.pierce) {
241-
return error.NotYetImplementedParams;
242-
}
243242

243+
if (params.depth != 1 or params.pierce) return error.NotYetImplementedParams;
244244
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
245245

246-
const input_node_id = params.nodeId orelse params.backendNodeId;
247-
if (input_node_id != null) {
248-
const node = bc.node_registry.lookup_by_id.get(params.nodeId.?) orelse return error.NodeNotFound;
249-
return cmd.sendResult(.{ .node = bc.nodeWriter(node, .{}) }, .{});
250-
}
251-
if (params.objectId != null) {
252-
// Retrieve the object from which ever context it is in.
253-
const parser_node = try bc.inspector.getNodePtr(cmd.arena, params.objectId.?);
254-
const node = try bc.node_registry.register(@ptrCast(parser_node));
255-
return cmd.sendResult(.{ .node = bc.nodeWriter(node, .{}) }, .{});
256-
}
257-
return error.MissingParams;
258-
}
246+
const node = try getNode(cmd.arena, bc, params.nodeId, params.backendNodeId, params.objectId);
259247

260-
// Note Element.DOMRect exists, but there is no need to couple them at this time.
261-
const Rect = struct {
262-
x: f64,
263-
y: f64,
264-
width: f64,
265-
height: f64,
266-
};
248+
return cmd.sendResult(.{ .node = bc.nodeWriter(node, .{}) }, .{});
249+
}
267250

268251
// An array of quad vertices, x immediately followed by y for each point, points clock-wise.
269252
// Note Y points downward
270253
// We are assuming the start/endpoint is not repeated.
271254
const Quad = [8]f64;
272255

256+
fn rectToQuad(rect: DOMRect) Quad {
257+
return Quad{
258+
rect.x,
259+
rect.y,
260+
rect.x + rect.width,
261+
rect.y,
262+
rect.x + rect.width,
263+
rect.y + rect.height,
264+
rect.x,
265+
rect.y + rect.height,
266+
};
267+
}
268+
273269
fn scrollIntoViewIfNeeded(cmd: anytype) !void {
274-
const params = (try cmd.params(struct {
270+
_ = (try cmd.params(struct {
275271
nodeId: ?Node.Id = null,
276272
backendNodeId: ?u32 = null,
277273
objectId: ?[]const u8 = null,
278-
rect: ?Rect = null,
274+
rect: ?DOMRect = null,
279275
})) orelse return error.InvalidParams;
280276

281-
var set_count: u2 = 0; // only 1 of nodeId backendNodeId objectId may be set
282-
if (params.nodeId != null) set_count += 1;
283-
if (params.backendNodeId != null) set_count += 1;
284-
if (params.objectId != null) set_count += 1;
285-
if (set_count != 1) return error.InvalidParams;
277+
// Only 1 of nodeId, backendNodeId, objectId may be set, but we don't want to error unnecessarily
278+
// TBD what do other browsers do in this user error sceneario?
286279

287280
// Since element.scrollIntoViewIfNeeded is a no-op we do not bother retrieving the node.
288281
// This however also means we also do not error in case the node is not found.
289282

290283
return cmd.sendResult(null, .{});
291284
}
292285

286+
fn getNode(arena: Allocator, browser_context: anytype, node_id: ?Node.Id, backend_node_id: ?Node.Id, object_id: ?[]const u8) !*Node {
287+
const input_node_id = node_id orelse backend_node_id;
288+
if (input_node_id) |input_node_id_| {
289+
return browser_context.node_registry.lookup_by_id.get(input_node_id_) orelse return error.NodeNotFound;
290+
}
291+
if (object_id) |object_id_| {
292+
// Retrieve the object from which ever context it is in.
293+
const parser_node = try browser_context.inspector.getNodePtr(arena, object_id_);
294+
return try browser_context.node_registry.register(@ptrCast(parser_node));
295+
}
296+
return error.MissingParams;
297+
}
298+
293299
fn getContentQuads(cmd: anytype) !void {
294300
const params = (try cmd.params(struct {
295301
nodeId: ?Node.Id = null,
296-
backendNodeId: ?u32 = null,
302+
backendNodeId: ?Node.Id = null,
297303
objectId: ?[]const u8 = null,
298304
})) orelse return error.InvalidParams;
299305

300-
var set_count: u2 = 0; // only 1 of nodeId backendNodeId objectId may be set
301-
if (params.nodeId != null) set_count += 1;
302-
if (params.backendNodeId != null) set_count += 1;
303-
if (params.objectId != null) set_count += 1;
304-
if (set_count != 1) return error.InvalidParams;
305-
306306
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
307307

308-
const node = blk: {
309-
const input_node_id = params.nodeId orelse params.backendNodeId;
310-
if (input_node_id != null) {
311-
const node = bc.node_registry.lookup_by_id.get(params.nodeId.?) orelse return error.NodeNotFound;
312-
break :blk node;
313-
}
314-
if (params.objectId != null) {
315-
const parser_node = try bc.inspector.getNodePtr(cmd.arena, params.objectId.?);
316-
const node = try bc.node_registry.register(@ptrCast(parser_node));
317-
break :blk node;
318-
}
319-
unreachable;
320-
};
308+
const node = try getNode(cmd.arena, bc, params.nodeId, params.backendNodeId, params.objectId);
321309

322-
if (try parser.nodeType(node._node) != .element) return error.NodeISNotAnElement;
310+
if (try parser.nodeType(node._node) != .element) return error.NodeIsNotAnElement;
311+
// TBD should the funcion work on nodes that are not elements, but may have geometry like Window?
323312

324313
const element = parser.nodeToElement(node._node);
325314
const rect = try bc.session.page.?.state.renderer.getRect(element);
326-
const quad = Quad{
327-
rect.x,
328-
rect.y,
329-
rect.x + rect.width,
330-
rect.y,
331-
rect.x + rect.width,
332-
rect.y + rect.height,
333-
rect.x,
334-
rect.y + rect.height,
335-
};
315+
const quad = rectToQuad(rect);
336316

337317
return cmd.sendResult(.{ .quads = &.{quad} }, .{});
338318
}

0 commit comments

Comments
 (0)