Introdução
Instalação
Guias
- Engine
- Perfil
- Navegador
- BrowserView
- Navegação
- Conteúdo
- Menu de contexto
- DOM
- JavaScript
- Pop-ups
- Diálogos
- Downloads
- Rede
- Cache
- Cookies
- Proxy
- Autenticação
- Permissões
- Plugins
- Impressão
- Senhas
- Perfis de dados do usuário
- Cartões de crédito
- Mídia
- Zoom
- Corretor ortográfico
- Implantação
- Chromium
Resolução de problemas
- Registro
- Exceções comuns
- A aplicação não termina
- O vídeo não é reproduzido
- Não é possível iniciar sessão na conta Google
- Os dados do usuário não são armazenados
- Esquema de cores
- Falha no início
- Início lento no Windows
- Aplicação .NET que não responde
- Encerramento inesperado do processo Chromium
- Comportamento inesperado
- Fim do suporte do Windows 7/8/8.1
Migração
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
.
Navegação
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 SuggestedDirectory
foram 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.