waitForExplicitFinish(); let pageSource = '' + '' + ''; let oldDiscardingPref, oldTab, newTab; let prefBranch = Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefService) .getBranch('image.mem.'); function isImgDecoded() { let img = gBrowser.getBrowserForTab(newTab).contentWindow .document.getElementById('testImg'); img.QueryInterface(Ci.nsIImageLoadingContent); let request = img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST); return request.imageStatus & Ci.imgIRequest.STATUS_FRAME_COMPLETE ? true : false; } // Ensure that the image is decoded by drawing it to a canvas. function forceDecodeImg() { let doc = gBrowser.getBrowserForTab(newTab).contentWindow.document; let img = doc.getElementById('testImg'); let canvas = doc.createElement('canvas'); let ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); } function test() { // Enable the discarding pref. oldDiscardingPref = prefBranch.getBoolPref('discardable'); prefBranch.setBoolPref('discardable', true); // Create and focus a new tab. oldTab = gBrowser.selectedTab; newTab = gBrowser.addTab('data:text/html,' + pageSource); gBrowser.selectedTab = newTab; // Run step2 after the tab loads. gBrowser.getBrowserForTab(newTab) .addEventListener("pageshow", step2 ); } function step2() { // Check that the image is decoded. forceDecodeImg(); ok(isImgDecoded(), 'Image should initially be decoded.'); // Focus the old tab, then fire a memory-pressure notification. This should // cause the decoded image in the new tab to be discarded. gBrowser.selectedTab = oldTab; var os = Cc["@mozilla.org/observer-service;1"] .getService(Ci.nsIObserverService); os.notifyObservers(null, 'memory-pressure', 'heap-minimize'); ok(!isImgDecoded(), 'Image should be discarded.'); // And we're done. gBrowser.removeTab(newTab); prefBranch.setBoolPref('discardable', oldDiscardingPref); finish(); }