In che modo un browser determina che uno script è stato eseguito troppo a lungo? In realtà è configurabile tramite alcune impostazioni avanzate?
Questa probabilmente non è la risposta che ti aspettavi ma potrebbe essere utile a qualcun altro. Conosco solo i dettagli di Firefox ma presumo che gli altri browser facciano qualcosa di simile (almeno quelli che limitano l'esecuzione dello script, vedi il link fornito da Yannis Rizos nei commenti).
JavaScript nel browser è generalmente a thread singolo e basato su eventi. Ciò significa che c'è una coda di eventi da qualche parte e il browser sta elaborando gli eventi in coda in un ciclo. Gli eventi pubblicati nella coda degli eventi possono essere sia eventi "reali" (ad esempio input da tastiera) che eventi sintetizzati (creati da codice JavaScript, codice nativo o cose come timeout). L'elaborazione di questi eventi potrebbe coinvolgere codice JavaScript (ad esempio gestori di eventi in una pagina Web) ma non deve: un evento può essere gestito solo in codice nativo. È essenziale che l'elaborazione di un evento sia rapida perché ritarda l'elaborazione di tutti gli altri eventi, compresi quelli essenziali per mantenere attiva l'interfaccia utente del browser: l'utente percepisce la mancanza dell'elaborazione degli eventi come in un hang.
Quindi il trucco che Firefox sta usando: c'è un thread che controlla regolarmente quanto tempo impiega l'elaborazione dell'evento corrente (quanto tempo è stato speso al di fuori del ciclo di elaborazione degli eventi fino a quel momento). Se supera una certa soglia (determinata dalla preferenza dom.max_script_run_time
per gli script Web e dom.max_chrome_script_run_time
per gli script del browser) questo thread controlla lo stack del thread principale e, se trova una frame JavaScript nello stack, lo sospende. Viene visualizzato l'avviso "script non rispondente" e il browser torna a elaborare temporaneamente la coda eventi. Se si decide di interrompere lo script, questo codice JavaScript viene arrestato. Non sono sicuro di come venga fermato esattamente, ma probabilmente generando un'eccezione JavaScript che non può essere rilevata - qualcosa che doesn funzionano sempre correttamente se i frame di stack nativi e JavaScript sono interlacciati .
La vera implementazione è ovviamente più complicata di quello che ho spiegato sopra (ad esempio quando si tratta di finestre di dialogo modali) ma questo dovrebbe essere sufficiente per iniziare se vuoi saperne di più.
Leggi altre domande sui tag web-development javascript browser web-browser