diff --git a/memento-note/extension/_locales/de/messages.json b/memento-note/extension/_locales/de/messages.json index 87e5416..3974589 100644 --- a/memento-note/extension/_locales/de/messages.json +++ b/memento-note/extension/_locales/de/messages.json @@ -36,7 +36,7 @@ "message": "Fügen Sie die HTTPS- (oder LAN-)URL Ihres Memento-Servers ein. Cookies in diesem Browser verarbeiten die Anmeldung." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento kann nicht auf diese Registerkarte zugreifen. Überprüfen Sie die Tastatur-/Site-Erweiterungsberechtigungen – oder öffnen Sie den Seitenbereich." diff --git a/memento-note/extension/_locales/en/messages.json b/memento-note/extension/_locales/en/messages.json index 97e5a64..0a0c7fd 100644 --- a/memento-note/extension/_locales/en/messages.json +++ b/memento-note/extension/_locales/en/messages.json @@ -36,7 +36,7 @@ "message": "Paste the HTTPS (or LAN) URL of your Memento server. Cookies in this browser handle sign-in." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento can't access this tab. Check keyboard/site extension permissions — or open the Side Panel." diff --git a/memento-note/extension/_locales/fa/messages.json b/memento-note/extension/_locales/fa/messages.json index f5952c9..1b5d358 100644 --- a/memento-note/extension/_locales/fa/messages.json +++ b/memento-note/extension/_locales/fa/messages.json @@ -36,7 +36,7 @@ "message": "URL HTTPS (یا LAN) سرور Memento خود را جایگذاری کنید. کوکی‌های این مرورگر ورود به سیستم را کنترل می‌کنند." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento نمی تواند به این برگه دسترسی پیدا کند. مجوزهای افزونه صفحه کلید/سایت را بررسی کنید - یا پانل جانبی را باز کنید." diff --git a/memento-note/extension/_locales/fr/messages.json b/memento-note/extension/_locales/fr/messages.json index 789e762..02ad9b2 100644 --- a/memento-note/extension/_locales/fr/messages.json +++ b/memento-note/extension/_locales/fr/messages.json @@ -36,7 +36,7 @@ "message": "Collez l'URL HTTPS (ou LAN) de votre serveur Memento. Les cookies de ce navigateur gèrent la connexion." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento ne peut pas accéder à cet onglet. Vérifiez les autorisations du clavier/extension de site – ou ouvrez le panneau latéral." diff --git a/memento-note/extension/dist-chrome-store/_locales/de/messages.json b/memento-note/extension/dist-chrome-store/_locales/de/messages.json index 87e5416..3974589 100644 --- a/memento-note/extension/dist-chrome-store/_locales/de/messages.json +++ b/memento-note/extension/dist-chrome-store/_locales/de/messages.json @@ -36,7 +36,7 @@ "message": "Fügen Sie die HTTPS- (oder LAN-)URL Ihres Memento-Servers ein. Cookies in diesem Browser verarbeiten die Anmeldung." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento kann nicht auf diese Registerkarte zugreifen. Überprüfen Sie die Tastatur-/Site-Erweiterungsberechtigungen – oder öffnen Sie den Seitenbereich." diff --git a/memento-note/extension/dist-chrome-store/_locales/en/messages.json b/memento-note/extension/dist-chrome-store/_locales/en/messages.json index 97e5a64..0a0c7fd 100644 --- a/memento-note/extension/dist-chrome-store/_locales/en/messages.json +++ b/memento-note/extension/dist-chrome-store/_locales/en/messages.json @@ -36,7 +36,7 @@ "message": "Paste the HTTPS (or LAN) URL of your Memento server. Cookies in this browser handle sign-in." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento can't access this tab. Check keyboard/site extension permissions — or open the Side Panel." diff --git a/memento-note/extension/dist-chrome-store/_locales/fa/messages.json b/memento-note/extension/dist-chrome-store/_locales/fa/messages.json index f5952c9..1b5d358 100644 --- a/memento-note/extension/dist-chrome-store/_locales/fa/messages.json +++ b/memento-note/extension/dist-chrome-store/_locales/fa/messages.json @@ -36,7 +36,7 @@ "message": "URL HTTPS (یا LAN) سرور Memento خود را جایگذاری کنید. کوکی‌های این مرورگر ورود به سیستم را کنترل می‌کنند." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento نمی تواند به این برگه دسترسی پیدا کند. مجوزهای افزونه صفحه کلید/سایت را بررسی کنید - یا پانل جانبی را باز کنید." diff --git a/memento-note/extension/dist-chrome-store/_locales/fr/messages.json b/memento-note/extension/dist-chrome-store/_locales/fr/messages.json index 789e762..02ad9b2 100644 --- a/memento-note/extension/dist-chrome-store/_locales/fr/messages.json +++ b/memento-note/extension/dist-chrome-store/_locales/fr/messages.json @@ -36,7 +36,7 @@ "message": "Collez l'URL HTTPS (ou LAN) de votre serveur Memento. Les cookies de ce navigateur gèrent la connexion." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento ne peut pas accéder à cet onglet. Vérifiez les autorisations du clavier/extension de site – ou ouvrez le panneau latéral." diff --git a/memento-note/extension/dist-chrome-store/manifest.json b/memento-note/extension/dist-chrome-store/manifest.json index 975fdbe..bf6b8f3 100644 --- a/memento-note/extension/dist-chrome-store/manifest.json +++ b/memento-note/extension/dist-chrome-store/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "__MSG_extName__", - "version": "0.4.1", + "version": "0.4.2", "description": "__MSG_extDescription__", "default_locale": "en", "permissions": [ diff --git a/memento-note/extension/dist-chrome-store/sidepanel.js b/memento-note/extension/dist-chrome-store/sidepanel.js index eaa63b3..63acaa0 100644 --- a/memento-note/extension/dist-chrome-store/sidepanel.js +++ b/memento-note/extension/dist-chrome-store/sidepanel.js @@ -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 || '' diff --git a/memento-note/extension/dist-firefox/_locales/de/messages.json b/memento-note/extension/dist-firefox/_locales/de/messages.json index 87e5416..3974589 100644 --- a/memento-note/extension/dist-firefox/_locales/de/messages.json +++ b/memento-note/extension/dist-firefox/_locales/de/messages.json @@ -36,7 +36,7 @@ "message": "Fügen Sie die HTTPS- (oder LAN-)URL Ihres Memento-Servers ein. Cookies in diesem Browser verarbeiten die Anmeldung." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento kann nicht auf diese Registerkarte zugreifen. Überprüfen Sie die Tastatur-/Site-Erweiterungsberechtigungen – oder öffnen Sie den Seitenbereich." diff --git a/memento-note/extension/dist-firefox/_locales/en/messages.json b/memento-note/extension/dist-firefox/_locales/en/messages.json index 97e5a64..0a0c7fd 100644 --- a/memento-note/extension/dist-firefox/_locales/en/messages.json +++ b/memento-note/extension/dist-firefox/_locales/en/messages.json @@ -36,7 +36,7 @@ "message": "Paste the HTTPS (or LAN) URL of your Memento server. Cookies in this browser handle sign-in." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento can't access this tab. Check keyboard/site extension permissions — or open the Side Panel." diff --git a/memento-note/extension/dist-firefox/_locales/fa/messages.json b/memento-note/extension/dist-firefox/_locales/fa/messages.json index f5952c9..1b5d358 100644 --- a/memento-note/extension/dist-firefox/_locales/fa/messages.json +++ b/memento-note/extension/dist-firefox/_locales/fa/messages.json @@ -36,7 +36,7 @@ "message": "URL HTTPS (یا LAN) سرور Memento خود را جایگذاری کنید. کوکی‌های این مرورگر ورود به سیستم را کنترل می‌کنند." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento نمی تواند به این برگه دسترسی پیدا کند. مجوزهای افزونه صفحه کلید/سایت را بررسی کنید - یا پانل جانبی را باز کنید." diff --git a/memento-note/extension/dist-firefox/_locales/fr/messages.json b/memento-note/extension/dist-firefox/_locales/fr/messages.json index 789e762..02ad9b2 100644 --- a/memento-note/extension/dist-firefox/_locales/fr/messages.json +++ b/memento-note/extension/dist-firefox/_locales/fr/messages.json @@ -36,7 +36,7 @@ "message": "Collez l'URL HTTPS (ou LAN) de votre serveur Memento. Les cookies de ce navigateur gèrent la connexion." }, "footerVersion": { - "message": "Memento Web Clipper 0.4.0" + "message": "Memento Web Clipper 0.4.2" }, "errPermissionDenied": { "message": "Memento ne peut pas accéder à cet onglet. Vérifiez les autorisations du clavier/extension de site – ou ouvrez le panneau latéral." diff --git a/memento-note/extension/dist-firefox/manifest.json b/memento-note/extension/dist-firefox/manifest.json index 432883b..e45ed60 100644 --- a/memento-note/extension/dist-firefox/manifest.json +++ b/memento-note/extension/dist-firefox/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "__MSG_extName__", - "version": "0.4.1", + "version": "0.4.2", "description": "__MSG_extDescription__", "default_locale": "en", "permissions": [ diff --git a/memento-note/extension/dist-firefox/sidepanel.js b/memento-note/extension/dist-firefox/sidepanel.js index eaa63b3..63acaa0 100644 --- a/memento-note/extension/dist-firefox/sidepanel.js +++ b/memento-note/extension/dist-firefox/sidepanel.js @@ -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 || '' diff --git a/memento-note/extension/manifest.json b/memento-note/extension/manifest.json index 90a8586..975997a 100644 --- a/memento-note/extension/manifest.json +++ b/memento-note/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "__MSG_extName__", - "version": "0.4.1", + "version": "0.4.2", "description": "__MSG_extDescription__", "default_locale": "en", "permissions": [ diff --git a/memento-note/extension/memento-web-clipper-chrome-store.zip b/memento-note/extension/memento-web-clipper-chrome-store.zip index c0bb799..b64db4e 100644 Binary files a/memento-note/extension/memento-web-clipper-chrome-store.zip and b/memento-note/extension/memento-web-clipper-chrome-store.zip differ diff --git a/memento-note/extension/memento-web-clipper-firefox.xpi b/memento-note/extension/memento-web-clipper-firefox.xpi index 3aa302f..58041be 100644 Binary files a/memento-note/extension/memento-web-clipper-firefox.xpi and b/memento-note/extension/memento-web-clipper-firefox.xpi differ diff --git a/memento-note/extension/sidepanel.js b/memento-note/extension/sidepanel.js index 6a21b0c..9bc47ce 100644 --- a/memento-note/extension/sidepanel.js +++ b/memento-note/extension/sidepanel.js @@ -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 || ''