dom/browser-element/mochitest/priority/test_HighPriority.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <!DOCTYPE HTML>
     2 <html>
     3 <!--
     4 Test that frames with mozapptype=critical which hold the "high-priority" or
     5 "cpu" wake locks get elevated process priority.
     6 -->
     7 <head>
     8   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     9   <script type="application/javascript" src="../browserElementTestHelpers.js"></script>
    10   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
    11 </head>
    12 <body>
    14 <script type="application/javascript;version=1.7">
    15 "use strict";
    17 SimpleTest.waitForExplicitFinish();
    18 browserElementTestHelpers.setEnabledPref(true);
    19 browserElementTestHelpers.addPermission();
    20 browserElementTestHelpers.enableProcessPriorityManager();
    22 function runTest() {
    23   // To test bug 870480, run this test while holding the CPU and high-priority
    24   // wake locks.  Without the fix for bug 870480, we won't set the priority of
    25   // the child process if the main process holds these wake locks and the test
    26   // will hang.
    27   navigator.requestWakeLock('cpu');
    28   navigator.requestWakeLock('high-priority');
    30   var iframe = document.createElement('iframe');
    31   iframe.setAttribute('mozbrowser', true);
    32   iframe.setAttribute('mozapptype', 'critical');
    33   iframe.src = 'file_HighPriority.html';
    35   // We expect the following to happen:
    36   //
    37   // - Process is created.
    38   // - Its priority is set to FOREGROUND (when the process starts).
    39   // - wait_alert('step0', FOREGROUND_HIGH)
    40   // - wait_alert('step1', FOREGROUND)
    41   // - wait_alert('step2', FOREGROUND_HIGH)
    42   //
    43   // Where wait_alert(M, P) means that we expect the subprocess to
    44   //   * do alert(M) and
    45   //   * be set to priority P
    46   // in some order.  If the alert occurs before the priority change, we block
    47   // the alert until we observe the priority change.  So the subprocess only
    48   // has to do
    49   //
    50   //   // set priority to FOREGROUND_HIGH
    51   //   alert('step0');
    52   //   // set priority to FOREGROUND
    53   //   alert('step1');
    54   //
    55   // etc.
    57   var childID = null;
    58   var alertTimes = [];
    60   // Return a promise that's resolved once the child process calls alert() and
    61   // we get a priority change, in some order.
    62   //
    63   // We check that the text of the alert is |"step" + index|.
    64   //
    65   // If gracePeriod is given, we check that the priority change occurred at
    66   // least gracePeriod ms since the alert from the previous step (with a fudge
    67   // factor to account for inaccurate timers).
    68   function expectAlertAndPriorityChange(index, priority, /* optional */ gracePeriod) {
    69     function checkAlertInfo(e) {
    70       is(e.detail.message, 'step' + index, 'alert() number ' + index);
    71       alertTimes.push(new Date());
    73       // Block the alert; we'll unblock it by calling e.detail.unblock() later.
    74       e.preventDefault();
    75       return Promise.resolve(e.detail.unblock);
    76     }
    78     function checkGracePeriod() {
    79       if (gracePeriod) {
    80         var msSinceLastAlert = (new Date()) - alertTimes[index - 1];
    82         // 50ms fudge factor.  This test is set up so that, if nsITimers are
    83         // accurate, we don't need any fudge factor.  Unfortunately our timers
    84         // are not accurate!  There's little we can do here except fudge.
    85         // Thankfully all we're trying to test is that we get /some/ delay; the
    86         // exact amount of delay isn't so important.
    87         ok(msSinceLastAlert + 50 >= gracePeriod,
    88            msSinceLastAlert + "ms since last alert >= (" + gracePeriod + " - 50ms)");
    89       }
    90     }
    92     return Promise.all(
    93       [expectMozbrowserEvent(iframe, 'showmodalprompt').then(checkAlertInfo),
    94        expectPriorityChange(childID, priority).then(checkGracePeriod)]
    95     ).then(function(results) {
    96       // checkAlertInfo returns the function to call to unblock the alert.
    97       // It comes to us as the first element of the results array.
    98       results[0]();
    99     });
   100   }
   102   expectProcessCreated().then(function(chid) {
   103     childID = chid;
   104     return expectPriorityChange(childID, 'FOREGROUND');
   105   }).then(function() {
   106     return expectAlertAndPriorityChange(0, 'FOREGROUND_HIGH');
   107   }).then(function() {
   108     return expectAlertAndPriorityChange(1, 'FOREGROUND', priorityChangeGracePeriod);
   109   }).then(function() {
   110     return expectAlertAndPriorityChange(2, 'FOREGROUND_HIGH');
   111   }).then(function() {
   112     return expectAlertAndPriorityChange(3, 'FOREGROUND', priorityChangeGracePeriod);
   113   }).then(SimpleTest.finish);
   115   document.body.appendChild(iframe);
   116 }
   118 const priorityChangeGracePeriod = 100;
   119 addEventListener('testready', function() {
   120   SpecialPowers.pushPrefEnv(
   121     {set: [['dom.ipc.processPriorityManager.backgroundGracePeriodMS',
   122             priorityChangeGracePeriod],
   123            ['dom.wakelock.enabled', true]]},
   124     runTest);
   125 });
   127 </script>
   128 </body>
   129 </html>

mercurial