Skip to content

Commit

Permalink
Merge pull request josdejong#448 from tomalec/issues/447-modes-in-sha…
Browse files Browse the repository at this point in the history
…dow-dom

Add listeners to list (shadow) root instead of window,
  • Loading branch information
josdejong authored Aug 20, 2017
2 parents c51db94 + 63c0689 commit 9ee8700
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/js/ContextMenu.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

var util = require('./util');

/**
* Node.getRootNode shim
* @param {Node} node node to check
* @return {Node} node's rootNode or `window` if there is ShadowDOM is not supported.
*/
function getRootNode(node){
return node.getRootNode && node.getRootNode() || window;
}
/**
* A context menu
* @param {Object[]} items Array containing the menu structure
Expand Down Expand Up @@ -240,7 +248,8 @@ ContextMenu.prototype.show = function (anchor, contentWindow) {
// create and attach event listeners
var me = this;
var list = this.dom.list;
this.eventListeners.mousedown = util.addEventListener(window, 'mousedown', function (event) {
var rootNode = getRootNode(list);
this.eventListeners.mousedown = util.addEventListener(rootNode, 'mousedown', function (event) {
// hide menu on click outside of the menu
var target = event.target;
if ((target != list) && !me._isChildOf(target, list)) {
Expand All @@ -249,7 +258,7 @@ ContextMenu.prototype.show = function (anchor, contentWindow) {
event.preventDefault();
}
});
this.eventListeners.keydown = util.addEventListener(window, 'keydown', function (event) {
this.eventListeners.keydown = util.addEventListener(rootNode, 'keydown', function (event) {
me._onKeyDown(event);
});

Expand Down Expand Up @@ -280,11 +289,12 @@ ContextMenu.prototype.hide = function () {

// remove all event listeners
// all event listeners are supposed to be attached to document.
var rootNode = getRootNode(this.dom.list);
for (var name in this.eventListeners) {
if (this.eventListeners.hasOwnProperty(name)) {
var fn = this.eventListeners[name];
if (fn) {
util.removeEventListener(window, name, fn);
util.removeEventListener(rootNode, name, fn);
}
delete this.eventListeners[name];
}
Expand Down

0 comments on commit 9ee8700

Please sign in to comment.