Structure de l'application et navigation
Scripts utilisateur intelligents
Scripts par site avec correspondance d'URL et moment d'exécution (comme Greasemonkey)
1Que sont les Smart User Scripts ?#
Les Smart User Scripts sont des scripts nommés individuellement, chacun avec :
🌐 ses motifs de correspondance d'URL (sur quelles pages s'exécuter)
⏱ son moment d'exécution (avant, pendant ou après le chargement)
✅ son interrupteur d'activation/désactivation
Ils fonctionnent comme Greasemonkey ou Tampermonkey dans les navigateurs de bureau, mais intégrés directement à votre application.
✅ Parfait pour :
- Connexion automatique UNIQUEMENT sur la page /login
- Masquer les publicités UNIQUEMENT sur les pages d'articles (https://news.com/article/*)
- Surveiller les changements du DOM avec MutationObserver
- Injecter avant l'affichage de la page (document-start) pour éviter le flash
Différence clé avec l'injection rapide :
Injection rapide = même CSS/JS sur TOUTES les pages
Smart User Scripts = contrôle par script, par URL et par moment d'exécution
2Où le trouver#
Étape 4 (Autorisations) → faites défiler vers le bas → carte 🤖 Smart User Scripts.
Touchez « + Ajouter » pour créer un nouveau script. Chaque script a :
- Nom : affiché dans la liste du gestionnaire
- Motifs de correspondance d'URL : un par ligne (le joker * est pris en charge)
- Exécuter à : document-end / document-start / document-idle
- Code : votre JavaScript
- Interrupteur d'activation
Touchez une ligne pour modifier ou supprimer un script.
3Exemples de motifs de correspondance d'URL#
Les motifs déterminent sur quelles pages le script s'exécute. Utilisez * comme joker :
# Run on every page of every site
*://*/*
# Run only on example.com (any path)
https://example.com/*
# Run on ALL pages of ANY .com domain
https://*.com/*
# Run only on the /login path
https://example.com/login
https://example.com/login/*
# Run on news article pages
https://news.example.com/article/*4Le moment d'exécution expliqué#
- document-end (par défaut)
S'exécute APRÈS la fin du chargement de la page. Sûr et le plus compatible. À utiliser pour masquer des éléments, ajouter des boutons, suivre des événements.
- document-start ⚡ (avancé)
S'exécute AVANT l'affichage de la page. Injecte le script dans le HTML brut via shouldInterceptRequest. Supprime les en-têtes CSP. À utiliser pour un CSS de mode sombre ou pour forcer le viewport avant le rendu.
- document-idle ⏱
S'exécute 1,5 seconde après le chargement de la page. Utile pour capter du contenu AJAX chargé tardivement ou des fenêtres modales qui apparaissent après un délai.
5Exemple 1 : connexion automatique sur /login uniquement#
Correspondance : https://myapp.com/login
Exécution : document-end
// Auto-fill login form
(function() {
var email = document.querySelector('input[type=email], input[name=email]');
var pass = document.querySelector('input[type=password]');
if (email) email.value = '[email protected]';
if (pass) pass.value = 'mypassword';
// Uncomment to auto-submit:
// var form = document.querySelector('form');
// if (form) form.submit();
})();6Exemple 2 : masquer les paywalls sur les pages d'articles#
Correspondance : https://news.site.com/article/*
Exécution : document-end
// Hide paywall overlay and restore scroll
(function() {
var overlay = document.querySelector('.paywall-overlay, .metered-content, #paywall');
if (overlay) overlay.remove();
document.body.style.overflow = 'auto';
document.documentElement.style.overflow = 'auto';
})();7Exemple 3 : surveiller le contenu dynamique (MutationObserver)#
Correspondance : *://*/*
Exécution : document-end
Pour les éléments qui apparaissent APRÈS le chargement de la page (fenêtres modales chargées à la demande, publicités) :
// Remove any modal/popup that appears dynamically
(function() {
var sel = '.modal, .popup, .overlay, [class*="modal"], [class*="popup"]';
// Remove existing ones first
document.querySelectorAll(sel).forEach(function(el) { el.remove(); });
// Watch for new ones
var obs = new MutationObserver(function() {
document.querySelectorAll(sel).forEach(function(el) { el.remove(); });
});
obs.observe(document.body, { childList: true, subtree: true });
// Stop watching after 30 s to save battery
setTimeout(function() { obs.disconnect(); }, 30000);
})();8Exemple 4 : forcer le mode sombre avant l'affichage (document-start)#
Correspondance : *://*/*
Exécution : document-start
Injecte le CSS avant l'affichage de la page, sans flash blanc :
// Inject dark theme before page renders
(function() {
var s = document.createElement('style');
s.id = '__force_dark__';
s.textContent = [
'html { filter: invert(1) hue-rotate(180deg) !important; }',
'img,video,canvas,svg { filter: invert(1) hue-rotate(180deg) !important; }'
].join('\
');
(document.head || document.documentElement).appendChild(s);
})();9Exemple 5 : analytique personnalisée / suivi d'événements#
Correspondance : https://myshop.com/*
Exécution : document-idle
Envoyez des événements personnalisés une fois la page totalement stabilisée :
// Track page views + button clicks
(function() {
// Page view
console.log('[Analytics] Page: ' + location.href);
// Track all CTA button clicks
document.querySelectorAll('button, .btn, a[href]').forEach(function(el) {
el.addEventListener('click', function() {
console.log('[Analytics] Clicked: ' + (el.textContent || el.href));
// Replace with your own tracker call, e.g. gtag('event', ...)
});
});
})();10Sécurité et limites#
⚡ document-start supprime les en-têtes Content-Security-Policy pour la page ciblée. À utiliser uniquement sur des sites que vous possédez ou en lesquels vous avez explicitement confiance.
🔒 Politique de même origine : le JS ne peut pas accéder aux iframes d'une autre origine (PayPal, Stripe, connexion Google). Cette règle est appliquée par le moteur du navigateur et ne peut pas être contournée.
📵 HTTPS uniquement : les API comme la géolocalisation ou la caméra dans les scripts injectés nécessitent HTTPS.
✅ Protection contre la double exécution : chaque script est protégé par un indicateur window, il ne s'exécute donc qu'une fois par page.
✅ Fonctionne hors ligne : les Smart User Scripts s'exécutent aussi dans les applications hors ligne issues d'un ZIP.