De 7.16 para 7.17

Neste guia de migração, descrevemos qual a API que foi removida na versão 7.17 e quais as alternativas que você deveria utilizar.

Carregamento de HTML

v7.16

Para carregar HTML de uma string para um frame numa página web, os seguintes métodos Frame são usados:

  • loadHtml(String html)
  • loadHtml(LoadHtmlParams params)
  • loadData(LoadDataParams params)

v7.17

Nas versões recentes do Chromium, a funcionalidade que permite carregar HTML num frame de uma página Web foi alterada por motivos de segurança e já não funciona corretamente. Por exemplo, se o HTML carregado tiver imagens externas localizadas num servidor Web, estas não serão carregadas e apresentadas.

Para nos livrarmos de comportamentos inesperados e potenciais erros, decidimos remover estes métodos e sugerimos as seguintes abordagens alternativas para carregar HTML a partir de uma cadeia de caracteres.

Carregando o URL de dados:

String html = "<html><body>Olá</body></html>";
String base64Html = Base64.getEncoder().encodeToString(html.getBytes(UTF_8));
String dataUrl = "data:text/html;charset=utf-8;base64," + base64Html;
browser.navigation().loadUrl(dataUrl);
val html = "<html><body>Olá</body></html>"
val base64Html = Base64.getEncoder().encodeToString(html.toByteArray(UTF_8))
val dataUrl = "data:text/html;charset=utf-8;base64,$base64Html"
browser.navigation().loadUrl(dataUrl)

Registando um esquema personalizado e interceptando os requests de URL necessários:

InterceptUrlRequestCallback interceptCallback = params -> {
    if (params.urlRequest().url().endsWith("?hello")) {
        byte[] bytes = "<html><body>Hello</body></html>".getBytes();
        UrlRequestJob job = params.newUrlRequestJob(
                UrlRequestJob.Options
                .newBuilder(HttpStatus.OK)
                .addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
                .build());
        job.write(bytes);
        job.complete();
        return Response.intercept(job);
    }
    return Response.proceed();
};

EngineOptions options = EngineOptions.newBuilder(renderingMode)
        .addScheme(HTTP, interceptCallback)
        .build();
Engine engine = Engine.newInstance(options);
Browser browser = engine.newBrowser();
browser.navigation().loadUrl("http://load.html/?hello");
val interceptCallback = InterceptUrlRequestCallback { params ->
    if (params.urlRequest().url().endsWith("?hello")) {
        val bytes = "<html><body>Hello</body></html>".toByteArray()
        val job = params.newUrlRequestJob(
            UrlRequestJob.Options
                .newBuilder(HttpStatus.OK)
                .addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
                .build()
        )
        job.write(bytes)
        job.complete()
        Response.intercept(job)
    } else {
        Response.proceed()
    }
}

val options = EngineOptions.newBuilder(renderingMode)
        .addScheme(HTTP, interceptCallback)
        .build()
val engine = Engine.newInstance(options)
val browser = engine.newBrowser()
browser.navigation().loadUrl("http://load.html/?hello"))

Leia mais sobre estas abordagens em Navegação.

Propriedades do sistema

As seguintes propriedades internas do sistema foram removidas:

  • jxbrowser.display.watcher.off
  • jxbrowser.enable.custom.dropdowns

Utilize a propriedade de sistema jxbrowser.desktop.headless.on para desativar o display watcher e ativar drop downs personalizados no modo de renderização fora de tela.

Go top