Falsifier la date dans une application Electron
Cherchez cela et toutes les réponses consistent à modifier votre propre code - simuler l'objet
Date, utiliser les faux minuteurs de votre framework de test. Rien de cela n'aide
quand ce que vous avez est une application déjà compilée. Ceci exécute l'application que vous
avez déjà.
Pourquoi l'injection ne l'atteint pas
Ce mode existe à cause d'un échec précis. Un minuteur Pomodoro construit sur Electron a été exécuté
sous une session x60 et son compte à rebours n'a pas bougé du tout. Démonter le bundle
de l'application a montré deux raisons indépendantes, et aucune n'avait de solution côté natif :
- Le compte à rebours ne lisait aucune horloge. C'était un compteur incrémenté par
setInterval, tournant dans un Web Worker. Il n'y avait aucun appel de temps à intercepter, car l'application ne demandait jamais quelle heure il était. - Ce worker vit dans un processus de rendu isolé, qui est précisément l'endroit où une bibliothèque injectée de l'extérieur n'entre pas.
Le mécanisme côté Windows ne peut donc pas aider ici, et la réponse est de s'adresser plutôt au moteur JavaScript propre de l'application.
Ce qui se passe à la place
L'application est lancée avec un port de débogage et un profil propre et jetable, et ses propres
API de temps sont placées sur l'horloge de la session par le protocole DevTools -
Date.now, le constructeur new Date(), performance.now,
setTimeout et setInterval.
La substitution est installée dans chaque contexte que l'application ouvre, y compris ses Web Workers - c'est là que le minuteur se trouve généralement, et le seul endroit que l'injection native ne pouvait pas atteindre.
Rien ne change dans la façon de le piloter. La même commande, la même fenêtre, le même panneau de session avec les deux horloges et le verdict.
# La même commande que pour une application native - le mode est détecté chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60
Deux limites à connaître avant de commencer
Le lancement est invasif, et volontairement bruyant à ce sujet.
L'application est démarrée avec un port de débogage distant ouvert et un profil neuf et isolé sous
%TEMP% - elle ne tourne pas sur votre vrai profil, et ce n'est pas la copie déjà
présente dans votre zone de notification. Le profil est supprimé à la fin de la session, et s'il
n'a pas pu l'être, le résumé de la session le dit plutôt que de le laisser discrètement
traîner.
Transmettre votre propre --user-data-dir ou --remote-debugging-port est
refusé plutôt que remplacé, parce que l'accident évident - pointer la session sur votre vrai
profil de navigateur - n'est pas de ceux qu'il vaut la peine d'autoriser.
Les pages lisent le fuseau horaire de la session.
Chaque page et chaque worker est placé sur le
fuseau horaire de la session, un décalage
fixe sans heure d'été, et vérifie le décalage qu'il lit, de sorte qu'une page qui a lu un
autre fuseau est signalée. Deux limites : Intl nomme ce fuseau par un décalage
comme GMT+02:00 et non par une ville, et le processus principal d'une
application Electron exécute du JavaScript dans Node, que la session n'atteint pas, donc il
garde l'horloge réelle - le rapport le dit.
Une chose de plus qui surprend : un intervalle déjà planifié garde son ancien rythme
quand vous changez la vitesse en pleine session. Date.now, new Date()
et performance.now réagissent immédiatement, un setInterval en cours non,
et la session vous en avertit plutôt que de vous laisser conclure que le changement n'a rien
fait.
À quel point est-il testé
Expérimental, et ce mot a ici un sens défini : il fonctionne sur les cibles pour lesquelles il a été construit, il n'a pas été testé largement, et l'audit intégré est votre source de vérité, pas cette page. Il a été vérifié à la main et non par la suite automatisée, sur une vraie application Electron sous Windows 64 bits.
La couverture est rapportée par contexte JavaScript et non par processus, puisque c'est l'unité qui existe ici. Une application inactive qui ne demande jamais l'heure produit honnêtement indéterminé - elle n'a lu aucune horloge, on ne peut donc rien affirmer sur la question de savoir si elle aurait vu la bonne. Ce que signifient les verdicts →