mirror of
				https://github.com/lightpanda-io/browser.git
				synced 2025-10-30 07:31:47 +00:00 
			
		
		
		
	Add basic support for key events
Support CDP's Input.dispatchKeyEvent and DOM key events. Currently only keydown is supported and expects every key to be a displayable character. It turns out that manipulating the DOM via key events isn't great because the behavior really depends on the cursor. So, to do this more accurately, we'd have to introduce some concept of a cursor. Personally, I don't think we'll run into many pages that are purposefully using keyboard events. But driver (puppeteer/playwright) scripts might be another issue.
This commit is contained in:
		| @@ -21,14 +21,60 @@ const Page = @import("../../browser/page.zig").Page; | ||||
|  | ||||
| pub fn processMessage(cmd: anytype) !void { | ||||
|     const action = std.meta.stringToEnum(enum { | ||||
|         dispatchKeyEvent, | ||||
|         dispatchMouseEvent, | ||||
|     }, cmd.input.action) orelse return error.UnknownMethod; | ||||
|  | ||||
|     switch (action) { | ||||
|         .dispatchKeyEvent => return dispatchKeyEvent(cmd), | ||||
|         .dispatchMouseEvent => return dispatchMouseEvent(cmd), | ||||
|     } | ||||
| } | ||||
|  | ||||
| // https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchKeyEvent | ||||
| fn dispatchKeyEvent(cmd: anytype) !void { | ||||
|     const params = (try cmd.params(struct { | ||||
|         type: Type, | ||||
|         key: []const u8, | ||||
|         code: []const u8, | ||||
|         modifiers: u4, | ||||
|         // Many optional parameters are not implemented yet, see documentation url. | ||||
|  | ||||
|         const Type = enum { | ||||
|             keyDown, | ||||
|             keyUp, | ||||
|             rawKeyDown, | ||||
|             char, | ||||
|         }; | ||||
|     })) orelse return error.InvalidParams; | ||||
|  | ||||
|     try cmd.sendResult(null, .{}); | ||||
|  | ||||
|     // quickly ignore types we know we don't handle | ||||
|     switch (params.type) { | ||||
|         .keyUp, .rawKeyDown, .char => return, | ||||
|         .keyDown => {}, | ||||
|     } | ||||
|  | ||||
|     const bc = cmd.browser_context orelse return; | ||||
|     const page = bc.session.currentPage() orelse return; | ||||
|  | ||||
|     const keyboard_event = Page.KeyboardEvent{ | ||||
|         .key = params.key, | ||||
|         .code = params.code, | ||||
|         .type = switch (params.type) { | ||||
|             .keyDown => .keydown, | ||||
|             else => unreachable, | ||||
|         }, | ||||
|         .alt = params.modifiers & 1 == 1, | ||||
|         .ctrl = params.modifiers & 2 == 2, | ||||
|         .meta = params.modifiers & 4 == 4, | ||||
|         .shift = params.modifiers & 8 == 8, | ||||
|     }; | ||||
|     try page.keyboardEvent(keyboard_event); | ||||
|     // result already sent | ||||
| } | ||||
|  | ||||
| // https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchMouseEvent | ||||
| fn dispatchMouseEvent(cmd: anytype) !void { | ||||
|     const params = (try cmd.params(struct { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Karl Seguin
					Karl Seguin