diff --git a/src/mousetracker.js b/src/mousetracker.js index 0a66cfee..a57993de 100644 --- a/src/mousetracker.js +++ b/src/mousetracker.js @@ -1367,6 +1367,14 @@ eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType ); // We emulate mouse capture by hanging listeners on the document object. // (Note we listen on the capture phase so the captured handlers will get called first) + if (isInIframe && canAccessEvents(window.top)) { + $.addEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } $.addEvent( $.MouseTracker.captureElement, eventParams.upName, @@ -1402,6 +1410,14 @@ eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType ); // We emulate mouse capture by hanging listeners on the document object. // (Note we listen on the capture phase so the captured handlers will get called first) + if (isInIframe && canAccessEvents(window.top)) { + $.removeEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } $.removeEvent( $.MouseTracker.captureElement, eventParams.moveName, @@ -3248,5 +3264,29 @@ } ); } } + + // True if inside an iframe, otherwise false. + // @member {Boolean} isInIframe + // @private + // @inner + var isInIframe = (function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + })(); + + // @function + // @private + // @inner + // @returns {Boolean} True if the target has access rights to events, otherwise false. + function canAccessEvents (target) { + try { + return target.addEventListener && target.removeEventListener; + } catch (e) { + return false; + } + } } ( OpenSeadragon ) );