De 7.12.2 para 7.13

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

Rede

Interceptação de requests

v7.12.2

Para interceptar requests de URL com os esquemas padrão (por exemplo, http, https) e personalizados (por exemplo, my-app, jxb) é utilizada a chamada de retorno InterceptRequestCallback. Ela permite interceptar requests e substituir dados de resposta como se fossem enviados por um servidor Web.

O exemplo seguinte demonstra a como interceptar requests com o esquema personalizado jxb:

network.set(InterceptRequestCallback.class, params -> {
    UrlRequest urlRequest = params.urlRequest();
    if (urlRequest.url().startsWith("jxb://")) {
        UrlRequestJob job = network.newUrlRequestJob(
                UrlRequestJob.Options
                        .newBuilder(urlRequest.id(), HttpStatus.OK)
                        .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                        .build());
        job.write("Hello!".getBytes());
        job.complete();
        return InterceptRequestCallback.Response.intercept(job);
    }
    return InterceptRequestCallback.Response.proceed();
});

...

browser.navigation().loadUrl("jxb://app/hello");

network.set(InterceptRequestCallback::class.java, InterceptRequestCallback { params ->
    val urlRequest: UrlRequest = params.urlRequest()
    if (urlRequest.url().startsWith("jxb://")) {
        val job = network.newUrlRequestJob(
            UrlRequestJob.Options
                .newBuilder(urlRequest.id(), HttpStatus.OK)
                .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                .build()
        )
        job.write("Hello!".toByteArray())
        job.complete()
        return InterceptRequestCallback.Response.intercept(job)
    }
    InterceptRequestCallback.Response.proceed()
})

...

browser.navigation().loadUrl("jxb://app/hello")

v7.13

A abordagem anterior, que consiste em interceptar todos os requests, tem várias limitações e problemas de segurança:

  • os esquemas personalizados interceptados são tratados como não-padrão, portanto, não é possível interceptar o esquema jxb e retornar HTML com JavaScript que acessa LocalStorage. Isto levará a um erro de acesso negado;
  • nem todos os esquemas podem ser interceptados. Por exemplo, é proibido interceptar esquemas como chrome, data, ou chrome-extensions. A API permite fazer isto, o que pode levar a um comportamento inesperado ou a uma falha no Chromium;
  • alguns esquemas são tratados como esquemas locais, por exemplo, file. Não podem ser interceptados porque não se trata de um request de rede.

Nesta versão, melhoramos a API que permite interceptar requests de URL e registar esquemas personalizados. A nova versão não tem as limitações de segurança e os problemas descritos acima.

O exemplo seguinte demonstra como registar o esquema jxb personalizado e interceptar todos os requests de URL correspondentes:

EngineOptions options = EngineOptions
        .newBuilder(renderingMode)
        .addScheme(Scheme.of("jxb"), params -> {
            UrlRequestJob job = params.newUrlRequestJob(
                    UrlRequestJob.Options
                            .newBuilder(HttpStatus.OK)
                            .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                            .build());
            job.write("Hello!".getBytes());
            job.complete();
            return Response.intercept(job);
        })
        .build();
Engine engine = Engine.newInstance(options);

...

browser.navigation().loadUrl("jxb://app/hello");

val options = EngineOptions
        .newBuilder(renderingMode)
        .addScheme(Scheme.of("jxb")) { params ->
            val job = params.newUrlRequestJob(
                UrlRequestJob.Options
                    .newBuilder(HttpStatus.OK)
                    .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                    .build()
            )
            job.write("Hello!".toByteArray())
            job.complete()
            Response.intercept(job)
        }
        .build()
val engine = Engine.newInstance(options)

...

browser.navigation().loadUrl("jxb://app/hello")

API removida

Não há necessidade de utilizar o método com.teamdev.jxbrowser.net.UrlRequest.id() devido a forma alternativa de registar esquemas personalizados e interceptar requests de URL, pelo que foi removido.

Go top