Firefox выдает ошибку 0x80004005 при работе с canvas - PullRequest
3 голосов
/ 29 декабря 2011

Иногда у меня возникают некоторые ошибки, подобные этой, когда я работаю с canvas в Firefox:

Ошибка: необработанное исключение: [Exception ... "Компонент вернул код ошибки: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth] "nsresult:" 0x80004005 (NS_ERROR_FAILURE) "location:" JS frame :: media / js / canvas / Rectangle.js :: :: line 34 "data: no]

Itпроисходит, когда я работаю с более чем 5 элементами canvas, в цикле for.Функция, которая их создает, такова:

function addCanvas(id) {
var canvas = document.getElementById(id);

if (canvas == null) {
    $('#content').append(
        '<canvas id="' + id + '" width="' + workAreaWidth +'" height="' 
            + workAreaHeight + '"></canvas>'
    );

    canvas = document.getElementById(id).getContext('2d');
} else {
    canvas = canvas.getContext('2d');
    canvas.setTransform(1, 0, 0, 1, 0, 0);
    canvas.clearRect(0, 0, workAreaWidth, workAreaHeight);
}   

return canvas;
}

Цикл for находится в другой функции.

В результате происходит обновление не всех элементов canvas.Я предполагаю причину исключения.

Я не могу опубликовать код места, где он точно выходит из строя, потому что во многих местах происходит сбой случайно, всегда с одной и той же ошибкой.

Firefoxверсия 9.0, но также произошла на 8.0.1.Я не проверял это на предыдущих выпусках.Моя операционная система Mac Snow Leopard.Я думаю, это поможет.Это не дает сбоя в Chrome или Safari,

Спасибо за вашу помощь.

1 Ответ

6 голосов
/ 29 декабря 2011

Эти сообщения об ошибках сбивают с толку непосвященных, но в них упаковано много информации.Важные части:

Код возврата компонента: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth]

Игнорировать шестнадцатеричное число: это говорит о том, что метод доступа nsIDOMRenderingContext2D.lineWidth вернул общий код ошибки (NS_ERROR_FAILURE), а не ширину строки.nsIDOMRenderingContext2D - это внутреннее имя класса C ++, который реализует объект, который вы получаете от getContext("2d") элемента canvas.

location: "JS frame :: media / js / canvas / Rectangle.js :: :: line 34 "

Вызов из JavaScript в метод C ++, который не удался, находится в строке 34 media/js/canvas/Rectangle.js.Это твой код.Это не , однако, код, который вы цитировали, но, возможно, мы можем выяснить, что не так, посмотрев на код для средства доступа, которое не удалось: http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3180

nsresult
nsCanvasRenderingContext2D::GetLineWidth(float *width)
{
    if (!EnsureSurface())
        return NS_ERROR_FAILURE;

    gfxFloat d = mThebes->CurrentLineWidth();
    *width = static_cast<float>(d);
    return NS_OK;
}

ХорошоТаким образом, единственный способ потерпеть неудачу - это если EnsureSurface потерпит неудачу. То, что определено в http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#1154, и я не буду здесь его цитировать, потому что оно огромно и имеет множество способов, которыми он может потерпеть неудачу.Тем не менее, мне кажется, что один из ваших элементов canvas либо не определен должным образом, либо ему не дают возможности инициализировать себя (т. Е. Необходимо разрешить запуск цикла событий).

РЕДАКТИРОВАТЬ: Конкретный совет: измените функцию, которую вы цитировали, чтобы это было так:

function addCanvas(id, continuation) {
    if (document.getElementById(id) === null) {
        $('#content').append(
            '<canvas id="' + id + '" width="' + workAreaWidth +'" height="' 
            + workAreaHeight + '"></canvas>'
        );
    }

    setTimeout(function() {
        var canvas = document.getElementById(id).getContext('2d');
        canvas.setTransform(1, 0, 0, 1, 0, 0);
        canvas.clearRect(0, 0, workAreaWidth, workAreaHeight);
        continuation(canvas);
    }, 0);
}

Вам также необходимо изменить всех вызывающих абонентов, чтобы они соответствовали.Я не гарантирую, что это сработает, но это самая правдоподобная вещь, о которой я могу подумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...