Publicado em 14 de agosto de 2020
JxBrowser 7.10
Nesta pequena atualização, melhoramos o desempenho de renderização no modo de renderização fora de tela para Swing, JavaFX e SWT, restauramos a funcionalidade que permite desativar o tráfego interno do Chromium, que foi temporariamente abandonado na versão 7.0, e melhoramos a estabilidade da biblioteca.
Desempenho de renderização
O modo de renderização fora de tela foi reimplementado para melhorar o seu desempenho de renderização em todas as plataformas suportadas e kits de ferramentas de IU.
Os resultados dos testes de desempenho de renderização nas diferentes plataformas num vídeo HTML5 em Frame por segundo ( FPS) são os seguintes:
Windows
- Intel Core i7 7700k 4,2 GHz com GPU GTX 1070
- Dimensão do vídeo: 1920x1080
Swing
JavaFX
SWT
macOS
- MacBook Pro 15", Intel Core i7 2,9GHz com GPU Radeon Pro 650 4GB
- Dimensão do vídeo: 2880x1800
Swing
JavaFX
SWT
Linux
- AMD FX-8300 3,3 GHz com GPU Radeon RX 480
- Dimensão do vídeo: 1920x1080
Swing
JavaFX
SWT
Para o kit de ferramentas SWT UI no Linux, ainda não realizamos qualquer otimização no modo de renderização fora de tela.
Tráfego do chromium
As funcionalidades do Chromium, como o Google Cloud Messaging, o Translate Ranker, o Extensions Updater, o Safe Browsing, o SpellChecker, o Widevine, etc., fazem requests aos serviços Web externos da Google, como https://ssl.gstatic.com, https://clients4.google.com, etc.
Se os serviços Web não estiverem acessíveis ou se você não desejar este tráfego adicional, você pode utilizar a seguinte API:
Engine engine = Engine.newInstance(
EngineOptions.newBuilder(renderingMode)
.disableChromiumTraffic()
.build());
Esta opção permite desativar apenas as funcionalidades do Chromium que não estão acessíveis através da API do JxBrowser. Por exemplo, as funcionalidades SpellChecker e Widevine podem ser acessadas através da API JxBrowser, portanto, a opção não desativa o tráfego causado por estas funcionalidades.
Elemento DOM focado
A API DOM foi expandida com o método Document.focusedElement()
que permite obter o elemento HTML
atualmente focado na página web:
document.focusedElement().ifPresent(element -> {
...
});
Melhorias
- A funcionalidade de verificação ortográfica foi restaurada.
- A implementação do
com.teamdev.jxbrowser.view.swt.callback.DefaultStartDownloadCallback
agora avisa quando o arquivo alvo existe e será substituído. - O método
DevTools.remoteDebuggingUrl()
agora retorna URL que pode ser usado sem conexão com a Internet.
Ordem das mensagens IPC
Nas versões anteriores
a ordem das mensagens IPC
pode ser alterada quando é invocada uma chamada de retorno síncrona. Por exemplo, o envio de eventos de teclado através do método Browser.dispatch()
pode levar a um problema com as letras misturadas aleatoriamente num campo de texto numa página Web.
Explicação: Quando uma synchronous callback é invocada, iniciamos um ciclo aninhado que processa as mensagens recebidas. O problema é que existe uma janela entre o momento em que entramos no método que invoca a chamada de retorno e o momento em que iniciamos efetivamente o ciclo aninhado. Como resultado, podemos ter uma situação quando algumas das mensagens recebidas são colocadas na fila de threads do Chromium e essas mensagens serão processadas após o retorno do método.Ao mesmo tempo, as mensagens que chegam quando o ciclo aninhado é iniciado serão processadas antes do método retornar, o que altera a ordem pela qual as mensagens foram enviadas.
Nesta versão, melhoramos a lógica interna do IPC para nos livrarmos de tais situações. Esta melhoria introduz um requisito importante sobre a forma como se deve processar o código dentro de um retorno de chamada síncrono. Se você executar alguma lógica que faz chamadas síncronas para a biblioteca em uma thread separada dentro de um retorno de chamada síncrona e bloqueia o retorno de chamada aguardando até que a lógica tenha sido executada, você pode obter um deadlock:
// Registrar uma chamada de retorno síncrona.
browser.set(SomeSyncCallback.class, params -> {
// Invocar alguma lógica numa thread separada e bloquear a execução da thread atual
// até a lógica ter sido executada.
invokeInSeparateThreadAndWait(() -> {
// Invocar um método síncrono.
browser.someSyncMethod(); // <-- Deadlock: este método nunca irá retornar.
});
return Response.proceed();
});
Para se livrar do impasse, utilize a seguinte abordagem:
// Registrar uma chamada de retorno síncrona.
browser.set(SomeSyncCallback.class, params -> {
// Invocar um método síncrono.
browser.someSyncMethod();
return Response.proceed();
});
Problemas corrigidos
- Dimensionamento inesperado de conteúdo ao redimensionar o
BrowserView
no modo de renderização acelerada por hardware no macOS. - A
NavigationException: Falha ao carregar o recurso: ABORTED
erro em chamadas subsequentesNavigation.loadUrlAndWait()
. - O mouse fica preso na panorâmica ao sair e voltar ao
BrowserView
no modo de renderização acelerada por hardware no Windows. - O JavaFX
BrowserView
não é mostrado depois de ocultar oStage
no modo de renderização fora de tela. - Crash ou congelamento ao fechar o
Engine
. - Falha ao exibir o
BrowserView
no modo de renderização acelerada por hardware no Windows. - A biblioteca fica frequentemente presa em
IpcLibrary.sendData()
. - As classes do kit de ferramentas Swing, JavaFX e SWT UI estão localizadas em
jxbrowser.jar
quando deveriam estar em JARs separados. - A funcionalidade de restauração do foco não funcionando corretamente no SWT
BrowserView
. - O método
Node.xPath()
gerando índicesNode
incorretos. - A inicialização do
Engine
travou ao chamar o comandoldd
para verificar as bibliotecas de sistema ausentes no Linux. - Deadlock no acesso a um armazenamento de cookies não vazio.
- A página de boas-vindas do Chromium no Windows Server 2012.
- A ordem incorreta ao enviar eventos de teclado utilizando o método
Browser.dispatch()
.
Baixe o JxBrowser 7.10
Por favor, compartilhe seu e-mail conosco, e nós lhe enviaremos instruções para download.
Não foi possível enviar o e-mail. Por favor, use o link direto para baixar o JxBrowser.
Se você é um cliente registrado, não precisa fazer nada para usar esta atualização.
Se você deseja avaliar o produto, precisa de uma licença de avaliação.
Siga @JxBrowserTeam para obter todas as atualizações da biblioteca.
Se inscreva na nossa RSS feed para obter atualizações instantâneas sobre os novos lançamentos.