Chrono Mock
IdiomaPortuguês (Brasil)

As páginas web dentro de um aplicativo nativo

Um aplicativo de desktop com um motor web embutido executa suas páginas em um processo separado e isolado. O mecanismo nativo cobre o aplicativo e para nessa fronteira - então a janela vai para a data que você pediu e o painel dentro dela não. Isto fecha essa lacuna.

A falha que parece sucesso

Muitos aplicativos do Windows são nativos por fora e uma página web por dentro. Uma tela de configurações, um painel de controle, uma visualização de relatório, um painel de licença - construídos uma vez em HTML e hospedados em WebView2 ou Qt WebEngine em vez de escritos duas vezes.

O motor executa essas páginas em seu próprio processo, e esse processo é isolado. Uma biblioteca injetada no aplicativo não entra nele. Tudo o que o aplicativo pede ao Windows passa para a data da sessão, e tudo o que a página pede ao JavaScript não:

  • A barra de título, os logs e os arquivos dizem 2038.
  • O painel dentro da mesma janela diz hoje.
  • Nada dá erro, nada avisa, e as duas metades parecem igualmente confiantes.

Essa é a versão cara deste bug, porque o teste parece ter rodado. O comportamento anterior relatava uma sessão assim como um sucesso limpo, o que era uma afirmação que a ferramenta não conseguia sustentar.

O que a sessão faz em vez disso

A sessão executa os dois mecanismos ao mesmo tempo. O hook nativo entra no aplicativo como sempre, e as páginas são alcançadas do único jeito em que se alcança um renderizador isolado: perguntando ao próprio motor.

Na inicialização, o aplicativo herda duas variáveis de ambiente que pedem ao motor dele que abra uma porta de depuração local. Elas são acrescentadas às opções que o aplicativo já passa, em vez de substituí-las. A sessão então observa os próprios processos até que essa porta apareça, e quando ela aparece, cada página e cada worker por trás dela passam para o mesmo relógio do aplicativo.

Um início, uma velocidade, uma linha do tempo. Uma mudança de velocidade ou um salto chega ao aplicativo e às suas páginas juntos, e os temporizadores das páginas correm no ritmo do aplicativo em vez de em um ritmo próprio.

Vem ativado por padrão e se desativa com uma única chave, que não abre porta nenhuma e deixa as páginas no relógio real.

# Nada para configurar - o motor é encontrado se estiver lá
chrono run "C:\Program Files\YourApp\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60

# Ou deixar as páginas em paz e não abrir porta nenhuma
chrono run "C:\Program Files\YourApp\YourApp.exe" --at 2038-01-01T00:00:00 --no-embedded

O que o relatório diz sobre as páginas

As páginas não são fundidas nos números do próprio aplicativo. Elas são contadas como unidades próprias, porque um processo e uma página são coisas diferentes e somá-los inventaria um número que não significa nada:

  • O cabeçalho conta os dois - processes: 4, contexts: 1.
  • Cada página recebe suas próprias linhas, como context 1: page Date.now (12 calls) na linha de comando e page Date.now - fake clock na tabela de auditoria da janela.
  • O motor alcançado é nomeado com a porta dele, para que você possa apontar o seu próprio DevTools exatamente para as páginas que a sessão está conduzindo.

Uma execução de teste diz se as páginas seriam alcançadas antes de qualquer coisa ser iniciada. O que os vereditos significam →

Três limites que vale conhecer antes de começar

Uma porta de depuração fica aberta enquanto o motor roda.

Ela escuta apenas neste computador, mas fica aberta para qualquer programa deste computador enquanto o motor estiver rodando, e qualquer coisa que a alcance pode conduzir essas páginas. A sessão avisa toda vez que uma foi aberta, e nomeia a porta em vez de mencioná-la em abstrato. Em uma máquina compartilhada ou não confiável, use a chave que não abre nada.

Um aplicativo executado com privilégios elevados está fora de alcance.

Um motor hospedado por um aplicativo elevado ignora as variáveis que a sessão define, então as páginas dele ficam no relógio real. Essa é a regra do próprio motor, não uma configuração, e não há como contorná-la por fora.

Uma sessão assim relata PARTIAL, e essa é a resposta honesta.

Os processos auxiliares do motor, e as próprias chamadas de tempo nativas do renderizador, ficam no relógio real. As páginas estão no relógio da sessão e o resto dessa família não, então o veredito diz parcial e nomeia o que ficou de fora em vez de arredondar para um sucesso.

Dois menores, ditos com clareza. As páginas leem o fuso da sessão como um deslocamento fixo, então o Intl o chama pelo deslocamento, como GMT+02:00, e não por uma cidade. E um temporizador já agendado antes de a sessão alcançar a página mantém o ritmo antigo, do mesmo jeito que em uma sessão Chromium pura - a sessão avisa em vez de deixar você concluir que nada aconteceu.

Se o motor é configurado por uma política de argumentos do navegador no registro, a variável da sessão tem precedência durante a execução, e o relatório diz isso - porque uma porta de depuração que você tivesse configurado ali não teria sido aplicada.

Quão bem testado é

Experimental, com o mesmo significado definido do resto daqui: funciona nos alvos para os quais foi construído, não foi testado amplamente, e a auditoria integrada é a sua fonte da verdade, não esta página. Foi medido manualmente em um host WebView2 e em um host Qt WebEngine no Windows de 64 bits, não pela suíte automatizada. Nessas execuções, as páginas leram o ano da sessão no ritmo da sessão e acompanharam um salto.

No Windows de 32 bits há um detalhe que vale conhecer em vez de descobrir: o runtime do WebView2 é de 64 bits mesmo quando o aplicativo que o hospeda é de 32, então uma sessão de 32 bits não consegue nomear os processos do motor nem suas funções. O canal até as páginas continua funcionando. O relatório fica apenas menos específico sobre o que não conseguiu identificar, e diz qual dos dois casos é.

Experimente