Files
palemoon27/image/test/browser/browser_bug666317.js
T
roytam1 604a6d61ce import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1123516 - Implement maplike/setlike in WebIDL parser; r=bz (5d62bcd93)
- Bug 1140324 - Remove __noSuchMethod__ handling from WebIDL parser and throw an exception instead. r=peterv (f7ea99339)
- Bug 1123516 - Implement maplike/setlike in WebIDL Codegen; r=b (0ca39b335)
- Bug 1183604, add some more assertions to help implementing new cycle collectable classes, r=mccr8 (1e66d29fe)
- Bug 1178665 - Part 1: Make Promise::DispatchToMicroTask public. r=khuey (b962e6006)
- Bug 1178665 - Part 2 - Adapt to latest Animation.finish procedure changes. r=bbirtles (33219fc0d)
- Bug 1178665 - Part 3: Make finish notifications asynchronously in most cases. r=bbirtles, r=smaug (144c0944a)
- Bug 1180770 part 1. Remove the unused ThrowNotEnoughArgsError. r=peterv (8bc1690f5)
- Bug 1180770 part 2. Remove the unused ifaceName/memberName arguments of ThrowMethodFailedWithDetails and rename it to ThrowMethodFailed. r=peterv (ee4900547)
- Bug 1135961. Implement subclassing of DOM objects. r=peterv (8e7e67b88)
- Bug 1170691 - part 1 - add the generating script's directory to sys.path in file_generate.py; r=glandium (dd1520952)
- Bug 1168409 - part 1 - avoid importing buildconfig in histogram_tools.py; r=gfritzsche (6a46dce23)
- Bug 1168409 - part 2 - avoiding importing usecounters in histogram_tools.py; r=gfritzsche (21a468303)
- Bug 1144397. Disallow using fill when dedent would do. r=peterv (544d4978d)
- Bug 1158806. Don't try to include stuff for a generated hasInstance hook if we have no interface object, since in that case we don't need the include. r=peterv (d280a1608)
- missing bit of Bug 1161627 - part 2 - machine-convert TemporaryRef<T> to already_AddRefed<T> (c51384311)
- Bug 1166910 followup: Add missing 'override' keyword to HTMLImageElement method GetImageReferrerPolicy. rs=ehsan (9e3dc8e6d)
- Bug 1174913 - remove unnecessary attribute parsing. r=bz (fdb769eda)
- Bug 1170680 - Do not add non-animated images to the visible list in response to UNLOCKED_DRAW. r=tn (a594883e8)
- Bug 1174923 - Stop delaying the document load event until images are decoded. r=tn a=kwierso (caee1b25f)
- Bug 968923 - part 3b - propagating use counters from SVG images into owning/parent documents; r=seth (234a41484)
- Bug 968923 - part 3a - add core DOM use counter functionality; r=smaug (98bb77358)
- Bug 968923 - part 3c - miscellaneous telemetry changes for use counters; r=gfritzsche (83adec291)
- Bug 968923 - part 4 - hook up use counters to WebIDL bindings; r=bz (8545e9a9b)
- Bug 771367 - Update test_animations_omta.html to support testing pseudo-elements. r=dbaron (4b2e5481b)
- Bug 1177563 - Test that we share agent rule processors across different documents. r=dbaron (d64146359)
- Bug 1181450 - Make GENERATED_FILES more visible during the build by printing their name when they are being generated. r=gps (b0c2166e8)
- Bug 1215526 - part 1 - pass dependencies file to file_generate.py; r=glandium (a14ea304a)
- Bug 1215526 - part 2 - write dependencies to file_generate.py's depfile; r=glandium (dc49ad380)
2021-06-29 09:54:02 +08:00

122 lines
3.9 KiB
JavaScript

waitForExplicitFinish();
let pageSource =
'<html><body>' +
'<img id="testImg" src="' + TESTROOT + 'big.png">' +
'</body></html>';
let oldDiscardingPref, oldTab, newTab;
let prefBranch = Cc["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService)
.getBranch('image.mem.');
function ImageDiscardObserver(result) {
this.discard = function onDiscard(request)
{
result.wasDiscarded = true;
this.synchronous = false;
}
this.synchronous = true;
}
function currentRequest() {
let img = gBrowser.getBrowserForTab(newTab).contentWindow
.document.getElementById('testImg');
img.QueryInterface(Ci.nsIImageLoadingContent);
return img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST);
}
function isImgDecoded() {
let request = currentRequest();
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 runAfterAsyncEvents(aCallback) {
function handlePostMessage(aEvent) {
if (aEvent.data == 'next') {
window.removeEventListener('message', handlePostMessage, false);
aCallback();
}
}
window.addEventListener('message', handlePostMessage, false);
// We'll receive the 'message' event after everything else that's currently in
// the event queue (which is a stronger guarantee than setTimeout, because
// setTimeout events may be coalesced). This lets us ensure that we run
// aCallback *after* any asynchronous events are delivered.
window.postMessage('next', '*');
}
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() {
// Create a place to hold the result.
var result = { wasDiscarded: false };
// Create the discard observer.
var observer = new ImageDiscardObserver(result);
var scriptedObserver = Cc["@mozilla.org/image/tools;1"]
.getService(Ci.imgITools)
.createScriptedObserver(observer);
// Clone the current imgIRequest with our new observer.
var request = currentRequest();
var clonedRequest = request.clone(scriptedObserver);
// Check that the image is decoded.
forceDecodeImg();
// The FRAME_COMPLETE notification is delivered asynchronously, so continue
// after we're sure it has been delivered.
runAfterAsyncEvents(() => step3(result, scriptedObserver, clonedRequest));
}
function step3(result, scriptedObserver, clonedRequest) {
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');
// The DISCARD notification is delivered asynchronously, so continue after
// we're sure it has been delivered.
runAfterAsyncEvents(() => step4(result, scriptedObserver, clonedRequest));
}
function step4(result, scriptedObserver, clonedRequest) {
ok(result.wasDiscarded, 'Image should be discarded.');
// And we're done.
gBrowser.removeTab(newTab);
prefBranch.setBoolPref('discardable', oldDiscardingPref);
clonedRequest.cancelAndForgetObserver(0);
finish();
}