问题 组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)


我的问题 :

uncaught exception: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIDOMCanvasRenderingContext2D.drawImage]"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: file:///***************.js :: redrawView :: line 308"  data: no]

产生此行为的代码(tmpImg是动态加载的,所以如果它尚未加载,则会跳过它)。

if(tmpImg!=null && tmpImg.img.complete===true && tmpImg.img.src!=null){
    var tmpPos = i_getCoordsImage(tmpImg);
    var rect = getRectInCurrentView(tmpPos.x,tmpPos.y,tmpPos.w,tmpPos.h);
    console.log(tmpImg);
    console.log(rect);
    mainDisplayContext.drawImage(tmpImg.img,rect.x,rect.y,rect.w,rect.h);
}

刚加载tmpImg时(至少根据Firebug的日志),问题会发生几次,然后消失。
代码片段连续多次调用,因此在抛出错误时无法查看图像是否实际显示。
rect。*中的值是浮点数,类似于{x:-1500,y:-2500,h:1000,w:1000}

你对这个错误的起源有什么看法吗?

编辑1

此代码产生错误(您需要在同一目录中有一个名为“test.png”的图像

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
    <meta charset="UTF-8" />
</head>
<body id="body">
    <canvas id="canvas" width="600" height="600"></canvas>
    <script>
    //[CDATA[
        var img = new Image();
        var mdc = document.getElementById("canvas").getContext("2d");
        function displayCallback(){
            if(img.complete===true && img.src!=null){
                mdc.drawImage(img,0,0,600,600);
            }
            setTimeout(displayCallback, 50);
        }
        setTimeout(function(){img.src = "test.png";}, 10000);
        setTimeout(displayCallback, 1000);
    //]]
    </script>
</body>
</html>

这似乎与空图像具有“src”的事实有关。它总是如此吗?

编辑2

事实上,对于错误报告,这个JavaScript就足够了(如果我理解的话):

document.getElementById("canvas").getContext("2d").drawImage(new Image(),0,0);

2124
2017-07-27 16:13


起源



答案:


当DOM API调用抛出未捕获的Javascript异常时,您会从Firefox获得此类无用的错误消息。实现drawImage的代码 - http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3212  - 似乎返回错误代码NS_ERROR_NOT_AVAILABLE(在C ++ / JS边界处转换为JS异常),当由于某种原因,它绘制图像所需的所有数据当前不可用。即使图像被认为是满载,这似乎也会发生;我对这部分代码不太熟悉,不知道为什么会这样。

我认为,作为偶尔的Firefox内部黑客,你在浏览器中发现了一个错误: drawImage的规范 在任何情况下都不会使用此错误代码许可生成异常。 (请注意第3243行的注释,这似乎误解了规范所说的内容。)请构建一个完整的,独立的测试用例来演示问题,然后我很乐意帮助您提交错误报告。


12
2017-07-27 18:26



添加了产生错误的代码,我发现我的代码中出现了问题(测试null而不是“”),如果你仍然说这是一个错误,我会很乐意帮助你正确发信号(我害怕HTML参考对我来说有点太模糊了)。 - Clement Bellot
看起来这是一个已知的旧bug: bugzilla.mozilla.org/show_bug.cgi?id=405761 我添加了你的简短测试用例。 - zwol


答案:


当DOM API调用抛出未捕获的Javascript异常时,您会从Firefox获得此类无用的错误消息。实现drawImage的代码 - http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3212  - 似乎返回错误代码NS_ERROR_NOT_AVAILABLE(在C ++ / JS边界处转换为JS异常),当由于某种原因,它绘制图像所需的所有数据当前不可用。即使图像被认为是满载,这似乎也会发生;我对这部分代码不太熟悉,不知道为什么会这样。

我认为,作为偶尔的Firefox内部黑客,你在浏览器中发现了一个错误: drawImage的规范 在任何情况下都不会使用此错误代码许可生成异常。 (请注意第3243行的注释,这似乎误解了规范所说的内容。)请构建一个完整的,独立的测试用例来演示问题,然后我很乐意帮助您提交错误报告。


12
2017-07-27 18:26



添加了产生错误的代码,我发现我的代码中出现了问题(测试null而不是“”),如果你仍然说这是一个错误,我会很乐意帮助你正确发信号(我害怕HTML参考对我来说有点太模糊了)。 - Clement Bellot
看起来这是一个已知的旧bug: bugzilla.mozilla.org/show_bug.cgi?id=405761 我添加了你的简短测试用例。 - zwol