diff options
Diffstat (limited to 'widget/tests/test_bug428405.xul')
-rw-r--r-- | widget/tests/test_bug428405.xul | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/widget/tests/test_bug428405.xul b/widget/tests/test_bug428405.xul new file mode 100644 index 0000000000..3654804689 --- /dev/null +++ b/widget/tests/test_bug428405.xul @@ -0,0 +1,167 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> + +<window id="window1" title="Test Bug 428405" + onload="setGlobals(); loadFirstTab();" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> + <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/NativeKeyCodes.js"/> + + <tabbox id="tabbox" flex="100%"> + <tabs> + <tab label="Tab 1"/> + <tab label="Tab 2"/> + </tabs> + <tabpanels flex="100%"> + <browser onload="configureFirstTab();" id="tab1browser" flex="100%"/> + <browser onload="configureSecondTab();" id="tab2browser" flex="100%"/> + </tabpanels> + </tabbox> + + <script type="application/javascript"><![CDATA[ + + SimpleTest.waitForExplicitFinish(); + + var gCmdOptYReceived = false; + + // Look for a cmd-opt-y event. + function onKeyPress(aEvent) { + gCmdOptYReceived = false; + if (String.fromCharCode(aEvent.charCode) != 'y') + return; + if (aEvent.ctrlKey || aEvent.shiftKey || !aEvent.metaKey || !aEvent.altKey) + return; + gCmdOptYReceived = true; + } + + function setGlobals() { + var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]. + getService(Components.interfaces.nsIWindowMediator); + gChromeWindow = wm.getMostRecentWindow("navigator:browser"); + // For some reason, a global <key> element's oncommand handler only gets + // invoked if the focus is outside both of the <browser> elements + // (tab1browser and tab2browser). So, to make sure we can see a + // cmd-opt-y event in window1 (if one is available), regardless of where + // the focus is in this window, we need to add a "keypress" event + // listener to gChromeWindow, and then check (in onKeyPress()) to see if + // it's a cmd-opt-y event. + gChromeWindow.addEventListener("keypress", onKeyPress, false); + } + + // 1) Start loading first tab. + // 6) Start reloading first tab. + function loadFirstTab() { + var browser = document.getElementById("tab1browser"); + browser.loadURI("data:text/html;charset=utf-8,<body><h2>First Tab</h2><p><input type='submit' value='Button' id='button1'/></body>", null, null); + } + + function configureFirstTab() { + try { + var button = document.getElementById("tab1browser").contentDocument.getElementById("button1"); + button.addEventListener("click", onFirstTabButtonClicked, false); + button.focus(); + if (document.getElementById("tabbox").selectedIndex == 0) { + // 2) When first tab has finished loading (while first tab is + // focused), hit Return to trigger the action of first tab's + // button. + synthesizeNativeReturnKey(); + } else { + // 7) When first tab has finished reloading (while second tab is + // focused), start loading second tab. + loadSecondTab(); + } + } catch(e) { + } + } + + // 8) Start loading second tab. + function loadSecondTab() { + var browser = document.getElementById("tab2browser"); + browser.loadURI("data:text/html;charset=utf-8,<body><h2>Second Tab</h2><p><input type='submit' value='Button' id='button1'/></body>", null, null); + } + + function configureSecondTab() { + try { + var button = document.getElementById("tab2browser").contentDocument.getElementById("button1"); + button.addEventListener("click", onSecondTabButtonClicked, false); + button.focus(); + if (document.getElementById("tabbox").selectedIndex == 1) { + // 9) When second tab has finished loading (while second tab is + // focused), hit Return to trigger action of second tab's + // button. + synthesizeNativeReturnKey(); + } + } catch(e) { + } + } + + // 3) First tab's button clicked. + function onFirstTabButtonClicked() { + switchToSecondTabAndReloadFirst(); + } + + // 10) Second tab's button clicked. + function onSecondTabButtonClicked() { + switchToFirstTab(); + } + + function switchToSecondTabAndReloadFirst() { + // 4) Switch to second tab. + document.getElementById("tabbox").selectedIndex = 1; + // 5) Start reloading first tab (while second tab is focused). + loadFirstTab(); + } + + function switchToFirstTab() { + // 11) Switch back to first tab. + document.getElementById("tabbox").selectedIndex = 0; + doCmdY(); + } + + function doCmdY() { + // 12) Back in first tab, try cmd-y. + gCmdOptYReceived = false; + if (!synthesizeNativeCmdOptY(finishTest)) { + ok(false, "Failed to synthesize native key"); + finishTest(); + } + } + + function finishTest() { + // 13) Check result. + is(gCmdOptYReceived, true); + + SimpleTest.finish(); + } + + // synthesizeNativeReturnKey() and synthesizeNativeCmdOptY() are needed + // because their synthesizeKey() counterparts don't work properly -- the + // latter make this test succeed when it should fail. + + // The 'aNativeKeyCode', 'aCharacters' and 'aUnmodifiedCharacters' + // parameters used below (in synthesizeNativeReturnKey() and + // synthesizeNativeCmdOptY()) were confirmed accurate using the + // DebugEventsPlugin v1.01 from bmo bug 441880. + + function synthesizeNativeReturnKey() { + synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_Return, {}, "\u000a", "\u000a"); + } + + function synthesizeNativeCmdOptY(aCallback) { + return synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_Y, {metaKey:1, altKey:1}, "y", "y", aCallback); + } + + ]]></script> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml"> + <p id="display"></p> + <div id="content" style="display: none"></div> + <pre id="test"></pre> + </body> + +</window> |