From 703f922ed803e20682678cebb19039039f47f0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20=C3=96berg?= Date: Mon, 7 Dec 2015 17:39:08 +0100 Subject: [PATCH] Fixed drag release outside of iframe when the iframe is on the same domain. --- src/mousetracker.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/mousetracker.js b/src/mousetracker.js index 0a66cfee..425b22e7 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,33 @@ } ); } } + + /** + * @function + * @private + * @inner + * @returns {Boolean} True if inside an iframe, otherwise false. + */ + function isInIframe () { + 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 ) );