Элемент управления WebBrowser: обнаружение ошибки навигации - PullRequest
3 голосов
/ 30 июля 2009

Я размещаю веб-браузер, который обычно загружает внешние документы, а затем вносит некоторые изменения, используя HTML DOM.

Мы также встраиваем пользовательские ссылки приложений, используя поддельный протокол, такой как «Close This», который перехватывается и обрабатывается в BeforeNavigate2.

Когда ссылка на ссылку введена с ошибкой (скажем, "spp: CloseWindow"), BeforeNavigate не будет запускать пользовательскую обработку. Элемент управления Browser не отображает ошибку navigaiton, но остается в READYSTATE_INTERACTIVE и не вызывает NavigateComplete или DocumentComplete.


Моя проблема: Большинство операций (например, получение или обновление содержимого) задерживаются и ожидают, когда состояние готовности достигнет READYSTATE_COMPLETE. После нажатия на такую ​​недействительную ссылку браузер больше не обновляется - состояние, которое я бы хотел избежать. Как я могу это сделать?

  • Могу ли я обнаружить в "DownloadComplete", что навигация не удалась? (Чтобы я мог расслабить тест до "READYSTATE_COMPLETE или READYSTATE_INTERACTIVE and last downloadComplete was broken ")
  • Могу ли я "сбросить" элемент управления браузера на READYSTATE_COMPLETE (вероятно, нет)
  • Могу ли я обнаружить псевдопротоколы, фактически поддерживаемые браузером?

(Оглядываясь назад, использование префикса xxxx: было не очень хорошей идеей, но изменить это сейчас - небольшая проблема.)

Ответы [ 2 ]

6 голосов
/ 30 августа 2009

Internet Explorer и Windows имеют расширенный список доступных протоколов, реализованных в UrlMon.dll, я считаю. Смотрите здесь немного о IE архитектура .

Причина, по которой вы не можете обнаружить неверный протокол в BeforeNavigate, заключается в том, что протокол неизвестен, поэтому никакой реальной навигации не происходит. Браузер решает показать страницу с ошибкой. Ошибка навигации по страницам явно не вызывает все нормальные события.

Однако есть способ определить, когда навигация прошла в сорняках. Если вы подключитесь к событию DocumentCompleted в веб-браузере, вы можете сканировать определенные URL-адреса, связанные с ошибками, или, в более общем случае, любые URL-адреса, начинающиеся с res: //ieframe.dll.

Примеры:

  • Рез: //ieframe.dll/unknownprotocol.htm#spp: CloseWindow
  • разрешение: //ieframe.dll/dnserrordiagoff_webOC.htm#http://192...

Более понятный способ - подключить к NavigateError интерфейса DWebBrowserEvents2 .

0 голосов
/ 02 сентября 2009

У нас возникла проблема при размещении элемента управления веб-браузера ( Google Map ) в том, что нас уведомят о завершении навигации (NavigateComplete), однако сама веб-страница не завершила рендеринг. Чтобы решить эту проблему, мы добавили функцию notifyInitialised javascript, которая просто переместилась в «app: // onInitialised» - аналогичный механизм, который вы используете.

Возможно, вы могли бы что-то вроде этого (если у вас есть контроль над страницами, на которые пользователь переходит). Вы можете добавить этот механизм уведомления и проверить его в своем коде. Если он не получен после установленного времени ожидания, вы можете предположить, что что-то пошло не так, и отобразить соответствующее сообщение.

Если вам интересно, мы также использовали механизм прямого вызова функций javascript из нашего кода C ++, описанного здесь и здесь .

...