<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=399925 --> <head> <title>Test for Bug 399925</title> <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <script type="text/javascript" src="imgutils.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=399925">Mozilla Bug 399925</a> <p id="display"></p> <div id="content" style="display: none"> <canvas id="canvas" width="100" height="100"> </canvas> </div> <pre id="test"> <script class="testbody" type="text/javascript"> /** Test for Bug 399925. **/ var triggerDiscardingManually = false; var pngResults = new Array(); SimpleTest.waitForExplicitFinish(); SimpleTest.requestFlakyTimeout("untriaged"); window.onload = function() { // It'd be nice to reduce the discard timer here, but unfortunately we only // read that pref on startup. We instead manually trigger discarding on // platforms where the discard timer is too long (which we'll somewhat // arbitrarily define as 'longer than 60 seconds'). var expirationMs = SpecialPowers.getIntPref('image.mem.surfacecache.min_expiration_ms'); if (expirationMs > 60000) { ok(true, 'Triggering discarding manually because SurfaceCache expiration ' + 'is ' + expirationMs + ' ms'); triggerDiscardingManually = true; } else { ok(true, 'Using normal discarding because SurfaceCache expiration ' + 'is ' + expirationMs + ' ms'); } // Enable discarding for the test. SpecialPowers.pushPrefEnv({ 'set':[['image.mem.discardable',true]] }, runTest); } function runTest() { var image = new Image(); image.setAttribute("id", "gif"); // 1. Draw the canvas once on loadComplete // 2. Redraw the canvas and compare the results right on discard addCallbacks(image, drawCanvas, function() { drawCanvas(); is(pngResults[0], pngResults[1], "got different rendered results"); SimpleTest.finish(); }); image.src = "bug399925.gif"; document.getElementById("content").appendChild(image); if (triggerDiscardingManually) { var request = SpecialPowers.wrap(image) .QueryInterface(SpecialPowers.Ci.nsIImageLoadingContent) .getRequest(SpecialPowers.Ci.nsIImageLoadingContent.CURRENT_REQUEST); setTimeout(() => request.requestDiscard(), 1000); } } function addCallbacks(anImage, loadCompleteCallback, discardCallback) { var observer = new ImageDecoderObserverStub(); observer.discard = function () { imgLoadingContent.removeObserver(scriptedObserver); discardCallback(); } observer.loadComplete = loadCompleteCallback; observer = SpecialPowers.wrapCallbackObject(observer); var scriptedObserver = SpecialPowers.Cc["@mozilla.org/image/tools;1"] .getService(SpecialPowers.Ci.imgITools) .createScriptedObserver(observer); var imgLoadingContent = SpecialPowers.wrap(anImage) .QueryInterface(SpecialPowers.Ci.nsIImageLoadingContent); imgLoadingContent.addObserver(scriptedObserver); } function drawCanvas() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var gif = document.getElementById('gif'); context.drawImage(gif, 0, 0); ok(true, "we got through the drawImage call without an exception being thrown"); pngResults.push(canvas.toDataURL()); } </script> </pre> </body> </html>