CefSharp Javascript注册和执行在79.1.36版中不起作用

问题描述 投票:0回答:1

我试图将CefSharp从69.0.0.0版本升级到79.1.36。我无法实现Javascript交互。注册从

更改
this.Browser.RegisterJsObject

this.Browser.JavascriptObjectRepository.Register

根据https://github.com/cefsharp/CefSharp/issues/2990

[当我执行EvaluateScriptAsync时,我收到了状态为已取消的响应。

[试图理解如何正确实现它,我检查了CefSharp.WpfExample,并注意到示例WPF应用程序中的Javascript功能也不起作用。单击“运行”按钮时,“执行Java脚本”(异步)不执行任何操作。评估Java脚本(异步)返回:

未捕获的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);
    }
}

这是EvaluateScriptAsync部分

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;
    }
}

}

javascript c# wpf cefsharp
1个回答
0
投票

使用@amaitland指出的内置ResourceHandlers解决了Javascript注册问题。

© www.soinside.com 2019 - 2024. All rights reserved.