From c8c6da4370905ea65d01c84ced0f47362a5b79a9 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 06:30:56 +0000 Subject: [PATCH] refactor: simplify cross-browser messaging logic Extracts the complex cross-browser messaging logic into a shared `sendMessageToTab` utility function in `utils/utils.js`. This function provides a unified Promise-based interface for sending messages to tabs across different browser environments (browserAPI, browser, and chrome). Updates `sendWebhook` in `utils/utils.js` and the messaging logic in `popup/popup.js` to use this new utility, reducing code duplication and improving maintainability. Co-authored-by: cmuench <211294+cmuench@users.noreply.github.com> --- popup/popup.js | 26 +------------------ utils/utils.js | 69 ++++++++++++++++++++++++++------------------------ 2 files changed, 37 insertions(+), 58 deletions(-) diff --git a/popup/popup.js b/popup/popup.js index b329b7a..fc3a03d 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -102,31 +102,7 @@ document.addEventListener("DOMContentLoaded", async () => { return false; }; - const sendMessageToTab = (tabId, message) => { - if (browserAPI.tabs && typeof browserAPI.tabs.sendMessage === "function") { - return browserAPI.tabs.sendMessage(tabId, message); - } - if (typeof browser !== "undefined" && browser.tabs?.sendMessage) { - return browser.tabs.sendMessage(tabId, message); - } - if (typeof chrome !== "undefined" && chrome.tabs?.sendMessage) { - return new Promise((resolve, reject) => { - try { - chrome.tabs.sendMessage(tabId, message, (response) => { - const error = chrome.runtime?.lastError; - if (error) { - reject(new Error(error.message)); - } else { - resolve(response); - } - }); - } catch (error) { - reject(error); - } - }); - } - throw new Error("tabs.sendMessage API is unavailable"); - }; + const sendMessageToTab = window.sendMessageToTab; const updateCaptureButtonState = (webhookId) => { const button = captureButtonMap.get(webhookId); diff --git a/utils/utils.js b/utils/utils.js index e90941c..2c27658 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -24,6 +24,35 @@ const getBrowserAPI = () => { } }; +/** + * Sends a message to a specific tab, handling cross-browser differences. + * @param {number} tabId - The ID of the tab to send the message to. + * @param {Object} message - The message object to send. + * @returns {Promise} A promise that resolves with the response from the tab. + */ +async function sendMessageToTab(tabId, message) { + const browserAPI = getBrowserAPI(); + if (browserAPI.tabs && typeof browserAPI.tabs.sendMessage === "function") { + return browserAPI.tabs.sendMessage(tabId, message); + } + if (typeof browser !== "undefined" && typeof browser.tabs?.sendMessage === "function") { + return browser.tabs.sendMessage(tabId, message); + } + if (typeof chrome !== "undefined" && typeof chrome.tabs?.sendMessage === "function") { + return new Promise((resolve, reject) => { + chrome.tabs.sendMessage(tabId, message, (response) => { + const error = chrome.runtime?.lastError; + if (error) { + reject(new Error(error.message)); + } else { + resolve(response); + } + }); + }); + } + throw new Error("tabs.sendMessage API is unavailable"); +} + /** * Replaces i18n placeholders in the HTML document. * It targets elements with the 'data-i18n' attribute, @@ -177,39 +206,12 @@ async function sendWebhook(webhook, isTest = false) { } } - const canSendMessage = - typeof browserAPI.tabs?.sendMessage === "function" || - (typeof browser !== "undefined" && typeof browser.tabs?.sendMessage === "function") || - (typeof chrome !== "undefined" && typeof chrome.tabs?.sendMessage === "function"); - - if (selectors.length > 0 && canSendMessage) { + if (selectors.length > 0) { try { - let response; - if (browserAPI.tabs && typeof browserAPI.tabs.sendMessage === "function") { - response = await browserAPI.tabs.sendMessage(activeTab.id, { - type: "GET_SELECTOR_CONTENT", - selectors, - }); - } else if (typeof browser !== "undefined" && typeof browser.tabs?.sendMessage === "function") { - response = await browser.tabs.sendMessage(activeTab.id, { - type: "GET_SELECTOR_CONTENT", - selectors, - }); - } else if (typeof chrome !== "undefined" && typeof chrome.tabs?.sendMessage === "function") { - response = await new Promise((resolve, reject) => { - chrome.tabs.sendMessage(activeTab.id, { - type: "GET_SELECTOR_CONTENT", - selectors, - }, (res) => { - const err = chrome.runtime?.lastError; - if (err) { - reject(new Error(err.message)); - } else { - resolve(res); - } - }); - }); - } + const response = await sendMessageToTab(activeTab.id, { + type: "GET_SELECTOR_CONTENT", + selectors, + }); if (response && Array.isArray(response.selectorContent)) { selectorContent = response.selectorContent.map((value) => typeof value === "string" ? value.trim() : "" @@ -363,9 +365,10 @@ async function sendWebhook(webhook, isTest = false) { } if (typeof module !== 'undefined' && module.exports) { - module.exports = { replaceI18nPlaceholders, getBrowserAPI, sendWebhook }; + module.exports = { replaceI18nPlaceholders, getBrowserAPI, sendMessageToTab, sendWebhook }; } else { window.replaceI18nPlaceholders = replaceI18nPlaceholders; window.getBrowserAPI = getBrowserAPI; + window.sendMessageToTab = sendMessageToTab; window.sendWebhook = sendWebhook; }