test_bug399925.html (3341B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=399925 5 --> 6 <head> 7 <title>Test for Bug 399925</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <script type="text/javascript" src="imgutils.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=399925">Mozilla Bug 399925</a> 14 <p id="display"></p> 15 <div id="content" style="display: none"> 16 <canvas id="canvas" width="100" height="100"> </canvas> 17 </div> 18 <pre id="test"> 19 <script class="testbody" type="text/javascript"> 20 21 /** Test for Bug 399925. */ 22 var triggerDiscardingManually = false; 23 var pngResults = []; 24 SimpleTest.waitForExplicitFinish(); 25 SimpleTest.requestFlakyTimeout("untriaged"); 26 27 window.onload = function() { 28 // It'd be nice to reduce the discard timer here, but unfortunately we only 29 // read that pref on startup. We instead manually trigger discarding on 30 // platforms where the discard timer is too long (which we'll somewhat 31 // arbitrarily define as 'longer than 60 seconds'). 32 var expirationMs = 33 SpecialPowers.getIntPref('image.mem.surfacecache.min_expiration_ms'); 34 if (expirationMs > 60000) { 35 ok(true, 'Triggering discarding manually because SurfaceCache expiration ' + 36 'is ' + expirationMs + ' ms'); 37 triggerDiscardingManually = true; 38 } else { 39 ok(true, 'Using normal discarding because SurfaceCache expiration ' + 40 'is ' + expirationMs + ' ms'); 41 } 42 43 // Enable discarding for the test. 44 SpecialPowers.pushPrefEnv({ 45 'set':[['image.mem.discardable',true]] 46 }, runTest); 47 } 48 49 function runTest() { 50 var image = new Image(); 51 image.setAttribute("id", "gif"); 52 53 // 1. Draw the canvas once on loadComplete 54 // 2. Redraw the canvas and compare the results right on discard 55 addCallbacks(image, drawCanvas, function() { 56 drawCanvas(); 57 is(pngResults[0], pngResults[1], "got different rendered results"); 58 SimpleTest.finish(); 59 }); 60 61 image.src = "bug399925.gif"; 62 document.getElementById("content").appendChild(image); 63 64 if (triggerDiscardingManually) { 65 var request = SpecialPowers.wrap(image) 66 .getRequest(SpecialPowers.Ci.nsIImageLoadingContent.CURRENT_REQUEST); 67 setTimeout(() => request.requestDiscard(), 1000); 68 } 69 } 70 71 function addCallbacks(anImage, loadCompleteCallback, discardCallback) { 72 var observer = new ImageDecoderObserverStub(); 73 observer.discard = function () { 74 imgLoadingContent.removeObserver(scriptedObserver); 75 discardCallback(); 76 } 77 observer.loadComplete = loadCompleteCallback; 78 observer = SpecialPowers.wrapCallbackObject(observer); 79 80 var scriptedObserver = SpecialPowers.Cc["@mozilla.org/image/tools;1"] 81 .getService(SpecialPowers.Ci.imgITools) 82 .createScriptedObserver(observer); 83 84 var imgLoadingContent = SpecialPowers.wrap(anImage); 85 imgLoadingContent.addObserver(scriptedObserver); 86 } 87 88 function drawCanvas() { 89 var canvas = document.getElementById('canvas'); 90 var context = canvas.getContext('2d'); 91 var gif = document.getElementById('gif'); 92 93 context.drawImage(gif, 0, 0); 94 ok(true, "we got through the drawImage call without an exception being thrown"); 95 pngResults.push(canvas.toDataURL()); 96 } 97 98 </script> 99 </pre> 100 </body> 101 </html>