mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-30 15:41:48 +00:00
The TL;DR is that this commit enforces the use of correct IDs, introduces a BrowserContext, and adds some CDP tests. These are the ids we need to be aware of when talking about CDP: - id - browserContextId - targetId - sessionId - loaderId - frameId The `id` is the only one that _should_ originate from the driver. It's attached to most messages and it's how we maintain a request -> response flow: when the server responds to a specific message, it echo's back the id from the requested message. (As opposed to out-of-band events sent from the server which won't have an `id`). When I say "id" from this point forward, I mean every id except for this req->res id. Every other id is created by the browser. Prior to this commit, we didn't really check incoming ids from the driver. If the driver said "attachToTarget" and included a targetId, we just assumed that this was the current targetId. This was aided by the fact that we only used hard-coded IDS. If _we_ only "create" a frameId of "FRAME-1", then it's tempting to think the driver will only ever send a frameId of "FRAME-1". The issue with this approach is that _if_ the browser and driver fall out of sync and there's only ever 1 browserContextId, 1 sessionId and 1 frameId, it's not impossible to imagine cases where we behave on the thing. Imagine this flow: - Driver asks for a new BrowserContext - Browser says OK, your browserContextId is 1 - Driver, for whatever reason, says close browserContextId 2 - Browser says, OK, but it doesn't check the id and just closes the only BrowserContext it knows about (which is 1) By both re-using the same hard-coded ids, and not verifying that the ids sent from the client correspond to the correct ids, any issues are going to be hard to debug. Currently LOADER_ID and FRAEM_ID are still hard-coded. Baby steps.
69 lines
2.3 KiB
Zig
69 lines
2.3 KiB
Zig
// 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 cdp = @import("cdp.zig");
|
|
const Runtime = @import("runtime.zig");
|
|
|
|
pub fn processMessage(cmd: anytype) !void {
|
|
const action = std.meta.stringToEnum(enum {
|
|
setEmulatedMedia,
|
|
setFocusEmulationEnabled,
|
|
setDeviceMetricsOverride,
|
|
setTouchEmulationEnabled,
|
|
}, cmd.input.action) orelse return error.UnknownMethod;
|
|
|
|
switch (action) {
|
|
.setEmulatedMedia => return setEmulatedMedia(cmd),
|
|
.setFocusEmulationEnabled => return setFocusEmulationEnabled(cmd),
|
|
.setDeviceMetricsOverride => return setDeviceMetricsOverride(cmd),
|
|
.setTouchEmulationEnabled => return setTouchEmulationEnabled(cmd),
|
|
}
|
|
}
|
|
|
|
// TODO: noop method
|
|
fn setEmulatedMedia(cmd: anytype) !void {
|
|
// const input = (try const incoming.params(struct {
|
|
// media: ?[]const u8 = null,
|
|
// features: ?[]struct{
|
|
// name: []const u8,
|
|
// value: [] const u8
|
|
// } = null,
|
|
// })) orelse return error.InvalidParams;
|
|
|
|
return cmd.sendResult(null, .{});
|
|
}
|
|
|
|
// TODO: noop method
|
|
fn setFocusEmulationEnabled(cmd: anytype) !void {
|
|
// const input = (try const incoming.params(struct {
|
|
// enabled: bool,
|
|
// })) orelse return error.InvalidParams;
|
|
return cmd.sendResult(null, .{});
|
|
}
|
|
|
|
// TODO: noop method
|
|
fn setDeviceMetricsOverride(cmd: anytype) !void {
|
|
return cmd.sendResult(null, .{});
|
|
}
|
|
|
|
// TODO: noop method
|
|
fn setTouchEmulationEnabled(cmd: anytype) !void {
|
|
return cmd.sendResult(null, .{});
|
|
}
|