Chrono Mock
BahasaBahasa Indonesia

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 →

Cobalah