Pergunta

Eu estou hospedando um controle webbrowser, que normalmente carrega um documentos externos, em seguida, faz algumas modificações usando HTML DOM.

Nós também incorporar links de aplicativos personalizados usando um protocolo falso, como "Fechar Este" que são capturados e manipulados em BeforeNavigate2.

Quando a ligação tarket está mal escrito (por exemplo, "spp: CloseWindow"), BeforeNavigate não será desencadeada a manipulação personalizada. O controle de navegador não mostra um erro navigaiton, mas permanece em READYSTATE_INTERACTIVE e não dispara um NavigateComplete ou DocumentComplete.


Meu Problema: A maioria das operações (por exemplo, recuperar ou atualizar o conteúdo) estão atrasadas e espera para o READYSTATE_COMPLETE atingindo readystate. Depois de tal um link inválido é clicado, o navegador não ficar mais atualizadas - um estado que eu gostaria de evitar. Como posso fazer isso?

  • Posso detectar em "DownloadComplete" que a navegação falhou? (Então, eu poderia relaxar o teste para "READYSTATE_COMPLETE ou READYSTATE_INTERACTIVE and last downloadComplete was broken ")
  • Can I "reset" o controle navegador para READYSTATE_COMPLETE (provavelmente não)
  • Eu poderia detectar as pseudoprotocols realmente suportados pelo navegador?

(Em retrospectiva, usando um prefixo xxxx: não era tal uma boa idéia, mas a mudança que agora é um pouco de um problema.)

Foi útil?

Solução

Internet Explorer e Windows tem uma lista extensível de protocolos disponíveis implementadas em urlmon.dll, eu acredito. Veja aqui para um pouco sobre IE arquitetura .

A razão que você não pode detectar o mau protocolo em BeforeNavigate é que o protocolo é desconhecido, assim não há navegação real está acontecendo. O navegador decide mostrar uma página de erro. navegação de página de erro não, evidentemente, levantar todos os eventos normais.

No entanto, há uma maneira de detectar quando a navegação tem ido no mato. Se você ligar para o evento DocumentCompleted do navegador da web, você pode procurar por URLs específicos associados com erros, ou, mais geralmente, qualquer coisa com um URL que começa com res:. //Ieframe.dll

Exemplos:

  • res: //ieframe.dll/unknownprotocol.htm#spp: CloseWindow
  • res: //ieframe.dll/dnserrordiagoff_webOC.htm# http: // 192 ...

forma Um aspirador é ligar-se a NavigateError do DWebBrowserEvents2 interface de .

Outras dicas

Nós tivemos um problema quando hospedando um controle de navegador web ( Google Map ) em que seria notificado que a navegação foi completo (NavigateComplete), no entanto, a página da web em si não tinha a renderização final. Para corrigir esse problema, nós adicionamos uma função notifyInitialised javascript que simplesmente navegou. 'App: // onInitialised' - um mecanismo semelhante que você está usando

Talvez você poderia então algo como isto (se você tem controle sobre as páginas para que o usuário está navegando para). Você pode adicionar este mecanismo de notificação e verificar-lo em seu código. Se não for recebido depois de um tempo limite prescrito você poderia assumir errado ido de algo e exibir uma mensagem relevante.

Se você estiver interessado, nós também utilizado um mecanismo para chamar diretamente funções JavaScript do nosso código C ++ descrito aqui e aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top