diff --git a/src/glide/browser/base/content/browser-hints.mts b/src/glide/browser/base/content/browser-hints.mts index 53feea11..7b945001 100644 --- a/src/glide/browser/base/content/browser-hints.mts +++ b/src/glide/browser/base/content/browser-hints.mts @@ -190,7 +190,9 @@ class GlideHintsClass { * Remove all hints from the DOM tree and switch back to `normal` mode. */ remove_hints() { - GlideBrowser._change_mode("normal"); + if (GlideBrowser.state.mode === "hint") { + GlideBrowser._change_mode("normal"); + } this.#clear_hints(); } diff --git a/src/glide/browser/base/content/plugins/keymaps.mts b/src/glide/browser/base/content/plugins/keymaps.mts index 329e0bba..250ecb5e 100644 --- a/src/glide/browser/base/content/plugins/keymaps.mts +++ b/src/glide/browser/base/content/plugins/keymaps.mts @@ -39,7 +39,33 @@ export function init(sandbox: Sandbox) { // hint mode glide.keymaps.set("normal", "f", "hint"); - glide.keymaps.set("normal", "F", "hint --action=newtab-click"); + glide.keymaps.set("normal", "F", () => + glide.hints.show({ + async action({ content }) { + const result = await content.execute((target) => { + const tagName = target.tagName.toLowerCase(); + const hasHref = tagName === "a" && (target as HTMLAnchorElement).href !== ""; + + if (hasHref) { + return { hasHref: true, href: (target as HTMLAnchorElement).href }; + } else { + target.focus(); + target.$glide_hack_click_from_hint = true; + target.click(); + setTimeout(() => { + target.$glide_hack_click_from_hint = false; + }, 10); + + return { hasHref: false }; + } + }); + + if (result.hasHref && result.href) { + await gBrowser.addTrustedTab(result.href, { inBackground: true }); + } + }, + })); + glide.keymaps.set("normal", "f", "hint --location=browser-ui"); glide.keymaps.set( "normal", diff --git a/src/glide/browser/base/content/test/hints/browser_hints.ts b/src/glide/browser/base/content/test/hints/browser_hints.ts index 6df1a592..df39380b 100644 --- a/src/glide/browser/base/content/test/hints/browser_hints.ts +++ b/src/glide/browser/base/content/test/hints/browser_hints.ts @@ -94,7 +94,8 @@ add_task(async function test_F_opens_new_tab() { is(GlideBrowser.state.mode, "normal", "Mode should return to 'normal' after following hint"); if (final_tab_count > initial_tab_count) { - gBrowser.removeTab(gBrowser.selectedTab); + const new_tab = gBrowser.tabs[gBrowser.tabs.length - 1]; + gBrowser.removeTab(new_tab); } }); }); @@ -438,7 +439,8 @@ add_task(async function test_numeric_hint_generator() { is(GlideBrowser.state.mode, "normal", "Mode should return to 'normal' after following hint"); if (final_tab_count > initial_tab_count) { - gBrowser.removeTab(gBrowser.selectedTab); + const new_tab = gBrowser.tabs[gBrowser.tabs.length - 1]; + gBrowser.removeTab(new_tab); } }); });