2011-07-27 8 views
11

mój problem:Komponent zwrócony kod błędu: 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] 

Kod które produkują to zachowanie (tmpImg się ładuje dynamicznie, więc jeśli nie jest jeszcze załadowany, to pominąć).

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); 
} 

Problem zdarza się kilka razy, kiedy tmpImg jest po prostu załadowane (a przynajmniej według dziennika Firebug jest), a następnie znikają.
Fragment kodu jest wywoływany kilka razy z rzędu, więc nie widzę, czy obraz jest rzeczywiście wyświetlany po zgłoszeniu błędu. .
Wartość w rect * są zmiennoprzecinkowych, coś jak {x: -1500, Y: -2500, H: 1000, w: 1000}

Czy masz jakiś pomysł na temat pochodzenia tego błędu?

Edycja 1

Ten kod produkować błąd (trzeba mieć obraz o nazwie „test.png” w tym samym katalogu

<!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> 

Wydaje związane z faktem, że pusty obraz ma przyzwoitość src "". Czy zawsze prawda?

edit 2

W rzeczywistości, do zgłaszania błędów, to wystarczyłoby JavaScript (jeśli zrozumiałem):

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

Odpowiedz

12

uzyskać tego rodzaju pomocny komunikat błędu z Firefoksa, gdy połączenie DOM API zgłasza wyjątek JavaScript, który nie jest złapany. Kod implementujący drawImage - http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3212 - wydaje się zwracać kod błędu NS_ERROR_NOT_AVAILABLE (który jest tłumaczony na wyjątek JS na granicy C++/JS), gdy z jakiegoś powodu wszystkie dane potrzebne do narysowania obrazu nie są obecnie dostępny. Wydaje się, że może się to zdarzyć nawet wtedy, gdy obraz jest uważany za w pełni załadowany; Nie znam wystarczająco dobrze tej części kodu, aby wiedzieć, dlaczego tak się dzieje.

Uważam, że od czasu do czasu haker wewnętrzny z witryny Firefox wykrył błąd w przeglądarce: specification for drawImage nie udziela licencji na tworzenie wyjątku z tym kodem błędu w żadnych okolicznościach. (Zwróć uwagę na komentarz do linii 3243, który prawdopodobnie źle zrozumiał to, co mówi spec.) Proszę skonstruować kompletny, samodzielny test testowy, który demonstruje problem, a ja z przyjemnością pomogę ci złożyć raport o błędzie.

+1

Dodałem kod wywołujący błąd, znalazłem od miejsca, w którym pojawił się problem w moim kodzie (testowanie wartości null zamiast ""), jeśli nadal mówisz, że to błąd, chciałbym Ci pomóc, aby poprawnie to zasygnalizować (I obawiam się, że odniesienie do HTML jest dla mnie trochę zbyt niejasne). –

+2

Wygląda na to, że jest to znany, stary błąd: https://bugzilla.mozilla.org/show_bug.cgi?id=405761 Dodałem twój krótszy przypadek testowy. – zwol

Powiązane problemy