Bir Electron uygulamasında tarihi sahtelemek
Bunu aratın ve her yanıt kendi kodunuzu değiştirmekle ilgili - Date nesnesini
mock’lamak, test çerçevenizin sahte zamanlayıcılarını kullanmak. Elinizde derlenmiş bir uygulama
olduğunda bunların hiçbiri işe yaramaz. Bu, zaten sahip olduğunuz uygulamayı çalıştırır.
Enjeksiyon ona neden ulaşmaz
Bu kip belirli bir başarısızlık yüzünden vardır. Electron üzerine kurulu bir Pomodoro zamanlayıcısı
x60 oturumunda çalıştırıldı ve geri sayımı hiç ilerlemedi. Uygulamanın paketini
parçalara ayırmak iki bağımsız neden gösterdi ve hiçbirinin yerel tarafta bir çözümü yoktu:
- Geri sayım bir saat okumuyordu. Bir Web Worker içinde çalışan,
setIntervaltarafından artırılan bir sayaçtı. Yakalanacak bir zaman çağrısı yoktu; çünkü uygulama saatin kaç olduğunu hiç sormuyordu. - O worker, yalıtılmış bir renderer sürecinde yaşar; dışarıdan enjekte edilen bir kitaplığın giremediği tam da o yer.
Dolayısıyla Windows tarafındaki mekanizma burada yardımcı olamaz ve çözüm, bunun yerine uygulamanın kendi JavaScript motoruyla konuşmaktır.
Bunun yerine ne olur
Uygulama bir hata ayıklama portu ve temiz, tek kullanımlık bir profille başlatılır ve kendi zaman
API’leri DevTools protokolü üzerinden oturum saatine alınır - Date.now,
new Date() oluşturucusu, performance.now, setTimeout ve
setInterval.
Geçersiz kılma, uygulamanın açtığı her bağlama, Web Worker’ları dahil, yüklenir - zamanlayıcının genellikle yaşadığı ve yerel enjeksiyonun asla ulaşamayacağı tek yer burasıdır.
Onu nasıl yönettiğiniz hakkında hiçbir şey değişmez. Aynı komut, aynı pencere, iki saatin ve kararın bulunduğu aynı oturum paneli.
# Yerel bir uygulamayla aynı komut - kip otomatik algılanır chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60
Başlamadan önce bilmeye değer iki sınırlama
Başlatma müdahaleci ve bunu bilerek yüksek sesle söylüyor.
Uygulama açık bir uzak hata ayıklama portu ve %TEMP% altında yeni, yalıtılmış bir
profille başlatılır - gerçek profilinizde çalışmaz ve sistem tepsinizde zaten bulunan kopya da
değildir. Profil oturum bittiğinde silinir ve silinememişse oturum özeti bunu sessizce geride
bırakmak yerine söyler.
Kendi --user-data-dir ya da --remote-debugging-port değerinizi iletmek
geçersiz kılınmak yerine reddedilir; çünkü bariz kaza - oturumu gerçek tarayıcı profilinize
yöneltmek - izin vermeye değmeyecek bir şeydir.
Sayfalar oturumun saat dilimini okur.
Her sayfa ve worker, yaz saati uygulaması olmayan sabit bir fark olan
oturum saat dilimine alınır ve okuduğu farkı denetler,
bu yüzden başka bir dilimi okuyan sayfa raporlanır. İki sınır var: Intl bu
dilimi bir şehir olarak değil, GMT+02:00 gibi bir fark olarak adlandırır ve bir
Electron uygulamasının ana süreci JavaScript'i oturumun erişemediği Node içinde çalıştırır,
bu yüzden gerçek saati korur - rapor bunu söyler.
İnsanları şaşırtan bir şey daha: zaten zamanlanmış bir aralık, oturum ortasında hızı
değiştirdiğinizde eski hızını korur. Date.now, new Date() ve
performance.now hemen tepki verir, çalışan bir setInterval vermez ve
oturum, değişikliğin hiçbir şey yapmadığı sonucuna varmanıza izin vermek yerine bunu uyarır.
Ne kadar iyi test edildi
Deneysel, ve bu sözcüğün burada tanımlı bir anlamı var: karşısında geliştirildiği hedeflerde çalışır, geniş çapta test edilmemiştir ve yerleşik denetim, bu sayfa değil, sizin gerçeğin kaynağınızdır. Otomatik paketle değil elle, 64 bit Windows üzerinde gerçek bir Electron uygulamasına karşı doğrulandı.
Kapsama, süreç başına değil JavaScript bağlamı başına bildirilir; çünkü burada var olan birim budur. Boşta duran ve saati hiç sormayan bir uygulama dürüstçe belirsiz üretir - saat okumadı, dolayısıyla doğru olanı görüp görmeyeceği hakkında hiçbir şey iddia edilemez. Kararlar ne anlama geliyor →