Mapeamento

Nesta seção, mostraremos como a principal funcionalidade da versão 6.x é mapeada para a versão 7.0.

Engine

Criar engine

6.x

O Engine não faz parte da API pública. Ele é criado internamente quando a primeira instância Browser é criada na aplicação. Apenas um Engine pode ser criado e utilizado na aplicação.

7.0

O Engine é uma parte da API pública agora. É possível criar e utilizar várias instâncias Engine na aplicação. Para criar uma instância Engine com as opções necessárias, utilize o seguinte código:

Engine engine = Engine.newInstance(
        EngineOptions.newBuilder(RenderingMode.OFF_SCREEN)
                // O idioma usado nas páginas de erro padrão e GUI.
                .language(Language.ENGLISH_US)
                // O caminho absoluto para o diretório onde os dados 
                // tais como cache, cookies, histórico, cache GPU, armazenamento local 
                // links visitados, dados web, ficheiros de dicionário de verificação ortográfica 
                // etc. são armazenados.
                .userDataDir(Paths.get("/Users/Me/JxBrowser/UserData"))
                .build());
val engine = Engine.newInstance(
        EngineOptions.newBuilder(RenderingMode.OFF_SCREEN) 
            // A linguagem usada nas páginas de erro padrão e GUI.
            .language(Language.ENGLISH_US)
            // O caminho absoluto para o diretório onde os dados 
            // tais como cache, cookies, histórico, cache GPU, armazenamento local 
            // links visitados, dados web, ficheiros de dicionário de verificação ortográfica 
            // etc. são armazenados.
            .userDataDir(Path("/Users/Me/JxBrowser/UserData"))
            .build()
)

O Engine executa um processo nativo separado onde o Chromium com as opções fornecidas é criado e inicializado. O processo nativo comunica com o processo Java através da ponte IPC (Inter-Process Communication). Se o processo nativo for terminado inesperadamente devido a uma falha, o processo Java continuará a ser executado.

Você pode utilizar a seguinte notificação para saber quando as instâncias Engine são terminadas inesperadamente, para que possa recriar o Engine e restaurar as instâncias Browser:

engine.on(EngineCrashed.class, event -> {
   // Limpar todos os recursos alocados e recriar o Engine.
});
engine.on(EngineCrashed::class.java) { event ->
    // Limpa todos os recursos alocados e recria o Engine.
}

Encerrando o Motor

6.x

A instância Engine é encerrada automaticamente quando a última instância Browser é encerrada na aplicação.

7.0

O Engine deve ser fechado manualmente através do método close() quando não for mais necessário:

engine.close();
engine.close()

Quando se fecha o Engine, todas as suas instâncias Browser são fechadas automaticamente. Qualquer tentativa de utilização de um Engine já fechado, conduzirá a uma exceção.

Para saber quando o Engine está fechado, utilize a seguinte notificação:

engine.on(EngineClosed.class, event -> {});
engine.on(EngineClosed::class.java) { event -> }

Browser

Criando um browser

6.x

Browser browser = new Browser();
val browser = Browser()

7.0

Browser browser = engine.newBrowser();
val browser = engine.newBrowser()

Criando um browser com opções

6.x

BrowserContextParams browserContextParams =
        new BrowserContextParams("Users/Me/JxBrowser/Data");
browserContextParams.setStorageType(StorageType.MEMORY);
BrowserContext browserContext = new BrowserContext(browserContextParams);
Browser browser = new Browser(BrowserType.HEAVYWEIGHT, browserContext);
val browserContextParams = BrowserContextParams("Users/Me/JxBrowser/Data")
browserContextParams.setStorageType(StorageType.MEMORY)
val browserContext = BrowserContext(browserContextParams)
val browser = Browser(BrowserType.HEAVYWEIGHT, browserContext)

7.0

A funcionalidade BrowserContext foi movida para Engine. Assim, o mesmo código deve ser substituído por:

Engine engine = Engine.newInstance(EngineOptions.newBuilder(HARDWARE_ACCELERATED)
        .userDataDir(Paths.get("/Users/Me/JxBrowser/UserData"))
        .enableIncognito()
        .build());
Browser browser = engine.newBrowser();
val engine = Engine.newInstance(EngineOptions.newBuilder(HARDWARE_ACCELERATED)
        .userDataDir(Path("/Users/Me/JxBrowser/UserData"))
        .enableIncognito()
        .build()
) 
val browser = engine.newBrowser()

Fechando o browser

6.x

browser.dispose();
browser.dispose()

7.0

browser.close();
browser.close()

Responsivo/não responsivo

6.x

browser.addRenderListener(new RenderAdapter() {
    @Override
    public void onRenderUnresponsive(RenderEvent event) {}

    @Override
    public void onRenderResponsive(RenderEvent event) {}
});
browser.addRenderListener(object: RenderAdapter {
    override fun onRenderUnresponsive(event: RenderEvent) {}
    override fun onRenderResponsive(event: RenderEvent) {}
})

7.0

browser.on(BrowserBecameResponsive.class, event -> {});
browser.on(BrowserBecameUnresponsive.class, event -> {});
browser.on(BrowserBecameResponsive::class.java) { event -> }
browser.on(BrowserBecameUnresponsive::class.java) { event -> }

BrowserView

Criando o Swing BrowserView

6.x

import com.teamdev.jxbrowser.chromium.swing.BrowserView;
...
BrowserView view = new BrowserView(browser);
import com.teamdev.jxbrowser.chromium.swing.BrowserView
...
val view = BrowserView(browser)

7.0

import com.teamdev.jxbrowser.view.swing.BrowserView;
...
BrowserView view = BrowserView.newInstance(browser);
import com.teamdev.jxbrowser.view.swing.BrowserView
...
val view = BrowserView.newInstance(browser)

Criando um BrowserView JavaFX

6.x

import com.teamdev.jxbrowser.chromium.javafx.BrowserView;
...
BrowserView view = new BrowserView(browser);
import com.teamdev.jxbrowser.chromium.javafx.BrowserView
...
val view = BrowserView(browser)

7.0

import com.teamdev.jxbrowser.view.javafx.BrowserView;
...
BrowserView view = BrowserView.newInstance(browser);
import com.teamdev.jxbrowser.view.javafx.BrowserView
...
val view = BrowserView.newInstance(browser)

Frame

Trabalhando com frame

6.x

Uma página Web pode ser constituída por um frame principal que pode conter vários sub-frames. Para efetuar uma operação com um frame, é necessário passar o identificador do frame para o método correspondente. Por exemplo:

// Obtém HTML do frame principal.
browser.getHTML();

// Obtém HTML de todos os frames.
for (Long frameId : browser.getFramesIds()) {
String html = browser.getHTML(frameId);
}
// Obtém o HTML do frame principal.
browser.html

// Obtém o HTML de todos os frames.
for (frameId in browser.framesIds) {
    val html = browser.getHTML(frameId)
}

7.0

O Frame é uma parte da API pública agora. É possível trabalhar com o frame através da instância Frame. Por exemplo:

// Obtém o HTML do frame principal se ele existir.
browser.mainFrame().ifPresent(Frame::getHtml);

// Obter o HTML de todos os frames.
browser.frames().forEach(frame -> {
String html = frame.html();
});
// Obtém o HTML do frame principal se ele existir.
browser.mainFrame().ifPresent(Frame::getHtml)

// Obtém o HTML de todos os frames.
browser.frames().forEach { frame ->
    val html = frame.html()
}

Carregando URL

6.x

browser.loadURL("https://www.google.com");
browser.loadURL("https://www.google.com")

7.0

browser.navigation().loadUrl("https://www.google.com");
browser.navigation().loadUrl("https://www.google.com")

Carregamento de HTML

6.x

browser.loadHTML("<html><body></body></html>");
browser.loadHTML("<html><body></body></html>")

7.0

browser.mainFrame().ifPresent(frame ->
        frame.loadHtml("<html><body></body></html>"));
browser.mainFrame().ifPresent { frame -> 
        frame.loadHtml("<html><body></body></html>") }

Filtragem de URLs

6.x

browser.setLoadHandler(new DefaultLoadHandler() {
    @Override
    public boolean onLoad(LoadParams params) {
        if (params.getURL().startsWith("mailto:")) {
            return true; // Cancelar o carregamento
        }
        return false; // Continuar o carregamento
    }
});
browser.setLoadHandler(object: DefaultLoadHandler {
        override fun onLoad(params: LoadParams): Boolean {
            return if (params.getURL().startsWith("mailto:")) {
                true // Cancelar o carregamento
            } else false // Continuar o carregamento
        }
})

7.0

navigation.set(StartNavigationCallback.class, params -> {
    if (params.url().startsWith("mailto:")) {
        return Response.ignore();
    }
    return Response.start();
});
navigation.set(StartNavigationCallback::class.java,
    StartNavigationCallback { params ->
        if (params.url().startsWith("mailto:")) Response.ignore() else Response.start()
    }
)

Eventos de navegação

Iniciar o carregamento

6.x

browser.addLoadListener(new LoadAdapter() {
    @Override
    public void onStartLoadingFrame(StartLoadingEvent event) {
        String url = event.getValidatedURL();
    }
});
browser.addLoadListener(object: LoadAdapter {
    override fun onStartLoadingFrame(event: StartLoadingEvent) {
        val url = event.validatedURL
    }
})

7.0

browser.navigation().on(NavigationStarted.class, event -> {
    String url = event.url();
});
browser.navigation().on(NavigationStarted::class.java) { event -> 
    val url = event.url()
}

Finalizar o carregamento

6.x

browser.addLoadListener(new LoadAdapter() {
    @Override
    public void onFinishLoadingFrame(FinishLoadingEvent event) {
        String html = browser.getHTML(event.getFrameId());
    }
});
browser.addLoadListener(object: LoadAdapter {
    override fun onFinishLoadingFrame(event: FinishLoadingEvent) {
        val html = browser.getHTML(event.frameId)
    }
})

7.0

browser.navigation().on(FrameLoadFinished.class, event -> {
    String html = event.frame().html();
});
browser.navigation().on(FrameLoadFinished::class.java) { event -> 
    val html = event.frame().html()
}

Falha no carregamento

6.x

browser.addLoadListener(new LoadAdapter() {
    @Override
    public void onFailLoadingFrame(FailLoadingEvent event) {
        NetError errorCode = event.getErrorCode();
    }
});
browser.addLoadListener(object: LoadAdapter {
    override fun onFailLoadingFrame(event: FailLoadingEvent) {
        val errorCode = event.errorCode
    }
})

7.0

browser.navigation().on(FrameLoadFailed.class, event -> {
    NetError error = event.error();
});
browser.navigation().on(FrameLoadFailed::class.java) { event -> 
    val error = event.error()
}

ou

browser.navigation().on(NavigationFinished.class, event -> {
    NetError errorCode = event.error();
});
browser.navigation().on(NavigationFinished::class.java) { event -> 
    val errorCode = event.error()
}

Rede

Configurando o User-Agent

6.x

BrowserPreferences.setUserAgent("My User-Agent");
BrowserPreferences.setUserAgent("My User-Agent")

7.0

Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .userAgent("My User-Agent")
        .build());
val engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .userAgent("My User-Agent")
        .build())

Configurando o Accept-Language

6.x

browserContext.setAcceptLanguage("fr, en-gb;q=0.8, en;q=0.7");
browserContext.setAcceptLanguage("fr, en-gb;q=0.8, en;q=0.7")

7.0

engine.network().acceptLanguage("fr, en-gb;q=0.8, en;q=0.7");
engine.network().acceptLanguage("fr, en-gb;q=0.8, en;q=0.7")

Configurando o proxy

6.x

ProxyService proxyService = browserContext.getProxyService();
proxyService.setProxyConfig(new CustomProxyConfig("http-proxy-server:80"));
val proxyService = browserContext.proxyService
proxyService.setProxyConfig(CustomProxyConfig("http-proxy-server:80"))

7.0

engine.proxy().config(CustomProxyConfig.newInstance("http-proxy-server:80"));
engine.proxy().config(CustomProxyConfig.newInstance("http-proxy-server:80"))

Redirecionando o request de URL

6.x

browserContext.getNetworkService().setNetworkDelegate(new NetworkDelegate() {
    @Override
    public void onBeforeURLRequest(BeforeURLRequestParams params) {
        params.setURL("https://www.google.com");
    }
});
browserContext.networkService.setNetworkDelegate(object: NetworkDelegate {
    override fun onBeforeURLRequest(params: BeforeURLRequestParams) {
        params.setURL("https://www.google.com")
    }
})

7.0

engine.network().set(BeforeUrlRequestCallback.class, (params) -> 
        Response.redirect("https://www.google.com"));
engine.network().set(BeforeUrlRequestCallback::class.java,
    BeforeUrlRequestCallback { params ->
        Response.redirect("https://www.google.com")
    }
)

Substituindo de cabeçalhos HTTP

6.x

browserContext.getNetworkService().setNetworkDelegate(new NetworkDelegate() {
    ...
    @Override
    public void onBeforeSendHeaders(BeforeSendHeadersParams params) {
        HttpHeadersEx headers = params.getHeadersEx();
        headers.setHeader("User-Agent", "MyUserAgent");
        headers.setHeader("Content-Type", "text/html");
    }
});
browserContext.networkService.setNetworkDelegate(object: NetworkDelegate {
    override fun onBeforeSendHeaders(params: BeforeSendHeadersParams) {
        val headers = params.headersEx
        headers.setHeader("User-Agent", "MyUserAgent")
        headers.setHeader("Content-Type", "text/html")
    }
})

7.0

engine.network().set(BeforeSendHeadersCallback.class, (params) ->
        Response.override(Arrays.asList(
                HttpHeader.of("User-Agent", "MyUserAgent"),
                HttpHeader.of("Content-Type", "text/html"))));
engine.network().set(BeforeSendHeadersCallback::class.java,
    BeforeSendHeadersCallback { params ->
        Response.override(listOf(
                HttpHeader.of("User-Agent", "MyUserAgent"),
                HttpHeader.of("Content-Type", "text/html")))
    }
)

Interceptar requests de URL

6.x

BrowserContext browserContext = browser.getContext();
ProtocolService protocolService = browserContext.getProtocolService();
protocolService.setProtocolHandler("https", new ProtocolHandler() {
    @Override
    public URLResponse onRequest(URLRequest request) {
        URLResponse response = new URLResponse();
        String html = "<html><body><p>Olá!</p></body></html>";
        response.setData(html.getBytes());
        response.getHeaders().setHeader("Content-Type", "text/html");
        return response;
    }
});
val browserContext = browser.context
val protocolService = browserContext.protocolService
protocolService.setProtocolHandler("https", object: ProtocolHandler {
    override fun onRequest(request: URLRequest): URLResponse {
        val response = URLResponse()
        val html = "<html><body><p>Olá!</p></body></html>"
        response.setData(html.toByteArray())
        response.headers.setHeader("Content-Type", "text/html")
        return response
    }
});

7.0

Network network = engine.network();
network.set(InterceptRequestCallback.class, params -> {
    UrlRequest urlRequest = params.urlRequest();
    if (urlRequest.url().startsWith("https")) {
        Options options = UrlRequestJob.Options
                .newBuilder(urlRequest.id(), HttpStatus.OK)
                .addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
                .build();
        UrlRequestJob urlRequestJob = network.newUrlRequestJob(options);
        String html = "<html><body><p>Olá!</p></body></html>";
        urlRequestJob.write(html.getBytes(UTF_8));
        urlRequestJob.complete();
        return Response.intercept(urlRequestJob);
    }
    return Response.proceed();
});
val network = engine.network()
network.set(InterceptRequestCallback::class.java, InterceptRequestCallback { params ->
    val urlRequest = params.urlRequest()
    if (urlRequest.url().startsWith("https")) {
        val options = UrlRequestJob.Options
            .newBuilder(urlRequest.id(), HttpStatus.OK)
            .addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
            .build()
        val urlRequestJob = network.newUrlRequestJob(options)
        val html = "<html><body><p>Olá!</p></body></html>"
        urlRequestJob.write(html.toByteArray(UTF_8))
        urlRequestJob.complete()
        Response.intercept(urlRequestJob)
    } else {
        Response.proceed()
    }
})

Autenticação

Proxy, Basic, Digest, NTLM

6.x

NetworkService networkService = browserContext.getNetworkService();
networkService.setNetworkDelegate(new NetworkDelegate() {
    ...
    @Override
    public boolean onAuthRequired(AuthRequiredParams params) {
        if (params.isProxy()) {
            params.setUsername("user");
            params.setPassword("password");
            return false;
        }
        return true; // Cancela o request de autenticação
    }
});
val networkService = browser.networkService
networkService.setNetworkDelegate(object: NetworkDelegate {
    ...
    override fun onAuthRequired(params: AuthRequiredParams): Boolean {
        return if (params.isProxy()) {
            params.setUsername("user")
            params.setPassword("password")
            false
        } else true // Cancela o request de autenticação
    }
});

7.0

engine.network().set(AuthenticateCallback.class, (params, tell) -> {
    if (params.isProxy()) {
        tell.authenticate("user", "password");
    } else {
        tell.cancel();
    }
});
engine.network().set(AuthenticateCallback::class.java, 
    AuthenticateCallback { params, tell ->
        if (params.isProxy) {
            tell.authenticate("user", "password")
        } else {
            tell.cancel()
        }
    }
)

Certificado de cliente HTTPS

6.x

browser.setDialogHandler(new DialogHandler() {
    ...
    @Override
    public CloseStatus onSelectCertificate(CertificatesDialogParams params) {
        List<Certificate> certificates = params.getCertificates();
        if (certificates.isEmpty()) {
            return CloseStatus.CANCEL;
        } else {
            params.setSelectedCertificate(certificates.get(certificates.size() - 1));
            return CloseStatus.OK;
        }
    }
});
browser.setDialogHandler(object: DialogHandler {
    ...
    override fun onSelectCertificate(params: CertificatesDialogParams): CloseStatus {
        val certificates = params.certificates
        return if (certificates.isEmpty()) {
            CloseStatus.CANCEL
        } else {
            params.setSelectedCertificate(certificates[certificates.size - 1])
            CloseStatus.OK
        }
    }
});

7.0

browser.set(SelectClientCertificateCallback.class, (params, tell) -> {
    List<Certificate> certificates = params.certificates();
    if (certificates.isEmpty()) {
        tell.cancel();
    } else {
        tell.select(certificates.size() - 1);
    }
});
browser.set(SelectClientCertificateCallback::class.java,
    SelectClientCertificateCallback { params, tell ->
        val certificates = params.certificates()
        if (certificates.isEmpty()) {
            tell.cancel()
        } else {
            tell.select(certificates.size - 1)
        }
    }
)

Plugins

Filtrando plugins

6.x

browser.getPluginManager().setPluginFilter(new PluginFilter() {
    @Override
    public boolean isPluginAllowed(PluginInfo pluginInfo) {
        return true;
    }
});
browser.pluginManager.setPluginFilter(object: PluginFilter {
    override fun isPluginAllowed(pluginInfo: PluginInfo): Boolean {
        return true
    }
})

7.0

engine.plugins().set(AllowPluginCallback.class, params -> Response.allow());
engine.plugins().set(AllowPluginCallback::class.java,
    AllowPluginCallback { Response.allow() })

DOM

Acessando o document

6.x

DOMDocument document = browser.getDocument();
if (document != null) {
    String baseURI = document.getBaseURI();
}
val document = browser.document
val baseURI = document?.baseURI

7.0

browser.mainFrame().ifPresent(frame ->
        frame.document().ifPresent(document -> {
            String baseUri = document.baseUri();
        }));
browser.mainFrame().ifPresent { frame ->
    frame.document().ifPresent { document ->
        val baseUri = document.baseUri()
    }
}

Eventos DOM

Trabalhando com eventos

6.x

element.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
    @Override
    public void handleEvent(DOMEvent event) {
        DOMEventTarget eventTarget = event.getTarget();
        if (eventTarget != null) {
            ...
        }
    }
}, false);
element.addEventListener(DOMEventType.OnClick, object: DOMEventListener {
    override fun handleEvent(event: DOMEvent) {
        val eventTarget = event.target
        if (eventTarget != null) {
            ...
        }
    }
})

7.0

element.addEventListener(EventType.CLICK, event ->
        event.target().ifPresent(eventTarget -> {
            ...
        }), false);
element.addEventListener(EventType.CLICK, { event ->
    event.target().ifPresent { eventTarget ->
        ...
    }
}, false)

CSS

Injetando CSS

6.x

browser.setCustomStyleSheet("body { background-color: orange; }");
browser.setCustomStyleSheet("body { background-color: orange; }")

7.0

browser.set(InjectCssCallback.class, params -> 
        Response.inject("body { background-color: orange; }"));
browser.set(InjectCssCallback::class.java,
        InjectCssCallback { Response.inject("body { background-color: orange; }") })

JavaScript

Chamando JavaScript a partir do Java

6.x

String string = browser.executeJavaScriptAndReturnValue("'Hello'")
        .asString().getValue();
double number = browser.executeJavaScriptAndReturnValue("123")
        .asNumber().getValue();
boolean bool = browser.executeJavaScriptAndReturnValue("true")
        .asBoolean().getValue();
JSObject window = browser.executeJavaScriptAndReturnValue("window")
        .asObject();
val string = browser.executeJavaScriptAndReturnValue("'Hello'")
        .asString().value
val number = browser.executeJavaScriptAndReturnValue("123")
        .asNumber().value
val bool = browser.executeJavaScriptAndReturnValue("true")
        .asBoolean().value
val window = browser.executeJavaScriptAndReturnValue("window")
        .asObject()

7.0

A classe JSValue foi removida. A conversão de tipos agora é efetuada automaticamente. É possível executar JavaScript tanto de forma síncrona, bloqueando a execução da thread atual, como de forma assíncrona:

browser.mainFrame().ifPresent(frame -> {
    String string = frame.executeJavaScript("'Hello'");
    Double number = frame.executeJavaScript("123");
    Boolean bool = frame.executeJavaScript("true");
    JsObject window = frame.executeJavaScript("window");

    frame.executeJavaScript("document", (Consumer<Document>) document -> {
        String baseUri = document.baseUri();
    });
});
browser.mainFrame().ifPresent { frame: Frame ->
    val string = frame.executeJavaScript<String>("'Hello'")
    val number = frame.executeJavaScript<Double>("123")
    val bool = frame.executeJavaScript<Boolean>("true")
    val window = frame.executeJavaScript<JsObject>("window")
    
    frame.executeJavaScript("document", Consumer<Document> { document ->
        val baseUri = document.baseUri()
    })
}

Chamando o Java a partir do JavaScript

6.x

No código Java:

public class JavaObject {
    public void foo(String text) {}
}

JSValue window = browser.executeJavaScriptAndReturnValue("window");
if (window.isObject()) {
    window.asObject().setProperty("java", new JavaObject());
}
class JavaObject {
    fun foo(text String) {}
}

val window = browser.executeJavaScriptAndReturnValue("window")
if (window.isObject()) {
    window.asObject().setProperty("java", JavaObject())
}

No código JavaScript:

window.java.foo("Olá");

7.0

Por razões de segurança, apenas os métodos públicos anotados com @JsAccessible podem ser acessados a partir do JavaScript.

No código Java:

public class JavaObject {
    @JsAccessible
    public void foo(String text) {}
}

JsObject window = frame.executeJavaScript("window");
window.putProperty("java", new JavaObject());
class JavaObject {
    @JsAccessible
    fun foo(text: String) {}
}

val window = frame.executeJavaScript<JsObject>("window")
window?.putProperty("java", JavaObject())

No código JavaScript:

window.java.foo("Olá");

Injetando JavaScript

6.x

browser.addScriptContextListener(new ScriptContextAdapter() {
    @Override
    public void onScriptContextCreated(ScriptContextEvent event) {
        JSValue window = browser.executeJavaScriptAndReturnValue(
                event.getJSContext().getFrameId(), "window");
    }
});
browser.addScriptContextListener(object: ScriptContextAdapter {
    override fun onScriptContextCreated(event: ScriptContextEvent) {
        val window = browser.executeJavaScriptAndReturnValue(
                event.jsContext.frameId, "window")
    }
})

7.0

browser.set(InjectJsCallback.class, params -> {
    JsObject window = params.frame().executeJavaScript("window");
    return Response.proceed();
});
browser.set(InjectJsCallback::class.java, InjectJsCallback { params ->
    val window = params.frame().executeJavaScript<JsObject>("window")
    Response.proceed()
})

Eventos do console

6.x

browser.addConsoleListener(new ConsoleListener() {
    @Override
    public void onMessage(ConsoleEvent event) {
        String message = event.getMessage();
    }
});
browser.addConsoleListener(object: ConsoleListener {
    override fun onMessage(event: ConsoleEvent) {
        val message = event.message
    }
})

7.0

browser.on(ConsoleMessageReceived.class, event -> {
    String message = event.consoleMessage().message();
});
browser.on(ConsoleMessageReceived::class.java) { event ->
    val message = event.consoleMessage().message()
}

Pop-ups

Contendo de pop-ups

6.x

browser.setPopupHandler(new PopupHandler() {
    @Override
    public PopupContainer handlePopup(PopupParams params) {
        return null;
    }
});
browser.setPopupHandler(object: PopupHandler {
    override fun handlePopup(params: PopupParams): PopupContainer? {
        return null
    }
})

7.0

browser.set(CreatePopupCallback.class, (params) -> Response.suppress());
browser.set(CreatePopupCallback::class.java, CreatePopupCallback { Response.suppress() })

Abrindo pop-ups

6.x

browser.setPopupHandler(new PopupHandler() {
    @Override
    public PopupContainer handlePopup(PopupParams params) {
        return new PopupContainer() {
            @Override
            public void insertBrowser(Browser popupBrowser, Rectangle initialBounds) {}
        };
    }
});
browser.setPopupHandler(object: PopupHandler {
    override fun handlePopup(params: PopupParams): PopupContainer {
        return object: PopupContainer {
            override fun insertBrowser(popupBrowser: Browser, initialBounds: Rectangle) {}
        }
    }
})

7.0

browser.set(CreatePopupCallback.class, (params) -> Response.create());
browser.set(OpenPopupCallback.class, (params) -> {
    Browser popup = params.popupBrowser();
    return OpenPopupCallback.Response.proceed();
});
browser.set(CreatePopupCallback::class.java, CreatePopupCallback { Response.create() })
browser.set(OpenPopupCallback::class.java, OpenPopupCallback { params -> 
    val popup = params.popupBrowser()
    OpenPopupCallback.Response.proceed()
})

Diálogos

Diálogos JavaScript

6.x

browser.setDialogHandler(new DialogHandler() {
    @Override
    public void onAlert(DialogParams params) {
    }

    @Override
    public CloseStatus onConfirmation(DialogParams params) {
        return CloseStatus.CANCEL;
    }

    @Override
    public CloseStatus onPrompt(PromptDialogParams params) {
        params.setPromptText("Text");
        return CloseStatus.OK;
    }
...
});
browser.setDialogHandler(object: DialogHandler {
    override fun onAlert(params: DialogParams) {}
    override fun onConfirmation(params: DialogParams): CloseStatus =
        CloseStatus.CANCEL
    override fun onPrompt(params: PromptDialogParams): CloseStatus {
        params.setPromptText("Text")
        return CloseStatus.OK
    }  
})

7.0

browser.set(AlertCallback.class, (params, tell) -> tell.ok());
browser.set(ConfirmCallback.class, (params, tell) -> tell.cancel());
browser.set(PromptCallback.class, (params, tell) -> tell.ok("Text"));
browser.set(AlertCallback::class.java, AlertCallback { params, tell -> tell.ok() })
browser.set(ConfirmCallback::class.java, ConfirmCallback { params, tell -> tell.cancel() })
browser.set(PromptCallback::class.java, PromptCallback { params, tell -> tell.ok("Text") })

Diálogos de arquivo

6.x

browser.setDialogHandler(new DialogHandler() {
    @Override
    public CloseStatus onFileChooser(FileChooserParams params) {
        FileChooserMode mode = params.getMode();
        if (mode == FileChooserMode.Open) {
            params.setSelectedFiles(new File(params.getDefaultFileName()));
        }
        if (mode == FileChooserMode.OpenMultiple) {
            params.setSelectedFiles(new File("file1.txt"), new File("file2.txt"));
        }
        return CloseStatus.OK;
    }
    ...
});
browser.setDialogHandler(object: DialogHandler {
    override fun onFileChooser(params: FileChooserParams): CloseStatus {
        val mode = params.mode
        if (mode == FileChooserMode.Open) {
            params.setSelectedFiles(File(params.defaultFileName))
        }
        if (mode == FileChooserMode.OpenMultiple) {
            params.setSelectedFiles(File("file1.txt"), File("file2.txt"))
        }
        return CloseStatus.OK
    }
})

7.0

browser.set(OpenFileCallback.class, (params, tell) ->
        tell.open(Paths.get(params.defaultFileName())));
browser.set(OpenFilesCallback.class, (params, callback) ->
        callback.open(Paths.get("file1.txt"), Paths.get("file2.txt")));
browser.set(OpenFileCallback::class.java, 
    OpenFileCallback { params, tell -> 
        tell.open(Path(params.defaultFileName()))
    }
)
browser.set(OpenFilesCallback::class.java, 
    OpenFilesCallback { _, callback -> 
        callback.open(Path("file1.txt"), Path("file2.txt"))
    }
)

Diálogos de cores

6.x

browser.setDialogHandler(new DialogHandler() {
    @Override
    public CloseStatus onColorChooser(ColorChooserParams params) {
        params.setColor(params.getColor());
        return CloseStatus.OK;
    }
    ...
});
browser.setDialogHandler(object: DialogHandler {
    override fun onColorChooser(params: ColorChooserParams): CloseStatus {
        params.setColor(params.сolor)
        return CloseStatus.OK
    }
})

7.0

browser.set(SelectColorCallback.class, (params, tell) ->
        tell.select(params.defaultColor()));
browser.set(SelectColorCallback::class.java, 
    SelectColorCallback { params, tell -> 
        tell.select(params.defaultColor())
    }
)

Diálogos de certificados SSL

6.x

browser.setDialogHandler(new DialogHandler() {
    @Override
    public CloseStatus onSelectCertificate(CertificatesDialogParams params) {
        X509Certificate x509Certificate = ...;
        PrivateKey privateKey = ...;
        params.setSelectedCertificate(new Certificate(x509Certificate, privateKey));
        return CloseStatus.OK;
    }
    ...
});
browser.setDialogHandler(object: DialogHandler {
    override fun onSelectCertificate(params: CertificatesDialogParams): CloseStatus {
        val x509Certificate: X509Certificate = ...
        val privateKey: PrivateKey = ...
        params.setSelectedCertificate(Certificate(x509Certificate, privateKey))
        return CloseStatus.OK
    }
    ...
})

7.0

private static final Path CLIENT_CERT_FILE = Paths.get("<cert-file>.p12");
private static final String CLIENT_CERT_PASSWORD = "<cert-password>";
...
browser.set(SelectClientCertificateCallback.class, (params, tell) ->
        tell.select(ClientCertificate.of(CLIENT_CERT_FILE,
                CLIENT_CERT_PASSWORD, KeyStoreType.PKCS12)));
private val certFile = Path("<cert-file>.p12")
private val certPassword = "<cert-password>"
...
browser.set(SelectClientCertificateCallback::class.java, 
    SelectClientCertificateCallback { params, tell -> 
        tell.select(ClientCertificate.of(certFile,
                certPassword, KeyStoreType.PKCS12))
    }
)

Manipulação do menu de contexto

6.x

browser.setContextMenuHandler(new ContextMenuHandler() {
    @Override
    public void showContextMenu(ContextMenuParams params) {
    }
});
browser.setContextMenuHandler(object: ContextMenuHandler {
    override fun showContextMenu(params: ContextMenuParams) {
    }
})

7.0

browser.set(ShowContextMenuCallback.class, (params, tell) -> {
    tell.close();
});
browser.set(ShowContextMenuCallback::class.java,
    ShowContextMenuCallback { params, tell -> tell.close() }
)

Leia mais sobre como lidar com o menu de contexto.

Impressão

Configurando a impressão

6.x

browser.setPrintHandler(new PrintHandler() {
    @Override
    public PrintStatus onPrint(PrintJob printJob) {
        PrintSettings printSettings = printJob.getPrintSettings();
        printSettings.setPrinterName("Microsoft XPS Document Writer");
        printSettings.setLandscape(true);
        printSettings.setPrintBackgrounds(true);
        ...
        return PrintStatus.CONTINUE;
    }
});
browser.setPrintHandler(object: PrintHandler {
    override fun onPrint(printJob: PrintJob): PrintStatus {
        val printSettings = printJob.printSettings
        printSettings.setPrinterName("Microsoft XPS Document Writer")
        printSettings.setLandscape(true)
        printSettings.setPrintBackgrounds(true)
        ...
        return PrintStatus.CONTINUE
    }
})

7.0

A funcionalidade que permite configurar a impressão foi removida. Em vez disso, é possível apresentar uma caixa de diálogo normal de Pré-visualização da impressão, na qual se podem introduzir as definições necessárias:

browser.set(PrintCallback.class, (params, tell) -> tell.showPrintPreview());
browser.set(PrintCallback::class.java,
    PrintCallback { params, tell -> tell.showPrintPreview() }
)

Suspendendo a impressão

6.x

browser.setPrintHandler(new PrintHandler() {
    @Override
    public PrintStatus onPrint(PrintJob printJob) {
        return PrintStatus.CANCEL;
    }
});
browser.setPrintHandler(object: PrintHandler {
    override fun onPrint(printJob: PrintJob): PrintStatus = 
        PrintStatus.CANCEL
})

7.0

browser.set(PrintCallback.class, (params, tell) -> tell.cancel());
browser.set(PrintCallback::class.java,
    PrintCallback { params, tell -> tell.cancel() }
)

Cache

Limpar o cache HTTP

6.x

browser.getCacheStorage().clearCache(new Callback() {
    @Override
    public void invoke() {
        // A cache de disco HTTP foi limpa.
    }
});
browser.cacheStorage.clearCache(object: Callback {
    override fun invoke() { 
        // A cache de disco HTTP foi limpa.
    }
})

7.0

engine.httpCache().clearDiskCache(() -> {
    // A cache de disco HTTP foi limpa.
});
engine.httpCache().clearDiskCache {
    // A cache de disco HTTP foi limpa.
}

Cookies

Acessando os cookies

6.x

List<Cookie> cookies = browser.getCookieStorage().getAllCookies();
val cookies = browser.cookieStorage.allCookies

7.0

List<Cookie> cookies = engine.cookieStore().cookies();
val cookies = engine.cookieStore().cookies()

Processo de renderização

Iniciado/Terminado

6.x

browser.addRenderListener(new RenderAdapter() {
    @Override
    public void onRenderCreated(RenderEvent event) {}

    @Override
    public void onRenderGone(RenderEvent event) {
        TerminationStatus status = event.getTerminationStatus();
    }
});
browser.addRenderListener(object: RenderAdapter {
    override fun onRenderCreated(event: RenderEvent) {}
    override fun onRenderGone(event: RenderEvent) {
        val status: TerminationStatus = event.terminationStatus
    }
})

7.0

browser.on(RenderProcessStarted.class, event -> {});
browser.on(RenderProcessTerminated.class, event -> {
    TerminationStatus status = event.status();
});
browser.on(RenderProcessStarted::class.java) { event -> }
browser.on(RenderProcessTerminated::class.java) { event -> 
    val status = event.status()
}

Chromium

Switches

A biblioteca não suporta todos os possíveis switches do Chromium. Ela permite configurar o Chromium com os switches, mas não garantimos que os switches aprovados funcionem corretamente ou funcionem de um modo geral. Recomendamos que verifique esta funcionalidade antes de utilizá-la.

6.x

BrowserPreferences.setChromiumSwitches(
        "--<switch_name>",
        "--<switch_name>=<switch_value>"
);
BrowserPreferences.setChromiumSwitches(
        "--<switch_name>",
        "--<switch_name>=<switch_value>"
)

7.0

Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .addSwitch("--<switch_name>")
        .addSwitch("--<switch_name>=<switch_value>")
        .build());
val engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .addSwitch("--<switch_name>")
        .addSwitch("--<switch_name>=<switch_value>")
        .build())

Chaves API

6.x

BrowserPreferences.setChromiumVariable(
        "GOOGLE_API_KEY", "My API Key");
BrowserPreferences.setChromiumVariable(
        "GOOGLE_DEFAULT_CLIENT_ID", "My Client ID");
BrowserPreferences.setChromiumVariable(
        "GOOGLE_DEFAULT_CLIENT_SECRET", "My Client Secret");
BrowserPreferences.setChromiumVariable(
        "GOOGLE_API_KEY", "My API Key")
BrowserPreferences.setChromiumVariable(
        "GOOGLE_DEFAULT_CLIENT_ID", "My Client ID")
BrowserPreferences.setChromiumVariable(
        "GOOGLE_DEFAULT_CLIENT_SECRET", "My Client Secret")

7.0

Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .googleApiKey("A minha chave API")
        .googleDefaultClientId("O meu ID de cliente")
        .googleDefaultClientSecret("O meu segredo de cliente")
        .build());
val engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .googleApiKey("A minha chave API")
        .googleDefaultClientId("O meu ID de cliente")
        .googleDefaultClientSecret("O meu segredo de cliente")
        .build())

Logs

Na nova versão, a API de logs foi simplificada. Leia mais sobre como configurar os logs no guia Resolução de problemas.

Go top