Эти сообщения об ошибках сбивают с толку непосвященных, но в них упаковано много информации.Важные части:
Код возврата компонента: 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);
}
Вам также необходимо изменить всех вызывающих абонентов, чтобы они соответствовали.Я не гарантирую, что это сработает, но это самая правдоподобная вещь, о которой я могу подумать.