CefSharp Javascript регистрация и выполнение не работает в Выпуске 79.1.36 - PullRequest
0 голосов
/ 27 апреля 2020

Я пытался обновить CefSharp с версии 69.0.0.0 до 79.1.36. Я не смог заставить работать Javascript взаимодействие. Регистрация изменилась с

this.Browser.RegisterJsObject

на

this.Browser.JavascriptObjectRepository.Register

в соответствии с https://github.com/cefsharp/CefSharp/issues/2990.

Когда я выполняю EvaluateScriptAsyn c, я получить ответ обратно со статусом отменено.

Пытаясь понять, как правильно его реализовать, я изучил CefSharp.WpfExample и заметил, что функциональность Javascript в примере приложения WPF также не работает. Выполнение Javascript (асинхронно) ничего не делает при нажатии кнопки «Выполнить». Оценка Javascript (Asyn c) возвращает:

Uncaught ReferenceError: привязка не определена @ about: blank: 1: 0

Сделано Javascript функциональность нарушена в последнем выпуске?

Обновление

Вот как это используется в нашем коде.

Это регистрация

public void RegisterJavaScriptHandler(string name, object handler)
{
    try
    {
        CefSharpSettings.LegacyJavascriptBindingEnabled = true;
        this.Browser.JavascriptObjectRepository.Register(name, handler, false, new BindingOptions() { CamelCaseJavascriptNames = false });
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

Это EvaluateScriptAsyn c part

public void InitializeLayers()
{
    try
    {
        int count = _mapLogic.Layers.Count();
        foreach (WMSLayer layer in _mapLogic.Layers)
        {
            if (!_loadedLayers.Contains(layer))
            {
                var script = string.Format("addWMSLayer('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}')",
                    layer.ProviderCode.Url, layer.AttributionText, layer.AttributionHref,
                    layer.Layer, layer.FormatCode.Format, layer.ServerType, layer.Res1, layer.Res2, layer.Res3, layer.Res4);

                var response = this.ECBBrowser.Browser.EvaluateScriptAsync(script, new TimeSpan(0, 0, 1));
                response.ContinueWith(t =>
                {
                    count--;
                    if (count == 0) this.initializeMap();

                });
                _loadedLayers.Add(layer);
            }
            else
            {
                count--;
                if(count == 0) this.initializeMap();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

Обновление II

Теперь я считаю, что что-то изменилось с загрузкой ресурса. Это то, что у меня есть (неважные детали опущены).

public class ECBSchemeHandler : IResourceHandler
{
    private string _mimeType;
    private Stream _stream;

    public bool Open(IRequest request, out bool handleRequest, ICallback callback)
    {
        var result = open(request, callback);
        handleRequest = result;
        return result;
    }

    public bool Read(Stream dataOut, out int bytesRead, IResourceReadCallback callback)
    {
        return read(dataOut, out bytesRead, callback);
    }

    public bool ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
    {
        return read(dataOut, out bytesRead, callback);
    }

    private bool open(IRequest request, ICallback callback)
    {
        var u = new Uri(request.Url);
        var file = u.Authority + u.AbsolutePath;

        var ass = Assembly.GetExecutingAssembly();
        var resourcePath = ECBConfiguration.DEFAULT_ASSEMBLY_NAMESPACE + "." + file.Replace("/", ".");

        if (ass.GetManifestResourceInfo(resourcePath) != null)
        {
            Task.Run(() =>
            {
                using (callback)
                {
                    _stream = ass.GetManifestResourceStream(resourcePath);
                    var fileExtension = Path.GetExtension(file);
                    _mimeType = ResourceHandler.GetMimeType(fileExtension);
                    callback.Continue();
                }
            });
            return true;
        }
        else
        {
            callback.Dispose();
        }           

        return false;
    }

    private bool read(Stream dataOut, out int bytesRead, IDisposable callback)
    {
        callback.Dispose();

        if (_stream == null)
        {
            bytesRead = 0;
            return false;
        }

        //Data out represents an underlying buffer (typically 32kb in size).
        var buffer = new byte[dataOut.Length];
        bytesRead = _stream.Read(buffer, 0, buffer.Length);

        dataOut.Write(buffer, 0, buffer.Length);

        return bytesRead > 0;
    }
}

}

1 Ответ

0 голосов
/ 07 мая 2020

Использование встроенных ResourceHandlers, как указано @amaitland, решило проблему с регистрацией Javascript.

...