Как перехватывать запросы ссылок без схемы?

#cefsharp

#cefsharp

Вопрос:

Я использую CefSharp (86.0.241) в WPF.Приложение NET Framework (4.7.2; x64) для отображения HTML из строки (не URL; см. «Редактировать 1»). Клики по гиперссылкам не должны инициировать переход к другому контенту, но должны обрабатываться приложением для выполнения других действий, таких как открытие системного веб-браузера по умолчанию или отображение информации в пользовательском интерфейсе приложения.

Я назначаю объект пользовательского IRequestHandler класса для ChromiumWebBrowser.RequestHandler выполнения перехвата запроса. В реализациях метода IRequestHandler я могу отменить навигацию и делать свое дело. Это отлично работает для ссылок с подобной схемой <a href="http://mynetwork/share/index.html">Click</a> .

Но если есть ссылки без схемы (например <a href="www.google.com">Click</a> ) или относительные ссылки (например <a href="/tmp/index.php">Click</a> ) IRequestHandler.OnDocumentAvailableInMainFrame , элемент управления CefSharp вызывает только реализацию метода. Это указывает на то, что новый контент создан (навигация выполнена). На самом деле визуальное содержимое элемента управления исчезает. В этом случае я не могу перехватывать запросы с моей IRequestHandler реализацией.

Итак, каков правильный способ перехватывать запросы ссылок без схемы?

Спасибо

Редактировать 1: чтобы быть более точным, я загружаю HTML из URI данных. Вместо того, чтобы использовать методы LoadHtml -extension, я генерирую их самостоятельно (например data:text/html;charset=utf-8;base64,PGh0bWwvPg== , и вызываю ChromiumWebBrowser.Load(string url) с ним метод экземпляра.

Редактировать 2: если я использую обычный веб-сайт, например https://magpcss.org/ceforum / IRequestHandler методы вызываются так, как и ожидалось. Например, ссылка «Команда» в нижнем колонтитуле является относительной в HTML-коде. Я могу отменить навигацию и сделать что-то еще с URL. Url Свойство в IRequest request аргументе IRequestHandler.OnBeforeBrowse содержит абсолютный URL-адрес со схемой, доменом и т.д. на страницу команды.

Комментарии:

1. Похоже на ошибку во встроенном фреймворке chromium. Cefsharp — это всего лишь одна из многих встроенных оболочек фреймворка chromium. Если вы разместите на magpcss.org/ceforum/viewforum.php?f=18 те, кто связан с CEF, могут быть вовлечены в обсуждение.

2. Как именно вы загрузили html?

3. Работает ли это, если вы используете обычный веб-сайт с соответствующими ссылками? URI данных является особым случаем и, вероятно, потребует изменений chromium, поэтому вряд ли будет исправлен. Если это работает для обычных URL-адресов, вы можете переключиться на использование обработчика ресурсов или фабрики обработчиков scheme.

4. Поскольку это работает, как и ожидалось, для обычных URL-адресов, вам придется переключиться с использования uri данных, скажем, ResourceHandler. Смотрите github.com/cefsharp/CefSharp/wiki /… для общего обзора. Вызов cefsharp.github.io/api/86.0.x/html /… с вашим HTML и URL-адресом — это самый простой вариант.

5. @amaitland: Вы правы. Использование метода LoadHtml расширения с подобным URL zack://www.example.com работает. Метод регистрирует значение по умолчанию ResourceHandler с моим новым базовым URL и моей HTML-строкой. Затем все ссылки без схемы добавляются новым базовым URL-адресом в аргументах реализаций IRequestHandler метода. Итак, я могу обрабатывать эти клики и навигации соответственно. Спасибо!