Migração da versão 2.6 para a 2.7

Neste guia de migração, descrevemos qual a API que foi removida/alterada na versão 2.7 e quais as alternativas que deve utilizar.

API removida

Carregamento de HTML

v2.6

Em certos casos, era possível carregar um documento HTML simples utilizando as funções IFrame.LoadHtml() ou IFrame.LoadData(). Aqui temos como ele se parece:

var html = "<html><head></head><body><h1>Olá mundo!</h1></body></html>";
browser.MainFrame.LoadHtml(html).Wait();
Dim html = "<html><head></head><body><h1>Olá mundo!</h1></body></html>"
browser.MainFrame.LoadHtml(html).Wait()

v2.7

As restrições de segurança tornaram-se mais rigorosas. Como resultado, quando um documento HTML que depende de scripts externos é carregado utilizando LoadHtml(), ele nunca carrega esses scripts e registra erros dizendo Failed to load resource: net::ERR_NOT_IMPLEMENTED. O mesmo comportamento também pode ser observado com imagens em HTML.

Não há forma de corrigir este comportamento sem quebrar a segurança do Chromium, e é por isso que tanto IFrame.LoadHtml como IFrame.LoadData foram completamente removidos da API.

A solução possível é utilizar data: encoded URI e depois carregá-lo utilizando a chamada LoadUrl normal. Eis um exemplo:

var html = "<html><head></head><body><h1>Html codificado no URL!</h1></body></html>";
var base64EncodedHtml = Convert.ToBase64String(Encoding.UTF8.GetBytes(html));
browser.Navigation.LoadUrl("data:text/html;base64," + base64EncodedHtml).Wait();
Dim html = "<html><head></head><body><h1>Html codificado no URL!</h1></body></html>"
Dim base64EncodedHtml = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
browser.Navigation.LoadUrl("data:text/html;base64," & base64EncodedHtml).Wait()

No entanto, o URL de base não pode ser definido quando se utiliza esta solução alternativa.

Outra abordagem possível é registrar um Scheme com um handler e interceptar o pedido correspondente para fornecer o HTML. Veja o artigo correspondente.

API atualizada

v2.6 Anteriormente, era necessário passar o URL da página web ao definir um cookie:

Cookie cookie = new Cookie.Builder
{
    Name = "nome",
    Value = "valor",
    DomainName = ".google.com",
    Path = "/"
}.Build();

bool success = engine.CookieStore.SetCookie("https://www.google.com",cookie).Result;
engine.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder With {
    .Name = "nome",
    .Value = "valor",
    .DomainName = ".google.com",
    .Path = "/"
}.Build()

Dim success As Boolean = engine.CookieStore.SetCookie("https://www.google.com",cookie).Result
engine.CookieStore.Flush()

v2.7

O ICookieStore.SetCookie() não tem agora qualquer parâmetro URL, uma vez que era anteriormente utilizado apenas para efeitos de validação:

Cookie cookie = new Cookie.Builder
{
    Name = "nome",
    Value = "valor",
    DomainName = ".google.com",
    Path = "/"
}.Build();

bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder With {
    .Name = "nome",
    .Value = "valor",
    .DomainName = ".google.com",
    .Path = "/"
}.Build()

Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()

Além disso, o ICookieStore.Delete() devolve agora uma Task em vez de Task<bool>.

API adicionada

Cor de fundo predefinida

Quando o Chromium não sabe a cor de fundo de uma página Web, ou a cor não foi especificada em momento algum, ele utiliza a cor branca. Na versão 2.7, alargámos a API com uma nova funcionalidade que lhe permite configurar a cor de fundo predefinida que o Chromium deve utilizar em vez da cor branca predefinida nesses casos.

O código a seguir demonstra como definir a cor de fundo desejada para a página about:blank:

Color purple = new Color(0.6f, 0.3f, 0.6f);
browser.Settings.DefaultBackgroundColor = purple;
Dim purple As New Color(0.6F, 0.3F, 0.6F)
browser.Settings.DefaultBackgroundColor = purple

Obter o conteúdo do frame como texto

A propriedade IFrame.Text devolve o conteúdo do frame e dos seus subframes como texto simples:

string text = browser.MainFrame?.Text;
Dim text As String = browser.MainFrame?.Text

Ver fonte da página

Agora você pode ver a fonte da página Web ou do frame carregado, como no Google Chrome, através de IFrame.ViewSource:

browser.MainFrame?.ViewSource();
browser.MainFrame?.ViewSource()

O código acima diz ao Chromium para criar e abrir uma nova janela pop-up com a fonte HTML do frame principal.

Suporte a Promise do JavaScript

Agora você pode trabalhar diretamente com as promessas JavaScript sem necessidade de criar um wrapper em IJsObject. Por exemplo:

IJsPromise promise = browser.MainFrame
                            .ExecuteJavaScript<IJsPromise>("Promise.resolve(\"test\")")
                            .Result;

// Invoca algum código .NET quando a promessa é cumprida ou rejeitada.
promise.Then(o => Console.WriteLine("Promessa cumprida"),
             e => Console.WriteLine("Promessa rejeitada"));
Dim promise As IJsPromise = 
    browser.MainFrame
            .ExecuteJavaScript(Of IJsPromise)("Promise.resolve(""test"")")
            .Result

' Invoca algum código .NET quando a promessa é cumprida ou rejeitada.
promise.Then(Sub(o) Console.WriteLine("Promessa cumprida"), 
             Sub(e) Console.WriteLine("Promessa rejeitada"))

Esquema de cores preferido

É possível forçar o esquema de cores preferido através das definições do navegador:

// Força o modo escuro.
browser.Settings.PreferredColorScheme = PreferredColorScheme.Dark;
// Força o modo claro.
browser.Settings.PreferredColorScheme = PreferredColorScheme.Light;
' Força o modo escuro.
browser.Settings.PreferredColorScheme = PreferredColorScheme.Dark 
' Força o modo claro.
browser.Settings.PreferredColorScheme = PreferredColorScheme.Light 

Os sites Web que respeitam a consulta multimídia prefers-color-scheme mudarão para o modo claro ou escuro em conformidade.

Suporte para perfis Chromium

Cada engine tem um perfil Profile padrão o qual você pode acessar através do:

IProfile defaultProfile = engine.Profiles.Default;
Dim defaultProfile As IProfile = engine.Profiles.Default

Os serviços abaixo indicados pertencem agora ao Profile. Você pode gerir cookies, downloads, permissões, plugins, etc. de forma independente para cada perfil:

  • Níveis de zoom
  • Plugins
  • Proxy
  • Rede
  • Corretor ortográfico
  • Loja de cookies
  • HttpCache
  • Downloads
  • Permissões

Para mais informações, consulte o guia correspondente.

Go Top