From c38188927ef73a98ae90fe6bb7e16b64d0c32ff9 Mon Sep 17 00:00:00 2001 From: Mark Salsbery <> Date: Wed, 10 Mar 2021 13:45:15 -0800 Subject: [PATCH] Added preventDefault option to MouseTracker.contextMenuHandler and Viewer 'canvas-contextmenu' event args --- changelog.txt | 1 + src/mousetracker.js | 32 ++++++++++++++++++-------------- src/viewer.js | 16 +++++++++++----- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/changelog.txt b/changelog.txt index 1c325eba..b1f80fda 100644 --- a/changelog.txt +++ b/changelog.txt @@ -36,6 +36,7 @@ OPENSEADRAGON CHANGELOG * Added additional documentation for the zoomPerSecond viewer option (#1872 @msalsbery) * MouseTracker: Per #1863, dropped support for Internet Explorer < 11 (#1872 @msalsbery) * Fixed simulated drag events in navigator tests (#1949 @msalsbery) +* Added preventDefault option to MouseTracker.contextMenuHandler and Viewer 'canvas-contextmenu' event args (# @msalsbery) 2.4.2: diff --git a/src/mousetracker.js b/src/mousetracker.js index 4aefd249..1c268ee2 100644 --- a/src/mousetracker.js +++ b/src/mousetracker.js @@ -280,7 +280,6 @@ this.dragHandler || this.dragEndHandler || this.pinchHandler ); this.hasScrollHandler = !!this.scrollHandler; - this.hasContextMenuHandler = !!this.contextMenuHandler; if (this.exitHandler) { $.console.error("MouseTracker.exitHandler is deprecated. Use MouseTracker.leaveHandler instead."); @@ -402,6 +401,8 @@ * The position of the event relative to the tracked element. * @param {Object} event.originalEvent * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the contextmenu event. * @param {Object} event.userData * Arbitrary user-defined object. */ @@ -1942,6 +1943,8 @@ function onContextMenu( tracker, event ) { //$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + var eventArgs = null; + var eventInfo = { originalEvent: event, eventType: 'contextmenu', @@ -1952,17 +1955,18 @@ // ContextMenu if ( tracker.contextMenuHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { - tracker.contextMenuHandler( - { - eventSource: tracker, - position: getPointRelativeToAbsolute( getMouseAbsolute( event ), tracker.element ), - originalEvent: eventInfo.originalEvent, - userData: tracker.userData - } - ); + eventArgs = { + eventSource: tracker, + position: getPointRelativeToAbsolute( getMouseAbsolute( event ), tracker.element ), + originalEvent: eventInfo.originalEvent, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + tracker.contextMenuHandler( eventArgs ); } - if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { $.cancelEvent( event ); } if ( eventInfo.stopPropagation ) { @@ -2810,7 +2814,7 @@ case 'pointerdown': eventInfo.isStopable = true; eventInfo.isCancelable = true; - eventInfo.preventDefault = false;//tracker.hasGestureHandlers; + eventInfo.preventDefault = false; // updatePointerDown() may set true (tracker.hasGestureHandlers) eventInfo.preventGesture = !tracker.hasGestureHandlers; eventInfo.stopPropagation = false; break; @@ -2824,7 +2828,7 @@ case 'wheel': eventInfo.isStopable = true; eventInfo.isCancelable = true; - eventInfo.preventDefault = false;//tracker.hasScrollHandler; + eventInfo.preventDefault = false; // handleWheelEvent() may set true (tracker.hasScrollHandler) eventInfo.preventGesture = !tracker.hasScrollHandler; eventInfo.stopPropagation = false; break; @@ -2854,8 +2858,8 @@ case 'contextmenu': eventInfo.isStopable = true; eventInfo.isCancelable = true; - eventInfo.preventDefault = false;//tracker.hasContextMenuHandler; - eventInfo.preventGesture = true;//!tracker.hasContextMenuHandler; + eventInfo.preventDefault = false; + eventInfo.preventGesture = false; eventInfo.stopPropagation = false; break; case 'pointerenter': diff --git a/src/viewer.js b/src/viewer.js index db1e8a23..21d6f469 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -2546,6 +2546,13 @@ function onBlur(){ } function onCanvasContextMenu( event ) { + var eventArgs = { + tracker: event.eventSource, + position: event.position, + originalEvent: event.originalEvent, + preventDefault: event.preventDefault + }; + /** * Raised when a contextmenu event occurs in the {@link OpenSeadragon.Viewer#canvas} element. * @@ -2556,13 +2563,12 @@ function onCanvasContextMenu( event ) { * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the contextmenu event. * @property {?Object} userData - Arbitrary subscriber-defined object. */ - this.raiseEvent( 'canvas-contextmenu', { - tracker: event.eventSource, - position: event.position, - originalEvent: event.originalEvent - }); + this.raiseEvent( 'canvas-contextmenu', eventArgs ); + + event.preventDefault = eventArgs.preventDefault; } function onCanvasKeyDown( event ) {