event-contextmenu.html revision 9615eac6ad1cb6b99392e1d9369c97b2882cb1f8
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>YUI Context Menu Synth Event Tests</title>
</head>
<body lang="en" class="yui3-skin-sam">
<div id="doc">
<button id="btn-1">Button 1</button>
</div>
<script type="text/javascript">
YUI({
filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min',
allowRollup: false,
lazyEventFacade: true,
logExclude: { Dom: true, Selector: true, Node: true, attribute: true, base: true, event: true, widget: true }
}).use('console', 'test', 'event-contextmenu', 'node-event-simulate', 'window-focus', 'node-screen', function (Y) {
var called = 0;
var onContextMenu = function () {
called = called + 1;
};
var isWinWebkit = (Y.UA.webkit && Y.UA.os === "windows");
var keyDownConfig = Y.UA.os == "macintosh" ? { shiftKey: true, ctrlKey: true, altKey: true, keyCode: 77 } : { shiftKey: true, keyCode: 121 };
var doc = Y.one("doc");
var btn = Y.one("#btn-1");
var simulateKeyDown = function () {
// For Chrome on Windows a real Shift + F10 keydown
// event generated from the user WILL trigger the
// contextmenu event. A simulated Shift + F10 does
// not, so need to simulate what the browser does for
// the test.
if (isWinWebkit) {
btn.once("keydown", function (e) {
if (e.shiftKey && e.keyCode === 121) {
btn.simulate("contextmenu");
}
});
}
btn.simulate("keydown", keyDownConfig);
};
(new Y.Console()).render();
var suite = new Y.Test.Suite("ContextMenu");
suite.add(new Y.Test.Case({
name: "ContextMenu Syth Tests",
test_contextmenu_event: function () {
called = 0;
btn.on("contextmenu", onContextMenu);
btn.simulate("contextmenu");
Y.Assert.isTrue((called === 1), "contextmenu event listener not called");
btn.detach("contextmenu");
},
test_mac_kb_shortct: function(){
called = 0;
btn.on("contextmenu", onContextMenu);
btn.simulate("keydown", { keyCode: 77, shiftKey: true, ctrlKey: true, altKey: true });
if (Y.UA.os == "macintosh") {
Y.Assert.isTrue((called === 1), "contextmenu event listener not called");
}
else {
Y.Assert.isTrue((called === 0), "ctrl + shift + alt + M should only fire the contextmenu event for mac");
}
btn.detach("contextmenu");
},
test_shiftF10_key: function(){
called = 0;
btn.on("contextmenu", onContextMenu);
if (isWinWebkit) {
btn.once("keydown", function (e) {
if (e.shiftKey && e.keyCode === 121) {
btn.simulate("contextmenu");
}
});
}
btn.simulate("keydown", { shiftKey: true, keyCode: 121 });
if (Y.UA.os == "windows") {
Y.Assert.isTrue((called === 1), "contextmenu event listener not called");
}
else {
Y.Assert.isTrue((called === 0), "the shift + f10 key should only fire the contextmenu event on windows");
}
btn.detach("contextmenu");
},
test_menu_key: function(){
called = 0;
btn.on("contextmenu", onContextMenu);
if (Y.UA.os == "windows") {
btn.once("keydown", function (e) {
if (e.keyCode === 93) {
btn.simulate("contextmenu");
}
});
}
btn.simulate("keydown", { keyCode: 93 });
if (Y.UA.os == "windows") {
Y.Assert.isTrue((called === 1), "contextmenu event listener not called");
}
else {
Y.Assert.isTrue((called === 0), "the Menu key should only fire the contextmenu event on windows");
}
btn.detach("contextmenu");
},
test_xy_coords_for_menu: function () {
var passed = false;
btn.on("contextmenu", function (e) {
var xy = btn.getXY(),
scrollX = Y.DOM.docScrollX(),
scrollY = Y.DOM.docScrollY(),
clientX = (xy[0] + (btn.get("offsetWidth")/2)) - scrollX,
clientY = (xy[1] + (btn.get("offsetHeight")/2)) - scrollY,
pageX = clientX + scrollX,
pageY = clientY + scrollY;
passed = (e.clientX === clientX && e.clientY === clientY && e.pageX === pageX && e.pageY === pageY);
});
if (Y.UA.os == "windows") {
btn.once("keydown", function (e) {
if (e.keyCode === 93) {
btn.simulate("contextmenu");
}
});
}
btn.simulate("keydown", { keyCode: 93 });
if (Y.UA.os == "windows") {
Y.Assert.isTrue(passed, "contextmenu event xy coords don't reference the center of the event target");
}
else {
Y.Assert.isFalse(passed, "the Menu key should only fire the contextmenu event on windows");
}
btn.detach("contextmenu");
},
test_xy_coords_for_shift10_or_ctrl_shift_option_m: function () {
var passed = false;
btn.on("contextmenu", function (e) {
var xy = btn.getXY(),
scrollX = Y.DOM.docScrollX(),
scrollY = Y.DOM.docScrollY(),
clientX = (xy[0] + (btn.get("offsetWidth")/2)) - scrollX,
clientY = (xy[1] + (btn.get("offsetHeight")/2)) - scrollY,
pageX = clientX + scrollX,
pageY = clientY + scrollY;
passed = (e.clientX === clientX && e.clientY === clientY && e.pageX === pageX && e.pageY === pageY);
});
simulateKeyDown();
Y.Assert.isTrue(passed, "contextmenu event xy coords don't reference the center of the event target");
btn.detach("contextmenu");
},
test_multiple_on_listeners: function(){
called = 0;
btn.on("contextmenu", onContextMenu);
btn.on("contextmenu", onContextMenu);
simulateKeyDown();
Y.Assert.isTrue((called === 2), "contextmenu event listener not called correct number of times");
btn.detach("contextmenu");
},
test_multiple_delegate_listeners: function(){
called = 0;
doc.delegate("contextmenu", onContextMenu, "button");
doc.delegate("contextmenu", onContextMenu, "button");
simulateKeyDown();
Y.Assert.isTrue((called === 2), "contextmenu event listener not called correct number of times");
doc.detach("contextmenu");
},
test_multiple_on_and_delegate_listeners: function(){
called = 0;
btn.on("contextmenu", onContextMenu);
btn.on("contextmenu", onContextMenu);
doc.delegate("contextmenu", onContextMenu, "button");
doc.delegate("contextmenu", onContextMenu, "button");
simulateKeyDown();
Y.Assert.isTrue((called === 4), "contextmenu event listener not called correct number of times");
btn.detach("contextmenu");
doc.detach("contextmenu");
}
}));
Y.Test.Runner.add(suite);
});
</script>
</body>
</html>