Как обрабатывать всплывающие ссылки в CefSharp

Я создаю веб-браузер с вкладками, используя CefSharp 39.0.2. Прямо сейчас, если пользователь нажимает ссылку на веб-сайт, он откроет новое окно, в котором нет моего первоначального пользовательского интерфейса. Например, когда вы нажимаете ссылку на статью в Новостях Google, она открывается в новом окне, но без каких-либо элементов управления просмотром, которые я составил. Я также рассмотрел программу Cef.WinForms.Example, и она делает то же самое.

Можно ли обрабатывать это по-другому? Я хотел бы, чтобы ссылка открывалась либо на новой вкладке, либо открывалась в новом окне (со всеми элементами управления там). Я просматривал проблемы GitHub, и я не мог найти ничего подобного (может быть, я не выглядел достаточно тяжело, потому что я думал, что это то, что другие тоже хотят делать...). Я просмотрел все events для элемента управления браузером, и я не смог найти ничего похожего на то, как они справляются с ним.

Ответ 1

ChromiumWebBrowser имеет свойство LifeSpanHandler. Чтобы вручную управлять всплывающими окнами в Cefsharp, вы должны реализовать свой собственный объект обработчика жизненного цикла, реализующий интерфейс ILifeSpanHandle.

Каждый раз, когда браузер хочет открыть новое окно, он будет вызывать функцию OnBeforePopup. Здесь вы можете реализовать свое желаемое поведение. Если вы вернетесь false, браузер откроет новое окно. Если вы вернетесь true, браузер игнорирует всплывающее действие, но вы можете вручную создать новое окно, новую вкладку и т.д.

Это очень простой пример пользовательского режима жизни. Во всплывающем запросе он вызывает событие PopupRequest. Вы можете подписаться на такое событие и создать новое окно/вкладку вручную. Затем он возвращает true, который инструктирует ChromiumWebBrowser не создавать свое собственное новое окно. Однако вам необходимо реализовать создание нового окна с другим ChromiumWebBrowser самостоятельно.

public class SampleLifeSpanHandler: ILifeSpanHandler
{
    public event Action<string> PopupRequest;

    public bool OnBeforePopup(IWebBrowser browser, string sourceUrl, string targetUrl, ref int x, ref int y, ref int width,
        ref int height)
    {
        if (PopupRequest != null)
            PopupRequest(targetUrl);

        return true;
    }

    public void OnBeforeClose(IWebBrowser browser)
    {

    }
}