Como um navegador determina que um script foi executado por muito tempo? [fechadas]

5

Como um navegador determina que um script foi executado por muito tempo? É realmente configurável através de algumas configurações avançadas?

    
por Geek 06.11.2012 / 17:08
fonte

1 resposta

3

Esta provavelmente não é a resposta que você esperava, mas pode ser útil para outra pessoa. Eu só sei os detalhes para o Firefox, mas suponho que os outros navegadores façam algo similar (pelo menos aqueles que limitam a execução de scripts, veja o link fornecido por Yannis Rizos nos comentários).

O JavaScript no navegador geralmente é segmentado de maneira única e orientado a eventos. Isso significa que há uma fila de eventos em algum lugar e o navegador está processando os eventos enfileirados em um loop. Os eventos postados na fila de eventos podem ser eventos "reais" (por exemplo, entrada de teclado) ou eventos sintetizados (criados por código JavaScript, código nativo ou coisas como tempos limite). O processamento desses eventos pode envolver código JavaScript (por exemplo, manipuladores de eventos em uma página da Web), mas não é necessário - um evento pode ser tratado apenas no código nativo. É essencial que o processamento de um evento seja rápido porque atrasa o processamento de todos os outros eventos, incluindo os essenciais para manter a interface do usuário do navegador funcionando - o usuário percebe a falta de processamento de eventos como uma interrupção.

Então, o truque que o Firefox está usando: há um thread verificando regularmente quanto tempo leva o processamento do evento atual (quanto tempo foi gasto fora do loop de processamento de eventos até agora). Se exceder um certo limite (determinado pela preferência dom.max_script_run_time para scripts da Web e dom.max_chrome_script_run_time para os próprios scripts do navegador), esse encadeamento verificará a pilha do encadeamento principal - e se encontrar um quadro JavaScript na pilha, ele o suspenderá. O aviso "script sem resposta" é exibido e o navegador retorna ao processamento da fila de eventos temporariamente. Se você decidir parar o script, esse código JavaScript será interrompido. Não tenho certeza de como exatamente isso está sendo interrompido, mas provavelmente gerando uma exceção JavaScript que não pode ser capturada - algo que não sempre funcionará corretamente se os quadros de pilha nativos e JavaScript forem intercalados .

A implementação real é, obviamente, mais complicada do que a que expliquei acima (por exemplo, quando se trata de diálogos modais), mas isso deve ser suficiente para você começar se quiser saber mais.

    
por 06.11.2012 / 21:01
fonte