fix(extension): applySelectionFromMessage tolérant + amorçage pageUrl v0.4.2
VRAI bug (que tu as raison de souligner, j'aurais pas dû revert) : la fonction applySelectionFromMessage rejetait TOUT message si pageUrl n'était pas encore settée, ou si les URLs différaient sur un trailing slash / fragment / query. Et pageUrl se populate de façon async via chrome.tabs.query dans refreshPageContext — donc le premier SELECTION_CHANGED arrivait avant pageUrl, était rejeté, et la sélection n'était jamais appliquée. Fixes dans sidepanel.js : - applySelectionFromMessage : si pageUrl vide, on amorce depuis le message (pageUrl, pageTitle, pageDomain, pageFavicon). Sans ce fallback, le bouton « Clipper la sélection » n'apparaît jamais. - Comparaison d'URL tolérante (origin + pathname, sans trailing slash, hash, query). - refreshPageContext : ne pas marquer tab?.url undefined comme restricted. Version bumpée 0.4.1 → 0.4.2 (à chaque livraison comme demandé).
This commit is contained in:
@@ -284,17 +284,58 @@ function updateSelectionUI() {
|
||||
}
|
||||
|
||||
function applySelectionFromMessage(msg) {
|
||||
if (!msg || msg.url !== pageUrl) return
|
||||
if (!msg) return
|
||||
// Comparaison d'URL tolérante : ignorer trailing slash, hash, query.
|
||||
// Compare origin + pathname, pas l'URL complète.
|
||||
const normalizeUrl = (u) => {
|
||||
if (!u) return ''
|
||||
try { return new URL(u).origin + new URL(u).pathname.replace(/\/+$/, '') }
|
||||
catch { return u }
|
||||
}
|
||||
const msgUrl = msg.url || ''
|
||||
const curUrl = pageUrl || ''
|
||||
// Si pageUrl n'est pas encore set (race avec refreshPageContext),
|
||||
// on accepte le premier message qui arrive et on amorce les métadonnées
|
||||
// de la page depuis le message. Sans ce fallback, le bouton ne s'affiche
|
||||
// jamais si chrome.tabs.query rate ou revient avant refreshPageContext.
|
||||
if (!curUrl) {
|
||||
if (msgUrl) {
|
||||
pageUrl = msgUrl
|
||||
pageTitle = msg.title || pageTitle || ''
|
||||
try {
|
||||
const u = new URL(msgUrl)
|
||||
pageDomain = u.hostname
|
||||
pageFavicon = `https://www.google.com/s2/favicons?domain=${u.hostname}&sz=32`
|
||||
} catch { /* ignore */ }
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else if (normalizeUrl(msgUrl) !== normalizeUrl(curUrl)) {
|
||||
// URL vraiment différente (autre onglet) — ignorer.
|
||||
return
|
||||
}
|
||||
selectionText = msg.text || ''
|
||||
if (msg.dir?.toLowerCase() === 'rtl') pageDir = 'rtl'
|
||||
if (msg.lang) pageLang = msg.lang
|
||||
if (state === 'idle') updateSelectionUI()
|
||||
if (state === 'idle') {
|
||||
// Si la page card n'existait pas encore (pageUrl vide avant),
|
||||
// il faut un render() complet pour qu'elle apparaisse.
|
||||
if (!curUrl) {
|
||||
render()
|
||||
} else {
|
||||
updateSelectionUI()
|
||||
}
|
||||
} else {
|
||||
console.debug('[memento] selection updated while busy, deferring UI')
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshPageContext() {
|
||||
const tab = await getActiveTab()
|
||||
activeTabId = tab?.id ?? null
|
||||
pageRestricted = isRestrictedUrl(tab?.url)
|
||||
// Ne marquer restricted QUE si on a vraiment une URL à analyser.
|
||||
// tab?.url undefined doit être traité comme "inconnu", pas restricted.
|
||||
pageRestricted = tab?.url ? isRestrictedUrl(tab.url) : false
|
||||
|
||||
if (!tab?.id || pageRestricted) {
|
||||
pageUrl = tab?.url || ''
|
||||
|
||||
Reference in New Issue
Block a user