Memalsukan tanggal di aplikasi Electron
Cari hal ini dan setiap jawaban adalah tentang mengubah kode Anda sendiri - me-mock objek
Date, memakai timer palsu dari framework pengujian Anda. Semua itu tidak membantu
ketika yang Anda miliki adalah aplikasi yang sudah jadi. Ini menjalankan aplikasi yang sudah Anda
punya.
Mengapa injeksi tidak menjangkaunya
Mode ini ada karena sebuah kegagalan tertentu. Timer Pomodoro yang dibangun di atas Electron
dijalankan dalam sesi x60 dan hitung mundurnya sama sekali tidak bergerak. Membongkar
bundel aplikasi itu menunjukkan dua alasan yang saling bebas, dan tak satu pun punya solusi di
sisi native:
- Hitung mundur itu tidak membaca jam. Ia adalah penghitung yang ditambah oleh
setInterval, berjalan di dalam Web Worker. Tidak ada panggilan waktu yang dapat dicegat, karena aplikasi tidak pernah bertanya jam berapa sekarang. - Worker itu hidup di proses renderer yang terisolasi, yang justru tempat pustaka yang disuntikkan dari luar tidak dapat masuk.
Jadi mekanisme sisi Windows tidak dapat membantu di sini, dan jawabannya adalah berbicara langsung dengan mesin JavaScript milik aplikasi itu.
Apa yang terjadi sebagai gantinya
Aplikasi diluncurkan dengan port debug dan profil bersih sekali pakai, dan API waktunya sendiri
dipasang ke jam sesi melalui protokol DevTools - Date.now, konstruktor
new Date(), performance.now, setTimeout, dan
setInterval.
Penggantian dipasang ke setiap konteks yang dibuka aplikasi, termasuk Web Worker-nya - tempat timer biasanya ternyata berada, dan satu-satunya tempat yang tidak akan pernah dijangkau injeksi native.
Tidak ada yang berubah pada cara Anda mengendalikannya. Perintah yang sama, jendela yang sama, panel sesi yang sama dengan dua jam dan putusannya.
# Perintah yang sama seperti untuk aplikasi native - modenya terdeteksi sendiri chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60
Dua batasan yang perlu diketahui sebelum Anda mulai
Peluncurannya invasif, dan sengaja dibuat terang-terangan soal itu.
Aplikasi dimulai dengan port debugging jarak jauh terbuka dan profil baru yang terisolasi di
%TEMP% - ia tidak berjalan pada profil asli Anda, dan bukan salinan yang sudah ada di
system tray Anda. Profil dihapus ketika sesi berakhir, dan jika tidak dapat dihapus, ringkasan
sesi menyatakannya, bukan membiarkannya diam-diam tertinggal.
Meneruskan --user-data-dir atau --remote-debugging-port milik Anda
sendiri ditolak, bukan ditimpa, karena kecelakaan yang paling jelas - mengarahkan sesi ke profil
peramban asli Anda - bukan sesuatu yang layak diizinkan.
Halaman membaca zona waktu sesi.
Setiap halaman dan worker ditempatkan pada zona waktu
sesi, selisih tetap tanpa waktu musim panas, dan memeriksa selisih yang dibacanya,
sehingga halaman yang membaca zona lain dilaporkan. Dua batasan: Intl menamai
zona itu sebagai selisih seperti GMT+02:00, bukan sebagai kota, dan proses
utama aplikasi Electron menjalankan JavaScript di Node, yang tidak dijangkau sesi, sehingga
ia tetap memakai jam asli - laporan menyebutkannya.
Satu hal lagi yang mengejutkan orang: interval yang sudah dijadwalkan mempertahankan laju
lamanya ketika Anda mengubah kecepatan di tengah sesi. Date.now,
new Date(), dan performance.now bereaksi seketika,
setInterval yang sedang berjalan tidak, dan sesi memperingatkannya, bukan
membiarkan Anda menyimpulkan bahwa perubahan itu tidak berbuat apa-apa.
Seberapa baik pengujiannya
Eksperimental, dan kata itu punya arti yang ditetapkan di sini: ia berfungsi pada target tempat ia dibangun, belum diuji secara luas, dan audit bawaan adalah sumber kebenaran Anda, bukan halaman ini. Ia diverifikasi secara manual, bukan dengan rangkaian otomatis, pada aplikasi Electron nyata di Windows 64-bit.
Cakupan dilaporkan per konteks JavaScript, bukan per proses, karena itulah unit yang ada di sini. Aplikasi yang diam dan tidak pernah menanyakan waktu dengan jujur menghasilkan tidak dapat ditentukan - ia tidak membaca jam, sehingga tidak ada yang dapat diklaim tentang apakah ia akan melihat yang benar. Arti setiap putusan →