fix(extension): timing bannière pick mode + responsive side panel
Bannière pick mode : - ensureContentScript() : retry le PING 8x (avec backoff 80→290ms) après chrome.scripting.executeScript, parce que l'injection est async côté page et le listener n'est pas enregistré immédiatement. - Avant : SET_PICK_MODE partait dans le vide, la bannière « surlignez le texte à clipper » n'apparaissait jamais. Responsive : - Media queries : <380px (Chrome Side Panel narrow), 380-420px (default), >420px (Firefox sidebar), <320px (very small). - Padding/margin/font-size adaptatifs selon la largeur du panneau. - .selection-body : min-height 80px, plus de max-height fixe, scroll si trop long. overflow-wrap: anywhere pour le texte long. - .btn : padding 16px / min-height 48px pour le tactile. - .page-card : word-break + overflow-wrap pour les URLs et titres longs. - Firefox : media query dédié >480px pour aérer la sidebar Firefox (plus large que Chrome Side Panel). Rebuilt : - memento-web-clipper-chrome-store.zip - memento-web-clipper-firefox.xpi
This commit is contained in:
@@ -160,18 +160,32 @@ async function getActiveTab() {
|
||||
}
|
||||
|
||||
async function ensureContentScript(tabId) {
|
||||
// PING initial : si le script est déjà injecté, on retourne immédiatement.
|
||||
try {
|
||||
const resp = await chrome.tabs.sendMessage(tabId, { type: 'PING' })
|
||||
if (resp?.ok) return true
|
||||
} catch {
|
||||
/* inject */
|
||||
/* pas injecté */
|
||||
}
|
||||
// Sinon, injection manuelle via chrome.scripting.executeScript.
|
||||
try {
|
||||
await chrome.scripting.executeScript({ target: { tabId }, files: ['content.js'] })
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
// L'injection est async côté page : le script doit finir de s'initialiser
|
||||
// (IIFE, listeners, flag globalThis) avant qu'on puisse lui parler.
|
||||
// On PING avec retry pour attendre qu'il soit prêt.
|
||||
for (let i = 0; i < 8; i++) {
|
||||
await new Promise(r => setTimeout(r, 80 + i * 30))
|
||||
try {
|
||||
const resp = await chrome.tabs.sendMessage(tabId, { type: 'PING' })
|
||||
if (resp?.ok) return true
|
||||
} catch {
|
||||
/* pas encore prêt */
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
async function setPickModeOnTab(enabled) {
|
||||
@@ -181,7 +195,7 @@ async function setPickModeOnTab(enabled) {
|
||||
try {
|
||||
await chrome.tabs.sendMessage(activeTabId, { type: 'SET_PICK_MODE', enabled })
|
||||
} catch {
|
||||
/* ignore */
|
||||
/* ignore — retry au prochain syncPickMode */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user