mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 07:03:29 +00:00
Handle CDP msg with order <id, method> and <method, id>
Signed-off-by: Francis Bouvier <francis@lightpanda.io>
This commit is contained in:
@@ -43,23 +43,43 @@ pub fn do(
|
|||||||
s: []const u8,
|
s: []const u8,
|
||||||
ctx: *Ctx,
|
ctx: *Ctx,
|
||||||
) ![]const u8 {
|
) ![]const u8 {
|
||||||
|
|
||||||
|
// JSON scanner
|
||||||
var scanner = std.json.Scanner.initCompleteInput(alloc, s);
|
var scanner = std.json.Scanner.initCompleteInput(alloc, s);
|
||||||
defer scanner.deinit();
|
defer scanner.deinit();
|
||||||
|
|
||||||
std.debug.assert(try scanner.next() == .object_begin);
|
std.debug.assert(try scanner.next() == .object_begin);
|
||||||
|
|
||||||
try checkKey("id", (try scanner.next()).string);
|
// handle 2 possible orders:
|
||||||
const id = try std.fmt.parseUnsigned(u64, (try scanner.next()).number, 10);
|
// - id, method <...>
|
||||||
|
// - method, id <...>
|
||||||
try checkKey("method", (try scanner.next()).string);
|
var id_key = (try scanner.next()).string;
|
||||||
const method_name = (try scanner.next()).string;
|
var id_token = try scanner.next();
|
||||||
|
var method_key = (try scanner.next()).string;
|
||||||
|
var method_token = try scanner.next();
|
||||||
|
// check swap order
|
||||||
|
if (!std.mem.eql(u8, id_key, "id")) {
|
||||||
|
const swap_key = method_key;
|
||||||
|
const swap_token = method_token;
|
||||||
|
method_key = id_key;
|
||||||
|
method_token = id_token;
|
||||||
|
id_key = swap_key;
|
||||||
|
id_token = swap_token;
|
||||||
|
}
|
||||||
|
try checkKey(id_key, "id");
|
||||||
|
try checkKey(method_key, "method");
|
||||||
|
|
||||||
|
// retrieve id and method
|
||||||
|
const id = try std.fmt.parseUnsigned(u64, id_token.number, 10);
|
||||||
|
const method_name = method_token.string;
|
||||||
std.log.debug("cmd: id {any}, method {s}", .{ id, method_name });
|
std.log.debug("cmd: id {any}, method {s}", .{ id, method_name });
|
||||||
|
|
||||||
|
// retrieve domain from method
|
||||||
var iter = std.mem.splitScalar(u8, method_name, '.');
|
var iter = std.mem.splitScalar(u8, method_name, '.');
|
||||||
const domain = std.meta.stringToEnum(Domains, iter.first()) orelse
|
const domain = std.meta.stringToEnum(Domains, iter.first()) orelse
|
||||||
return error.UnknonwDomain;
|
return error.UnknonwDomain;
|
||||||
|
|
||||||
|
// select corresponding domain
|
||||||
return switch (domain) {
|
return switch (domain) {
|
||||||
.Browser => browser(alloc, id, iter.next().?, &scanner, ctx),
|
.Browser => browser(alloc, id, iter.next().?, &scanner, ctx),
|
||||||
.Target => target(alloc, id, iter.next().?, &scanner, ctx),
|
.Target => target(alloc, id, iter.next().?, &scanner, ctx),
|
||||||
|
|||||||
Reference in New Issue
Block a user