Bug 792324 - access keys are fired for non-open popups. r=enndeakin

This commit is contained in:
Mark Hammond 2012-09-28 15:04:57 +10:00
Родитель 2c2237472a
Коммит cccfa62453
3 изменённых файлов: 88 добавлений и 2 удалений

Просмотреть файл

@ -89,6 +89,7 @@ MOCHITEST_CHROME_FILES = findbar_window.xul \
test_bug557987.xul\
test_bug562554.xul \
test_bug585946.xul \
test_bug792324.xul \
test_button.xul \
test_closemenu_attribute.xul \
test_colorpicker_popup.xul \

Просмотреть файл

@ -0,0 +1,76 @@
<?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"?>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=792324
-->
<window title="Mozilla Bug 792324"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<title>Test for Bug 792324</title>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
<body xmlns="http://www.w3.org/1999/xhtml">
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=792324">Mozilla Bug 792324</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
</body>
<panel id="panel-1">
<button label="just a normal button"/>
<button id="button-1"
accesskey="X"
oncommand="clicked(event)"
label="Button in panel 1"
/>
</panel>
<panel id="panel-2">
<button label="just a normal button"/>
<button id="button-2"
accesskey="X"
oncommand="clicked(event)"
label="Button in panel 2"
/>
</panel>
<script class="testbody" type="application/javascript;version=1.7"><![CDATA[
/** Test for Bug 792324 **/
let after_click;
function clicked(event) {
after_click(event);
}
function checkAccessKeyOnPanel(panelid, buttonid, cb) {
let panel = document.getElementById(panelid);
panel.addEventListener("popupshown", function onpopupshown() {
panel.removeEventListener("popupshown", onpopupshown);
panel.firstChild.focus();
after_click = function(event) {
is(event.target.id, buttonid, "Accesskey was directed to the button '" + buttonid + "'");
panel.hidePopup();
cb();
}
synthesizeKey("X", {});
});
panel.openPopup(null, "", 100, 100, false, false);
}
function test() {
checkAccessKeyOnPanel("panel-1", "button-1", function() {
checkAccessKeyOnPanel("panel-2", "button-2", function() {
SimpleTest.finish();
});
});
}
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(test, window);
]]></script>
</window>

Просмотреть файл

@ -89,8 +89,17 @@
<parameter name="node"/>
<body>
<![CDATA[
if (node.localName == "button" && node.accessKey &&
!node.disabled && !node.collapsed && !node.hidden)
// if the node isn't visible, don't descend into it.
var cs = node.ownerDocument.defaultView.getComputedStyle(node, null);
if (cs.visibility != "visible" || cs.display == "none") {
return NodeFilter.FILTER_REJECT;
}
// but it may be a popup element, in which case we look at "state"...
if (cs.display == "-moz-popup" && node.state != "open") {
return NodeFilter.FILTER_REJECT;
}
// OK - the node seems visible, so it is a candidate.
if (node.localName == "button" && node.accessKey && !node.disabled)
return NodeFilter.FILTER_ACCEPT;
return NodeFilter.FILTER_SKIP;
]]>