diff --git a/src/background/index.ts b/src/background/index.ts index 1e53cb1..d728c6d 100644 --- a/src/background/index.ts +++ b/src/background/index.ts @@ -4,12 +4,26 @@ import { migrate } from './migrate.js' import { each, Deferred } from 'extra-promise' import { applyPropertyDecorators } from 'extra-proxy' import { getActiveTab, waitForLaunch, LaunchReason } from 'extra-webextension' -import { IBackgroundAPI } from '@src/contract.js' +import { IBackgroundAPI, SpecialMessage } from '@src/contract.js' import { ImplementationOf } from 'delight-rpc' import { createServer } from '@delight-rpc/webextension' import { updateMenu } from './menu.js' -import { isDev } from '@utils/is-dev.js' -import { assert, isntUndefined } from '@blackglory/prelude' +import { isntUndefined } from '@blackglory/prelude' + +let activeFrameId = 0 +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (sender.id === chrome.runtime.id) { + switch (message) { + case SpecialMessage.UpdateActiveFrameId: { + if (isntUndefined(sender.frameId)) { + activeFrameId = sender.frameId + sendResponse() + } + break + } + } + } +}) const launched = new Deferred() @@ -76,27 +90,14 @@ chrome.contextMenus.onClicked.addListener(async (info, tab) => { chrome.commands.onCommand.addListener(async (command, tab) => { tab = tab ?? await getActiveTab() - const tabId = tab.id - assert(isntUndefined(tabId)) - - const frames = await chrome.webNavigation.getAllFrames({ tabId }) ?? [] - - const result = await Promise.any( - frames.map(async frame => { - const result = await commandHandlers[command]( - { - frameUrl: frame.url - , frameId: frame.frameId - } - , tab - ) - assert(isntUndefined(result)) - - return result - }) + const result = await commandHandlers[command]( + { frameId: activeFrameId } + , tab ) - await handleCommandResult(result) + if (result) { + await handleCommandResult(result) + } }) async function ensureOffscreenDocument(): Promise { diff --git a/src/content-script.ts b/src/content-script.ts index 1af1cbe..83959f0 100644 --- a/src/content-script.ts +++ b/src/content-script.ts @@ -1,11 +1,21 @@ import { createServer } from '@delight-rpc/webextension' -import { IFrameAPI } from '@src/contract.js' +import { IFrameAPI, SpecialMessage } from '@src/contract.js' import { isDev } from '@utils/is-dev.js' if (isDev()) { console.info(`[${chrome.runtime.getManifest().name}] The content script is injected`) } +window.addEventListener('focus', async () => { + try { + await chrome.runtime.sendMessage(SpecialMessage.UpdateActiveFrameId) + } catch (e) { + if (isDev()) { + console.error(e) + } + } +}) + createServer({ getActiveElementTextContent , getDocumentTitle diff --git a/src/contract.ts b/src/contract.ts index 96aa9fa..88bc856 100644 --- a/src/contract.ts +++ b/src/contract.ts @@ -1,3 +1,7 @@ +export enum SpecialMessage { + UpdateActiveFrameId = 'UpdateActiveFrameId' +} + export enum StorageItemKey { Menu = 'menu' , Config = 'config' diff --git a/src/manifest.dev.json b/src/manifest.dev.json index aef5e85..f465d2e 100644 --- a/src/manifest.dev.json +++ b/src/manifest.dev.json @@ -93,7 +93,6 @@ , "clipboardWrite" , "offscreen" , "storage" - , "webNavigation" ] , "host_permissions": [ "" diff --git a/src/manifest.prod.json b/src/manifest.prod.json index 53246d2..add9ca6 100644 --- a/src/manifest.prod.json +++ b/src/manifest.prod.json @@ -93,7 +93,6 @@ , "clipboardWrite" , "offscreen" , "storage" - , "webNavigation" ] , "host_permissions": [ ""