From 3e131c29b4b3a144c808dfea4bc635c1d0153b46 Mon Sep 17 00:00:00 2001 From: Scott Johnson Date: Wed, 9 Nov 2011 13:39:16 -0800 Subject: [PATCH] Bug 666446, Part 10/10 - Add mochitests to imagelib for testing animated gif image cases [r=dholbert,joe]. --- image/test/mochitest/Makefile.in | 19 + .../mochitest/animated-gif-finalframe.gif | Bin 0 -> 72 bytes image/test/mochitest/animated-gif.gif | Bin 0 -> 146 bytes image/test/mochitest/animated-gif2.gif | Bin 0 -> 165 bytes image/test/mochitest/animation.svg | 5 + image/test/mochitest/animationPolling.js | 395 ++++++++++++++++++ image/test/mochitest/filter-final.svg | 9 + image/test/mochitest/filter.svg | 9 + image/test/mochitest/iframe.html | 5 + image/test/mochitest/purple.gif | Bin 0 -> 86 bytes image/test/mochitest/ref-iframe.html | 6 + image/test/mochitest/test_animation.html | 46 ++ .../mochitest/test_background_image_anim.html | 44 ++ .../test/mochitest/test_bullet_animation.html | 57 +++ image/test/mochitest/test_changeOfSource.html | 63 +++ .../test/mochitest/test_changeOfSource2.html | 48 +++ .../test/mochitest/test_svg_animatedGIF.html | 52 +++ .../mochitest/test_svg_filter_animation.html | 42 ++ .../mochitest/test_undisplayed_iframe.html | 48 +++ .../mochitest/test_xultree_animation.xhtml | 67 +++ 20 files changed, 915 insertions(+) create mode 100644 image/test/mochitest/animated-gif-finalframe.gif create mode 100644 image/test/mochitest/animated-gif.gif create mode 100644 image/test/mochitest/animated-gif2.gif create mode 100644 image/test/mochitest/animation.svg create mode 100644 image/test/mochitest/animationPolling.js create mode 100644 image/test/mochitest/filter-final.svg create mode 100644 image/test/mochitest/filter.svg create mode 100644 image/test/mochitest/iframe.html create mode 100644 image/test/mochitest/purple.gif create mode 100644 image/test/mochitest/ref-iframe.html create mode 100644 image/test/mochitest/test_animation.html create mode 100644 image/test/mochitest/test_background_image_anim.html create mode 100644 image/test/mochitest/test_bullet_animation.html create mode 100644 image/test/mochitest/test_changeOfSource.html create mode 100644 image/test/mochitest/test_changeOfSource2.html create mode 100644 image/test/mochitest/test_svg_animatedGIF.html create mode 100644 image/test/mochitest/test_svg_filter_animation.html create mode 100644 image/test/mochitest/test_undisplayed_iframe.html create mode 100644 image/test/mochitest/test_xultree_animation.xhtml diff --git a/image/test/mochitest/Makefile.in b/image/test/mochitest/Makefile.in index 0e3651f3dcd..8ed8d3957fd 100644 --- a/image/test/mochitest/Makefile.in +++ b/image/test/mochitest/Makefile.in @@ -93,8 +93,27 @@ _TEST_FILES = imgutils.js \ # test_bug478398.html disabled - See bug 579139 _CHROME_FILES = imgutils.js \ + animationPolling.js \ lime-anim-100x100.svg \ + animation.svg \ test_animSVGImage.html \ + test_animation.html \ + animated-gif-finalframe.gif \ + animated-gif.gif \ + animated-gif2.gif \ + purple.gif \ + test_svg_animatedGIF.html \ + test_bullet_animation.html \ + test_background_image_anim.html \ + filter.svg \ + filter-final.svg \ + test_svg_filter_animation.html \ + test_xultree_animation.xhtml \ + test_changeOfSource.html \ + test_changeOfSource2.html \ + test_undisplayed_iframe.html \ + iframe.html \ + ref-iframe.html \ $(NULL) libs:: $(_TEST_FILES) diff --git a/image/test/mochitest/animated-gif-finalframe.gif b/image/test/mochitest/animated-gif-finalframe.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e80d31a727fc725326082d71ba42ccd33bf3b49 GIT binary patch literal 72 zcmZ?wbh9u|)L_tHXkcW}`p@wH|9>3@AOMLlFsZlnuRQ&hfAO3xx4Jjq+w+^h?UBc{ bXPwJlo!a(}`}ilH>)(2x|2n74%3uuu*a9G= literal 0 HcmV?d00001 diff --git a/image/test/mochitest/animated-gif.gif b/image/test/mochitest/animated-gif.gif new file mode 100644 index 0000000000000000000000000000000000000000..001cbfb87a05e518f53707a4237a7034d2111344 GIT binary patch literal 146 zcmZ?wbhEHb)L_tHSjfbn^`GJY7s>x%p!k!8fs5fkgAM}_faDpN)O-3@o_@=}c+Qqv x-J9?2`OV+<$Ya{G&SkGoZF|Rk{FBf1Z@tfdol|CI0P1DrVqiqk+d`yXYXIPpLiGRu literal 0 HcmV?d00001 diff --git a/image/test/mochitest/animated-gif2.gif b/image/test/mochitest/animated-gif2.gif new file mode 100644 index 0000000000000000000000000000000000000000..c66cc4b7344f52e312460d7424cc2cce7f6fd87d GIT binary patch literal 165 zcmZ?wbhEHb)L_tHSjfb{!1jL{!+!`+{Lk&@8WQa67~pE8XTZ$Jz`&sRlZAnc;Xi{8 zkPXzJ!N9--h6M*Z~nGN9@Cz6E_-!q+dJ;#pM0)=>wW&~oH8p& QFC!OF8?xRWBK2AW0EH1oYXATM literal 0 HcmV?d00001 diff --git a/image/test/mochitest/animation.svg b/image/test/mochitest/animation.svg new file mode 100644 index 00000000000..2141d867916 --- /dev/null +++ b/image/test/mochitest/animation.svg @@ -0,0 +1,5 @@ + + + + diff --git a/image/test/mochitest/animationPolling.js b/image/test/mochitest/animationPolling.js new file mode 100644 index 00000000000..f7e98882b76 --- /dev/null +++ b/image/test/mochitest/animationPolling.js @@ -0,0 +1,395 @@ +var currentTest; +var gIsImageLoaded = false; +var gIsRefImageLoaded = false; + +function pollForSuccess () +{ + if (!currentTest.isTestFinished) { + if (!currentTest.reusingReferenceImage || (currentTest.reusingReferenceImage + && gRefImageLoaded)) { + currentTest.checkImage(); + } + + setTimeout(pollForSuccess, currentTest.pollFreq); + } +}; + +function imageLoadCallback() +{ + gIsImageLoaded = true; +} + +function referencePoller() +{ + currentTest.takeReferenceSnapshot(); +} + +function reuseImageCallback() +{ + gIsRefImageLoaded = true; +} + +function failTest () +{ + if (currentTest.isTestFinished || currentTest.closeFunc) { + return; + } + + ok(false, "timing out after " + currentTest.timeout + "ms. " + + "Animated image still doesn't look correct, " + "after call #" + + currentTest.onStopFrameCounter + " to onStopFrame"); + currentTest.wereFailures = true; + + currentTest.enableDisplay(document.getElementById(currentTest.debugElementId)); + + currentTest.cleanUpAndFinish(); +}; + +/** + * Create a new AnimationTest object. + * + * @param pollFreq The amount of time (in ms) to wait between consecutive + * snapshots if the reference image and the test image don't match. + * @param timeout The total amount of time (in ms) to wait before declaring the + * test as failed. + * @param referenceElementId The id attribute of the reference image element, or + * the source of the image to change to, once the reference snapshot has + * been successfully taken. This latter option could be used if you don't + * want the image to become invisible at any time during the test. + * @param imageElementId The id attribute of the test image element. + * @param debugElementId The id attribute of the div where links should be + * appended if the test fails. + * @param cleanId The id attribute of the div or element to use as the 'clean' + * test. This element is only enabled when we are testing to verify that + * the reference image has been loaded. It can be undefined. + * @param srcAttr The location of the source of the image, for preloading. This + * is usually not required, but it useful for preloading reference + * images. + * @param xulTest A boolean value indicating whether or not this is a XUL test + * (uses hidden=true/false rather than display: none to hide/show + * elements). + * @param closeFunc A function that should be called when this test is finished. + * If null, then cleanUpAndFinish() will be called. This can be used to + * chain tests together, so they are all finished exactly once. + * @returns {AnimationTest} + */ +function AnimationTest(pollFreq, timeout, referenceElementId, imageElementId, + debugElementId, cleanId, srcAttr, xulTest, closeFunc) +{ + // We want to test the cold loading behavior, so clear cache in case an + // earlier test got our image in there already. + clearImageCache(); + + this.wereFailures = false; + this.pollFreq = pollFreq; + this.timeout = timeout; + this.imageElementId = imageElementId; + this.referenceElementId = referenceElementId; + + if (!document.getElementById(referenceElementId)) { + // In this case, we're assuming the user passed in a string that + // indicates the source of the image they want to change to, + // after the reference image has been taken. + this.reusingImageAsReference = true; + } + + this.srcAttr = srcAttr; + this.debugElementId = debugElementId; + this.referenceSnapshot = ""; // value will be set in takeReferenceSnapshot() + this.onStopFrameCounter = 0; + this.isTestFinished = false; + this.numRefsTaken = 0; + this.blankWaitTime = 0; + + this.cleanId = cleanId ? cleanId : ''; + this.xulTest = xulTest ? xulTest : ''; + this.closeFunc = closeFunc ? closeFunc : ''; + + if (this.srcAttr) { + this.myImage = new Image(); + this.myImage.onload = imageLoadCallback; + this.myImage.src = this.srcAttr; + } else { + gIsImageLoaded = true; + } +} + +AnimationTest.prototype.outputDebugInfo = function(message, id, dataUri) +{ + var debugElement = document.getElementById(this.debugElementId); + var newDataUriElement = document.createElement("a"); + newDataUriElement.setAttribute("id", id); + newDataUriElement.setAttribute("href", dataUri); + newDataUriElement.appendChild(document.createTextNode(message)); + debugElement.appendChild(newDataUriElement); + var brElement = document.createElement("br"); + debugElement.appendChild(brElement); +}; + +AnimationTest.prototype.isFinished = function() +{ + return this.isTestFinished; +}; + +AnimationTest.prototype.takeCleanSnapshot = function() +{ + var cleanElement; + if (this.cleanId) { + cleanElement = document.getElementById(this.cleanId); + } + + // Enable clean page comparison element + if (cleanElement) { + this.enableDisplay(cleanElement); + } + + // Take a snapshot of the initial (clean) page + this.cleanSnapshot = snapshotWindow(window, false); + + // Disable the clean page comparison element + if (cleanElement) { + this.disableDisplay(cleanElement); + } + + var dataString1 = "Clean Snapshot"; + this.outputDebugInfo(dataString1, 'cleanSnap', + this.cleanSnapshot.toDataURL()); +}; + +AnimationTest.prototype.takeBlankSnapshot = function() +{ + // Take a snapshot of the initial (essentially blank) page + this.blankSnapshot = snapshotWindow(window, false); + + var dataString1 = "Initial Blank Snapshot"; + this.outputDebugInfo(dataString1, 'blank1Snap', + this.blankSnapshot.toDataURL()); +}; + +/** + * Begin the AnimationTest. This will utilize the information provided in the + * constructor to invoke a mochitest on animated images. It will automatically + * fail if allowed to run past the timeout. + */ +AnimationTest.prototype.beginTest = function () +{ + SimpleTest.waitForExplicitFinish(); + + currentTest = this; + + this.takeReferenceSnapshot(); + + // In case something goes wrong, fail earlier than mochitest timeout, + // and with more information. + setTimeout(failTest, this.timeout); + + if (!this.reusingImageAsReference) { + this.disableDisplay(document.getElementById(this.imageElementId)); + } + + this.setupPolledImage(); + setTimeout(pollForSuccess, 10); +}; + +AnimationTest.prototype.setupPolledImage = function () +{ + // Make sure the image is visible + if (!this.reusingImageAsReference) { + this.enableDisplay(document.getElementById(this.imageElementId)); + var currentSnapshot = snapshotWindow(window, false); + var result = compareSnapshots(currentSnapshot, this.referenceSnapshot, true); + + var dataString = "Snapshot #" + this.onStopFrameCounter; + this.outputDebugInfo(dataString, 'snap' + this.onStopFrameCounter, + currentSnapshot.toDataURL()); + + if (result[0]) { + // SUCCESS! + ok(true, "Animated image looks correct, " + "at call #" + + this.onStopFrameCounter + " to onStopFrame"); + + this.cleanUpAndFinish(); + } + } else { + if (!gIsRefImageLoaded) { + this.myImage = new Image(); + this.myImage.onload = reuseImageCallback; + document.getElementById(this.imageElementId).setAttribute('src', + this.referenceElementId); + } + } +} + +AnimationTest.prototype.checkImage = function () +{ + if (this.isTestFinished) { + return; + } + + this.onStopFrameCounter++; + + // We need this for some tests, because we need to force the + // test image to be visible. + if (!this.reusingImageAsReference) { + this.enableDisplay(document.getElementById(this.imageElementId)); + } + + var currentSnapshot = snapshotWindow(window, false); + var result = compareSnapshots(currentSnapshot, this.referenceSnapshot, true); + + var dataString = "Snapshot #" + this.onStopFrameCounter; + this.outputDebugInfo(dataString, 'snap' + this.onStopFrameCounter, + currentSnapshot.toDataURL()); + + if (result[0]) { + // SUCCESS! + ok(true, "Animated image looks correct, " + "at call #" + + this.onStopFrameCounter + " to onStopFrame"); + + this.cleanUpAndFinish(); + } +}; + +AnimationTest.prototype.takeReferenceSnapshot = function () +{ + this.numRefsTaken++; + + // Test to make sure the reference image doesn't match a clean snapshot + if (!this.cleanSnapshot) { + this.takeCleanSnapshot(); + } + + // Used later to verify that the reference div disappeared + if (!this.blankSnapshot) { + this.takeBlankSnapshot(); + } + + if (this.reusingImageAsReference) { + // Show reference div, & take a snapshot + var referenceDiv = document.getElementById(this.imageElementId); + this.enableDisplay(referenceDiv); + + this.referenceSnapshot = snapshotWindow(window, false); + var snapResult = compareSnapshots(this.cleanSnapshot, this.referenceSnapshot, + false); + if (!snapResult[0]) { + if (this.blankWaitTime > 2000) { + // if it took longer than two seconds to load the image, we probably + // have a problem. + this.wereFailures = true; + ok(snapResult[0], + "Reference snapshot shouldn't match clean (non-image) snapshot"); + } else { + this.blankWaitTime += 20; + // let's wait a bit and see if it clears up + setTimeout(referencePoller, 20); + return; + } + } + + ok(snapResult[0], + "Reference snapshot shouldn't match clean (non-image) snapshot"); + + var dataString = "Reference Snapshot #" + this.numRefsTaken; + this.outputDebugInfo(dataString, 'refSnapId', + this.referenceSnapshot.toDataURL()); + } else { + // Make sure the animation section is hidden + this.disableDisplay(document.getElementById(this.imageElementId)); + + // Show reference div, & take a snapshot + var referenceDiv = document.getElementById(this.referenceElementId); + this.enableDisplay(referenceDiv); + + this.referenceSnapshot = snapshotWindow(window, false); + var snapResult = compareSnapshots(this.cleanSnapshot, this.referenceSnapshot, false); + if (!snapResult[0]) { + if (this.blankWaitTime > 2000) { + // if it took longer than two seconds to load the image, we probably + // have a problem. + this.wereFailures = true; + ok(snapResult[0], + "Reference snapshot shouldn't match clean (non-image) snapshot"); + } else { + this.blankWaitTime += 20; + // let's wait a bit and see if it clears up + setTimeout(referencePoller, 20); + return; + } + } + + ok(snapResult[0], + "Reference snapshot shouldn't match clean (non-image) snapshot"); + + var dataString = "Reference Snapshot #" + this.numRefsTaken; + this.outputDebugInfo(dataString, 'refSnapId', + this.referenceSnapshot.toDataURL()); + + // Re-hide reference div, and take another snapshot to be sure it's gone + this.disableDisplay(referenceDiv); + this.testBlankCameBack(); + } +}; + +AnimationTest.prototype.enableDisplay = function(element) +{ + if (!element) { + return; + } + + if (!this.xulTest) { + element.style.display = ''; + } else { + element.setAttribute('hidden', 'false'); + } +}; + +AnimationTest.prototype.disableDisplay = function(element) +{ + if (!element) { + return; + } + + if (!this.xulTest) { + element.style.display = 'none'; + } else { + element.setAttribute('hidden', 'true'); + } +}; + +AnimationTest.prototype.testBlankCameBack = function() +{ + var blankSnapshot2 = snapshotWindow(window, false); + var result = compareSnapshots(this.blankSnapshot, blankSnapshot2, true); + ok(result[0], "Reference image should disappear when it becomes display:none"); + + if (!result[0]) { + this.wereFailures = true; + var dataString = "Second Blank Snapshot"; + this.outputDebugInfo(dataString, 'blank2SnapId', result[2]); + } +}; + +AnimationTest.prototype.cleanUpAndFinish = function () +{ + // On the off chance that failTest and checkImage are triggered + // back-to-back, use a flag to prevent multiple calls to SimpleTest.finish. + if (this.isTestFinished) { + return; + } + + this.isTestFinished = true; + + // Call our closing function, if one exists + if (this.closeFunc) { + this.closeFunc(); + return; + } + + if (this.wereFailures) { + document.getElementById(this.debugElementId).style.display = 'block'; + } + + SimpleTest.finish(); + document.getElementById(this.debugElementId).style.display = ""; +}; diff --git a/image/test/mochitest/filter-final.svg b/image/test/mochitest/filter-final.svg new file mode 100644 index 00000000000..b2b3dca0088 --- /dev/null +++ b/image/test/mochitest/filter-final.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/image/test/mochitest/filter.svg b/image/test/mochitest/filter.svg new file mode 100644 index 00000000000..e185f15b69a --- /dev/null +++ b/image/test/mochitest/filter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/image/test/mochitest/iframe.html b/image/test/mochitest/iframe.html new file mode 100644 index 00000000000..6d66557ef80 --- /dev/null +++ b/image/test/mochitest/iframe.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/image/test/mochitest/purple.gif b/image/test/mochitest/purple.gif new file mode 100644 index 0000000000000000000000000000000000000000..79826af205d7eceb7763d8a213d3ec28844db363 GIT binary patch literal 86 zcmZ?wbhEHb)L_tHSjfb{!1jL{!+!`+{K>+|#lXOz1H?dC4F(1#^`8Efr{D4~p0njv l_vU+he)G3I@|gClbJ?p?+um^>|KxN1TkrE<=ag9)tO1)NCT9Qu literal 0 HcmV?d00001 diff --git a/image/test/mochitest/ref-iframe.html b/image/test/mochitest/ref-iframe.html new file mode 100644 index 00000000000..585772c8a96 --- /dev/null +++ b/image/test/mochitest/ref-iframe.html @@ -0,0 +1,6 @@ + + +
+ + diff --git a/image/test/mochitest/test_animation.html b/image/test/mochitest/test_animation.html new file mode 100644 index 00000000000..b0dc5ff7f18 --- /dev/null +++ b/image/test/mochitest/test_animation.html @@ -0,0 +1,46 @@ + + + + + Test for Bug 666446 - General Animated GIF Test + + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+ +
+
+
+ +
+
+ +
+
+
+
+ + diff --git a/image/test/mochitest/test_background_image_anim.html b/image/test/mochitest/test_background_image_anim.html new file mode 100644 index 00000000000..f9b1f59265d --- /dev/null +++ b/image/test/mochitest/test_background_image_anim.html @@ -0,0 +1,44 @@ + + + + + Test for Bug 666446 - Animated Background Images + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+
+
+ +
+ +
+
+
+ + diff --git a/image/test/mochitest/test_bullet_animation.html b/image/test/mochitest/test_bullet_animation.html new file mode 100644 index 00000000000..fd0622e37ad --- /dev/null +++ b/image/test/mochitest/test_bullet_animation.html @@ -0,0 +1,57 @@ + + + + + Test for Bug 666446 - Animated Bullets + + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+ +
+ + + +
+ +
+
+
+
+ + diff --git a/image/test/mochitest/test_changeOfSource.html b/image/test/mochitest/test_changeOfSource.html new file mode 100644 index 00000000000..51972bffb13 --- /dev/null +++ b/image/test/mochitest/test_changeOfSource.html @@ -0,0 +1,63 @@ + + + + + Test for Bug 666446 - Change of Source (1st Version) + + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+ +
+
+
+
+ +
+
+ +
+
+
+
+ + diff --git a/image/test/mochitest/test_changeOfSource2.html b/image/test/mochitest/test_changeOfSource2.html new file mode 100644 index 00000000000..08168be4fee --- /dev/null +++ b/image/test/mochitest/test_changeOfSource2.html @@ -0,0 +1,48 @@ + + + + + Test for Bug 691792 - Change of Source (2nd Version) + + + + + + + + + +Mozilla Bug 691792: Change of src attribute for animated gifs no longer works as expected + +

+ +
+
+ +
+
+ +
+
+
+
+ + diff --git a/image/test/mochitest/test_svg_animatedGIF.html b/image/test/mochitest/test_svg_animatedGIF.html new file mode 100644 index 00000000000..d7889726d1f --- /dev/null +++ b/image/test/mochitest/test_svg_animatedGIF.html @@ -0,0 +1,52 @@ + + + + + Test for Bug 666446 - Animated Raster Images inside of SVG Frames + + + + + + + + + + +

+
+
+ + +
+ +
+
+
+ + diff --git a/image/test/mochitest/test_svg_filter_animation.html b/image/test/mochitest/test_svg_filter_animation.html new file mode 100644 index 00000000000..c58505416a2 --- /dev/null +++ b/image/test/mochitest/test_svg_filter_animation.html @@ -0,0 +1,42 @@ + + + + + Test for Bug 666446 - Animated Images within SVG Filters + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+
+ + +
+ +
+
+
+ + diff --git a/image/test/mochitest/test_undisplayed_iframe.html b/image/test/mochitest/test_undisplayed_iframe.html new file mode 100644 index 00000000000..55c6b41f27d --- /dev/null +++ b/image/test/mochitest/test_undisplayed_iframe.html @@ -0,0 +1,48 @@ + + + + +Test for Bug 666446 - Test for Animated Gif within IFRAME + + + + + + + + + + Mozilla Bug 666446: lots of animated gifs swamp us with paint events +

+ +
+ +
+ +
+ +
+
+
+
+ + diff --git a/image/test/mochitest/test_xultree_animation.xhtml b/image/test/mochitest/test_xultree_animation.xhtml new file mode 100644 index 00000000000..35157fbe957 --- /dev/null +++ b/image/test/mochitest/test_xultree_animation.xhtml @@ -0,0 +1,67 @@ + + + + + Test for Bug 666446 - Animated Images within SVG Filters + + + + + + + + +Mozilla Bug 666446: lots of animated gifs swamp us with paint events + +

+
+ + +
+ + + + + + + + + + + + +
+ +
+
+
+ +