Migração da versão 2.2 para a 2.3

No DotNetBrowser 2.3, o engine Chromium foi atualizado para a versão 84. Esta versão do Chromium tem várias alterações de ruptura no código fonte que afetam a API pública do produto. Neste guia de migração, descrevemos qual a API que foi removida/alterada na versão 2.3 e quais as alternativas que deve utilizar.

API removida

Rede

Substituindo cabeçalhos HTTP pedidos

Os endereços SendHeadersHandler e SendProxyHeadersHandler foram removidos no Chromium 84.

v2.2

network.SendHeadersHandler =
    new Handler<SendHeadersParameters, SendHeadersResponse>((parameters) =>
    {
        IEnumerable<IHttpHeader> headers = parameters.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return SendHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.SendProxyHeadersHandler =
    new Handler<SendProxyHeadersParameters, SendProxyHeadersResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return SendProxyHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.SendHeadersHandler = 
    New Handler(Of SendHeadersParameters, SendHeadersResponse)(Function(parameters)
        Dim headers As IEnumerable(Of IHttpHeader) = parameters.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return SendHeadersResponse.OverrideHeaders(newHttpHeaders)
End Function)
network.SendProxyHeadersHandler = 
    New Handler(Of SendProxyHeadersParameters, SendProxyHeadersResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return SendProxyHeadersResponse.OverrideHeaders(newHttpHeaders)
End Function)

v2.3

Para substituir os cabeçalhos HTTP antes de serem enviados para um servidor Web, utilize a API INetwork.StartTransactionHandler:

INetwork.StartTransactionHandler = 
    new Handler<StartTransactionParameters, StartTransactionResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return StartTransactionResponse.OverrideHeaders(newHttpHeaders);
    });
INetwork.StartTransactionHandler = 
    New Handler(Of StartTransactionParameters, StartTransactionResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return StartTransactionResponse.OverrideHeaders(newHttpHeaders)
End Function)

Filtrando recursos

O handler LoadResourceHandler foi removido no Chromium 84.

v2.2

engine.Network.LoadResourceHandler =
    new Handler<LoadResourceParameters, LoadResourceResponse>(p =>
    {
        if (p.ResourceType == ResourceType.Image)
        {
            return LoadResourceResponse.Cancel();
        }
        return LoadResourceResponse.Continue();
    });
engine.Network.LoadResourceHandler = 
    New Handler(Of LoadResourceParameters, LoadResourceResponse)(Function(p)
        If p.ResourceType = ResourceType.Image Then
            Return LoadResourceResponse.Cancel()
        End If
        Return LoadResourceResponse.Continue()
End Function)

v2.3

Em vez disso, deve ser utilizado o SendUrlRequestHandler. No DotNetBrowser 2.3, ele também oferece a possibilidade de cancelar o pedido:

engine.Network.SendUrlRequestHandler =
    new Handler<SendUrlRequestParameters, SendUrlRequestResponse>(p =>
    {
        if (p.ResourceType == ResourceType.Image)
        {
            return SendUrlRequestResponse.Cancel();
        }
        return SendUrlRequestResponse.Continue();
    });
engine.Network.SendUrlRequestHandler = 
    New Handler(Of SendUrlRequestParameters, SendUrlRequestResponse)(Function(p)
        If p.ResourceType = ResourceType.Image Then
            Return SendUrlRequestResponse.Cancel()
        End If
        Return SendUrlRequestResponse.Continue()
End Function)

O evento RequestCompleted

A propriedade RequestCompletedEventArgs.IsStarted foi removida porque agora o Pedido de URL não pode ser concluído se não tiver sido iniciado. Assim, esta propriedade não faz sentido porque devolve sempre true.

O evento FrameLoadFailed

A propriedade FrameLoadFailedEventArgs.ErrorDescription foi removida. Já não é suportada no Chromium 84.

API adicionada ou atualizada

Pedido de URL

A classe UrlRequest foi alargada com as propriedades Browser, ResourceType, SslVersion. Todas estas propriedades podem ser utilizadas para obter mais informações sobre este pedido de URL, incluindo o navegador que iniciou este pedido, o tipo de recurso pedido e a versão SSL utilizada para efetuar este pedido.

Consequentemente, é agora possível obter a instância do IBrowser em InterceptRequestHandler:

Engine.Network.InterceptRequestHandler =
    new Handler<InterceptRequestParameters, InterceptRequestResponse>(data =>
    {
        //Acessar o navegador ligado ao pedido URL.
        IBrowser browser = data.UrlRequest.Browser;
        /Diga ao engine Chromium para tratar este pedido.
        return InterceptRequestResponse.Proceed();
    });
Engine.Network.InterceptRequestHandler = 
    New Handler(Of InterceptRequestParameters, InterceptRequestResponse)(Function(data)
        ' Acessa o navegador ligado ao pedido URL.
        Dim browser As IBrowser = data.UrlRequest.Browser
        ' Dizer ao engine Chromium para tratar este pedido.
        Return InterceptRequestResponse.Proceed()
End Function)

Salvar como PDF

As propriedades SuggestedFileName e SuggestedDirectoryforam adicionadas a SaveAsPdfParameters.

browser.Dialogs.SaveAsPdfHandler =
    new Handler<SaveAsPdfParameters, SaveAsPdfResponse>(p =>
    {
        // O arquivo fornecido deve ser salvo.
        string pdfFile = Path.Combine(p.SuggestedDirectory, p.SuggestedFileName);
        return SaveAsPdfResponse.SaveToFile(pdfFile);
    });
browser.Dialogs.SaveAsPdfHandler = 
    New Handler(Of SaveAsPdfParameters, SaveAsPdfResponse)(Function(p)
        ' O arquivo fornecido deve ser salvo.
        Dim pdfFile As String = Path.Combine(p.SuggestedDirectory, p.SuggestedFileName)
        Return SaveAsPdfResponse.SaveToFile(pdfFile)
End Function)

Arrastar e Soltar

O EnterDragHandler e o DropHandler são adicionados a IDragAndDrop. Estes handlers podem ser utilizados para interceptar os eventos de arrastar e soltar correspondentes na página Web no modo de renderização acelerada por hardware. Por exemplo:

browser.DragAndDrop.EnterDragHandler = new Handler<EnterDragParameters>(OnDragEnter);
browser.DragAndDrop.DropHandler = new Handler<DropParameters>(OnDrop);
private void OnDragEnter(EnterDragParameters arg)
{
    if (arg.Event.DropData != null)
    {
        //Escreve os nomes dos arquivos para depurar a saída.
        foreach (IFileValue file in arg.Event.DropData.Files)
        {
            Debug.WriteLine($"OnDragEnter: File = {file?.FileName}");
        }
    }
}
private void OnDrop(DropParameters arg)
{
    if (arg.Event.DropData != null)
    {
        //Escreve os nomes dos arquivos na saída de depuração.
        foreach (IFileValue file in arg.Event.DropData.Files)
        {
            Debug.WriteLine($"OnDrop: File = {file?.FileName}");
        }
    }
}
browser.DragAndDrop.EnterDragHandler = New Handler(Of EnterDragParameters)(OnDragEnter)
browser.DragAndDrop.DropHandler = New Handler(Of DropParameters)(OnDrop)
Private Sub OnDragEnter(ByVal arg As EnterDragParameters)
    If arg.Event.DropData IsNot Nothing Then
        ' Escreve os nomes dos arquivos para depurar a saída.
        For Each file As IFileValue In arg.Event.DropData.Files
            Debug.WriteLine($"OnDragEnter: File = {file?.FileName}")
        Next file
    End If
End Sub
Private Sub OnDrop(ByVal arg As DropParameters)
    If arg.Event.DropData IsNot Nothing Then
        ' Escreve os nomes dos arquivos na saída de depuração.
        For Each file As IFileValue In arg.Event.DropData.Files
            Debug.WriteLine($"OnDrop: File = {file?.FileName}")
        Next file
    End If
End Sub

No .NET Framework, também é possível trabalhar com a instância IDataObject no âmbito destes handlers para receber e processar a representação específica da plataforma dos dados arrastados e soltos. Esta funcionalidade fica disponível quando a opção --enable-com-in-drag-drop Chromium switch é especificada. Por exemplo:

private void OnDragEnter(EnterDragParameters arg)
{
    System.Runtime.InteropServices.ComTypes.IDataObject dataObject = arg.Event.DataObject;
    if (dataObject != null)
    {
        //Processa o conteúdo de IDataObject.
    }
}
private void OnDrop(DropParameters arg)
{
    System.Runtime.InteropServices.ComTypes.IDataObject dataObject = arg.Event.DataObject;
    if (dataObject != null)
    {
        //Processa o conteúdo de IDataObject.
    }
}
Private Sub OnDragEnter(ByVal arg As EnterDragParameters)
    Dim dataObject As System.Runtime.InteropServices.ComTypes.IDataObject = 
        arg.Event.DataObject
    If dataObject IsNot Nothing Then
        ' Processa o conteúdo do IDataObject.
    End If
End Sub
Private Sub OnDrop(ByVal arg As DropParameters)
    Dim dataObject As System.Runtime.InteropServices.ComTypes.IDataObject = 
        arg.Event.DataObject
    If dataObject IsNot Nothing Then
        ' Processa o conteúdo de IDataObject.
    End If
End Sub

DOM

Eventos-chave do DOM

A enumeração DomKeyCode é introduzida e utilizada em eventos chave DOM em vez da enumeração KeyCode existente. A implementação anterior da obtenção do código da chave baseava-se na API DOM obsoleta e parecia funcionar incorretamente em alguns casos.

A propriedade Character também é adicionada aos eventos de tecla DOM para fornecer um carácter atual quando este está disponível para o evento DOM.

Go Top