Chrono Mock
SpracheDeutsch

Das Datum in einer Electron-App fälschen

Wer danach sucht, findet nur Antworten, die den eigenen Code ändern - das Date-Objekt mocken, die Fake-Timer des Test-Frameworks verwenden. Nichts davon hilft, wenn man eine fertige Anwendung hat. Dies führt die Anwendung aus, die Sie bereits haben.

Warum Injektion sie nicht erreicht

Dieser Modus existiert wegen eines konkreten Fehlschlags. Ein auf Electron gebauter Pomodoro-Timer lief unter einer x60-Sitzung, und sein Countdown bewegte sich überhaupt nicht. Das Zerlegen des Bundles der Anwendung zeigte zwei voneinander unabhängige Gründe, und für keinen gab es auf der nativen Seite eine Lösung:

  • Der Countdown las keine Uhr. Er war ein von setInterval hochgezählter Zähler in einem Web Worker. Es gab keinen Zeitaufruf abzufangen, weil die Anwendung nie fragte, wie spät es ist.
  • Dieser Worker lebt in einem abgeschotteten Renderer-Prozess, und genau dort kommt eine von außen eingeschleuste Bibliothek nicht hinein.

Der Mechanismus auf der Windows-Seite kann hier also nicht helfen, und die Antwort ist, stattdessen mit der eigenen JavaScript-Engine der Anwendung zu sprechen.

Was stattdessen passiert

Die Anwendung wird mit einem Debug-Port und einem sauberen Wegwerfprofil gestartet, und ihre eigenen Zeit-APIs werden über das DevTools-Protokoll auf die Sitzungsuhr gelegt - Date.now, der Konstruktor new Date(), performance.now, setTimeout und setInterval.

Die Überschreibung wird in jedem Kontext installiert, den die Anwendung öffnet, einschließlich ihrer Web Worker - dort steckt der Timer meist, und es ist der eine Ort, den die native Injektion nie erreichen konnte.

An der Bedienung ändert sich nichts. Derselbe Befehl, dasselbe Fenster, dasselbe Sitzungsfenster mit den zwei Uhren und dem Urteil.

# Derselbe Befehl wie für eine native Anwendung - der Modus wird erkannt
chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60

Zwei Einschränkungen, die man vor dem Start kennen sollte

Der Start ist invasiv und sagt das bewusst laut.

Die Anwendung wird mit offenem Remote-Debugging-Port und einem frischen, isolierten Profil unter %TEMP% gestartet - sie läuft nicht mit Ihrem echten Profil und ist nicht die Kopie, die schon in Ihrem Infobereich sitzt. Das Profil wird am Ende der Sitzung gelöscht, und wenn das nicht gelang, sagt die Sitzungszusammenfassung das, statt es stillschweigend liegen zu lassen.

Ein eigenes --user-data-dir oder --remote-debugging-port durchzureichen wird abgelehnt statt überschrieben, denn der naheliegende Unfall - die Sitzung auf Ihr echtes Browserprofil zu richten - ist keiner, den man zulassen sollte.

Die Seiten lesen die Zeitzone der Sitzung.

Jede Seite und jeder Worker wird auf die Sitzungszeitzone gesetzt, einen festen Versatz ohne Sommerzeit, und prüft den Versatz, den er liest, sodass eine Seite, die eine andere Zone gelesen hat, gemeldet wird. Zwei Grenzen: Intl nennt diese Zone einen Versatz wie GMT+02:00 und keine Stadt, und der Hauptprozess einer Electron-Anwendung führt JavaScript in Node aus, das die Sitzung nicht erreicht, sodass er die echte Uhr behält - der Bericht sagt das.

Noch etwas, das Leute überrascht: Ein bereits geplantes Intervall behält seine alte Rate, wenn Sie die Geschwindigkeit mitten in der Sitzung ändern. Date.now, new Date() und performance.now reagieren sofort, ein laufendes setInterval nicht, und die Sitzung warnt davor, statt Sie schließen zu lassen, die Änderung habe nichts bewirkt.

Wie gut ist es getestet

Experimentell, und dieses Wort hat hier eine feste Bedeutung: Es funktioniert an den Zielen, für die es gebaut wurde, wurde nicht breit getestet, und die eingebaute Prüfung ist Ihre Quelle der Wahrheit, nicht diese Seite. Es wurde von Hand geprüft und nicht mit der automatisierten Suite, an einer echten Electron-Anwendung unter 64-Bit-Windows.

Die Abdeckung wird pro JavaScript-Kontext gemeldet und nicht pro Prozess, denn das ist die Einheit, die es hier gibt. Eine Anwendung, die untätig herumsteht und nie nach der Zeit fragt, ergibt ehrlicherweise unbestimmt - sie hat keine Uhr gelesen, sodass sich nichts darüber behaupten lässt, ob sie die richtige gesehen hätte. Was die Urteile bedeuten →

Ausprobieren