#!/usr/bin/env node /** * Script de diagnostic pour l'extension Momento * Vérifie tous les fichiers et identifie les problèmes potentiels */ import fs from 'fs' import path from 'path' import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const extDir = __dirname console.log('🔍 Diagnostic Extension Momento\n') const issues = [] const warnings = [] // Vérifier la syntaxe des fichiers JS function checkSyntax(filePath) { try { const content = fs.readFileSync(filePath, 'utf8') // Pas de vérification syntaxique simple en Node.js sans eval // On vérifie juste que le fichier est lisible return true } catch (error) { issues.push(`Fichier illisible: ${filePath} - ${error.message}`) return false } } // Vérifier les event handlers inline dans le HTML function checkInlineHandlers(htmlPath) { try { const content = fs.readFileSync(htmlPath, 'utf8') const inlineHandlers = [] if (content.match(/onerror=/i)) inlineHandlers.push('onerror') if (content.match(/onclick=/i)) inlineHandlers.push('onclick') if (content.match(/onload=/i)) inlineHandlers.push('onload') if (inlineHandlers.length > 0) { issues.push(`Event handlers inline trouvés dans ${htmlPath}: ${inlineHandlers.join(', ')}`) } else { console.log('✓ Pas d\'event handlers inline dans le HTML') } } catch (error) { issues.push(`Impossible de lire ${htmlPath}: ${error.message}`) } } // Vérifier les fixes CSP dans sidepanel.js function checkCSPFixes(jsPath) { try { const content = fs.readFileSync(jsPath, 'utf8') // Vérifier l'absence de onerror inline if (content.match(/onerror=/)) { issues.push('Event handler onerror trouvé dans sidepanel.js') } else { console.log('✓ Pas de onerror inline dans sidepanel.js') } // Vérifier la présence du fix avec data-fallback if (content.includes('data-fallback')) { console.log('✓ Fix CSP data-favicon présent') } else { warnings.push('Fix CSP data-favicon可能缺失') } // Vérifier le handler de favicon if (content.includes("querySelector('.page-favicon')")) { console.log('✓ Handler error pour favicon présent') } else { warnings.push('Handler error pour favicon可能缺失') } } catch (error) { issues.push(`Impossible de lire ${jsPath}: ${error.message}`) } } // Vérifier le fix pick mode function checkPickModeFix(jsPath) { try { const content = fs.readFileSync(jsPath, 'utf8') // Vérifier le handler visibilitychange if (content.includes('visibilityState === \'hidden\'')) { console.log('✓ Handler visibilitychange pour hidden présent') } else { issues.push('Handler visibilitychange pour hidden manquant') } // Vérifier l'appel à setPickModeOnTab(false) if (content.match(/visibilityState === 'hidden'.*setPickModeOnTab\(false\)/s)) { console.log('✓ Appel setPickModeOnTab(false) dans visibilitychange présent') } else { issues.push('Appel setPickModeOnTab(false) dans visibilitychange可能缺失') } } catch (error) { issues.push(`Impossible de lire ${jsPath}: ${error.message}`) } } // Vérifier le manifest function checkManifest(manifestPath) { try { const content = fs.readFileSync(manifestPath, 'utf8') const manifest = JSON.parse(content) console.log('✓ Manifest.json valide') console.log(` Version: ${manifest.version}`) console.log(` Permissions: ${manifest.permissions.join(', ')}`) console.log(` Host permissions: ${manifest.host_permissions.length}`) } catch (error) { issues.push(`Manifest.json invalide: ${error.message}`) } } // Exécuter les tests console.log('📋 Vérification des fichiers...\n') checkSyntax(path.join(extDir, 'sidepanel.js')) checkSyntax(path.join(extDir, 'content.js')) checkSyntax(path.join(extDir, 'background.js')) console.log('\n🔒 Vérification CSP...\n') checkInlineHandlers(path.join(extDir, 'sidepanel.html')) checkCSPFixes(path.join(extDir, 'sidepanel.js')) console.log('\n🎯 Vérification fix pick mode...\n') checkPickModeFix(path.join(extDir, 'sidepanel.js')) console.log('\n📦 Vérification manifest...\n') checkManifest(path.join(extDir, 'manifest.json')) // Résumé console.log('\n' + '='.repeat(50)) if (issues.length === 0 && warnings.length === 0) { console.log('✅ Aucun problème détecté !') } else { if (issues.length > 0) { console.log('\n❌ Problèmes détectés:') issues.forEach(issue => console.log(` • ${issue}`)) } if (warnings.length > 0) { console.log('\n⚠️ Warnings:') warnings.forEach(warning => console.log(` • ${warning}`)) } } console.log('\n📝 Instructions:') console.log('1. Rechargez l\'extension dans chrome://extensions (bouton 🔄)') console.log('2. Ouvrez une page web normale') console.log('3. Cliquez sur l\'icône Momento') console.log('4. Fermez le sidepanel - la bannière doit disparaître') console.log('5. Ouvrez la console (F12) - pas d\'erreur CSP')