Загруженные элементы в Cefsharp 75 больше не отображают значки - PullRequest
1 голос
/ 08 июля 2019

Итак, с появлением CefSharp версии 75 от MyGet изменилось то, как обработчик схемы обрабатывает такие элементы, как значки файлов загруженных элементов из браузера.С CefSharp 74 у меня не было таких проблем, как все загруженные элементы отображали свои иконки на моей странице downloads.html после завершения загрузки, так что теперь это даже не происходит.Файл downloads.html прекрасно загружается, но не показывает мои последние загрузки и не отображает значки их файлов.Загруженные элементы по-прежнему загружаются без проблем, но мне нужно вернуть их в прежнее состояние.

Я попытался реализовать IResourceHandler с новыми частями Open, Read и Skip к коду.И редактируя их, чтобы они работали с кодом, все отлично загружается из моей схемы, однако значки файлов загруженных элементов не отображаются.

Старый обработчик схемы //

    private MemoryStream GetFileIcon(string name, IconReader.IconSize size)
    {
        Icon icon = IconReader.GetFileIcon(name, size, false);
        using (icon)
        {
            Bitmap bmp = icon.ToBitmap();
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            ms.Seek(0, SeekOrigin.Begin);
            return ms;
        }
    }

    public bool ProcessRequest(IRequest request, ICallback callback)
    {
        Uri uri = new Uri(request.Url);
        string fileName = uri.AbsolutePath;

        if (uri.Host == "storage")
        {
            fileName = appPath + uri.Host + fileName;
            if (File.Exists(fileName))
            {
                Task.Factory.StartNew(() =>
                {
                    using (callback)
                    {
                        //var bytes = Encoding.UTF8.GetBytes(resource);
                        //stream = new MemoryStream(bytes);
                        FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                        mimeType = ResourceHandler.GetMimeType(Path.GetExtension(fileName));
                        stream = fStream;
                        callback.Continue();
                    }
                });

                return true;
            }
        }

        if (uri.Host == "fileicon")
        {
            Task.Factory.StartNew(() =>
            {
                using (callback)
                {
                    stream = GetFileIcon(fileName, IconReader.IconSize.Large);
                    mimeType = ResourceHandler.GetMimeType(".png");
                    callback.Continue();
                }
            });
            return true;
        }

        return false;
    }
    public bool ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
    {
        //Dispose the callback as it's an unmanaged resource, we don't need it in this case
        callback.Dispose();

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

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

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

        return bytesRead > 0;
    }
}}

Новый обработчик схемы//

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

    public bool Skip(long bytesToSkip, out long bytesSkipped, IResourceSkipCallback callback)
    {
        bytesSkipped = 0;
        callback.Continue(bytesSkipped);
        return true;
    }

    public bool Read(Stream dataOut, out int bytesRead, IResourceReadCallback callback)
    {
        bytesRead = -1;
        return false;
    }

Код Downloads.html //

    var $container;
    var $template;
    var timer;

    $(document).ready(function () {
    $container = $("#downloads-display");
    $template = $("#template");
    UpdateList();
    timer = setInterval(UpdateList, 500);
    });

    function formatBytes(bytes, decimals) {
    if (bytes == 0) return '0 Byte';
    var k = 1000;
    var dm = decimals + 1 || 3;
    var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    var i = Math.floor(Math.log(bytes) / Math.log(k));
    return (bytes / Math.pow(k, i)).toPrecision(dm) + ' ' + sizes[i];
    }

    String.prototype.between = function (prefix, suffix) {
    s = this;
    var i = s.indexOf(prefix);
    if (i >= 0) {
    s = s.substring(i + prefix.length);
    }
    else {
    return '';
    }
    if (suffix) {
    i = s.indexOf(suffix);
    if (i >= 0) {
    s = s.substring(0, i);
    }
    else {
    return '';
    }
    }
    return s;
    }

    Date.prototype.format = function (format) //author: meizz
    {
    var o = {
    "M+": this.getMonth() + 1, //month
    "d+": this.getDate(),    //day
    "h+": this.getHours(),   //hour
    "m+": this.getMinutes(), //minute
    "s+": this.getSeconds(), //second
    "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter
    "S": this.getMilliseconds() //millisecond
    }

    if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
    (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o) if (new RegExp("(" + k + ")").test(format))
    format = format.replace(RegExp.$1,
    RegExp.$1.length == 1 ? o[k] :
    ("00" + o[k]).substr(("" + o[k]).length));
    return format;
    }

    function getDate(dt) {
    return eval("new " + dt.between("/","/"));
    }

    function UpdateItem(item) {
    var $item;
    var id = "d" + item.Id;
    $item = $("#" + id);
    //Add item if it does not exist
    if ($item.length == 0) {
    $item = $($template[0].outerHTML);
    $container.prepend($item);

    // show it
    $item.removeAttr("hidden");

    // add basic stuff
    $item.attr("id", id);
    $item.find("a.cancel").click(function () {
    host.cancelDownload(item.Id);
    });

    // icon
    $item.find("img.icon").attr("src", "codernut://fileicon/" + item.SuggestedFileName);

    // name
    if (item.SuggestedFileName != "") $item.find("span.name").text(item.SuggestedFileName);
    $item.find("a.src-url").attr("href", item.Url).text(item.Url);
    $item.find("a.cancel").removeAttr("hidden");

    // date
    var startTime = Date.parse(item.startTime);
    $item.find("div.since").text(startTime.format("MM.dd.yyyy"));
    $item.find("div.date").text(startTime.format("hh:mm:ss"));
    }
    var progress = "";
    if (item.IsInProgress) {
    progress = formatBytes(item.CurrentSpeed) + "/s - " + formatBytes(item.ReceivedBytes, 2);
    if (item.TotalBytes > 0) progress += " of " + formatBytes(item.TotalBytes, 2);
    if (item.PercentComplete > 0) progress += " (" + item.PercentComplete + "%)";
    } else {
    if (item.IsComplete) progress = "Complete";
    else if (item.IsCancelled) progress = "Cancelled";
    $item.find("a.cancel").attr("hidden","");
    }
    $item.find("span.status").text(progress);
    }

    function UpdateList() {
    host.getDownloads().then(function (res) {
    var list = JSON.parse(res);
    $.each(list, function (key, item) {
    UpdateItem(item.v);
    });
    });
    }
</script>

Ничто из того, что рекомендовал Amaitland, не сработало для меня.

...