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:

Esquema personalizado

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:

Abrir diálogo de aplicação externa

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 SWT BrowserView 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 Swing BrowserView 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 com src="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.

Enviando...
Por favor, verifique sua caixa de entrada.

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.

Obtenha Teste Gratuito de 30 dias
Go Top