toolkit/content/tests/widgets/window_menubar.xul

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/toolkit/content/tests/widgets/window_menubar.xul	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,799 @@
     1.4 +<?xml version="1.0"?>
     1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
     1.6 +
     1.7 +<!-- the condition in the focus event handler is because pressing Tab
     1.8 +     unfocuses and refocuses the window on Windows -->
     1.9 +
    1.10 +<window title="Popup Tests"
    1.11 +  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    1.12 +
    1.13 +  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
    1.14 +  <script type="application/javascript" src="popup_shared.js"></script>
    1.15 +
    1.16 +<!--
    1.17 +  Need to investigate these tests a bit more. Some of the accessibility events
    1.18 +  are firing multiple times or in different orders in different circumstances.
    1.19 +  Note that this was also the case before bug 279703.
    1.20 +  -->
    1.21 +
    1.22 +<hbox style="margin-left: 275px; margin-top: 275px;">
    1.23 +<menubar id="menubar">
    1.24 +  <menu id="filemenu" label="File" accesskey="F">
    1.25 +    <menupopup id="filepopup">
    1.26 +      <menuitem id="item1" label="Open" accesskey="O"/>
    1.27 +      <menuitem id="item2" label="Save" accesskey="S"/>
    1.28 +      <menuitem id="item3" label="Close" accesskey="C"/>
    1.29 +    </menupopup>
    1.30 +  </menu>
    1.31 +  <menu id="secretmenu" label="Secret Menu" accesskey="S" disabled="true">
    1.32 +    <menupopup>
    1.33 +      <menuitem label="Secret Command" accesskey="S"/>
    1.34 +    </menupopup>
    1.35 +  </menu>
    1.36 +  <menu id="editmenu" label="Edit" accesskey="E">
    1.37 +    <menupopup id="editpopup">
    1.38 +      <menuitem id="cut" label="Cut" accesskey="t" disabled="true"/>
    1.39 +      <menuitem id="copy" label="Copy" accesskey="C"/>
    1.40 +      <menuitem id="paste" label="Paste" accesskey="P"/>
    1.41 +    </menupopup>
    1.42 +  </menu>
    1.43 +  <menu id="viewmenu" label="View" accesskey="V">
    1.44 +    <menupopup id="viewpopup">
    1.45 +      <menu id="toolbar" label="Toolbar" accesskey="T">
    1.46 +        <menupopup id="toolbarpopup">
    1.47 +          <menuitem id="navigation" label="Navigation" accesskey="N" disabled="true"/>
    1.48 +          <menuitem label="Bookmarks" accesskey="B" disabled="true"/>
    1.49 +        </menupopup>
    1.50 +      </menu>
    1.51 +      <menuitem label="Status Bar" accesskey="S"/>
    1.52 +      <menu label="Sidebar" accesskey="d">
    1.53 +        <menupopup>
    1.54 +          <menuitem label="Bookmarks" accesskey="B"/>
    1.55 +          <menuitem label="History" accesskey="H"/>
    1.56 +        </menupopup>
    1.57 +      </menu>
    1.58 +    </menupopup>
    1.59 +  </menu>
    1.60 +  <menu id="helpmenu" label="Help" accesskey="H">
    1.61 +    <menupopup id="helppopup" >
    1.62 +      <label value="Unselectable"/>
    1.63 +      <menuitem id="contents" label="Contents" accesskey="C"/>
    1.64 +      <menuitem label="More Info" accesskey="I"/>
    1.65 +      <menuitem id="amenu" label="A Menu" accesskey="M"/>
    1.66 +      <menuitem label="Another Menu"/>
    1.67 +      <menuitem id="one" label="One"/>
    1.68 +      <menu id="only" label="Only Menu">
    1.69 +        <menupopup>
    1.70 +          <menuitem label="Test Submenu"/>
    1.71 +        </menupopup>
    1.72 +      </menu>
    1.73 +      <menuitem label="Second Menu"/>
    1.74 +      <menuitem id="other" disabled="true" label="Other Menu"/>
    1.75 +      <menuitem id="third" label="Third Menu"/>
    1.76 +      <menuitem label="One Other Menu"/>
    1.77 +      <label value="Unselectable"/>
    1.78 +      <menuitem id="about" label="About" accesskey="A"/>
    1.79 +    </menupopup>
    1.80 +  </menu>
    1.81 +</menubar>
    1.82 +</hbox>
    1.83 +
    1.84 +<script class="testbody" type="application/javascript">
    1.85 +<![CDATA[
    1.86 +
    1.87 +window.opener.SimpleTest.waitForFocus(function () {
    1.88 +  gFilePopup = document.getElementById("filepopup");
    1.89 +  var filemenu = document.getElementById("filemenu");
    1.90 +  filemenu.focus();
    1.91 +  is(filemenu.openedWithKey, false, "initial openedWithKey");
    1.92 +  startPopupTests(popupTests);
    1.93 +}, window);
    1.94 +
    1.95 +// On Linux, the first menu opens when F10 is pressed, but on other platforms
    1.96 +// the menubar is focused but no menu is opened. This means that different events
    1.97 +// fire.
    1.98 +function pressF10Events()
    1.99 +{
   1.100 +  return navigator.platform.indexOf("Linux") >= 0 ?
   1.101 +    [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu", "popupshowing filepopup", "DOMMenuItemActive item1", "popupshown filepopup"] :
   1.102 +    [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   1.103 +}
   1.104 +
   1.105 +function closeAfterF10Events(extraInactive)
   1.106 +{
   1.107 +  if (navigator.platform.indexOf("Linux") >= 0) {
   1.108 +    var events = [ "popuphiding filepopup", "popuphidden filepopup", "DOMMenuItemInactive item1",
   1.109 +                   "DOMMenuInactive filepopup", "DOMMenuBarInactive menubar",
   1.110 +                   "DOMMenuItemInactive filemenu" ];
   1.111 +    if (extraInactive)
   1.112 +      events.push("DOMMenuItemInactive filemenu");
   1.113 +    return events;
   1.114 +  }
   1.115 +
   1.116 +  return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ];
   1.117 +}
   1.118 +
   1.119 +var popupTests = [
   1.120 +{
   1.121 +  testname: "press on menu",
   1.122 +  events: [ "popupshowing filepopup", "DOMMenuBarActive menubar",
   1.123 +            "DOMMenuItemActive filemenu", "popupshown filepopup" ],
   1.124 +  test: function() { synthesizeMouse(document.getElementById("filemenu"), 8, 8, { }); },
   1.125 +  result: function (testname) {
   1.126 +    checkActive(gFilePopup, "", testname);
   1.127 +    checkOpen("filemenu", testname);
   1.128 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.129 +  }
   1.130 +},
   1.131 +{
   1.132 +  // check that pressing cursor down while there is no selection
   1.133 +  // highlights the first item
   1.134 +  testname: "cursor down no selection",
   1.135 +  events: [ "DOMMenuItemActive item1" ],
   1.136 +  test: function() { sendKey("DOWN"); },
   1.137 +  result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   1.138 +},
   1.139 +{
   1.140 +  // check that pressing cursor up wraps and highlights the last item
   1.141 +  testname: "cursor up wrap",
   1.142 +  events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item3" ],
   1.143 +  test: function() { sendKey("UP"); },
   1.144 +  result: function(testname) { checkActive(gFilePopup, "item3", testname); }
   1.145 +},
   1.146 +{
   1.147 +  // check that pressing cursor down wraps and highlights the first item
   1.148 +  testname: "cursor down wrap",
   1.149 +  events: [ "DOMMenuItemInactive item3", "DOMMenuItemActive item1" ],
   1.150 +  test: function() { sendKey("DOWN"); },
   1.151 +  result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   1.152 +},
   1.153 +{
   1.154 +  // check that pressing cursor down highlights the second item
   1.155 +  testname: "cursor down",
   1.156 +  events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item2" ],
   1.157 +  test: function() { sendKey("DOWN"); },
   1.158 +  result: function(testname) { checkActive(gFilePopup, "item2", testname); }
   1.159 +},
   1.160 +{
   1.161 +  // check that pressing cursor up highlights the second item
   1.162 +  testname: "cursor up",
   1.163 +  events: [ "DOMMenuItemInactive item2", "DOMMenuItemActive item1" ],
   1.164 +  test: function() { sendKey("UP"); },
   1.165 +  result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   1.166 +},
   1.167 +
   1.168 +{
   1.169 +  // cursor right should skip the disabled menu and move to the edit menu
   1.170 +  testname: "cursor right skip disabled",
   1.171 +  events: function() {
   1.172 +    var elist = [
   1.173 +      // the file menu gets deactivated, the file menu gets hidden, then
   1.174 +      // the edit menu is activated
   1.175 +      "DOMMenuItemInactive filemenu", "DOMMenuItemActive editmenu",
   1.176 +      "popuphiding filepopup", "popuphidden filepopup",
   1.177 +      // the popupshowing event gets fired when showing the edit menu.
   1.178 +      // The item from the file menu doesn't get deactivated until the
   1.179 +      // next item needs to be selected
   1.180 +      "popupshowing editpopup", "DOMMenuItemInactive item1",
   1.181 +      // not sure why the menu inactivated event is firing so late
   1.182 +      "DOMMenuInactive filepopup"
   1.183 +    ];
   1.184 +    // finally, the first item is activated and popupshown is fired.
   1.185 +    // On Windows, don't skip disabled items.
   1.186 +    if (navigator.platform.indexOf("Win") == 0)
   1.187 +      elist.push("DOMMenuItemActive cut");
   1.188 +    else
   1.189 +      elist.push("DOMMenuItemActive copy");
   1.190 +    elist.push("popupshown editpopup");
   1.191 +    return elist;
   1.192 +  },
   1.193 +  test: function() { sendKey("RIGHT"); },
   1.194 +  result: function(testname) {
   1.195 +    var expected = (navigator.platform.indexOf("Win") == 0) ? "cut" : "copy";
   1.196 +    checkActive(document.getElementById("editpopup"), expected, testname);
   1.197 +    checkClosed("filemenu", testname);
   1.198 +    checkOpen("editmenu", testname);
   1.199 +    is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey");
   1.200 +  }
   1.201 +},
   1.202 +{
   1.203 +  // on Windows, a disabled item is selected, so pressing RETURN should close
   1.204 +  // the menu but not fire a command event
   1.205 +  testname: "enter on disabled",
   1.206 +  events: function() {
   1.207 +    if (navigator.platform.indexOf("Win") == 0)
   1.208 +      return [ "popuphiding editpopup", "popuphidden editpopup",
   1.209 +               "DOMMenuItemInactive cut", "DOMMenuInactive editpopup",
   1.210 +               "DOMMenuBarInactive menubar",
   1.211 +               "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu" ];
   1.212 +    else
   1.213 +      return [ "DOMMenuItemInactive copy", "DOMMenuInactive editpopup",
   1.214 +               "DOMMenuBarInactive menubar",
   1.215 +               "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu",
   1.216 +               "command copy", "popuphiding editpopup", "popuphidden editpopup",
   1.217 +               "DOMMenuItemInactive copy" ];
   1.218 +  },
   1.219 +  test: function() { sendKey("RETURN"); },
   1.220 +  result: function(testname) {
   1.221 +    checkClosed("editmenu", testname);
   1.222 +    is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey");
   1.223 +  }
   1.224 +},
   1.225 +{
   1.226 +  // pressing Alt + a key should open the corresponding menu
   1.227 +  testname: "open with accelerator",
   1.228 +  events: function() {
   1.229 +    return [ "DOMMenuBarActive menubar",
   1.230 +             "popupshowing viewpopup", "DOMMenuItemActive viewmenu",
   1.231 +             "DOMMenuItemActive toolbar", "popupshown viewpopup" ];
   1.232 +  },
   1.233 +  test: function() { synthesizeKey("V", { altKey: true }); },
   1.234 +  result: function(testname) {
   1.235 +    checkOpen("viewmenu", testname);
   1.236 +    is(document.getElementById("viewmenu").openedWithKey, true, testname + " openedWithKey");
   1.237 +  }
   1.238 +},
   1.239 +{
   1.240 +  // open the submenu with the cursor right key
   1.241 +  testname: "open submenu with cursor right",
   1.242 +  events: function() {
   1.243 +    // on Windows, the disabled 'navigation' item can stll be highlihted
   1.244 +    if (navigator.platform.indexOf("Win") == 0)
   1.245 +      return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   1.246 +               "popupshown toolbarpopup" ];
   1.247 +    else
   1.248 +      return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   1.249 +  },
   1.250 +  test: function() { sendKey("RIGHT"); },
   1.251 +  result: function(testname) {
   1.252 +    checkOpen("viewmenu", testname);
   1.253 +    checkOpen("toolbar", testname);
   1.254 +  }
   1.255 +},
   1.256 +{
   1.257 +  // close the submenu with the cursor left key
   1.258 +  testname: "close submenu with cursor left",
   1.259 +  events: function() {
   1.260 +    if (navigator.platform.indexOf("Win") == 0)
   1.261 +      return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   1.262 +               "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup",
   1.263 +               "DOMMenuItemActive toolbar" ];
   1.264 +    else
   1.265 +      return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   1.266 +               "DOMMenuInactive toolbarpopup",
   1.267 +               "DOMMenuItemActive toolbar" ];
   1.268 +  },
   1.269 +  test: function() { sendKey("LEFT"); },
   1.270 +  result: function(testname) {
   1.271 +    checkOpen("viewmenu", testname);
   1.272 +    checkClosed("toolbar", testname);
   1.273 +  }
   1.274 +},
   1.275 +{
   1.276 +  // open the submenu with the enter key
   1.277 +  testname: "open submenu with enter",
   1.278 +  events: function() {
   1.279 +    // on Windows, the disabled 'navigation' item can stll be highlighted
   1.280 +    if (navigator.platform.indexOf("Win") == 0)
   1.281 +      return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   1.282 +               "popupshown toolbarpopup" ];
   1.283 +    else
   1.284 +      return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   1.285 +  },
   1.286 +  test: function() { sendKey("RETURN"); },
   1.287 +  result: function(testname) {
   1.288 +    checkOpen("viewmenu", testname);
   1.289 +    checkOpen("toolbar", testname);
   1.290 +  },
   1.291 +},
   1.292 +{
   1.293 +  // close the submenu with the escape key
   1.294 +  testname: "close submenu with escape",
   1.295 +  events: function() {
   1.296 +    if (navigator.platform.indexOf("Win") == 0)
   1.297 +      return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   1.298 +               "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup",
   1.299 +               "DOMMenuItemActive toolbar" ];
   1.300 +    else
   1.301 +      return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   1.302 +               "DOMMenuInactive toolbarpopup",
   1.303 +               "DOMMenuItemActive toolbar" ];
   1.304 +  },
   1.305 +  test: function() { sendKey("ESCAPE"); },
   1.306 +  result: function(testname) {
   1.307 +    checkOpen("viewmenu", testname);
   1.308 +    checkClosed("toolbar", testname);
   1.309 +  },
   1.310 +},
   1.311 +{
   1.312 +  // open the submenu with the enter key again
   1.313 +  testname: "open submenu with enter again",
   1.314 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.315 +  events: function() {
   1.316 +    // on Windows, the disabled 'navigation' item can stll be highlighted
   1.317 +    if (navigator.platform.indexOf("Win") == 0)
   1.318 +      return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   1.319 +               "popupshown toolbarpopup" ];
   1.320 +    else
   1.321 +      return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   1.322 +  },
   1.323 +  test: function() { sendKey("RETURN"); },
   1.324 +  result: function(testname) {
   1.325 +    checkOpen("viewmenu", testname);
   1.326 +    checkOpen("toolbar", testname);
   1.327 +  },
   1.328 +},
   1.329 +{
   1.330 +  // while a submenu is open, switch to the next toplevel menu with the cursor right key
   1.331 +  testname: "while a submenu is open, switch to the next menu with the cursor right",
   1.332 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.333 +  events: [ "DOMMenuItemInactive viewmenu", "DOMMenuItemActive helpmenu",
   1.334 +            "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   1.335 +            "popuphiding viewpopup", "popuphidden viewpopup",
   1.336 +            "popupshowing helppopup", "DOMMenuItemInactive navigation",
   1.337 +            "DOMMenuInactive toolbarpopup", "DOMMenuItemInactive toolbar",
   1.338 +            "DOMMenuInactive viewpopup", "DOMMenuItemActive contents",
   1.339 +            "popupshown helppopup" ],
   1.340 +  test: function() { sendKey("RIGHT"); },
   1.341 +  result: function(testname) {
   1.342 +    checkOpen("helpmenu", testname);
   1.343 +    checkClosed("toolbar", testname);
   1.344 +    checkClosed("viewmenu", testname);
   1.345 +  }
   1.346 +},
   1.347 +{
   1.348 +  // close the main menu with the escape key
   1.349 +  testname: "close menubar menu with escape",
   1.350 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.351 +  events: [ "popuphiding helppopup", "popuphidden helppopup",
   1.352 +            "DOMMenuItemInactive contents", "DOMMenuInactive helppopup",
   1.353 +            "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu" ],
   1.354 +  test: function() { sendKey("ESCAPE"); },
   1.355 +  result: function(testname) { checkClosed("viewmenu", testname); },
   1.356 +},
   1.357 +{
   1.358 +  // close the main menu with the escape key
   1.359 +  testname: "close menubar menu with escape",
   1.360 +  condition: function() { return (navigator.platform.indexOf("Win") != 0) },
   1.361 +  events: [ "popuphiding viewpopup", "popuphidden viewpopup",
   1.362 +            "DOMMenuItemInactive toolbar", "DOMMenuInactive viewpopup",
   1.363 +            "DOMMenuBarInactive menubar",
   1.364 +            "DOMMenuItemInactive viewmenu" ],
   1.365 +  test: function() { sendKey("ESCAPE"); },
   1.366 +  result: function(testname) { checkClosed("viewmenu", testname); },
   1.367 +},
   1.368 +{
   1.369 +  // Pressing Alt should highlight the first menu but not open it,
   1.370 +  // but it should be ignored if the alt keydown event is consumed.
   1.371 +  testname: "alt shouldn't activate menubar if keydown event is consumed",
   1.372 +  test: function() {
   1.373 +    document.addEventListener("keydown", function (aEvent) {
   1.374 +      document.removeEventListener("keydown", arguments.callee, true);
   1.375 +      aEvent.preventDefault();
   1.376 +    }, true);
   1.377 +    sendKey("ALT");
   1.378 +  },
   1.379 +  result: function(testname) {
   1.380 +    ok(!document.getElementById("filemenu").openedWithKey, testname);
   1.381 +    checkClosed("filemenu", testname);
   1.382 +  },
   1.383 +},
   1.384 +{
   1.385 +  // Pressing Alt should highlight the first menu but not open it,
   1.386 +  // but it should be ignored if the alt keyup event is consumed.
   1.387 +  testname: "alt shouldn't activate menubar if keyup event is consumed",
   1.388 +  test: function() {
   1.389 +    document.addEventListener("keyup", function (aEvent) {
   1.390 +      document.removeEventListener("keyup", arguments.callee, true);
   1.391 +      aEvent.preventDefault();
   1.392 +    }, true);
   1.393 +    sendKey("ALT");
   1.394 +  },
   1.395 +  result: function(testname) {
   1.396 +    ok(!document.getElementById("filemenu").openedWithKey, testname);
   1.397 +    checkClosed("filemenu", testname);
   1.398 +  },
   1.399 +},
   1.400 +{
   1.401 +  // Pressing Alt should highlight the first menu but not open it.
   1.402 +  testname: "alt to activate menubar",
   1.403 +  events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   1.404 +  test: function() { sendKey("ALT"); },
   1.405 +  result: function(testname) {
   1.406 +    is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey");
   1.407 +    checkClosed("filemenu", testname);
   1.408 +  },
   1.409 +},
   1.410 +{
   1.411 +  // pressing cursor left should select the previous menu but not open it
   1.412 +  testname: "cursor left on active menubar",
   1.413 +  events: [ "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu" ],
   1.414 +  test: function() { sendKey("LEFT"); },
   1.415 +  result: function(testname) { checkClosed("helpmenu", testname); },
   1.416 +},
   1.417 +{
   1.418 +  // pressing cursor right should select the previous menu but not open it
   1.419 +  testname: "cursor right on active menubar",
   1.420 +  events: [ "DOMMenuItemInactive helpmenu", "DOMMenuItemActive filemenu" ],
   1.421 +  test: function() { sendKey("RIGHT"); },
   1.422 +  result: function(testname) { checkClosed("filemenu", testname); },
   1.423 +},
   1.424 +{
   1.425 +  // pressing a character should act as an accelerator and open the menu
   1.426 +  testname: "accelerator on active menubar",
   1.427 +  events: [ "popupshowing helppopup",
   1.428 +            "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu",
   1.429 +            "DOMMenuItemActive contents", "popupshown helppopup" ],
   1.430 +  test: function() { sendChar("h"); },
   1.431 +  result: function(testname) {
   1.432 +    checkOpen("helpmenu", testname);
   1.433 +    is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey");
   1.434 +  },
   1.435 +},
   1.436 +{
   1.437 +  // check that pressing cursor up skips non menuitems
   1.438 +  testname: "cursor up wrap",
   1.439 +  events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive about" ],
   1.440 +  test: function() { sendKey("UP"); },
   1.441 +  result: function(testname) { }
   1.442 +},
   1.443 +{
   1.444 +  // check that pressing cursor down skips non menuitems
   1.445 +  testname: "cursor down wrap",
   1.446 +  events: [ "DOMMenuItemInactive about", "DOMMenuItemActive contents" ],
   1.447 +  test: function() { sendKey("DOWN"); },
   1.448 +  result: function(testname) { }
   1.449 +},
   1.450 +{
   1.451 +  // check that pressing a menuitem's accelerator selects it
   1.452 +  testname: "menuitem accelerator",
   1.453 +  events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive amenu",
   1.454 +            "DOMMenuItemInactive amenu", "DOMMenuInactive helppopup",
   1.455 +            "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu",
   1.456 +            "DOMMenuItemInactive helpmenu",
   1.457 +            "command amenu", "popuphiding helppopup", "popuphidden helppopup",
   1.458 +            "DOMMenuItemInactive amenu",
   1.459 +           ],
   1.460 +  test: function() { sendChar("m"); },
   1.461 +  result: function(testname) { checkClosed("helpmenu", testname); }
   1.462 +},
   1.463 +{
   1.464 +  // pressing F10 should highlight the first menu. On Linux, the menu is opened.
   1.465 +  testname: "F10 to activate menubar",
   1.466 +  events: pressF10Events(),
   1.467 +  test: function() { sendKey("F10"); },
   1.468 +  result: function(testname) {
   1.469 +    is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey");
   1.470 +    if (navigator.platform.indexOf("Linux") >= 0)
   1.471 +      checkOpen("filemenu", testname);
   1.472 +    else
   1.473 +      checkClosed("filemenu", testname);
   1.474 +  },
   1.475 +},
   1.476 +{
   1.477 +  // pressing cursor left then down should open a menu
   1.478 +  testname: "cursor down on menu",
   1.479 +  events: (navigator.platform.indexOf("Linux") >= 0) ?
   1.480 +            [  "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu",
   1.481 +               // This is in a different order than the
   1.482 +               // "accelerator on active menubar" because menus opened from a
   1.483 +               // shortcut key are fired asynchronously
   1.484 +               "popuphiding filepopup", "popuphidden filepopup",
   1.485 +               "popupshowing helppopup", "DOMMenuItemInactive item1",
   1.486 +               "DOMMenuItemActive item2", "DOMMenuItemInactive item2",
   1.487 +               "DOMMenuInactive filepopup", "DOMMenuItemActive contents",
   1.488 +               "popupshown helppopup" ] :
   1.489 +            [ "popupshowing helppopup", "DOMMenuItemInactive filemenu",
   1.490 +              "DOMMenuItemActive helpmenu",
   1.491 +              // This is in a different order than the
   1.492 +              // "accelerator on active menubar" because menus opened from a
   1.493 +              // shortcut key are fired asynchronously
   1.494 +              "DOMMenuItemActive contents", "popupshown helppopup" ],
   1.495 +  test: function() { sendKey("LEFT"); sendKey("DOWN"); },
   1.496 +  result: function(testname) {
   1.497 +    is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey");
   1.498 +  }
   1.499 +},
   1.500 +{
   1.501 +  // pressing a letter that doesn't correspond to an accelerator. The menu
   1.502 +  // should not close because there is more than one item corresponding to
   1.503 +  // that letter
   1.504 +  testname: "menuitem with no accelerator",
   1.505 +  events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive one" ],
   1.506 +  test: function() { sendChar("o"); },
   1.507 +  result: function(testname) { checkOpen("helpmenu", testname); }
   1.508 +},
   1.509 +{
   1.510 +  // pressing the letter again should select the next one that starts with
   1.511 +  // that letter
   1.512 +  testname: "menuitem with no accelerator again",
   1.513 +  events: [ "DOMMenuItemInactive one", "DOMMenuItemActive only" ],
   1.514 +  test: function() { sendChar("o"); },
   1.515 +  result: function(testname) {
   1.516 +    // 'only' is a menu but it should not be open
   1.517 +    checkOpen("helpmenu", testname);
   1.518 +    checkClosed("only", testname);
   1.519 +  }
   1.520 +},
   1.521 +{
   1.522 +  // pressing the letter again when the next item is disabled should still
   1.523 +  // select the disabled item
   1.524 +  testname: "menuitem with no accelerator disabled",
   1.525 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.526 +  events: [ "DOMMenuItemInactive only", "DOMMenuItemActive other" ],
   1.527 +  test: function() { sendChar("o"); },
   1.528 +  result: function(testname) { }
   1.529 +},
   1.530 +{
   1.531 +  // when only one menuitem starting with that letter exists, it should be
   1.532 +  // selected and the menu closed
   1.533 +  testname: "menuitem with no accelerator single",
   1.534 +  events: function() {
   1.535 +    var elist = [ "DOMMenuItemInactive other", "DOMMenuItemActive third",
   1.536 +                  "DOMMenuItemInactive third", "DOMMenuInactive helppopup",
   1.537 +                  "DOMMenuBarInactive menubar",
   1.538 +                  "DOMMenuItemInactive helpmenu",
   1.539 +                  "DOMMenuItemInactive helpmenu",
   1.540 +                  "command third", "popuphiding helppopup",
   1.541 +                  "popuphidden helppopup", "DOMMenuItemInactive third",
   1.542 +                ];
   1.543 +    if (navigator.platform.indexOf("Win") == -1)
   1.544 +      elist[0] = "DOMMenuItemInactive only";
   1.545 +    return elist;
   1.546 +  },
   1.547 +  test: function() { sendChar("t"); },
   1.548 +  result: function(testname) { checkClosed("helpmenu", testname); }
   1.549 +},
   1.550 +{
   1.551 +  // pressing F10 should highlight the first menu but not open it
   1.552 +  testname: "F10 to activate menubar again",
   1.553 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.554 +  events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   1.555 +  test: function() { sendKey("F10"); },
   1.556 +  result: function(testname) { checkClosed("filemenu", testname); },
   1.557 +},
   1.558 +{
   1.559 +  // pressing an accelerator for a disabled item should deactivate the menubar
   1.560 +  testname: "accelerator for disabled menu",
   1.561 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.562 +  events: [ "DOMMenuItemInactive filemenu", "DOMMenuBarInactive menubar" ],
   1.563 +  test: function() { sendChar("s"); },
   1.564 +  result: function(testname) {
   1.565 +    checkClosed("secretmenu", testname);
   1.566 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.567 +  },
   1.568 +},
   1.569 +{
   1.570 +  testname: "press on disabled menu",
   1.571 +  test: function() {
   1.572 +    synthesizeMouse(document.getElementById("secretmenu"), 8, 8, { });
   1.573 +  },
   1.574 +  result: function (testname) {
   1.575 +    checkClosed("secretmenu", testname);
   1.576 +  }
   1.577 +},
   1.578 +{
   1.579 +  testname: "press on second menu with shift",
   1.580 +  events: [ "popupshowing editpopup", "DOMMenuBarActive menubar",
   1.581 +            "DOMMenuItemActive editmenu", "popupshown editpopup" ],
   1.582 +  test: function() {
   1.583 +    synthesizeMouse(document.getElementById("editmenu"), 8, 8, { shiftKey : true });
   1.584 +  },
   1.585 +  result: function (testname) {
   1.586 +    checkOpen("editmenu", testname);
   1.587 +    checkActive(document.getElementById("menubar"), "editmenu", testname);
   1.588 +  }
   1.589 +},
   1.590 +{
   1.591 +  testname: "press on disabled menuitem",
   1.592 +  test: function() {
   1.593 +    synthesizeMouse(document.getElementById("cut"), 8, 8, { });
   1.594 +  },
   1.595 +  result: function (testname) {
   1.596 +    checkOpen("editmenu", testname);
   1.597 +  }
   1.598 +},
   1.599 +{
   1.600 +  testname: "press on menuitem",
   1.601 +  events: [ "DOMMenuInactive editpopup",
   1.602 +            "DOMMenuBarInactive menubar",
   1.603 +            "DOMMenuItemInactive editmenu",
   1.604 +            "DOMMenuItemInactive editmenu",
   1.605 +            "command copy", "popuphiding editpopup", "popuphidden editpopup",
   1.606 +            "DOMMenuItemInactive copy",
   1.607 +           ],
   1.608 +  test: function() {
   1.609 +    synthesizeMouse(document.getElementById("copy"), 8, 8, { });
   1.610 +  },
   1.611 +  result: function (testname) {
   1.612 +    checkClosed("editmenu", testname);
   1.613 +  }
   1.614 +},
   1.615 +{
   1.616 +  // this test ensures that the menu can still be opened by clicking after selecting
   1.617 +  // a menuitem from the menu. See bug 399350.
   1.618 +  testname: "press on menu after menuitem selected",
   1.619 +  events: [ "popupshowing editpopup", "DOMMenuBarActive menubar",
   1.620 +            "DOMMenuItemActive editmenu", "popupshown editpopup" ],
   1.621 +  test: function() { synthesizeMouse(document.getElementById("editmenu"), 8, 8, { }); },
   1.622 +  result: function (testname) {
   1.623 +    checkActive(document.getElementById("editpopup"), "", testname);
   1.624 +    checkOpen("editmenu", testname);
   1.625 +  }
   1.626 +},
   1.627 +{  // try selecting a different command
   1.628 +  testname: "press on menuitem again",
   1.629 +  events: [ "DOMMenuInactive editpopup",
   1.630 +            "DOMMenuBarInactive menubar",
   1.631 +            "DOMMenuItemInactive editmenu",
   1.632 +            "DOMMenuItemInactive editmenu",
   1.633 +            "command paste", "popuphiding editpopup", "popuphidden editpopup",
   1.634 +            "DOMMenuItemInactive paste",
   1.635 +           ],
   1.636 +  test: function() {
   1.637 +    synthesizeMouse(document.getElementById("paste"), 8, 8, { });
   1.638 +  },
   1.639 +  result: function (testname) {
   1.640 +    checkClosed("editmenu", testname);
   1.641 +  }
   1.642 +},
   1.643 +{
   1.644 +  testname: "F10 to activate menubar for tab deactivation",
   1.645 +  events: pressF10Events(),
   1.646 +  test: function() { sendKey("F10"); },
   1.647 +},
   1.648 +{
   1.649 +  testname: "Deactivate menubar with tab key",
   1.650 +  events: closeAfterF10Events(true),
   1.651 +  test: function() { sendKey("TAB"); },
   1.652 +  result: function(testname) {
   1.653 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.654 +  }
   1.655 +},
   1.656 +{
   1.657 +  testname: "F10 to activate menubar for escape deactivation",
   1.658 +  events: pressF10Events(),
   1.659 +  test: function() { sendKey("F10"); },
   1.660 +},
   1.661 +{
   1.662 +  testname: "Deactivate menubar with escape key",
   1.663 +  events: closeAfterF10Events(false),
   1.664 +  test: function() { sendKey("ESCAPE"); },
   1.665 +  result: function(testname) {
   1.666 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.667 +  }
   1.668 +},
   1.669 +{
   1.670 +  testname: "F10 to activate menubar for f10 deactivation",
   1.671 +  events: pressF10Events(),
   1.672 +  test: function() { sendKey("F10"); },
   1.673 +},
   1.674 +{
   1.675 +  testname: "Deactivate menubar with f10 key",
   1.676 +  events: closeAfterF10Events(true),
   1.677 +  test: function() { sendKey("F10"); },
   1.678 +  result: function(testname) {
   1.679 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.680 +  }
   1.681 +},
   1.682 +{
   1.683 +  testname: "F10 to activate menubar for alt deactivation",
   1.684 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.685 +  events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   1.686 +  test: function() { sendKey("F10"); },
   1.687 +},
   1.688 +{
   1.689 +  testname: "Deactivate menubar with alt key",
   1.690 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.691 +  events: [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu"  ],
   1.692 +  test: function() { sendKey("ALT"); },
   1.693 +  result: function(testname) {
   1.694 +    is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   1.695 +  }
   1.696 +},
   1.697 +{
   1.698 +  testname: "Don't activate menubar with mousedown during alt key auto-repeat",
   1.699 +  test: function() {
   1.700 +    synthesizeKey("VK_ALT", { type: "keydown" });
   1.701 +    synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mousedown", altKey: true });
   1.702 +    synthesizeKey("VK_ALT", { type: "keydown" });
   1.703 +    synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mouseup", altKey: true });
   1.704 +    synthesizeKey("VK_ALT", { type: "keydown" });
   1.705 +    synthesizeKey("VK_ALT", { type: "keyup" });
   1.706 +  },
   1.707 +  result: function (testname) {
   1.708 +    checkActive(document.getElementById("menubar"), "", testname);
   1.709 +  }
   1.710 +},
   1.711 +
   1.712 +// Fllowing 4 tests are a test of bug 616797, don't insert any new tests
   1.713 +// between them.
   1.714 +{
   1.715 +  testname: "Open file menu by accelerator",
   1.716 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.717 +  events: function() {
   1.718 +    return [ "DOMMenuBarActive menubar", "popupshowing filepopup",
   1.719 +             "DOMMenuItemActive filemenu", "DOMMenuItemActive item1",
   1.720 +             "popupshown filepopup" ];
   1.721 +  },
   1.722 +  test: function() {
   1.723 +    synthesizeKey("VK_ALT", { type: "keydown" });
   1.724 +    synthesizeKey("F", { altKey: true });
   1.725 +    synthesizeKey("VK_ALT", { type: "keyup" });
   1.726 +  }
   1.727 +},
   1.728 +{
   1.729 +  testname: "Close file menu by click at outside of popup menu",
   1.730 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.731 +  events: function() {
   1.732 +    return [ "popuphiding filepopup", "popuphidden filepopup",
   1.733 +             "DOMMenuItemInactive item1", "DOMMenuInactive filepopup",
   1.734 +             "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu",
   1.735 +             "DOMMenuItemInactive filemenu" ];
   1.736 +  },
   1.737 +  test: function() {
   1.738 +    // XXX hidePopup() causes DOMMenuItemInactive event to be fired twice.
   1.739 +    document.getElementById("filepopup").hidePopup();
   1.740 +  }
   1.741 +},
   1.742 +{
   1.743 +  testname: "Alt keydown set focus the menubar",
   1.744 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.745 +  events: function() {
   1.746 +    return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   1.747 +  },
   1.748 +  test: function() {
   1.749 +    sendKey("ALT");
   1.750 +  },
   1.751 +  result: function (testname) {
   1.752 +    checkClosed("filemenu", testname);
   1.753 +  }
   1.754 +},
   1.755 +{
   1.756 +  testname: "unset focus the menubar",
   1.757 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.758 +  events: function() {
   1.759 +    return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ];
   1.760 +  },
   1.761 +  test: function() {
   1.762 +    sendKey("ALT");
   1.763 +  }
   1.764 +},
   1.765 +
   1.766 +// bug 625151
   1.767 +{
   1.768 +  testname: "Alt key state before deactivating the window shouldn't prevent " +
   1.769 +            "next Alt key handling",
   1.770 +  condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   1.771 +  events: function() {
   1.772 +    return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   1.773 +  },
   1.774 +  test: function() {
   1.775 +    synthesizeKey("VK_ALT", { type: "keydown" });
   1.776 +    synthesizeKey("VK_TAB", { type: "keydown" }); // cancels the Alt key
   1.777 +    var thisWindow = window;
   1.778 +    var newWindow =
   1.779 +      window.open("data:text/html,", "_blank", "width=100,height=100");
   1.780 +    newWindow.addEventListener("focus", function () {
   1.781 +      newWindow.removeEventListener("focus", arguments.callee, false);
   1.782 +      thisWindow.addEventListener("focus", function () {
   1.783 +        thisWindow.removeEventListener("focus", arguments.callee, false);
   1.784 +        setTimeout(function () {
   1.785 +          sendKey("ALT", thisWindow);
   1.786 +        }, 0);
   1.787 +      }, false);
   1.788 +      newWindow.close();
   1.789 +      thisWindow.focus();
   1.790 +      // Note that our window dispatches a hacky key event if IMM is installed
   1.791 +      // on the system during focus change only if Alt key is pressed.
   1.792 +      synthesizeKey("`", { type: "keypress" }, thisWindow);
   1.793 +    }, false);
   1.794 +  }
   1.795 +}
   1.796 +
   1.797 +];
   1.798 +
   1.799 +]]>
   1.800 +</script>
   1.801 +
   1.802 +</window>

mercurial