image/test/mochitest/test_animation_operators.html

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 <!DOCTYPE HTML>
     2 <html>
     3 <!--
     4 https://bugzilla.mozilla.org/show_bug.cgi?id=936720
     5 -->
     6 <head>
     7   <title>Test for Bug 936720</title>
     8   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     9   <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.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=936720">Mozilla Bug 936720</a>
    14 <pre id="test">
    15 <script type="application/javascript">
    17 /** Test for Bug 936720 **/
    19 // Because there is no event telling us when an animated image finishes
    20 // animating, tests for the operators used by animated GIFs and PNGs
    21 // require that we poll until we get the correct result. A fixed timeout
    22 // can easily result in intermittent failures on tests running in VMs.
    24 // (Note that we do _not_ poll the reference, so it must not be animated.)
    26 var gTests = [
    27   // IMPORTANT NOTE: For these tests, the test and reference are not
    28   // snapshotted in the same way.  The REFERENCE (second file) is
    29   // assumed to be complete when loaded, but we poll the TEST
    30   // (first file) until the test passes.
    32   // Tests of the allowed disposal operators for both GIF and APNG: keep, clear,
    33   // and restore previous.
    34   "== green-background.html?clear.gif green.png",
    35   "== green-background.html?clear.png green.png",
    36   "== keep.gif green.png",
    37   "== keep.png green.png",
    38   "== restore-previous.gif green.png",
    39   "== restore-previous.png green.png",
    41   // Tests of the blending/compositing operators that only APNG supports.
    42   "== over.png grey.png",
    43   "!= source.png grey.png",
    44   "== bug900200.png bug900200-ref.png",
    46   // Test of subframe updates.
    47   "== clear2.gif clear2-results.gif",
    48 ];
    50 // Maintain a reference count of how many things we're waiting for until
    51 // we can say the tests are done.
    52 var gDelayCount = 0;
    53 function AddFinishDependency()
    54   { ++gDelayCount; }
    55 function RemoveFinishDependency()
    56   { if (--gDelayCount == 0) SimpleTest.finish(); }
    58 // We record the maximum number of times we had to look at a test before
    59 // it switched to the passing state (though we assume it's 10 to start
    60 // rather than 0 so that we have a reasonable default).  Then we make a
    61 // test "time out" if it takes more than gTimeoutFactor times that
    62 // amount of time.  This allows us to report a test failure rather than
    63 // making a test failure just show up as a timeout.
    64 var gMaxPassingTries = 10;
    65 var gTimeoutFactor = 10;
    67 function takeSnapshot(iframe_element)
    68 {
    69   return snapshotWindow(iframe_element.contentWindow, false);
    70 }
    72 function passes(op, shot1, shot2)
    73 {
    74   var [correct, s1, s2] = compareSnapshots(shot1, shot2, op == "==");
    75   return correct;
    76 }
    78 function startTest(i)
    79 {
    80   var testLine = gTests[i];
    81   var splitData = testLine.split(" ");
    82   var testData =
    83     { op: splitData[0], test: splitData[1], reference: splitData[2] };
    84   var tries = 0;
    86   // Maintain state specific to this test in the closure exposed to all
    87   // the functions nested inside this one.
    89   function startIframe(url)
    90   {
    91     var element = document.createElement("iframe");
    92     element.addEventListener("load", handleLoad, false);
    93     // Smaller than normal reftests, but enough for these.
    94     element.setAttribute("style", "width: 100px; height: 100px");
    95     element.setAttribute("frameborder", "0");
    96     element.setAttribute("scrolling", "no");
    97     element.src = url;
    98     document.body.appendChild(element);
    99     function handleLoad(event)
   100     {
   101       iframe.loaded = true;
   102       if (iframe == reference) {
   103         reference.snapshot = takeSnapshot(element);
   104       }
   105       var other = (iframe == test) ? reference : test;
   106       if (other.loaded) {
   107         setTimeout(checkTest, 100);
   108       }
   109     }
   110     function checkTest()
   111     {
   112       var test_snapshot = takeSnapshot(test.element);
   113       if (passes(testData.op, test_snapshot, reference.snapshot)) {
   114         if (tries > gMaxPassingTries) {
   115           gMaxPassingTries = tries;
   116         }
   117         report(true);
   118       } else {
   119         ++tries;
   120         if (tries > gMaxPassingTries * gTimeoutFactor) {
   121           info("Giving up after " + tries + " tries, " +
   122                "maxp=" + gMaxPassingTries +
   123                "fact=" + gTimeoutFactor);
   124           report(false);
   125         } else {
   126           // The animation might not have finished.  Try again in 100ms.
   127           setTimeout(checkTest, 100);
   128         }
   129       }
   130     }
   131     function report(result)
   132     {
   133       ok(result, "(" + i + ") " +
   134                  testData.op + " " + testData.test + " " + testData.reference);
   135       RemoveFinishDependency();
   136     }
   137     var iframe = { element: element, loaded: false };
   139     return iframe;
   140   }
   142   AddFinishDependency();
   143   var test = startIframe(testData.test);
   144   var reference = startIframe(testData.reference);
   145 }
   147 SimpleTest.waitForExplicitFinish();
   149 // Run the tests.
   150 for (var i = 0; i < gTests.length; ++i) {
   151   startTest(i);
   152 }
   154 </script>
   155 </pre>
   156 </body>
   157 </html>

mercurial