Usando quadros em aplicativos WebView2
Os quadros permitem que você insira outras páginas da Web em sua própria página da Web. Um quadro é uma sub-página ou área dentro de uma página da Web, como uma página da Web em uma página da Web.
Um iframe é um tipo de quadro. Outros tipos de quadros são frameset
, portal
, embed
, fencedFrame
e object
. O tipo main WebView2 para quadros é CoreWebView2Frame
, que atualmente está habilitado para iframes de nível superior. O suporte para outros tipos de quadros está planejado.
O WebView2 dá suporte a APIs para interagir com iframes. Você pode:
- Descubra quando os iframes são criados.
- Descubra quando os iframes estão navegando para uma URL diferente. Isso funciona da mesma forma que eventos de navegação do computador de estado para aplicativos WebView2.
- Comunique-se entre o aplicativo host e os iframes, enviando mensagens em ambas as direções.
- Permitir que o aplicativo ignore o
X-Frame-Options
cabeçalho de resposta HTTP.
Veja também:
- iframes em Visão geral de recursos e APIs do WebView2.
- Marca de iframe> HTML <
Assinar o evento FrameCreated para obter um quadro
Para interagir com quadros em seu aplicativo host, a primeira etapa é assinar o evento para que seu FrameCreated
aplicativo host obtenha um objeto de quadro. O FrameCreated
evento é gerado sempre que um novo quadro é criado. Depois que o aplicativo host tiver obtido um objeto de quadro, use o objeto frame para monitorar as alterações e interagir com esse quadro específico.
Seu aplicativo host deve monitorar o tempo de vida de um quadro assinando o CoreWebView2Frame.Destroyed
evento, pois quando o quadro é destruído, seu aplicativo host não pode mais referenciar esse quadro. Os quadros são criados e destruídos durante cada nova navegação de página da Web. Use o CoreWebView2Frame.IsDestroyed
método para marcar se o quadro ainda existe.
Veja também:
- iframes em Visão geral de recursos e APIs do WebView2.
Navegando dentro de um quadro
Depois que um quadro é criado, o quadro navega até a URL de origem do quadro. iframes usam eventos de navegação e navegação, como FrameNavigationStarting
e NavigationCompleted
. Quando o quadro navega até a URL de origem, os seguintes eventos de navegação são gerados:
NavigationStarting
ContentLoading
HistoryChanged
DOMContentLoaded
NavigationCompleted
Frequência de navegação dentro de um quadro
A navegação pode potencialmente acontecer dentro de um quadro. Como um caso de uso simples, o atributo de source
um iframe
elemento é uma URL, como wikipedia.com, e a URL é carregada em um iframe. Normalmente, a navegação acontece imediatamente após a criação do quadro. Os ContentLoading
eventos , DOMContentLoaded
e NavigationCompleted
são então gerados.
O quadro em si está navegando. Uma página da Web navega até uma URL. Da mesma forma, um quadro potencialmente navega.
Depois que o quadro é criado, o quadro navega conforme controlado pelo aplicativo host. Para monitorar o que está acontecendo na página main, eventos como NavigationStarting
, NavigationCompleted
e HistoryChanged
permitir que o aplicativo host navegue entre quadros ou páginas da Web. Os quadros são navegados para uma NOVA URL com menos frequência do que as páginas da Web, mas o mesmo estilo de navegação é compatível. O usuário geralmente não pode navegar dentro de um quadro, embora o JavaScript habilite isso; um quadro geralmente é estático em relação à navegação.
Veja também:
- Sequência padrão de eventos em eventos de navegação para aplicativos WebView2.
- Método CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync – Esse método pode ser usado para um iframe, bem como para uma página da Web. Seu script deve marcar se ele está em um iframe.
Eventos de navegação:
Em relação aos eventos e equivalentes NavigationStarting
duplicados, os eventos em CoreWebView2Frame
são recomendados em vez dos eventos equivalentes e substituídos em CoreWebView2
, porque o CoreWebView2Frame
tipo dá suporte a mais cenários para permitir interações com quadros.NavigationCompleted
Veja também:
- Sequência padrão de eventos em eventos de navegação para aplicativos WebView2.
- Eventos de navegação em Visão geral de recursos e APIs do WebView2.
- Bloquear a navegação indesejada em Visão geral de recursos e APIs do WebView2.
Usando objetos host em um iframe
Para se comunicar entre o lado nativo do aplicativo host e JavaScript que está em um iframe, use objetos host. Um objeto host é um objeto que você cria no aplicativo host e, em seguida, usa do código JavaScript no lado da página da Web do aplicativo.
O uso de APIs do lado nativo do script dentro de um quadro, por meio de um objeto host, é semelhante à estrutura de página de interoperabilidade web/nativa, conforme explicado em Chamar código nativo do código web:
Para usar objetos host em um iframe:
- Defina o objeto host e implemente
IDispatch
. - Adicione o objeto host no lado nativo usando
AddHostObjectToScriptWithOrigins
(Win32) ouAddHostObjectToScript
(.NET). - No JavaScript no código do lado da Web, acesse este objeto host usando
chrome.webview.hostObjects.<name>
a API.
Para acessar e controlar objetos nativos do JavaScript do lado da Web em um quadro, use AddHostObjectToScriptWithOrigins
(Win32) ou CoreWebView2Frame.AddHostObjectToScript
(.NET), que tem um origins
parâmetro. O origins
parâmetro especifica quais URLs serão permitidas para acessar, por motivos de segurança. Esse parâmetro identifica as URLs para as quais os iframes terão acesso ao objeto host.
Se o quadro for navegado para uma URL que não está na origins
lista, o quadro não poderá operar o objeto host; o quadro não poderá ler ou gravar nenhuma propriedade.
Consulte a tabela Nome do método no AddHostObjectToScript
método para sua estrutura. Confira as duas linhas a seguir:
-
applyHostFunction
,getHostProperty
esetHostProperty
. -
getLocalProperty
esetLocalProperty
.
-
Método CoreWebView2Frame.AddHostObjectToScript – tem um
origins
parâmetro. A documentação não tem uma tabela de nomes de método .
O método acima funciona como o seguinte método:
-
Método CoreWebView2.AddHostObjectToScript. Consulte a tabela Nome do método . Leia ambos os tópicos de referência da API, embora para quadros, você usaria o método que dá suporte a um
origins
parâmetro.
Código de exemplo
Consulte Etapa 6: chame AddHostObjectToScript para passar o objeto host para o código do lado da Web em Chamar código nativo do código web.
Veja também:
- Compartilhamento de objeto Host/Web em Visão geral dos recursos e APIs do WebView2.
Enviar e receber mensagens
As mensagens podem ser enviadas entre o aplicativo nativo e o código JavaScript que está em um iframe:
- Você pode enviar mensagens do JavaScript em um iframe em uma página HTML para o aplicativo host.
- Você pode enviar mensagens do aplicativo host para JavaScript em um iframe em uma página HTML.
Enviar mensagens da Web de um iframe para o aplicativo host
Para enviar mensagens da Web de um iframe para o aplicativo host, use o window.chrome.webview.postMessage
método:
window.chrome.webview.postMessage(`SetTitleText ${titleText.value}`);
Para receber essas mensagens no aplicativo host, o aplicativo host deve assinar o WebMessageReceived event
.
Enviar mensagens do aplicativo host para o iframe
O aplicativo host envia mensagens para o iframe chamando o PostWebMessageAsJson
método ou PostWebMessageAsString
.
O iframe recebe a mensagem assinando o window.chrome.webview.addEventListener('message')
evento, da seguinte maneira:
window.chrome.webview.addEventListener('message', arg => {
// implement event listener here
});
Veja também:
- Interoperabilidade do código nativo e do lado da Web
- Mensagens da Web em Visão geral de recursos e APIs do WebView2.
Executar código JavaScript em iframes usando ExecuteScript
Um aplicativo WebView2 pode executar qualquer JavaScript em um quadro usando ExecuteScript
.
Para que o script seja executado em um iframe, um contexto de execução deve ser criado. Um contexto de execução é criado após o ContentLoading
evento, por isso, se ExecuteScript
for chamado antes do ContentLoading
evento ser gerado, o script não será executado e a cadeia de caracteres null
será retornada.
Para obter informações sobre o ContentLoading
evento, consulte Eventos de navegação para aplicativos WebView2, que são válidos para quadros e páginas da Web.
Veja também:
- Execução de script em Visão geral de recursos e APIs do WebView2.
Modificando eventos de rede usando o WebResourceRequested
evento em iframes
Para iframes, você pode ouvir eventos de rede e modificá-los usando o WebResourceRequested
evento.
Veja também:
- Gerenciar solicitações de rede no WebView2 em Visão geral dos recursos e APIs do WebView2.
- Gerenciamento personalizado de solicitações de rede
- APIs experimentais para 1.0.1222-prerelease em Notas de Versão Arquivadas para o SDK do WebView2.
Confira as APIs de pré-lançamento mais recentes. Os links a seguir contêm 1.0.1466-prerelease
. Na lista suspensa Versão no canto superior esquerdo dos documentos de referência da API, selecione o pré-lançamento mais recente.
- Sobrecarga do método CoreWebView2.AddWebResourceRequestedFilter(uri, resourceContext, requestSourceKinds) – Para assinar solicitações de rede que pertencem a um iframe, você deve usar essa sobrecarga e usar
Document
como o valor dorequestSourceKinds
parâmetro. - Sobrecarga do método CoreWebView2.RemoveWebResourceRequestedFilter(uri, resourceContext, requestSourceKinds)
- Classe CoreWebView2WebResourceRequestedEventArgs
Ignorando opções de quadro X para renderizar uma página da Web dentro de um quadro
O X-Frame-Options
cabeçalho de resposta HTTP é usado por páginas da Web para impedir que um aplicativo renderize essa página da Web dentro de um quadro. A AdditionalAllowedFrameAncestors
propriedade permite que seu aplicativo ignore o X-Frame-Options
cabeçalho, para renderizar a página da Web dentro de um quadro.
Veja também:
Exemplo de uso de iframes em um aplicativo host
Este código de exemplo mostra como usar APIs de quadro, incluindo:
FrameCreated
CoreWebView2FrameCreatedEventArgs
DOMContentLoaded
CoreWebView2DOMContentLoadedEventArgs
ExecuteScript
Este código de exemplo é condensado de MainWindow.xaml.cs no exemplo WebView2WpfBrowser .
void DOMContentLoadedCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
// Subscribe to the FrameCreated event to obtain the frame object when
// it's created.
webView.CoreWebView2.FrameCreated += WebView_FrameCreatedDOMContentLoaded;
webView.NavigateToString(@"<!DOCTYPE html>" +
"<h1>DOMContentLoaded sample page</h1>" +
"<h2>The content to the iframe and below will be added after DOM content is loaded </h2>" +
"<iframe style='height: 200px; width: 100%;'/>");
}
void WebView_FrameCreatedDOMContentLoaded(object sender, CoreWebView2FrameCreatedEventArgs args)
{
// In order for ExecuteScriptAsync to successfully run inside the iframe,
// subscribe to the ContentLoading or DOMContentLoaded event. Once these
// events are raised, you can call ExecuteScriptAsync.
args.Frame.DOMContentLoaded += (frameSender, DOMContentLoadedArgs) =>
{
args.Frame.ExecuteScriptAsync(
"let content = document.createElement(\"h2\");" +
"content.style.color = 'blue';" +
"content.textContent = \"This text was added to the iframe by the host app\";" +
"document.body.appendChild(content);");
};
}
Visão geral da Referência de API
Os seguintes recursos, listados em Visão geral dos recursos e APIs do WebView2, incluem APIs relacionadas a quadros:
- Compartilhamento de objetos Host/Web
- Iframes
- Execução de script
- Mensagens da Web
- Permissões
- Bloquear navegação indesejada
- Eventos de navegação
Confira também
- Chamar código nativo do código do lado da Web
- Eventos de navegação para aplicativos WebView2 – válidos para quadros e páginas da Web.
Páginas externas: