123456789const PING_TIMEOUT_MS = 150;1011async function pingContentScript(tabId: number): Promise<boolean> {12 return new Promise((resolve) => {13 const timer = setTimeout(() => resolve(false), PING_TIMEOUT_MS);14 try {15 chrome.tabs.sendMessage(tabId, { type: "PING" }, (response) => {16 clearTimeout(timer);17 if (chrome.runtime.lastError) {18 resolve(false);19 } else {20 resolve(response?.ok === true);21 }22 });23 } catch {24 clearTimeout(timer);25 resolve(false);26 }27 });28}2930async function openPopup(): Promise<void> {31 try {32 33 34 await (chrome.action as { openPopup?: () => Promise<void> }).openPopup?.();35 } catch {36 37 }38}3940export function setupCommands(): void {41 chrome.commands.onCommand.addListener(async (command) => {42 if (command !== "summon-autofill") return;4344 const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });45 if (!tab?.id || !tab.url) return;4647 48 if (!/^https?:\/\//i.test(tab.url)) {49 await openPopup();50 return;51 }5253 const tabId = tab.id;5455 56 const alive = await pingContentScript(tabId);57 if (alive) {58 59 60 61 const response = await new Promise<{ ok?: boolean }>((resolve) => {62 try {63 chrome.tabs.sendMessage(tabId, { type: "SUMMON_AUTOFILL" }, (r) => {64 resolve((r as { ok?: boolean }) ?? {});65 });66 } catch {67 resolve({});68 }69 });70 if (response?.ok) return;71 }7273 74 75 await openPopup();76 });77}