List icon Conteúdo

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:

Gradle
Maven
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:

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.

JxBrowser Chrome Web Store

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.

JxBrowser Compose Desktop IME

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:

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:

Gradle
Maven
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:

Gradle
Maven
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")
    }
}