From e59048e90ff5488956cf557836d94334871331e9 Mon Sep 17 00:00:00 2001 From: circl Date: Sun, 14 Jul 2024 20:48:26 +0200 Subject: [PATCH] LibWebView: Add keyboard navigation to the Inspector --- Base/res/ladybird/inspector.js | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/Base/res/ladybird/inspector.js b/Base/res/ladybird/inspector.js index f5b7b2a74da2..45b38aa8034f 100644 --- a/Base/res/ladybird/inspector.js +++ b/Base/res/ladybird/inspector.js @@ -7,6 +7,8 @@ let selectedBottomTabButton = null; let selectedDOMNode = null; let pendingEditDOMNode = null; +let visibleDOMNodes = []; + let consoleGroupStack = []; let consoleGroupNextID = 0; @@ -123,6 +125,16 @@ inspector.loadDOMTree = tree => { event.preventDefault(); }); } + + domNodes = domTree.querySelectorAll("details"); + + for (let domNode of domNodes) { + domNode.addEventListener("toggle", event => { + updateVisibleDOMNodes(); + }); + } + + updateVisibleDOMNodes(); }; inspector.loadAccessibilityTree = tree => { @@ -343,6 +355,30 @@ const addAttributeToDOMNode = domNode => { domNode.parentNode.insertBefore(container, domNode.parentNode.lastChild); }; +const updateVisibleDOMNodes = () => { + let domTree = document.getElementById("dom-tree"); + + visibleDOMNodes = []; + + function recurseDOMNodes(node) { + for (let child of node.children) { + if (child.classList.contains("hoverable")) { + visibleDOMNodes.push(child); + } + + if (child.tagName === "DIV") { + if (node.open) { + recurseDOMNodes(child); + } + } else { + recurseDOMNodes(child); + } + } + } + + recurseDOMNodes(domTree); +}; + const requestContextMenu = (clientX, clientY, domNode) => { pendingEditDOMNode = null; @@ -516,5 +552,37 @@ document.addEventListener("DOMContentLoaded", () => { event.preventDefault(); }); + document.addEventListener("keydown", event => { + const UP_ARROW_KEYCODE = 38; + const DOWN_ARROW_KEYCODE = 40; + const RETURN_KEYCODE = 13; + const SPACE_KEYCODE = 32; + + if (document.activeElement.tagName !== "INPUT") { + if (event.keyCode == UP_ARROW_KEYCODE || event.keyCode == DOWN_ARROW_KEYCODE) { + let selectedIndex = visibleDOMNodes.indexOf(selectedDOMNode); + if (selectedIndex < 0) { + return; + } + + let newIndex; + + if (event.keyCode == UP_ARROW_KEYCODE) { + newIndex = selectedIndex - 1; + } else if (event.keyCode == DOWN_ARROW_KEYCODE) { + newIndex = selectedIndex + 1; + } + + if (visibleDOMNodes[newIndex]) { + inspectDOMNode(visibleDOMNodes[newIndex]); + } + } else if (event.keyCode == RETURN_KEYCODE || event.keyCode == SPACE_KEYCODE) { + if (selectedDOMNode.parentNode.tagName === "SUMMARY") { + selectedDOMNode.parentNode.click(); + } + } + } + }); + inspector.inspectorLoaded(); });