Код возврата компонента: 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);

Ответ 1

Вы получаете такое бесполезное сообщение об ошибке из Firefox, когда вызов DOM API выдает исключение Javascript, которое не было обнаружено. Код, реализующий drawImage - http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3212 -, как представляется, возвращает код ошибки NS_ERROR_NOT_AVAILABLE (который переводится в исключение JS на границе С++/JS), когда для по какой-то причине все данные, необходимые для рисования изображения, в настоящее время недоступны. Похоже, что это может произойти, даже если изображение считается полностью загруженным; Я недостаточно хорошо знаком с этой частью кода, чтобы узнать, почему это возможно.

Я считаю случайным хакером для внутренних браузеров Firefox, что вы нашли ошибку в браузере: спецификация для drawImage не лицензирует производство исключения с этот код ошибки при любых обстоятельствах. (Обратите внимание на комментарий на строке 3243, который, похоже, неправильно понял, что говорит спецификация.) Пожалуйста, создайте полный автономный тестовый пример, демонстрирующий проблему, и я буду рад помочь вам представить отчет об ошибке.