toolkit/content/tests/chrome/test_notificationbox.xul

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 <?xml version="1.0"?>
     2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
     3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
     4 <!--
     5   XUL Widget Test for notificationbox
     6   -->
     7 <window title="Notification Box" width="500" height="600"
     8         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
     9   <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>  
    11   <notificationbox id="nb"/>
    12   <menupopup id="menupopup" onpopupshown="this.hidePopup()" onpopuphidden="checkPopupClosed()">
    13     <menuitem label="One"/>
    14   </menupopup>
    16   <!-- test results are displayed in the html:body -->
    17   <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/>
    19   <!-- test code goes here -->
    20   <script type="application/javascript"><![CDATA[
    21 SimpleTest.waitForExplicitFinish();
    23 var testtag_notificationbox_buttons = [
    24   {
    25     label: "Button 1",
    26     accesskey: "u",
    27     callback: testtag_notificationbox_buttonpressed,
    28     popup: "menupopup"
    29   }
    30 ];
    32 function testtag_notificationbox_buttonpressed(event)
    33 {
    34 }
    36 function testtag_notificationbox(nb)
    37 {
    38   testtag_notificationbox_State(nb, "initial", null, 0);
    40   SimpleTest.ise(nb.notificationsHidden, false, "initial notificationsHidden");
    41   SimpleTest.ise(nb.removeAllNotifications(false), undefined, "initial removeAllNotifications");
    42   testtag_notificationbox_State(nb, "initial removeAllNotifications", null, 0);
    43   SimpleTest.ise(nb.removeAllNotifications(true), undefined, "initial removeAllNotifications immediate");
    44   testtag_notificationbox_State(nb, "initial removeAllNotifications immediate", null, 0);
    46   runTimedTests(tests, -1, nb, null);
    47 }
    49 var notification_last_event, notification_last_event_item;
    50 function notification_eventCallback(event)
    51 {
    52   notification_last_event = event;
    53   notification_last_event_item = this;
    54 }
    56 function testtag_notification_eventCallback(expectedEvent, ntf, testName)
    57 {
    58   SimpleTest.is(notification_last_event, expectedEvent,
    59                 testName + ": event name");
    60   SimpleTest.is(notification_last_event_item, ntf,
    61                 testName + ": event item");
    63   notification_last_event = null;
    64   notification_last_event_item = null;
    65 }
    67 var tests =
    68 [
    69   {
    70     test: function(nb, ntf) {
    71       // append a new notification
    72       var ntf = nb.appendNotification("Notification", "note", "happy.png",
    73                                       nb.PRIORITY_INFO_LOW, testtag_notificationbox_buttons);
    74       SimpleTest.ise(ntf && ntf.localName == "notification", true, "append notification");
    75       return ntf;
    76     },
    77     result: function(nb, ntf) {
    78       testtag_notificationbox_State(nb, "append", ntf, 1);
    79       testtag_notification_State(nb, ntf, "append", "Notification", "note",
    80                                  "happy.png", nb.PRIORITY_INFO_LOW);
    82       // check the getNotificationWithValue method
    83       var ntf_found = nb.getNotificationWithValue("note");
    84       SimpleTest.ise(ntf, ntf_found, "getNotificationWithValue note");
    86       var none_found = nb.getNotificationWithValue("notenone");
    87       SimpleTest.ise(none_found, null, "getNotificationWithValue null");
    88       return ntf;
    89     }
    90   },
    91   {
    92     test: function(nb, ntf) {
    93       // check that notifications can be removed properly
    94       nb.removeNotification(ntf);
    95       return ntf;
    96     },
    97     result: function(nb, ntf) {
    98       testtag_notificationbox_State(nb, "removeNotification", null, 0);
   100       // try removing the notification again to make sure an exception occurs
   101       var exh = false;
   102       try {
   103         nb.removeNotification(ntf);
   104       } catch (ex) { exh = true; }
   105       SimpleTest.ise(exh, true, "removeNotification again");
   106       testtag_notificationbox_State(nb, "removeNotification again", null, 0);
   108     }
   109   },
   110   {
   111     test: function(nb, ntf) {
   112       // append a new notification, but now with an event callback
   113       var ntf = nb.appendNotification("Notification", "note", "happy.png",
   114                                       nb.PRIORITY_INFO_LOW,
   115                                       testtag_notificationbox_buttons,
   116                                       notification_eventCallback);
   117       SimpleTest.ise(ntf && ntf.localName == "notification", true, "append notification with callback");
   118       return ntf;
   119     },
   120     result: function(nb, ntf) {
   121       testtag_notificationbox_State(nb, "append with callback", ntf, 1);
   122       return ntf;
   123     }
   124   },
   125   {
   126     test: function(nb, ntf) {
   127       nb.removeNotification(ntf);
   128       return ntf;
   129     },
   130     result: function(nb, ntf) {
   131       testtag_notificationbox_State(nb, "removeNotification with callback",
   132                                     null, 0);
   134       testtag_notification_eventCallback("removed", ntf, "removeNotification()");
   135       return [1, null];
   136     }
   137   },
   138   {
   139     repeat: true,
   140     test: function(nb, arr) {
   141       var idx = arr[0];
   142       var ntf = arr[1];
   143       switch (idx) {
   144         case 1:
   145           // append a new notification
   146           ntf = nb.appendNotification("Notification", "note", "happy.png",
   147                             nb.PRIORITY_INFO_LOW, testtag_notificationbox_buttons);
   148           SimpleTest.ise(ntf && ntf.localName == "notification", true, "append notification");
   150           // Test persistence
   151           ntf.persistence++;
   153           return [idx, ntf];
   154         case 2:
   155         case 3:
   156           nb.removeTransientNotifications();
   158           return [idx, ntf];
   159       }
   160     },
   161     result: function(nb, arr) {
   162       var idx = arr[0];
   163       var ntf = arr[1];
   164       switch (idx) {
   165         case 1:
   166           testtag_notificationbox_State(nb, "notification added", ntf, 1);
   167           testtag_notification_State(nb, ntf, "append", "Notification", "note",
   168                                      "happy.png", nb.PRIORITY_INFO_LOW);
   169           SimpleTest.ise(ntf.persistence, 1, "persistence is 1");
   171           return [++idx, ntf];
   172         case 2:
   173           testtag_notificationbox_State(nb, "first removeTransientNotifications", ntf, 1);
   174           testtag_notification_State(nb, ntf, "append", "Notification", "note",
   175                                      "happy.png", nb.PRIORITY_INFO_LOW);
   176           SimpleTest.ise(ntf.persistence, 0, "persistence is now 0");
   178           return [++idx, ntf];
   179         case 3:
   180           testtag_notificationbox_State(nb, "second removeTransientNotifications", null, 0);
   182           this.repeat = false;
   183       }
   184     }
   185   },
   186   {
   187     test: function(nb, ntf) {
   188       // append another notification
   189       var ntf = nb.appendNotification("Notification", "note", "happy.png",
   190                                       nb.PRIORITY_INFO_MEDIUM, testtag_notificationbox_buttons);
   191       SimpleTest.ise(ntf && ntf.localName == "notification", true, "append notification again");
   192       return ntf;
   193     },
   194     result: function(nb, ntf) {
   195       // check that appending a second notification after removing the first one works
   196       testtag_notificationbox_State(nb, "append again", ntf, 1);
   197       testtag_notification_State(nb, ntf, "append again", "Notification", "note",
   198                                  "happy.png", nb.PRIORITY_INFO_MEDIUM);
   199       return ntf;
   200     }
   201   },
   202   {
   203     test: function(nb, ntf) {
   204       // check the removeCurrentNotification method
   205       nb.removeCurrentNotification();
   206       return ntf;
   207     },
   208     result: function(nb, ntf) {
   209       testtag_notificationbox_State(nb, "removeCurrentNotification", null, 0);
   210     }
   211   },
   212   {
   213     test: function(nb, ntf) {
   214       var ntf = nb.appendNotification("Notification", "note", "happy.png",
   215                                       nb.PRIORITY_INFO_HIGH, testtag_notificationbox_buttons);
   216       return ntf;
   217     },
   218     result: function(nb, ntf) {
   219       // test the removeAllNotifications method
   220       testtag_notificationbox_State(nb, "append info_high", ntf, 1);
   221       SimpleTest.ise(ntf.priority, nb.PRIORITY_INFO_HIGH,
   222                     "notification.priority " + nb.PRIORITY_INFO_HIGH);
   223       SimpleTest.ise(nb.removeAllNotifications(false), undefined, "removeAllNotifications");
   224     }
   225   },
   226   {
   227     test: function(nb, unused) {
   228       // add a number of notifications and check that they are added in order
   229       nb.appendNotification("Four", "4", null, nb.PRIORITY_INFO_HIGH, testtag_notificationbox_buttons);
   230       nb.appendNotification("Seven", "7", null, nb.PRIORITY_WARNING_HIGH, testtag_notificationbox_buttons);
   231       nb.appendNotification("Two", "2", null, nb.PRIORITY_INFO_LOW, null);
   232       nb.appendNotification("Eight", "8", null, nb.PRIORITY_CRITICAL_LOW, null);
   233       nb.appendNotification("Five", "5", null, nb.PRIORITY_WARNING_LOW, null);
   234       nb.appendNotification("Six", "6", null, nb.PRIORITY_WARNING_HIGH, null);
   235       nb.appendNotification("One", "1", null, nb.PRIORITY_INFO_LOW, null);
   236       nb.appendNotification("Nine", "9", null, nb.PRIORITY_CRITICAL_MEDIUM, null);
   237       var ntf = nb.appendNotification("Ten", "10", null, nb.PRIORITY_CRITICAL_HIGH, null);
   238       nb.appendNotification("Three", "3", null, nb.PRIORITY_INFO_MEDIUM, null);
   239       return ntf;
   240     },
   241     result: function(nb, ntf) {
   242       SimpleTest.ise(nb.currentNotification == ntf ?
   243                     nb.currentNotification.value : null, "10", "appendNotification order");
   244       return 1;
   245     }
   246   },
   247   {
   248     // test closing notifications to make sure that the current notification is still set properly
   249     repeat: true,
   250     test: function(nb, testidx) {
   251       switch (testidx) {
   252         case 1:
   253           nb.getNotificationWithValue("10").close();
   254           return [1, 9];
   255         case 2:
   256           nb.removeNotification(nb.getNotificationWithValue("9"));
   257           return [2, 8];
   258         case 3:
   259           nb.removeCurrentNotification();
   260           return [3, 7];
   261         case 4:
   262           nb.getNotificationWithValue("6").close();
   263           return [4, 7];
   264         case 5:
   265           nb.removeNotification(nb.getNotificationWithValue("5"));
   266           return [5, 7];
   267         case 6:
   268           nb.removeCurrentNotification();
   269           return [6, 4];
   270       }
   271     },
   272     result: function(nb, arr) {
   273       // arr is [testindex, expectedvalue]
   274       SimpleTest.ise(nb.currentNotification.value, "" + arr[1], "close order " + arr[0]);
   275       SimpleTest.ise(nb.allNotifications.length, 10 - arr[0], "close order " + arr[0] + " count");
   276       if (arr[0] == 6)
   277         this.repeat = false;
   278       return ++arr[0];
   279     }
   280   },
   281   {
   282     test: function(nb, ntf) {
   283       var exh = false;
   284       try {
   285         nb.appendNotification("no", "no", "no", 0, null);
   286       } catch (ex) { exh = true; }
   287       SimpleTest.ise(exh, true, "appendNotification priority too low");
   289       exh = false;
   290       try {
   291         nb.appendNotification("no", "no", "no", 11, null);
   292       } catch (ex) { exh = true; }
   293       SimpleTest.ise(exh, true, "appendNotification priority too high");
   295       // check that the other priority types work properly
   296       runTimedTests(appendPriorityTests, -1, nb, nb.PRIORITY_WARNING_LOW);
   297     }
   298   }
   299 ];
   301 var appendPriorityTests = [
   302   {
   303     test: function(nb, priority) {
   304       var ntf = nb.appendNotification("Notification", "note", "happy.png",
   305                                       priority, testtag_notificationbox_buttons);
   306       SimpleTest.ise(ntf && ntf.localName == "notification", true, "append notification " + priority);
   307       return [ntf, priority];
   308     },
   309     result: function(nb, obj) {
   310       SimpleTest.ise(obj[0].priority, obj[1], "notification.priority " + obj[1]);
   311       return obj[1];
   312     }
   313   },
   314   {
   315     test: function(nb, priority) {
   316       nb.removeCurrentNotification();
   317       return priority;
   318     },
   319     result: function(nb, priority) {
   320       if (priority == nb.PRIORITY_CRITICAL_BLOCK) {
   321         let ntf = nb.appendNotification("Notification", "note", "happy.png",
   322                                         nb.PRIORITY_INFO_LOW, testtag_notificationbox_buttons);
   323         setTimeout(checkPopupTest, 50, nb, ntf);
   324       }
   325       else {
   326         runTimedTests(appendPriorityTests, -1, nb, ++priority);
   327       }
   328     }
   329   }
   330 ];
   332 function testtag_notificationbox_State(nb, testid, expecteditem, expectedcount)
   333 {
   334   SimpleTest.ise(nb.currentNotification, expecteditem, testid + " currentNotification");
   335   SimpleTest.ise(nb.allNotifications ? nb.allNotifications.length : "no value",
   336                 expectedcount, testid + " allNotifications");
   337 }
   339 function testtag_notification_State(nb, ntf, testid, label, value, image, priority)
   340 {
   341   SimpleTest.ise(ntf.control, nb, testid + " notification.control");
   342   SimpleTest.ise(ntf.label, label, testid + " notification.label");
   343   SimpleTest.ise(ntf.value, value, testid + " notification.value");
   344   SimpleTest.ise(ntf.image, image, testid + " notification.image");
   345   SimpleTest.ise(ntf.priority, priority, testid + " notification.priority");
   347   var type;
   348   switch (priority) {
   349     case nb.PRIORITY_INFO_LOW:
   350     case nb.PRIORITY_INFO_MEDIUM:
   351     case nb.PRIORITY_INFO_HIGH:
   352       type = "info";
   353       break;
   354     case nb.PRIORITY_WARNING_LOW:
   355     case nb.PRIORITY_WARNING_MEDIUM:
   356     case nb.PRIORITY_WARNING_HIGH:
   357       type = "warning";
   358       break;
   359     case nb.PRIORITY_CRITICAL_LOW:
   360     case nb.PRIORITY_CRITICAL_MEDIUM:
   361     case nb.PRIORITY_CRITICAL_HIGH:
   362     case nb.PRIORITY_CRITICAL_BLOCK:
   363       type = "critical";
   364       break;
   365   }
   367   SimpleTest.ise(ntf.type, type, testid + " notification.type");
   368 }
   370 function checkPopupTest(nb, ntf)
   371 {
   372   if (nb._animating)
   373     setTimeout(checkPopupTest, ntf);
   374   else {
   375     var evt = new Event("");
   376     ntf.dispatchEvent(evt);
   377     evt.target.buttonInfo = testtag_notificationbox_buttons[0];
   378     ntf._doButtonCommand(evt);
   379   }
   380 }
   382 function checkPopupClosed()
   383 {
   384   is(document.popupNode, null, "popupNode null after popup is closed");
   385   SimpleTest.finish();
   386 }
   388 /**
   389  * run one or more tests which perform a test operation, wait for a delay,
   390  * then perform a result operation.
   391  *
   392  * tests - array of objects where each object is :
   393  *           {
   394  *             test: test function,
   395  *             result: result function
   396  *             repeat: true to repeat the test
   397  *           }
   398  * idx - starting index in tests
   399  * element - element to run tests on
   400  * arg - argument to pass between test functions
   401  *
   402  * If, after executing the result part, the repeat property of the test is
   403  * true, then the test is repeated. If the repeat property is not true,
   404  * continue on to the next test.
   405  *
   406  * The test and result functions take two arguments, the element and the arg.
   407  * The test function may return a value which will passed to the result
   408  * function as its arg. The result function may also return a value which
   409  * will be passed to the next repetition or the next test in the array.
   410  */
   411 function runTimedTests(tests, idx, element, arg)
   412 {
   413   if (idx >= 0 && "result" in tests[idx])
   414     arg = tests[idx].result(element, arg);
   416   // if not repeating, move on to the next test
   417   if (idx == -1 || !tests[idx].repeat)
   418     idx++;
   420   if (idx < tests.length) {
   421     var result = tests[idx].test(element, arg);
   422     setTimeout(runTimedTestsWait, 50, tests, idx, element, result);
   423   }
   424 }
   426 function runTimedTestsWait(tests, idx, element, arg)
   427 {
   428   // use this secret property to check if the animation is still running. If it
   429   // is, then the notification hasn't fully opened or closed yet
   430   if (element._animating)
   431     setTimeout(runTimedTestsWait, 50, tests, idx, element, arg);
   432   else
   433     runTimedTests(tests, idx, element, arg);
   434 }
   436 setTimeout(testtag_notificationbox, 0, document.getElementById('nb'));
   437 ]]>
   438 </script>
   440 </window>

mercurial