Publicado em 1 de março de 2021
JxBrowser 7.13
Boas notícias para todos! Está disponível uma nova versão com novas funcionalidades fantásticas para download. Nesta versão, o motor Chromium foi atualizado para a versão 88. Ela habilita o suporte ao macOS Big Sur. Foi introduzida a API de impressão há muito tempo esperada. Agora você pode imprimir programaticamente as páginas Web e os PDFs.
Fizemos algumas atualizações na API pública. Por favor veja as partes da API que foram removidas do JxBrowser, e as alternativas que sugerimos que sejam utilizadas em seu lugar.
Chromium 88
O Chromium foi atualizado para a versão 88.0.4324.182.
Nesta versão do Chromium, algumas das suas funcionalidades associadas ao JxBrowser foram removidas ou alteradas, portanto esta versão da nossa biblioteca introduz várias alterações significativas na API pública.
Consulte o guia de migração para esta versão para ver qual API foi removida e que alternativas você deveria utilizar.
macOS Big Sur
Agora é possível executar o JxBrowser no macOS Big Sur nos Macs baseados em Intel. Planejamos introduzir o suporte da arquitetura Apple Silicon numa das próximas versões. Neste momento, você pode utilizar o JxBrowser no modo de emulação Rosetta 2.
API de impressão
Agora você pode imprimir uma página Web ou um documento PDF programaticamente sem apresentar a caixa de diálogo Prévia de Impressão.
Com a nova API de impressão, você pode:
- selecionar um dispositivo de impressão;
- fornecer as definições de impressão necessárias, como o tamanho do papel, a orientação, os intervalos de páginas, etc;
- receber notificações quando a impressão estiver concluída;
- cancelar a impressão;
- salvar a página Web atualmente carregada num documento PDF e muito mais.
O exemplo seguinte demonstra como salvar a página Web atualmente carregada como um PDF:
Browser browser = engine.newBrowser();
CountDownLatch latch = new CountDownLatch(1);
// Permitir a impressão de páginas Web programaticamente
browser.set(PrintCallback.class, (params, tell) -> tell.print());
// Quando uma página Web está prestes a ser impressa, configurar as definições de impressão e prosseguir
browser.set(PrintHtmlCallback.class, (params, tell) -> {
// Selecionar a impressora PDF como dispositivo de destino
PdfPrinter<HtmlSettings> pdfPrinter = params.printers().pdfPrinter();
// Acessar a tarefa de impressão para configurar as suas definições e registrar eventos
PrintJob<HtmlSettings> printJob = pdfPrinter.printJob();
// Ouvir o evento de impressão concluída
printJob.on(PrintCompleted.class, event -> latch.countDown());
// Configurar as definições de impressão necessárias, incluindo o caminho para o arquivo PDF de destino
printJob.settings()
.pdfFilePath(Paths.get("/Users/vladimir/Desktop/google.pdf"))
.apply();
// Notificar o motor de que queremos imprimir utilizando a impressora PDF indicada
tell.proceed(pdfPrinter);
});
// Carregar a página Web e aguardar até estar completamente carregada
browser.navigation().loadUrlAndWait("https://google.com");
// Imprimir a página Web atualmente carregada
browser.mainFrame().ifPresent(Frame::print);
// Aguardar até a impressão estar concluída
if (latch.await(30, TimeUnit.SECONDS)) {
throw new IllegalStateException("Failed to save web page as PDF within 30 sec");
}
Esquemas personalizados
A forma de interceptar os requests está melhorada. Para interceptar requests de URL com o esquema jxb
personalizado, adicione o esquema correspondente e o associe à uma chamada de retorno de interceptação, conforme mostrado no exemplo abaixo:
EngineOptions.Builder optionsBuilder = EngineOptions.newBuilder(OFF_SCREEN);
optionsBuilder.addScheme(Scheme.of("jxb"), params -> {
UrlRequestJob job = params.newUrlRequestJob(
UrlRequestJob.Options.newBuilder(HttpStatus.OK)
.addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
.build());
job.write("<html><body>Hello!</body></html>".getBytes(UTF_8));
job.complete();
return Response.intercept(job);
});
Engine engine = Engine.newInstance(optionsBuilder.build());
Agora, se você carregar jxb://anyhost/anypage.html
, os requests de URL serão interceptados, e o callback associado será
invocado. Você irá obter o seguinte resultado:
Aplicações externas
Algumas aplicações instaladas no sistema operacional podem estar associadas a um esquema URI específico. Quando o usuário navega para uma URL com o esquema associado à aplicação instalada, o Chromium apresenta uma caixa de diálogo onde o usuário pode decidir se o link deve ser aberto na aplicação externa associada ou não.
Com esta atualização, introduzimos o retorno de chamada que pode ser utilizado para interceptar esses casos e apresentar a sua própria caixa de diálogo aos usuários finais ou abrir programaticamente a aplicação externa sem avisar ao usuário. Por exemplo:
browser.set(OpenExternalAppCallback.class, (params, tell) -> tell.open());
Quando você cria uma instância do Swing, JavaFX e SWT BrowserView
, esta chamada de retorno é registrada automaticamente, se já não
estiver registrada, e apresenta um diálogo correspondente:
Melhorias
- Permite redimensionar o
Browser
para 1x1. Nas versões anteriores, o tamanho mínimo era definido pelo sistema operacional. - Ativar o download de vários arquivos. Agora, quando você baixar vários arquivos, o callback
StartDownloadCallback
será invocado para cada arquivo. - Resolve o caso quando algumas chamadas de sistema são interrompidas com o sinal
EINTR
no macOS e no Linux. O que pode levar a uma falha nativa no motor Chromium. - Permite configurar o tempo limite do processo de renderização sem resposta através do
--hung-render-delay-seconds=45
Chromium switch. - Permite nome de usuário e senha vazios em
AuthenticateCallback
.
Problemas corrigidos
- O
(SWT:12502): GLib-GObject-CRITICAL **: 14:58:41.997: g_object_set_data: assertion 'G_IS_OBJECT (object)' failed
erro ao exibir um menu de contexto no SWTBrowserView
no modo de renderização acelerada por hardware no Linux. - Códigos de teclas incorretos para o teclado numérico ao receber os eventos de teclado no modo de renderização acelerada por hardware.
- O erro
IllegalStateException
ao fechar os pop-ups SwingBrowserView
no modo de renderização fora de tela. - Os limites do
BrowserView
não são atualizados quando o componente é incorporado num container Swing com o layout absoluto e são alterados programaticamente no modo de renderização fora de tela. - Crash no processo principal do Chromium ao carregar
IFRAME
comsrc="data:image/gif;base64,R0lGODlhE...
. - Falha no processo principal do Chromium quando são apresentadas várias caixas de diálogo “Selecionar certificado SSL do cliente” e um usuário seleciona um certificado SSL personalizado numa delas.
- As aplicações Angular não “vêem” alguns eventos de teclado no modo de renderização fora de tela.
- O método
Frame.children()
retorna todos os filhos aninhados quando deveria retornar apenas os filhos imediatos. - A ação
StartDownloadCallback.Action.cancel()
não está cancelando a transferência.
Baixe o JxBrowser 7.13
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.