Publicado em 29 de março de 2024
JxBrowser 8.0.0 EAP
Esta página contém um histórico completo das versões do JxBrowser 8.0.0 EAP em ordem cronológica inversa.
Para adicionar as dependências de compilação EAP 8.0.0 mais recentes ao seu projeto, adicione o seguinte à configuração do projeto:
plugins {
id("com.teamdev.jxbrowser") version "1.1.0"
}
jxbrowser {
// A versão EAP mais recente do JxBrowser.
version = "8.0.0-eap.5"
// Adiciona um repositório com compilações EAP do JxBrowser ao projeto.
includePreviewBuilds()
}
dependencies {
// Adiciona uma dependência para integração com o kit de ferramentas Compose UI.
implementation(jxbrowser.compose)
// Adiciona uma dependência para integração com o kit de ferramentas SWT UI.
implementation(jxbrowser.swt)
// Adiciona uma dependência para integração com o kit de ferramentas Swing UI.
implementation(jxbrowser.swing)
// Adiciona uma dependência para integração com o kit de ferramentas JavaFX UI.
implementation(jxbrowser.javafx)
// Detecta a plataforma atual e adiciona os binários Chromium correspondentes.
implementation(jxbrowser.currentPlatform)
}
<repositories>
<!-- Adiciona um repositório com versões de pré-visualização do JxBrowser ao projeto. -->
<repository>
<id>teamdev-preview</id>
<url>https://europe-maven.pkg.dev/jxbrowser/eaps</url>
</repository>
</repositories>
<dependencies>
<!-- Adiciona dependências aos artefatos com binários do Chromium. -->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-cross-platform</artifactId>
<version>8.0.0-eap.5</version>
<type>pom</type>
</dependency>
<!-- Adiciona uma dependência para integração com o toolkit de UI Swing. -->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-swing</artifactId>
<version>8.0.0-eap.5</version>
<!--
Outras opções disponíveis são:
- jxbrowser-compose
- jxbrowser-javafx
- jxbrowser-swt
-->
</dependency>
</dependencies>
Para saber mais sobre as melhorias planeadas para esta versão principal, visite plano futuro do JxBrowser.
v8.0.0-eap.5
Entrada tátil
O JxBrowser te permite enviar e tratar programaticamente eventos de toque nos modos de renderização fora de tela e acelerado por hardware no Windows e no Linux. Isso pode ser útil quando é necessário simular a entrada de toque em testes automatizados ou quando é necessário tratar eventos de toque na sua aplicação.
O código seguinte demonstra como enviar programaticamente um evento de toque iniciado:
browser.dispatch(TouchStarted.newBuilder(
List.of(TouchPoint.newBuilder(1, Point.of(20, 30), STARTED)
.positionInWidget(Point.of(20, 30))
.force(0.5F)
.radiusX(50)
.radiusY(40)
.build()))
.build());
O código seguinte demonstra como tratar o evento de toque iniciado:
browser.set(StartTouchCallback.class, params -> {
TouchStarted event = params.event();
List<TouchPoint> points = event.points();
List<TouchPoint> targetTouches = event.targetTouches();
List<TouchPoint> changedTouches = event.changedTouches();
KeyModifiers keyModifiers = event.keyModifiers();
return Response.proceed();
});
Você pode utilizar StartTouchCallback
para suprimir o evento de início de toque e impedir que este seja enviado para a
página Web.
Eventos de toque do DOM
A API JxBrowser DOM te permite subscrever aos eventos DOM touchstart
, touchmove
, touchcancel
e touchend
. O
código seguinte demonstra como subscrever aos eventos de início de toque:
boolean useCapture = false;
element.addEventListener(EventType.TOUCH_START, event -> {
if (event instanceof TouchEvent touchEvent) {
touchEvent.touches().forEach(touch -> {
int id = touch.id();
Point positionInWidget = touch.positionInWidget();
Point positionInScreen = touch.positionInScreen();
double radiusX = touch.radiusX();
double radiusY = touch.radiusY();
double rotationAngle = touch.rotationAngle();
});
}
}, useCapture);
Eventos personalizados do DOM
Agora, é possível criar e enviar eventos DOM personalizados. O código seguinte demonstra como criar e enviar um evento personalizado:
EventType eventType = EventType.of("WebViewReady");
CustomEventParams eventParams =
CustomEventParams.newBuilder(document)
.detail("true")
.build();
CustomEvent event = document.createCustomEvent(eventType, eventParams);
document.dispatch(event);
Senhas, cartões de crédito, perfis de dados de usuários
Agora você pode adicionar senhas, cartões de crédito e perfis de dados do usuário às lojas correspondentes de forma programática. Nas versões anteriores, estes dados só podiam ser adicionados aos repositórios através da interação do usuário com o navegador quando este solicitava ao usuário que salvasse os dados.
O código seguinte demonstra como adicionar uma senha ao armazenamento de senhas de forma programática:
String url = "https://company.com";
String login = "login";
String password = "password";
PasswordStore passwords = profile.passwordStore();
passwords.add(PasswordRecord.newBuilder(url, password).login(login).build());
Chromium 128.0.6613.85
Atualizamos o Chromium para uma versão mais recente, que introduz várias correções de segurança que impedem um atacante remoto de explorar a corrupção de heap através de uma página HTML forjada, incluindo:
- CVE-2024-7971: Type Confusion in V8
- CVE-2024-7968: Use after free in Autofill
- CVE-2024-7966: Out of bounds memory access in Skia
Para obter a lista completa de melhorias no Chromium 128.0.6613.85, visite o publicação no blog.
Melhorias de qualidade
- Corrigido o tamanho incorreto da janela pop-up no Linux quando o navegador é incorporado num aplicativo Compose Desktop.
- O ícone de ação da extensão do Chrome tem um tamanho de 32x32 para suportar telas de DPI elevado.
- Foi corrigido o erro quando o evento
ExtensionActionUpdated
não é ativado quando o ícone da ação da extensão do Chrome é atualizado. - Foi corrigida uma falha no processo de renderização do Chromium quando a extensão do Chrome apresenta uma janela pop-up.
- Corrigido o erro quando o IntelliJ IDEA não consegue descarregar fontes para a dependência
com.teamdev.jxbrowser:jxbrowser-kotlin:8.0.0-eap.4:sources
do Gradle.
v8.0.0-eap.4
Extensões do Chrome
Agora, o JxBrowser fornece a API de extensões que lhe permite instalar, atualizar, desinstalar e trabalhar com extensões do Chrome. Isso abre uma vasta gama de possibilidades para integrar extensões do Chrome nas suas aplicações Java desktop.
Com a API de Extensões, é possível:
- Obter uma lista das extensões instaladas;
- Instalar manualmente extensões do Chrome a partir da Chrome Web Store;
- Controlar quais as extensões que podem ser instaladas manualmente pelos usuários;
- Instalar programaticamente extensões do Chrome a partir de arquivos CRX;
- Desinstalar programaticamente as extensões que foram instaladas a partir da Chrome Web Store ou de arquivos CRX;
- Controlar quais as extensões que podem ser desinstaladas manualmente pelos usuários;
- Receber notificações quando uma extensão for instalada, atualizada ou desinstalada;
- Exibir pop-ups de extensão;
- Simular cliques em ícones de extensão e muito mais.
Você pode ler mais sobre como trabalhar com as extensões do Chrome no guia Extensões.
Compose Desktop
Adicionamos implementações padrões para as seguintes caixas de diálogo e pop-ups:
- O diálogo de abertura de arquivo;
- A caixa de diálogo para salvar o arquivo;
- A caixa de diálogo para selecionar uma pasta;
- A implementação padrão para o pop-up de extensão;
- A implementação padrão para a ação de extensão pop-up;
- A implementação padrão para o pop-up de sugestões que aparece quando você digita num campo de entrada e existem sugestões de preenchimento automático.
Chromium 126.0.6478.57
Atualizamos o Chromium para uma versão mais recente, que introduz várias correções de segurança que impedem um atacante remoto de explorar potencialmente a corrupção de heap através de uma página HTML forjada, incluindo:
Para obter a lista completa de melhorias no Chromium 126.0.6478.57, visite a publicação no blog.
v8.0.0-eap.3
Compose Desktop
Adicionámos implementações predefinidas para várias caixas de diálogo e menus, para que não tenha de o fazer:
- Um menu de contexto de verificação ortográfica;
- As caixas de diálogo JavaScript de alerta, solicitação e confirmação;
- A caixa de diálogo antes de o browser ser descarregado;
- Os diálogos para guardar e atualizar os cartões de crédito;
- A caixa de diálogo para selecionar um certificado de cliente;
- As caixas de diálogo para guardar e atualizar os perfis de utilizador e os cartões de crédito;
- A caixa de diálogo quando o browser pretende abrir uma aplicação externa.
Além disso, mostraremos as seguintes caixas de diálogo do Chromium:
- Uma caixa de diálogo de seleção de cores;
- Uma caixa de diálogo de pré-visualização de impressão;
- Uma caixa de diálogo para selecionar uma fonte de partilha de ecrã.
Sem mais opcionais em Kotlin
Na API do Java, temos muitos valores de retorno Optional
. Isso é desnecessário para os desenvolvedores de Kotlin, então estendemos a API com métodos null-safe:
// Antes:
val input: Optional<Element> = element.findElementById("my-input")
// Depois:
val input: Element? = element.findById("my-input")
Alterações que geram incompatibilidade
Extraímos as operações com atributos de Element
para um ElementAttributes
semelhante a um mapa. Por exemplo, eis como
atribuir um valor a um atributo antes e agora:
// Antes:
element.putAttribute("src", "https://example.com/image.png");
// Depois:
element.attributes().put("src", "https://example.com/image.png");
Em Kotlin, você pode acessar atributos usando o operador de indexação:
element.attributes()["src"] = "https://example.com/image.png"
Para ver todas as mudanças que quebram a compatibilidade, visite o guia de migração do JxBrowser 7 para 8.
Chromium 125.0.6422.113
Actualizámos o Chromium para uma versão mais recente, que introduz várias correcções de segurança. Entre elas, uma correção para uma vulnerabilidade que tem explorações conhecidas:
Para obter a lista completa de melhorias no Chromium 125.0.6422.113, visite o blog posts.
v8.0.0-eap.2
Kotlin DSL
A API Kotlin para montagem de instância Engine
foi estendida para permitir a configuração de todas as opções disponíveis para Java EngineOptions.Builder
. O código a seguir demonstra como criar uma instância Engine
com as opções especificadas usando o Kotlin DSL:
val engine = Engine(RenderingMode.HARDWARE_ACCELERATED) {
options {
passwordStore = PasswordStore.BASIC
proprietaryFeatures = setOf(ProprietaryFeature.H_264)
switches = listOf("--chromium-switch1", "--chromium-switch2")
}
}
A API Kotlin para BrowserSettings
agora fornece propriedades variáveis para configuração declarativa. Permite-lhe configurar as definições do browser de uma forma mais concisa e legível. O código a seguir demonstra como configurar as definições do navegador usando o Kotlin DSL:
browser.settings.apply {
javascriptEnabled = false
defaultFontSize = FontSizeInPixels.of(12)
webRtcIpHandlingPolicy = DISABLE_NON_PROXIED_UDP
}
Compose Desktop
Melhorámos a integração com o kit de ferramentas Compose Desktop UI. O JxBrowser suporta agora o IME (Input Method Editor) e apresenta janelas pop-up por defeito.
Chromium 123.0.6312.124
Actualizamos o Chromium para uma versão mais recente, que introduz várias correcções de segurança que impedem que um atacante remoto que tenha comprometido o processo da GPU possa executar uma fuga da caixa de areia através de gestos específicos da IU, explorar potencialmente a corrupção de heap através de uma página HTML criada, incluindo:
- CVE-2024-3157: Out of bounds write in Compositing
- CVE-2024-3516: Heap buffer overflow in ANGLE
- CVE-2024-3515: Use after free in Dawn
- CVE-2024-3159: Out of bounds memory access in V8
Para obter a lista completa de melhorias no Chromium 123.0.6312.124, visite as publicações no blog.
v8.0.0-eap.1
Esta é a primeira compilação EAP da próxima versão principal do JxBrowser. Nesta versão, introduzimos as seguintes novas funcionalidades:
Java 17
Java 17 é a versão JVM mínima necessária para o JxBrowser 8.0.0.
Kotlin DSL
Agora, você pode escrever códigos em Kotlin mais concisos e legíveis ao trabalhar com a API do JxBrowser graças ao Kotlin DSL.
Para adicionar o Kotlin DSL ao seu projeto, inclua o seguinte na configuração do seu projeto:
dependencies {
// Adiciona uma dependência ao Kotlin DSL para trabalhar com a API do JxBrowser.
implementation(jxbrowser.kotlin)
}
<!-- Adiciona uma dependência ao DSL do Kotlin para trabalhar com a API do JxBrowser. -->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-kotlin</artifactId>
<version>[8.0.0-eap,]</version>
</dependency>
Aqui está um exemplo de como você pode usar o Kotlin DSL para criar e configurar uma instância Engine
:
val engine = Engine(RenderingMode.HARDWARE_ACCELERATED) {
options {
license = JxBrowserLicense("your_license_key")
language = Language.GERMAN
remoteDebuggingPort = 9222
schemes {
add(Scheme.JAR, InterceptJarRequestCallback())
}
}
}
val browser = engine.newBrowser()
Compose Desktop
Adicionámos o suporte de mais um kit de ferramentas Java UI — Compose Desktop. Agora, você pode incorporar o JxBrowser BrowserView
em aplicativos Compose Desktop e criar aplicativos de desktop multiplataforma modernos com um kit de ferramentas de interface do usuário moderno.
Para adicionar a dependência do JxBrowser Compose Desktop ao seu projeto, inclua o seguinte na configuração do seu projeto:
dependencies {
// Adiciona uma dependência para integração com o toolkit de UI Compose.
implementation(jxbrowser.compose)
}
<!-- Adiciona uma dependência para integração com o toolkit de UI Compose. -->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-compose</artifactId>
<version>[8.0.0-eap,]</version>
</dependency>
Aqui está um exemplo de como você pode incorporar o componente @composable
BrowserView
do JxBrowser em um aplicativo Compose Desktop:
fun main() = singleWindowApplication {
val engine = remember { createEngine() }
val browser = remember { engine.newBrowser() }
BrowserView(browser)
DisposableEffect(Unit) {
browser.navigation.loadUrl("google.com")
onDispose {
engine.close()
}
}
}
private fun createEngine() = Engine(RenderingMode.HARDWARE_ACCELERATED) {
options {
license = JxBrowserLicense("your_license_key")
}
}
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.