Files
Momento/memento-note/extension/background.js
Antigravity 9d10815415
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m44s
CI / Deploy production (on server) (push) Successful in 24s
fix(extension): forwarder les messages content→sidepanel via le background
Bug réel : chrome.runtime.sendMessage depuis un content script ne va
QU'au background service worker en MV3. Le side panel qui écoute via
chrome.runtime.onMessage ne reçoit jamais rien directement. Résultat :
la sélection, le titre de la page et le contexte n'atteignaient jamais
le panneau.

Fix :
- background.js : ajouter un onMessage qui forward SELECTION_CHANGED et
  PAGE_CONTEXT_CHANGED vers toutes les surfaces (side panel).
- sidepanel.js applySelectionFromMessage : normaliser les URLs
  (ignorer query/fragment/trailing slash), amorcer pageUrl depuis le
  premier message si tabs.query a échoué, accepter une sélection qui
  arrive avant refreshPageContext.

La v0.3.1 souffrait du même bug — la sélection fonctionnait parfois par
chance quand Chrome routait le message avant que le side panel ne soit
complètement initialisé. Maintenant c'est garanti.
2026-07-18 09:41:27 +00:00

47 lines
1.8 KiB
JavaScript

/** Service worker — ouvre le panneau latéral (Chrome Side Panel ou Firefox sidebar) au clic sur l'icône. */
const extApi = (typeof browser !== 'undefined' && browser.sidebarAction) ? browser : chrome
if (extApi.sidePanel?.setPanelBehavior) {
// Chrome MV3 : Side Panel API
extApi.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }).catch(() => {})
} else if (extApi.sidebarAction?.open) {
// Firefox MV3 : sidebarAction
extApi.action?.onClicked?.addListener?.(() => {
extApi.sidebarAction.open().catch(() => {})
})
}
extApi.runtime?.onInstalled?.addListener?.(() => {
if (extApi.sidePanel?.setPanelBehavior) {
extApi.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }).catch(() => {})
}
})
extApi.runtime?.onStartup?.addListener?.(() => {
if (extApi.sidePanel?.setPanelBehavior) {
extApi.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }).catch(() => {})
}
})
// === Forwarding content script → side panel ===
// En Chrome MV3, chrome.runtime.sendMessage depuis un content script arrive
// uniquement au background service worker (PAS au side panel directement).
// On doit broadcaster manuellement vers toutes les surfaces ouvertes.
extApi.runtime?.onMessage?.addListener?.((msg, sender) => {
if (!msg || typeof msg !== 'object') return
// Messages émis par le content script qui doivent atteindre le side panel.
const FORWARD_TYPES = new Set([
'SELECTION_CHANGED',
'PAGE_CONTEXT_CHANGED',
])
if (!FORWARD_TYPES.has(msg.type)) return
// Broadcast à toutes les surfaces (side panel, popup).
// runAt permet au receiver de filtrer par URL s'il veut.
extApi.runtime.sendMessage({
...msg,
_fromContentScript: true,
_fromTabId: sender?.tab?.id,
}).catch(() => { /* no listener */ })
// Retourne true pour permettre une réponse asynchrone si besoin.
return false
})