CEFSharp ChromiumBrowser не загружает содержимое при вызове Load (url)? - PullRequest
0 голосов
/ 18 февраля 2020

Я использую CEFSharp для создания очень простого браузера в C# с использованием WinForms. Единственная функциональность, которая мне нужна, - это мгновенная очистка всех файлов cookie и установка пользовательской строки пользовательского агента.

Это прекрасно работало до недавнего обновления до версии 79 с более старой версии CEFSharp. Из-за устаревания некоторых функций мне пришлось реализовать несколько новых интерфейсов, таких как, например, ICookieAccessFilter (см. Полный список ниже).

После того, как мой браузер перестал показывать новый контент. При вызове метода Load(url) я вижу следующие методы из моей реализации интерфейса (в этом порядке):

OnBeforeBrowse
GetResourceRequestHandler
GetCookieAccessFilter
OnBeforeResourceLoad
GetResourceHandler
OnResourceResponse
GetResourceResponseFilter

Тем не менее, в браузере ничего не отображается. Если я щелкну правой кнопкой мыши в окне браузера и выберу «Просмотр источника», я получу источник по умолчанию для пустой страницы, чтобы увидеть:

<html><head></head><body></body></html>

В отладке я вижу, что свойство Address браузера было изменено, но все равно содержимое не отображается (просто пустой экран)

Address property changes

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

Вот полный исходный код этого интерфейса.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using CefSharp;
using CefSharp.Callback;

namespace CustomWebBrowser
{
    public class CustomRequestHandler : IRequestHandler
    {
        public string UserAgent { get; set; }

        public string CookiePath { get; set; }

        public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
        {
            return false;
        }

        bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return this.OnOpenUrlFromTab(browserControl, browser, frame, targetUrl, targetDisposition, userGesture);
        }

        public IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
            IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
        {
            return new CustomResourceRequestHandler(this);
        }

        public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host,
            int port, string realm, string scheme, IAuthCallback callback)
        {
            callback.Dispose();
            return false;
        }

        bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            return false;
        }

        void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
        {
        }

        void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
        {
        }

        bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
        {
            return false;
        }

        void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
        {
        }


        protected virtual bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return false;
        }

        public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
        {
            return true;
        }

        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
        {

        }

        public bool CanGetCookies(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
        {
            return true;
        }

        public bool CanSetCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
        {
            return true;
        }
    }

    public class CustomResourceRequestHandler : IResourceRequestHandler
    {
        public CustomRequestHandler Handler { get; }
        public ICookieAccessFilter GetCookieAccessFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
            IRequest request)
        {
            return new CustomCookieAccessFilter();
        }

        public CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
            IRequestCallback callback)
        {
            var headers = request.Headers;

            var userAgent = headers["User-Agent"];
            headers["User-Agent"] = Handler.UserAgent;
            request.Headers = headers;

            return CefReturnValue.Continue;
        }

        public IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
        {
            return new CustomResourceHandler();
        }

        public void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
            IResponse response, ref string newUrl)
        {

        }

        public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
            IResponse response)
        {
            return false;
        }

        public IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
            IRequest request, IResponse response)
        {
            return null;
        }

        public void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
            IResponse response, UrlRequestStatus status, long receivedContentLength)
        {

        }

        public bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
        {
            return true;
        }

        public CustomResourceRequestHandler(CustomRequestHandler handler)
        {
            Handler = handler;
        }
    }

    public class CustomResourceHandler : ResourceHandler
    {

        public bool ProcessRequest(IRequest request, ICallback callback)
        {
            return true;
        }


    }

    public class CustomCookieAccessFilter : ICookieAccessFilter
    {
        public bool CanSendCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
        {
            return true;
        }

        public bool CanSaveCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response,
            Cookie cookie)
        {
            return true;
        }
    }
}
...