From 1987b084c3e002a67661cbdb6b602c60b24361b5 Mon Sep 17 00:00:00 2001 From: Antigravity Date: Sat, 18 Jul 2026 10:30:45 +0000 Subject: [PATCH] =?UTF-8?q?fix(extension):=20applySelectionFromMessage=20t?= =?UTF-8?q?ol=C3=A9rant=20+=20amor=C3=A7age=20pageUrl=20v0.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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é). --- .../extension/_locales/de/messages.json | 2 +- .../extension/_locales/en/messages.json | 2 +- .../extension/_locales/fa/messages.json | 2 +- .../extension/_locales/fr/messages.json | 2 +- .../_locales/de/messages.json | 2 +- .../_locales/en/messages.json | 2 +- .../_locales/fa/messages.json | 2 +- .../_locales/fr/messages.json | 2 +- .../extension/dist-chrome-store/manifest.json | 2 +- .../extension/dist-chrome-store/sidepanel.js | 47 ++++++++++++++++-- .../dist-firefox/_locales/de/messages.json | 2 +- .../dist-firefox/_locales/en/messages.json | 2 +- .../dist-firefox/_locales/fa/messages.json | 2 +- .../dist-firefox/_locales/fr/messages.json | 2 +- .../extension/dist-firefox/manifest.json | 2 +- .../extension/dist-firefox/sidepanel.js | 47 ++++++++++++++++-- memento-note/extension/manifest.json | 2 +- .../memento-web-clipper-chrome-store.zip | Bin 44743 -> 45327 bytes .../extension/memento-web-clipper-firefox.xpi | Bin 44807 -> 45391 bytes memento-note/extension/sidepanel.js | 47 ++++++++++++++++-- 20 files changed, 147 insertions(+), 24 deletions(-) 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 c0bb7996604951d8f0965d39d170a79b7981d685..b64db4e36f15a901f75b3644c6fc971c07c4caef 100644 GIT binary patch delta 13504 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

>%%vsY_*>)U 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
i!0FCBzCl_C+obVGCOsHyZZRdt|Rmh>L$S? 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 delta 12950 zcmY*=V{~3!)NRt(wr!^k8#cCW+s4z_d}5o8(-@6y>xpeUx$S%J829`B%!PT@pMAzS zd+jsVp4#~m2Ks`aC<6hB2?hoW3x-jLunmolp>m@;Fs-sk3k?Q#j1C5d2L_y~AOKWp z$T_TuqjtV(AVQL8|8dvO>)fLrnuOUIuBM_9vX{Au&<)Qrvq)7gAQk%%jmm+)L%*YG z#L2AyBpS?KBsS7zs^aJ25cOxTtgJkOI{ca?IC}}Wl%T{>jyH(WX3Bp4roRV7>*s;- zi2^>wYEWkibyKNK8zt^O@*=(m!~n!n_C+{(6WLYoBKF=L_f44+-K?W=2I-5CPe={WRaK&Dp}OMV{KhMZ zr|Ng`XjFUQeo&ig9D7yxY_nETB$S_Q-e&k=$MquO(~d=8-j6Kh5H2V+AO-LM{#e^! z!yvMVO?jmFs#D56h&gE`e_p-zy`zo4oy3dkIXyD|QT#<*Dg}vb)T3w!w)zQqCz;C)w=d0bS025(!?T;fA$0qMlLH{gZf>nK<2A~&qg6h0>qk(|q&d!<=*uW2DldToa(7o7 zKSKO(k38$|O>svFYzRoFbP1N4n68ZGW@I0<(ghh(0{3YMdpVFqKc`}x;!{!i=0C94 ziE3xLBsPis=8PhSp^By#X?Va-!AYCSu_M#D^OV(Y+icr@R8$2qCUFC%+oYkqV*w~F z&rE?y^{qJ`tDGu}bQ&YuLFMk;{K?6JrK(x0uz}nzyj9Cwi#EcR2M1GYHaDpPNZHqw zZdq>HJNcM+4K2p%1E|G;>#9!T)F#uie0v*+KxzrWVruG1OSGi&N}XmnNcx$qN!I|E zi`4Agu40@F1{mptK6k+NYK;5J&j)^GiN?>PH*5B_(%#)NITuA1CKoIU4zDk*-yvsc zgIzz$u*S&pd>TLPFh~TpV(3RnGYc;zCN?i0S2t5gc)mO;Y=u(U>aHY@I^SFwx)YH} zuSf#IdTEf3n-0vIg?T4kwFHWAq_G7WbH0HW#pAQVsAAo#(wPBnovN71s^s^Zx)cS? zGK{9dQ$8(Lv1@PB9-$*XcMJ4g1y3liXfQnlXDg^CIawxo0Bb0N(!(sII^N_$ygkLz zY;5*~L$&G>5ExhGp{_jHg4;yX)p*5ANcfRscR8HbV%PSyMpFTq z(0ik)in*V|YbZJcT6*)s(>1XaT2_?ti1pRIrfa+&4C0F#4Jy&rNLG(shcuj}L80X1 z?Fu9xM{HyqE>!Px?}HJF`9$XidO7C+dA_%^PviaJEC#@N9}LP1wO?)?>@SRS8xqR# z@&n9olcu)`IMpG=VODY^tGW{LjtX29k9KJ3{9z;s9JeENlc;22E zqS9O){)QHiNoZw$AyS2zL zT!4wOPuq)8!Z6pf797L(t@pO=R$cG}o=Ti!Ph<#TbNM56g}M7RmxYX*^YYgx(8BYn zJ1rDkd&xpzX0coP)s1V?IcDM#N%;|U`3~_vwwAw}il2xW2&jVe^$U#+{-%jSJ zOprJJipV4u%W46?zh%V~vLszck2a&tvttRm_OleQ`%2oA5FknDIE@Oe#jIL~jy0*8 z^$F+-lrF0hB?UOH&nLs7rOp4IQ7~!g$gV1_l)1rN*M+iV!W&W^Ba|cI{WIJL1Ashs zJR)#(eXgi`gn8<(SdCgb3RAj$42ybbwlj*zG50u{)vmWyif^vf$A&MK;}@NnxgARk z){1y3Nqrza!abGWXn5n_x4&2St_Ym}b@+>@Z>`^M$2SompS zk14zIeB$2C_HBUMZkm^Zw%Qbeg;(;3sGC&D;2iSS*2d^dSOJO zcjo5>b2l_MmDZw$XQerFX|va5-)v359YtCtsQ13Ho%-k}P~(#lBZrz3P}ZL9dk`2cmdV{cnoe)mgazh#K%?4(A6GC$28sMCnB ziG64o{aX4ZbX>%#aY&dy{^!@AAr2iD8unkOX`6MK2F%6%`UP$pxQMGj1>9VMB`caO zh&AE7iWx;%El9Be0%}HB?&A6F>fJMMM)AomFM!f`!e0c!fiZZ36c)+WH}QNZLU!d_k4$UDYIF8x+cEC#&+b5dd`h;Es_EKDCHMnedtQJv_J9=iO_tWa zm$7K>l6Cv*Ugk1HuC1Ldpt8^R=9f#B4rZ?eumPVFV7FHMW-&^%;W#($0!fBaxv55S zFg)_iyw7xC7%ykdhIBQj7|zE?_ov)gL<+p(2dCm%HVQ;zLLKZH-mDz>B=nUO-&pW(Upz(YO zCdI4~z*#IxJ6W3|S;8fOzXEz*BK zhZkgzPwi*Mb(&=H6+=0p)Wv~T%)Q*y(Cl3a;H>X2q!6vHV;?&Dn7nuHVRO8h)F(%; zW(#cd_DWfSx&rsb&Cj|kzIm#nc~tHq`(?D!(a~_D8vfp=9?IHteK^EFCB{HoKoUcS z8Z>n5KKXD(xQRY|n0UX^4_mE@?lY5yX(Lq}$2afjFzEsphXNA}!}w`nH>9&vtqryWpz>`pq#DU_-upR|ipVMY1h=HuAL& z@w90sZ>_1_C}ZAfIe$>EtZS@M5fA%o^tejgAZvniy`renWbIHm+Kea&iwdzkp(6IE zr&!k|pItoS1*_3x%%0UI?!&vkWzxwNu&tdH!16)KjRaeiC>?425XllX+#0wYcrP!0b^_#lue8CNspCP2mGrL%d`{BV;W258g zyi>Ya9%S)TyU#Imc-Bz_vhMz&T^ciAiGkuV-uhM<0`+s+441-@Oy->5u4V%|FRQX< z`TBjCxiJd2XRG@K~t)Q@+as&Zgx{Qr2kPz1wK+gD^?lZeI zHyaiVHq(PR29}=%FdSC{U?NPlGrw&$n-=fQ2dR|c*1eod!)`*kMmAay7x`yf#9<5A zs=c1qgq&cJtd%CmEwa}30d!lPr0_FJs8lp9Q%MVRpj$L~j$}S5mg`Hg8q%h$wvKgc ztOpJOT&bjtd?>QQEQhtq7?a6#OhgAzZ%IIpN+yNJ3{bymsIIk^l3r`&_ zsG0P^Sl1C>;T6%$IO>u9+$OHTiIZB>Q9UeGp&Ru+;4n1}jXXMT5j4^coYXRNw+{B8 zJ+AvGt(>KewjQB&xxzu+cxlfv_*?{4y~F(PjxLQ^m~IUU3@qor-vnS_2DT0+Mz&_a z4H9xZN+F+Xxw;MNGIF>VrzuR24(f3#E>UNub|5Y(1t3=f3}Ss5PR7v@8bAyVhKSA? zI`9$KLm;cDg=Fv%BIt;8s9Z!hy9K+oVTI)r5DJv6ny%m&C?<~%sS8Fy%@0T#u-rmk z`iV^rgUyBA!<|U3E{2Sz0?lsslSA1OY2L!q_Y18Pn zvJW@~EW%@DPA)6`utdB_RhOudj9tMuv$(Ss2!*Y5UqX9rRTc?y7w2{E@W3}$-BaDG zGj(cdv#uhkEs}i#&SHn@(zK5=%I&`sR-UvoaLcODfp{qe)l^yRK;iOAoiqFC?d-C8 z;(-ri>}n>&vucJJNMu%Q~QU=kUv$^2rhFQNH5H#Zaxl1Uk%sSnMB!$Kx3Mqc&$vy zt+ru%^R&(42_B(18A^!W>NY{a>9U+jtbMH&J5^daa?>(umN6nf_EVKTmP=b)vfUXB znymI(LP`p|4-qBSK=pbX!d^2G+MMu>z3ju^L-li!7H~xnCRO)N_?z~|8t;dgJ%rlV z6YRR#`HhAf45SCHvw@9a%^|c&>+`FZ*?0_;9M0NkcgT(}0V=TO9-~Q-SqMQt;lEsR z;_61aDv|8uSxYWTuE?`8q&^HeH)8kk5EM5c4vB2YCwF{C79|cvVwU}(QveWGAc>o^ z$u|-?#R3My-Qu1)<(2jPks%C-WF3|0FCKo@ro2>%#?uggSp3LA%j%wlByO=>f+{jT&Wv{^W^&V1Y+IYA$v+jtsEO*|sj~2O;ql?x)@F0y$ z7r*Z!NP$ja4mA<^3%mbj5Txm7Rpj~^4@CZszYSpP`Q!RskjUM*Tw}g!_E65owId@g zu6q!z^7-i%Z)b3IKI^;BV)3G0zpy1E9NVP!k#wLT}aZl_T7KMhe*|B&f6BMy|zB%fqrN9g@*x zR0QA}$miJ{#*Dk{pW9@MKxEIYZ2h`qV9&^AwASA+A112|^!h^ocs84HeF1H71Pz;J zeDfh(=9y1)eK8pQhOa_T3!%cip1r_+I$k#ELJRRbPZgS3a}h_)cT4;Dham$a6_KXu z0FGt)(Z!L2SoIqxwB7XsjnU$qv*(j0b|ye2kDQB{&Y1-dPG#Ss@lX1md}v78FSZ-# z9)2<+LD3CYj-gj zp2tiW%=Bqc*SmC7m)4yvt8&|taWbq>`fZlfPv_`d z8zA?(-;L;xOy?e)-=A0=^1DaAWxcZu=EIDdt>E-NaalYjeUK zgE7+)6gUPj{})DsKF2Hc-;6eI?>|E%eEpYbK#}nK7sbe({foR+O8ym*>A3t&0+Wpn z{|0`>FmQiOh|S8EzsA6x>A&Y)@xcE^rEY@%%%QvIKhDrg2>ic8fVot59k9%s5D>M- zirRUofykRu-2f^X+fhLX$KCDwDZLB z$IV`Is{k73a%2#7bv7pNxiB9o5x~1p#1!RMpdbSn7&T=%g+L_lJy>nRw7p9}7LLw% zO+}AEZ$S<`<;fp)Fa@iTNvNF~`&BfzeC-+}{Kh@|Ulfc*9H%H4bMrHge%I0(ASHy> zO>d7{q{=O`q>zs?${W!0_ZLf_3;G=39~JzRNp$UbI z9HdXzGP^awea_=c(0*V+-QbAm-a*Ao+7d_pSBFkkDQ^bXKfzfybpw_1&vRHBs}lK12QHb%<(p|A?dik^`Wxu9l`E@7Klj2)3!shD0j*Nvu1 z=w=)x0@6hniIVUU+29^V6O+;4h;$k26+UgHdvxWaGQ>CDQ_pZ8G+ly;*1kxr9PPSe z@>$NwnQ#>7oLy$ec+{Hku;^(?Izj zJ+SbbT|DAc472oTjl*aoO4@a_;s%IZiR6c0hzLo#U*=Y3#(;A{sR}4lIbGh*Z$~zq z>PKJ48~P4m9O4wFatN~s3)tYzMUs3yxU+yfBVugB2*Nu>X)yR7dv}0^%%B>SsjlyD zLl~UmT$X`6USsuom`7w5QsQHYwH!x0m73UhXol&S14D(45R2aN`$xkYHktNRmsw%oc=^!FTklwqwp6FokJIiEumo z8gASv@1yS3?9oS^yq*Uih{#Lb!&KN)^-4C2{FYeCnJX}1>E*2_?MbQ;H{#^}4l%87 z)=MO&On*gb!_G~2ljUhMZ~TKj@6sHCEQeL(MlT6l3d$KxA%Yt)UKGyXDj?k_1P-YL zfLQ2l!qgU}b(9azdrs;e}O~U}!$SUAO z^Cc>>MmYD2YLJtb`H}<=4!6Sa$^KVitiS@wXD7De=aU|0TtwZpPC@UNll_&E?d$D1 z6;6;4t>-vP=}{!0#Q58Vo&Do<^z^Z8SvLz^tGBW*{-d~Ma8uLFqC1M-G$X;|4LQyC zekcZkL?@PVT#8mtZBrGU&zFJwV(}_PM78 zpAWaAHcZ^k48^m;x8-OOyZni#nUZ!MmT%272PIsF7CvB}&?pIU{&$ieK=8&62WNm-R|bXvwfoLh4z?7PU`;c!j{dEbM0{ zsnR`cg-Gf3$taSn*d*P^f?>}_zM?u(UCA@n?*~f&uRumL%0ny)7%D%x-cKH{n1z&v@{w=sMS-7!Qe)}^q)BrRT81mqV+s| z#5@B5GFHsN>uW_AJ(dDUtr^vz8<;*T5-60bjyKWiGoN2C>@yduDtdFV)j20GUG%1< zYMl=9aZ@?|E?3YoGglk0){VEXGhiQ&Z_lsRckKypPuXvtMFPZjV{t_H*RTRzyzwLk z;LEo(^@qyDWf$NSW_YiZkyPy`B03YY4ROc08%-d*cO2Ye@z8Oo?eQ~3@QZ+n#*ns?A$TW3| z_hh(|Zf5vU5iwDA(E%uSZu?)uxH%Pt!0`guTEFLFNK(ULh$N$6h-5hGeC!MXsXk9Y zv^W#|Jq_4d43*m}tsyzWbaklHejJ*AEa*u^;n?RfSCJNZ6wC9#etuDGQsT@YoD+}j{N zvTC00!FT>K!+j3S4$@uf8~>9i-A&58e^scO)7-$Jj=6KjSoXCfoixXYIE51sL(XS0 z9`Un8!240SoOX>v?Yok$x-a%Yf&dJ%mTEi?%0Ty&x4$Dl*iH;?-WVmpO*_M@AOqOLp3{wzJeMFap}}lMP0wB?!rii%}ltKGsxn6V2*K9_TxE~!8`Dn6fme-zTCChvo1$ju3m+%>3 z0h}z1Op(ezR9K%jVovY?Nah(Zy3Hoy*Q5}izlA$sgOVJDT@Zl;DUeEyN9R)T7n{o) z(Hw~i1BmC98|!v;#m!6o**NO_UmOxhedEF+JH8uK>0{c)4iE&A!8=PIQfAF{pa-{; zb4!@q)n_QcR{A(N6c2z|7{wC%EO{EP34i%!7X}NVu5d?B!(2)L$Tk+=N|}M4=09Pd zF8x86Ru=1F3WDQ*p5}~$%DH-ajjTPr5|;>aPcXzfrZ{hZk2tV$D#lNi#a+EJEeBjR z4nvI$NcCFMiGW{IiA5SNfuQ7jVq+>1%2`H;&>Z1aeBv`tUb)$%C&xQtu zGRkG?hoPivCC$A7gWEXa2b%%w{%rH3rPM=(KV{mi1Y$;L5>*3_Le@zGR+7T?^2DGg zu>G!l;5^Y$^8&<%Hn0D@U{oH>_|a3B5QRf?@u1aM-CT<$Bx>;3(vFbzrtpHw2zuw- zHP5N>L+7Qh3isWYY+mll+)GaqR{Ek`&+tgeI_KXX}dYou=Oo(RFezH9!$2 z)e69lA{uUb-^e$2(rA(0F-0prKH>G0LkS!n37A;9ZxH}71T;FKSN*T~0&WtZ_1 zacWhFcCCXY^St+1XN0@?knD81)a5z-^t`j;DQHT}L`Ms*g9 zS+tEP$Rc;YuJO&^k;3A)aj+kFm|h30Z)pc4f4KMc%DcjU}dCMFC zaWURA^r4kF?viplr_6pkt8gO<^8Gf|$N<}Z;9hWuFnix~5~N>IbbLIwzKI1qel&S4 z)~R7PHs`cdP>TNM* zZb3%-vlSAioGnw)VS5@11+He-7ZUR;_HoOY>dw2)qtUPFc`P~=F+Voa>Ck@yHklI? zlUhE)a~d9m7Ts2VRoinrwCg|j6*z4FT-NIx)0lmS8szzLITSq}CF2}#<{-p$#mZjz zd-ITwgUO==xsgtxZ^z#U)7^_)zncJh41Q}Va=qIG9ny_acC)=Qlvl$=(L%wnYfZ;> zinOJ3!HoCumy23vwwJW#(MyjvVB#kgGrjOKS1C*EOv_vel!Lt7PCyeAIxUNMj}Y;T*1Vc`YR{s0?R1N$qE~iW2p3U#XMyia%rI?oMQFDSgNp zrB2o=8I9nVUG{WV$CGf`!n$jMN!v!*P<)!W1O)LX#H6yjNdY*8B*>g)!1PZN(OEvF zB{(?#l`zGFk1qNT;dA2>^J;D61Uj=m+n^!}^ZdP1W)OQ&w#+=!UgCy`f7uqbYZqgG z0Ao-AFxqlsvD}=0W!+L1p~1enGP9Ku6S%=;~e77=N?7oQ;Y2iewO_c~WNv)4^O$WvH>|Wp1(4 zdh*YeLlrj$Yl3@d8t+qjxWZ{LtQl`#XhxR+KUDX}-4%(vUDhbF(U&YFPL zCb?FC3WnC592%`8z&?4?^8<;J&+k%PqVvTveQFMmrJc+e$`+c>n<3@!pTSrPYcJMDBag1-AcF@-L*2BF=2*^$~gpsK7DI0#M1O9(sL{(be= zbv{*ydcE@<(sNhAxT+Qzft8lP@OA}WqvI2#ew-O*{5?@~mh0&lICC|DskMK3dySN{ z2U`0Y!dn1k)GZ-ZRBuV-Yb znj3HmL!3V3Xm00w+-0TG*!0E~k9^0wz2hD28#)^cSX%<4&eM{Za`S9*_hDcQDr**~ zakEFBtYGke7`+l*N=_^HY*z^3o6YT_7AgtfV+c(`@F;K(UDNvT@@|z$K#*y1@w6=n~N?dlT`An2JMOUxlrss)x*(Plj^k4-jkQH zL$vo`8t|TA>C(ZQ>u!?k_tca)!6Te($CC;v0Q8=%$nE;2P9tc@b<|;@mvt+MZ-&}h zJybyf{Q;{l4+-)4CK(C}k&#rfH`)Oeeod4RZbzc&nlR9p+PEs@tmo6jR1BtIRJj5` zR3=lq@_=)P%f|8khE@-pcm+5ksumHDPyPF{E3U!7kJ3GpCg@+bUqjPdO^Q?lT4(5Y z0M^m&^p)feGwv$aQHgxDziFy9mlOVKu87cj4uWQe z1|>}?x0)!I+CdkQ*cS^6=$1i-5r(H1#Wxmcl+FKwD66bcr$P6?*up52>SC`=YuF}}6 zI`}M9y!s9(C-rLSH?(acFXl_;>Ei9&RL&>32K`gsCskVx)~2K`1Bp8spg@N6)^}|` z|5TA&k+e0thI^UD*fI{Y_|0n}0y6D&T+?-EPSjdF;11(&%1tnFI2Cl*BJHQ@+_ZS( zCIQ8Kx2d3`TssAF=4uZ13qK7fVU}u`wrY<@a*ABA;0VDaZnb6!r3-ue@&3t;YE7`m|i~8tb^m>CL9JpA18lOuopF(nXoW-JHS4E>4*v z|G>?;pAU67B*|WguTrgaP>rIGH`Xcb+)G6KEgyD5>Vyn#Phc*=$L{zAI)lU=R~P_WY7B*7S@s*SVpig>tSIRFW|x%?n%T?TZDG1Q4HHaz*=yq7g>X!&ogc^*Qe}&Y+13kz&35^Z!W%c zqMZKeT_l7yL6yy<^ph^etY_{+{#jxB$mB$ZWhC5O1)S$-tKTeRYpKnAf-7Wf|JV#P z1$00PYm_T9X*mAG3|keHhV&zd<;E3Y0l=ExVoi!y=UQ}9L>0z;)a%A}PQ7IR^uT~JSn3xkj#JcGe)=kX=7`|HkOt2@!yh!z)HprbjJL-`BF8n| zQ>%XcTHDT?#h|u7u=*os1>J&P_v{DtFJbz+VaPyohP@al zXKj`m{kqH+4F$4OW?Bu)$aY~Ynf)R=gx)muuTyLjs_DXq8%E+Dp=6BKI(SFLjwd&K zpC9ZQEpE+?0Oiv$=iPgHeRL-^R+T}!QpL!YufolhS3-{IOZnUdp>1x?iXOjS%&y)H@*S`};jHhF{Q@ZGtfjxSdDossl}gl^sq>%na7z zFKoV40^HPBDP?5c#}dEEIhdg-(}=ymz*zb#dG-qjl^eI0%33{9(FzmJbph|bN}m-A z7uxIuT=)9j-Pk-aBtliCj-GOddVHSfEoE9AmOs@CNGU&_mIg5f!6-&Ml5aiRqYmIe z@%4`|BGMFmOr%5%FS*)p6tLhfTw}xgmo=%21Hj8?{|Gg2OYz6-k&t8Ba`m{6cOqGq~jL=XksHZsL?|0RtA*w&FAt0RCDYV=hpVcnPc>bbm4fkKH`p-Z7&nK { + 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 || ''