UNPKG

reframer

Version:

A declarative wrapper to iframe-resizer. Just add reframer class to any iframe. Cool!

1,100 lines (1,085 loc) 85.8 kB
(function () { function $parcel$export(e, n, v, s) { Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true}); } var $parcel$global = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {}; var $parcel$modules = {}; var $parcel$inits = {}; var parcelRequire = $parcel$global["parcelRequire94c2"]; if (parcelRequire == null) { parcelRequire = function(id) { if (id in $parcel$modules) { return $parcel$modules[id].exports; } if (id in $parcel$inits) { var init = $parcel$inits[id]; delete $parcel$inits[id]; var module = {id: id, exports: {}}; $parcel$modules[id] = module; init.call(module.exports, module, module.exports); return module.exports; } var err = new Error("Cannot find module '" + id + "'"); err.code = 'MODULE_NOT_FOUND'; throw err; }; parcelRequire.register = function register(id, init) { $parcel$inits[id] = init; }; $parcel$global["parcelRequire94c2"] = parcelRequire; } parcelRequire.register("8FXbP", function(module, exports) { $parcel$export(module.exports, "iframeResize", function () { return $651010ee02d6657e$export$e284ab1b3bcdabe6; }, function (v) { return $651010ee02d6657e$export$e284ab1b3bcdabe6 = v; }); $parcel$export(module.exports, "iframeResizer", function () { return $651010ee02d6657e$export$b6962bfb5a91d43; }, function (v) { return $651010ee02d6657e$export$b6962bfb5a91d43 = v; }); $parcel$export(module.exports, "iframeResizerContentWindow", function () { return $651010ee02d6657e$export$1aafc108bc1f168c; }, function (v) { return $651010ee02d6657e$export$1aafc108bc1f168c = v; }); var $651010ee02d6657e$export$e284ab1b3bcdabe6; var $651010ee02d6657e$export$b6962bfb5a91d43// Backwards compatability ; var $651010ee02d6657e$export$1aafc108bc1f168c; var $5swb3 = parcelRequire("5swb3"); $651010ee02d6657e$export$e284ab1b3bcdabe6 = $5swb3; $651010ee02d6657e$export$b6962bfb5a91d43 = $5swb3; $651010ee02d6657e$export$1aafc108bc1f168c = (parcelRequire("KQMxT")); }); parcelRequire.register("5swb3", function(module, exports) { (function(undefined) { if (typeof window === 'undefined') return; // don't run for server side render var count = 0, logEnabled = false, hiddenCheckEnabled = false, msgHeader = 'message', msgHeaderLen = msgHeader.length, msgId = '[iFrameSizer]', msgIdLen = msgId.length, pagePosition = null, requestAnimationFrame = window.requestAnimationFrame, resetRequiredMethods = { max: 1, scroll: 1, bodyScroll: 1, documentElementScroll: 1 }, settings = {}, timer = null, defaults = { autoResize: true, bodyBackground: null, bodyMargin: null, bodyMarginV1: 8, bodyPadding: null, checkOrigin: true, inPageLinks: false, enablePublicMethods: true, heightCalculationMethod: 'bodyOffset', id: 'iFrameResizer', interval: 32, log: false, maxHeight: Infinity, maxWidth: Infinity, minHeight: 0, minWidth: 0, mouseEvents: true, resizeFrom: 'parent', scrolling: false, sizeHeight: true, sizeWidth: false, warningTimeout: 5000, tolerance: 0, widthCalculationMethod: 'scroll', onClose: function onClose() { return true; }, onClosed: function onClosed() {}, onInit: function onInit() {}, onMessage: function onMessage() { warn('onMessage function not defined'); }, onMouseEnter: function onMouseEnter() {}, onMouseLeave: function onMouseLeave() {}, onResized: function onResized() {}, onScroll: function onScroll() { return true; } }; function getMutationObserver() { return window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; } function addEventListener(el, evt, func) { el.addEventListener(evt, func, false); } function removeEventListener(el, evt, func) { el.removeEventListener(evt, func, false); } function setupRequestAnimationFrame() { var vendors = [ 'moz', 'webkit', 'o', 'ms' ]; var x; // Remove vendor prefixing if prefixed and break early if not for(x = 0; x < vendors.length && !requestAnimationFrame; x += 1)requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; if (!requestAnimationFrame) log('setup', 'RequestAnimationFrame not supported'); else // Firefox extension content-scripts have a globalThis object that is not the same as window. // Binding `requestAnimationFrame` to window allows the function to work and prevents errors // being thrown when run in that context, and should be a no-op in every other context. requestAnimationFrame = requestAnimationFrame.bind(window); } function getMyID(iframeId) { var retStr = 'Host page: ' + iframeId; if (window.top !== window.self) retStr = window.parentIFrame && window.parentIFrame.getId ? window.parentIFrame.getId() + ': ' + iframeId : 'Nested host page: ' + iframeId; return retStr; } function formatLogHeader(iframeId) { return msgId + '[' + getMyID(iframeId) + ']'; } function isLogEnabled(iframeId) { return settings[iframeId] ? settings[iframeId].log : logEnabled; } function log(iframeId, msg) { output('log', iframeId, msg, isLogEnabled(iframeId)); } function info(iframeId, msg) { output('info', iframeId, msg, isLogEnabled(iframeId)); } function warn(iframeId, msg) { output('warn', iframeId, msg, true); } function output(type, iframeId, msg, enabled) { if (true === enabled && 'object' === typeof window.console) // eslint-disable-next-line no-console console[type](formatLogHeader(iframeId), msg); } function iFrameListener(event1) { function resizeIFrame() { function resize() { setSize(messageData); setPagePosition(iframeId1); on('onResized', messageData); } ensureInRange('Height'); ensureInRange('Width'); syncResize(resize, messageData, 'init'); } function processMsg() { var data = msg.substr(msgIdLen).split(':'); var height = data[1] ? parseInt(data[1], 10) : 0; var iframe = settings[data[0]] && settings[data[0]].iframe; var compStyle = getComputedStyle(iframe); return { iframe: iframe, id: data[0], height: height + getPaddingEnds(compStyle) + getBorderEnds(compStyle), width: data[2], type: data[3] }; } function getPaddingEnds(compStyle) { if (compStyle.boxSizing !== 'border-box') return 0; var top = compStyle.paddingTop ? parseInt(compStyle.paddingTop, 10) : 0; var bot = compStyle.paddingBottom ? parseInt(compStyle.paddingBottom, 10) : 0; return top + bot; } function getBorderEnds(compStyle) { if (compStyle.boxSizing !== 'border-box') return 0; var top = compStyle.borderTopWidth ? parseInt(compStyle.borderTopWidth, 10) : 0; var bot = compStyle.borderBottomWidth ? parseInt(compStyle.borderBottomWidth, 10) : 0; return top + bot; } function ensureInRange(Dimension) { var max = Number(settings[iframeId1]['max' + Dimension]), min = Number(settings[iframeId1]['min' + Dimension]), dimension = Dimension.toLowerCase(), size = Number(messageData[dimension]); log(iframeId1, 'Checking ' + dimension + ' is in range ' + min + '-' + max); if (size < min) { size = min; log(iframeId1, 'Set ' + dimension + ' to min value'); } if (size > max) { size = max; log(iframeId1, 'Set ' + dimension + ' to max value'); } messageData[dimension] = '' + size; } function isMessageFromIFrame() { function checkAllowedOrigin() { function checkList() { var i = 0, retCode = false; log(iframeId1, 'Checking connection is from allowed list of origins: ' + checkOrigin); for(; i < checkOrigin.length; i++)if (checkOrigin[i] === origin) { retCode = true; break; } return retCode; } function checkSingle() { var remoteHost = settings[iframeId1] && settings[iframeId1].remoteHost; log(iframeId1, 'Checking connection is from: ' + remoteHost); return origin === remoteHost; } return checkOrigin.constructor === Array ? checkList() : checkSingle(); } var origin = event1.origin, checkOrigin = settings[iframeId1] && settings[iframeId1].checkOrigin; if (checkOrigin && '' + origin !== 'null' && !checkAllowedOrigin()) throw new Error('Unexpected message received from: ' + origin + ' for ' + messageData.iframe.id + '. Message was: ' + event1.data + '. This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.'); return true; } function isMessageForUs() { return msgId === ('' + msg).substr(0, msgIdLen) && msg.substr(msgIdLen).split(':')[0] in settings // ''+Protects against non-string msg ; } function isMessageFromMetaParent() { // Test if this message is from a parent above us. This is an ugly test, however, updating // the message format would break backwards compatibity. var retCode = messageData.type in { true: 1, false: 1, undefined: 1 }; if (retCode) log(iframeId1, 'Ignoring init message from meta parent page'); return retCode; } function getMsgBody(offset) { return msg.substr(msg.indexOf(':') + msgHeaderLen + offset); } function forwardMsgFromIFrame(msgBody) { log(iframeId1, 'onMessage passed: {iframe: ' + messageData.iframe.id + ', message: ' + msgBody + '}'); on('onMessage', { iframe: messageData.iframe, message: JSON.parse(msgBody) }); log(iframeId1, '--'); } function getPageInfo() { var bodyPosition = document.body.getBoundingClientRect(), iFramePosition = messageData.iframe.getBoundingClientRect(); return JSON.stringify({ iframeHeight: iFramePosition.height, iframeWidth: iFramePosition.width, clientHeight: Math.max(document.documentElement.clientHeight, window.innerHeight || 0), clientWidth: Math.max(document.documentElement.clientWidth, window.innerWidth || 0), offsetTop: parseInt(iFramePosition.top - bodyPosition.top, 10), offsetLeft: parseInt(iFramePosition.left - bodyPosition.left, 10), scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, documentHeight: document.documentElement.clientHeight, documentWidth: document.documentElement.clientWidth, windowHeight: window.innerHeight, windowWidth: window.innerWidth }); } function sendPageInfoToIframe(iframe, iframeId) { function debouncedTrigger() { trigger('Send Page Info', 'pageInfo:' + getPageInfo(), iframe, iframeId); } debounceFrameEvents(debouncedTrigger, 32, iframeId); } function startPageInfoMonitor() { function setListener(type, func) { function sendPageInfo() { if (settings[id]) sendPageInfoToIframe(settings[id].iframe, id); else stop(); } [ 'scroll', 'resize' ].forEach(function(evt) { log(id, type + evt + ' listener for sendPageInfo'); func(window, evt, sendPageInfo); }); } function stop() { setListener('Remove ', removeEventListener); } function start() { setListener('Add ', addEventListener); } var id = iframeId1 // Create locally scoped copy of iFrame ID ; start(); if (settings[id]) settings[id].stopPageInfo = stop; } function stopPageInfoMonitor() { if (settings[iframeId1] && settings[iframeId1].stopPageInfo) { settings[iframeId1].stopPageInfo(); delete settings[iframeId1].stopPageInfo; } } function checkIFrameExists() { var retBool = true; if (null === messageData.iframe) { warn(iframeId1, 'IFrame (' + messageData.id + ') not found'); retBool = false; } return retBool; } function getElementPosition(target) { var iFramePosition = target.getBoundingClientRect(); getPagePosition(iframeId1); return { x: Math.floor(Number(iFramePosition.left) + Number(pagePosition.x)), y: Math.floor(Number(iFramePosition.top) + Number(pagePosition.y)) }; } function scrollRequestFromChild(addOffset) { /* istanbul ignore next */ // Not testable in Karma function reposition() { pagePosition = newPosition; scrollTo(); log(iframeId1, '--'); } function calcOffset() { return { x: Number(messageData.width) + offset.x, y: Number(messageData.height) + offset.y }; } function scrollParent() { if (window.parentIFrame) window.parentIFrame['scrollTo' + (addOffset ? 'Offset' : '')](newPosition.x, newPosition.y); else warn(iframeId1, 'Unable to scroll to requested position, window.parentIFrame not found'); } var offset = addOffset ? getElementPosition(messageData.iframe) : { x: 0, y: 0 }, newPosition = calcOffset(); log(iframeId1, 'Reposition requested from iFrame (offset x:' + offset.x + ' y:' + offset.y + ')'); if (window.top !== window.self) scrollParent(); else reposition(); } function scrollTo() { if (false !== on('onScroll', pagePosition)) setPagePosition(iframeId1); else unsetPagePosition(); } function findTarget(location) { function jumpToTarget() { var jumpPosition = getElementPosition(target); log(iframeId1, 'Moving to in page link (#' + hash + ') at x: ' + jumpPosition.x + ' y: ' + jumpPosition.y); pagePosition = { x: jumpPosition.x, y: jumpPosition.y }; scrollTo(); log(iframeId1, '--'); } function jumpToParent() { if (window.parentIFrame) window.parentIFrame.moveToAnchor(hash); else log(iframeId1, 'In page link #' + hash + ' not found and window.parentIFrame not found'); } var hash = location.split('#')[1] || '', hashData = decodeURIComponent(hash), target = document.getElementById(hashData) || document.getElementsByName(hashData)[0]; if (target) jumpToTarget(); else if (window.top !== window.self) jumpToParent(); else log(iframeId1, 'In page link #' + hash + ' not found'); } function onMouse(event) { var mousePos = {}; if (Number(messageData.width) === 0 && Number(messageData.height) === 0) { var data = getMsgBody(9).split(':'); mousePos = { x: data[1], y: data[0] }; } else mousePos = { x: messageData.width, y: messageData.height }; on(event, { iframe: messageData.iframe, screenX: Number(mousePos.x), screenY: Number(mousePos.y), type: messageData.type }); } function on(funcName, val) { return chkEvent(iframeId1, funcName, val); } function actionMsg() { if (settings[iframeId1] && settings[iframeId1].firstRun) firstRun(); switch(messageData.type){ case 'close': closeIFrame(messageData.iframe); break; case 'message': forwardMsgFromIFrame(getMsgBody(6)); break; case 'mouseenter': onMouse('onMouseEnter'); break; case 'mouseleave': onMouse('onMouseLeave'); break; case 'autoResize': settings[iframeId1].autoResize = JSON.parse(getMsgBody(9)); break; case 'scrollTo': scrollRequestFromChild(false); break; case 'scrollToOffset': scrollRequestFromChild(true); break; case 'pageInfo': sendPageInfoToIframe(settings[iframeId1] && settings[iframeId1].iframe, iframeId1); startPageInfoMonitor(); break; case 'pageInfoStop': stopPageInfoMonitor(); break; case 'inPageLink': findTarget(getMsgBody(9)); break; case 'reset': resetIFrame(messageData); break; case 'init': resizeIFrame(); on('onInit', messageData.iframe); break; default: if (Number(messageData.width) === 0 && Number(messageData.height) === 0) warn('Unsupported message received (' + messageData.type + '), this is likely due to the iframe containing a later ' + 'version of iframe-resizer than the parent page'); else resizeIFrame(); } } function hasSettings(iframeId) { var retBool = true; if (!settings[iframeId]) { retBool = false; warn(messageData.type + ' No settings for ' + iframeId + '. Message was: ' + msg); } return retBool; } function iFrameReadyMsgReceived() { // eslint-disable-next-line no-restricted-syntax, guard-for-in for(var iframeId in settings)trigger('iFrame requested init', createOutgoingMsg(iframeId), settings[iframeId].iframe, iframeId); } function firstRun() { if (settings[iframeId1]) settings[iframeId1].firstRun = false; } var msg = event1.data, messageData = {}, iframeId1 = null; if ('[iFrameResizerChild]Ready' === msg) iFrameReadyMsgReceived(); else if (isMessageForUs()) { messageData = processMsg(); iframeId1 = messageData.id; if (settings[iframeId1]) settings[iframeId1].loaded = true; if (!isMessageFromMetaParent() && hasSettings(iframeId1)) { log(iframeId1, 'Received: ' + msg); if (checkIFrameExists() && isMessageFromIFrame()) actionMsg(); } } else info(iframeId1, 'Ignored: ' + msg); } function chkEvent(iframeId, funcName, val) { var func = null, retVal = null; if (settings[iframeId]) { func = settings[iframeId][funcName]; if ('function' === typeof func) retVal = func(val); else throw new TypeError(funcName + ' on iFrame[' + iframeId + '] is not a function'); } return retVal; } function removeIframeListeners(iframe) { var iframeId = iframe.id; delete settings[iframeId]; } function closeIFrame(iframe) { var iframeId = iframe.id; if (chkEvent(iframeId, 'onClose', iframeId) === false) { log(iframeId, 'Close iframe cancelled by onClose event'); return; } log(iframeId, 'Removing iFrame: ' + iframeId); try { // Catch race condition error with React if (iframe.parentNode) iframe.parentNode.removeChild(iframe); } catch (error) { warn(error); } chkEvent(iframeId, 'onClosed', iframeId); log(iframeId, '--'); removeIframeListeners(iframe); } function getPagePosition(iframeId) { if (null === pagePosition) { pagePosition = { x: window.pageXOffset !== undefined ? window.pageXOffset : document.documentElement.scrollLeft, y: window.pageYOffset !== undefined ? window.pageYOffset : document.documentElement.scrollTop }; log(iframeId, 'Get page position: ' + pagePosition.x + ',' + pagePosition.y); } } function setPagePosition(iframeId) { if (null !== pagePosition) { window.scrollTo(pagePosition.x, pagePosition.y); log(iframeId, 'Set page position: ' + pagePosition.x + ',' + pagePosition.y); unsetPagePosition(); } } function unsetPagePosition() { pagePosition = null; } function resetIFrame(messageData) { function reset() { setSize(messageData); trigger('reset', 'reset', messageData.iframe, messageData.id); } log(messageData.id, 'Size reset requested by ' + ('init' === messageData.type ? 'host page' : 'iFrame')); getPagePosition(messageData.id); syncResize(reset, messageData, 'reset'); } function setSize(messageData) { function setDimension(dimension) { if (!messageData.id) { log('undefined', 'messageData id not set'); return; } messageData.iframe.style[dimension] = messageData[dimension] + 'px'; log(messageData.id, 'IFrame (' + iframeId + ') ' + dimension + ' set to ' + messageData[dimension] + 'px'); } function chkZero(dimension) { // FireFox sets dimension of hidden iFrames to zero. // So if we detect that set up an event to check for // when iFrame becomes visible. /* istanbul ignore next */ // Not testable in PhantomJS if (!hiddenCheckEnabled && '0' === messageData[dimension]) { hiddenCheckEnabled = true; log(iframeId, 'Hidden iFrame detected, creating visibility listener'); fixHiddenIFrames(); } } function processDimension(dimension) { setDimension(dimension); chkZero(dimension); } var iframeId = messageData.iframe.id; if (settings[iframeId]) { if (settings[iframeId].sizeHeight) processDimension('height'); if (settings[iframeId].sizeWidth) processDimension('width'); } } function syncResize(func, messageData, doNotSync) { /* istanbul ignore if */ // Not testable in PhantomJS if (doNotSync !== messageData.type && requestAnimationFrame && // including check for jasmine because had trouble getting spy to work in unit test using requestAnimationFrame !window.jasmine) { log(messageData.id, 'Requesting animation frame'); requestAnimationFrame(func); } else func(); } function trigger(calleeMsg, msg, iframe, id, noResponseWarning) { function postMessageToIFrame() { var target = settings[id] && settings[id].targetOrigin; log(id, '[' + calleeMsg + '] Sending msg to iframe[' + id + '] (' + msg + ') targetOrigin: ' + target); iframe.contentWindow.postMessage(msgId + msg, target); } function iFrameNotFound() { warn(id, '[' + calleeMsg + '] IFrame(' + id + ') not found'); } function chkAndSend() { if (iframe && 'contentWindow' in iframe && null !== iframe.contentWindow) // Null test for PhantomJS postMessageToIFrame(); else iFrameNotFound(); } function warnOnNoResponse() { function warning() { if (settings[id] && !settings[id].loaded && !errorShown) { errorShown = true; warn(id, 'IFrame has not responded within ' + settings[id].warningTimeout / 1000 + ' seconds. Check iFrameResizer.contentWindow.js has been loaded in iFrame. This message can be ignored if everything is working, or you can set the warningTimeout option to a higher value or zero to suppress this warning.'); } } if (!!noResponseWarning && settings[id] && !!settings[id].warningTimeout) settings[id].msgTimeout = setTimeout(warning, settings[id].warningTimeout); } var errorShown = false; id = id || iframe.id; if (settings[id]) { chkAndSend(); warnOnNoResponse(); } } function createOutgoingMsg(iframeId) { return iframeId + ':' + settings[iframeId].bodyMarginV1 + ':' + settings[iframeId].sizeWidth + ':' + settings[iframeId].log + ':' + settings[iframeId].interval + ':' + settings[iframeId].enablePublicMethods + ':' + settings[iframeId].autoResize + ':' + settings[iframeId].bodyMargin + ':' + settings[iframeId].heightCalculationMethod + ':' + settings[iframeId].bodyBackground + ':' + settings[iframeId].bodyPadding + ':' + settings[iframeId].tolerance + ':' + settings[iframeId].inPageLinks + ':' + settings[iframeId].resizeFrom + ':' + settings[iframeId].widthCalculationMethod + ':' + settings[iframeId].mouseEvents; } function isNumber(value) { return typeof value === 'number'; } function setupIFrame(iframe, options1) { function setLimits() { function addStyle(style) { var styleValue = settings[iframeId2][style]; if (Infinity !== styleValue && 0 !== styleValue) { iframe.style[style] = isNumber(styleValue) ? styleValue + 'px' : styleValue; log(iframeId2, 'Set ' + style + ' = ' + iframe.style[style]); } } function chkMinMax(dimension) { if (settings[iframeId2]['min' + dimension] > settings[iframeId2]['max' + dimension]) throw new Error('Value for min' + dimension + ' can not be greater than max' + dimension); } chkMinMax('Height'); chkMinMax('Width'); addStyle('maxHeight'); addStyle('minHeight'); addStyle('maxWidth'); addStyle('minWidth'); } function newId() { var id = options1 && options1.id || defaults.id + count++; if (null !== document.getElementById(id)) id += count++; return id; } function ensureHasId(iframeId) { if ('' === iframeId) { // eslint-disable-next-line no-multi-assign iframe.id = iframeId = newId(); logEnabled = (options1 || {}).log; log(iframeId, 'Added missing iframe ID: ' + iframeId + ' (' + iframe.src + ')'); } return iframeId; } function setScrolling() { log(iframeId2, 'IFrame scrolling ' + (settings[iframeId2] && settings[iframeId2].scrolling ? 'enabled' : 'disabled') + ' for ' + iframeId2); iframe.style.overflow = false === (settings[iframeId2] && settings[iframeId2].scrolling) ? 'hidden' : 'auto'; switch(settings[iframeId2] && settings[iframeId2].scrolling){ case 'omit': break; case true: iframe.scrolling = 'yes'; break; case false: iframe.scrolling = 'no'; break; default: iframe.scrolling = settings[iframeId2] ? settings[iframeId2].scrolling : 'no'; } } // The V1 iFrame script expects an int, where as in V2 expects a CSS // string value such as '1px 3em', so if we have an int for V2, set V1=V2 // and then convert V2 to a string PX value. function setupBodyMarginValues() { if ('number' === typeof (settings[iframeId2] && settings[iframeId2].bodyMargin) || '0' === (settings[iframeId2] && settings[iframeId2].bodyMargin)) { settings[iframeId2].bodyMarginV1 = settings[iframeId2].bodyMargin; settings[iframeId2].bodyMargin = '' + settings[iframeId2].bodyMargin + 'px'; } } function checkReset() { // Reduce scope of firstRun to function, because IE8's JS execution // context stack is borked and this value gets externally // changed midway through running this function!!! var firstRun = settings[iframeId2] && settings[iframeId2].firstRun, resetRequertMethod = settings[iframeId2] && settings[iframeId2].heightCalculationMethod in resetRequiredMethods; if (!firstRun && resetRequertMethod) resetIFrame({ iframe: iframe, height: 0, width: 0, type: 'init' }); } function setupIFrameObject() { if (settings[iframeId2]) settings[iframeId2].iframe.iFrameResizer = { close: closeIFrame.bind(null, settings[iframeId2].iframe), removeListeners: removeIframeListeners.bind(null, settings[iframeId2].iframe), resize: trigger.bind(null, 'Window resize', 'resize', settings[iframeId2].iframe), moveToAnchor: function moveToAnchor(anchor) { trigger('Move to anchor', 'moveToAnchor:' + anchor, settings[iframeId2].iframe, iframeId2); }, sendMessage: function sendMessage(message) { message = JSON.stringify(message); trigger('Send Message', 'message:' + message, settings[iframeId2].iframe, iframeId2); } }; } // We have to call trigger twice, as we can not be sure if all // iframes have completed loading when this code runs. The // event listener also catches the page changing in the iFrame. function init(msg) { function iFrameLoaded() { trigger('iFrame.onload', msg, iframe, undefined, true); checkReset(); } function createDestroyObserver(MutationObserver) { if (!iframe.parentNode) return; var destroyObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { var removedNodes = Array.prototype.slice.call(mutation.removedNodes) // Transform NodeList into an Array ; removedNodes.forEach(function(removedNode) { if (removedNode === iframe) closeIFrame(iframe); }); }); }); destroyObserver.observe(iframe.parentNode, { childList: true }); } var MutationObserver1 = getMutationObserver(); if (MutationObserver1) createDestroyObserver(MutationObserver1); addEventListener(iframe, 'load', iFrameLoaded); trigger('init', msg, iframe, undefined, true); } function checkOptions(options) { if ('object' !== typeof options) throw new TypeError('Options is not an object'); } function copyOptions(options) { // eslint-disable-next-line no-restricted-syntax for(var option in defaults)if (Object.prototype.hasOwnProperty.call(defaults, option)) settings[iframeId2][option] = Object.prototype.hasOwnProperty.call(options, option) ? options[option] : defaults[option]; } function getTargetOrigin(remoteHost) { return '' === remoteHost || null !== remoteHost.match(/^(about:blank|javascript:|file:\/\/)/) ? '*' : remoteHost; } function depricate(key) { var splitName = key.split('Callback'); if (splitName.length === 2) { var name = 'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1); this[name] = this[key]; delete this[key]; warn(iframeId2, "Deprecated: '" + key + "' has been renamed '" + name + "'. The old method will be removed in the next major version."); } } function processOptions(options) { options = options || {}; settings[iframeId2] = { firstRun: true, iframe: iframe, remoteHost: iframe.src && iframe.src.split('/').slice(0, 3).join('/') }; checkOptions(options); Object.keys(options).forEach(depricate, options); copyOptions(options); if (settings[iframeId2]) settings[iframeId2].targetOrigin = true === settings[iframeId2].checkOrigin ? getTargetOrigin(settings[iframeId2].remoteHost) : '*'; } function beenHere() { return iframeId2 in settings && 'iFrameResizer' in iframe; } var iframeId2 = ensureHasId(iframe.id); if (!beenHere()) { processOptions(options1); setScrolling(); setLimits(); setupBodyMarginValues(); init(createOutgoingMsg(iframeId2)); setupIFrameObject(); } else warn(iframeId2, 'Ignored iFrame, already setup.'); } function debouce(fn, time) { if (null === timer) timer = setTimeout(function() { timer = null; fn(); }, time); } var frameTimer = {}; function debounceFrameEvents(fn, time, frameId) { if (!frameTimer[frameId]) frameTimer[frameId] = setTimeout(function() { frameTimer[frameId] = null; fn(); }, time); } // Not testable in PhantomJS /* istanbul ignore next */ function fixHiddenIFrames() { function checkIFrames() { function checkIFrame(settingId) { function chkDimension(dimension) { return '0px' === (settings[settingId] && settings[settingId].iframe.style[dimension]); } function isVisible(el) { return null !== el.offsetParent; } if (settings[settingId] && isVisible(settings[settingId].iframe) && (chkDimension('height') || chkDimension('width'))) trigger('Visibility change', 'resize', settings[settingId].iframe, settingId); } Object.keys(settings).forEach(function(key) { checkIFrame(key); }); } function mutationObserved(mutations) { log('window', 'Mutation observed: ' + mutations[0].target + ' ' + mutations[0].type); debouce(checkIFrames, 16); } function createMutationObserver() { var target = document.querySelector('body'), config = { attributes: true, attributeOldValue: false, characterData: true, characterDataOldValue: false, childList: true, subtree: true }, observer = new MutationObserver(mutationObserved); observer.observe(target, config); } var MutationObserver = getMutationObserver(); if (MutationObserver) createMutationObserver(); } function resizeIFrames(event) { function resize() { sendTriggerMsg('Window ' + event, 'resize'); } log('window', 'Trigger event: ' + event); debouce(resize, 16); } // Not testable in PhantomJS /* istanbul ignore next */ function tabVisible() { function resize() { sendTriggerMsg('Tab Visable', 'resize'); } if ('hidden' !== document.visibilityState) { log('document', 'Trigger event: Visiblity change'); debouce(resize, 16); } } function sendTriggerMsg(eventName, event) { function isIFrameResizeEnabled(iframeId) { return settings[iframeId] && 'parent' === settings[iframeId].resizeFrom && settings[iframeId].autoResize && !settings[iframeId].firstRun; } Object.keys(settings).forEach(function(iframeId) { if (isIFrameResizeEnabled(iframeId)) trigger(eventName, event, settings[iframeId].iframe, iframeId); }); } function setupEventListeners() { addEventListener(window, 'message', iFrameListener); addEventListener(window, 'resize', function() { resizeIFrames('resize'); }); addEventListener(document, 'visibilitychange', tabVisible); addEventListener(document, '-webkit-visibilitychange', tabVisible); } function factory() { function init(options, element) { function chkType() { if (!element.tagName) throw new TypeError('Object is not a valid DOM element'); else if ('IFRAME' !== element.tagName.toUpperCase()) throw new TypeError('Expected <IFRAME> tag, found <' + element.tagName + '>'); } if (element) { chkType(); setupIFrame(element, options); iFrames.push(element); } } function warnDeprecatedOptions(options) { if (options && options.enablePublicMethods) warn('enablePublicMethods option has been removed, public methods are now always available in the iFrame'); } var iFrames; setupRequestAnimationFrame(); setupEventListeners(); return function iFrameResizeF(options, target) { iFrames = [] // Only return iFrames past in on this call ; warnDeprecatedOptions(options); switch(typeof target === "undefined" ? "undefined" : $73eafee58a309765$export$2e2bcd8739ae039(target)){ case 'undefined': case 'string': Array.prototype.forEach.call(document.querySelectorAll(target || 'iframe'), init.bind(undefined, options)); break; case 'object': init(options, target); break; default: throw new TypeError('Unexpected data type (' + (typeof target === "undefined" ? "undefined" : $73eafee58a309765$export$2e2bcd8739ae039(target)) + ')'); } return iFrames; }; } function createJQueryPublicMethod($) { if (!$.fn) info('', 'Unable to bind to jQuery, it is not fully loaded.'); else if (!$.fn.iFrameResize) $.fn.iFrameResize = function $iFrameResizeF(options) { function init(index, element) { setupIFrame(element, options); } return this.filter('iframe').each(init).end(); }; } if (window.jQuery) createJQueryPublicMethod(window.jQuery); if (typeof define === 'function' && define.amd) define([], factory); else if (typeof module.exports === 'object') // Node for browserfy module.exports = factory(); window.iFrameResize = window.iFrameResize || factory(); })(); }); function $feada87b51f3f2af$export$2e2bcd8739ae039(obj, key, value) { if (key in obj) Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); else obj[key] = value; return obj; } function $24348b77894bb2d6$export$2e2bcd8739ae039(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); ownKeys.forEach(function(key) { $feada87b51f3f2af$export$2e2bcd8739ae039(target, key, source[key]); }); } return target; } function $73eafee58a309765$export$2e2bcd8739ae039(obj) { return obj && obj.constructor === Symbol ? "symbol" : typeof obj; } parcelRequire.register("KQMxT", function(module, exports) { (function(undefined) { if (typeof window === 'undefined') return; // don't run for server side render var autoResize = true, base = 10, bodyBackground = '', bodyMargin = 0, bodyMarginStr = '', bodyObserver = null, bodyPadding = '', calculateWidth = false, doubleEventList = { resize: 1, click: 1 }, eventCancelTimer = 128, firstRun = true, height1 = 1, heightCalcModeDefault = 'bodyOffset', heightCalcMode = heightCalcModeDefault, initLock = true, initMsg = '', inPageLinks = {}, interval = 32, intervalTimer = null, logging = false, mouseEvents = false, msgID = '[iFrameSizer]', msgIdLen = msgID.length, myID = '', resetRequiredMethods = { max: 1, min: 1, bodyScroll: 1, documentElementScroll: 1 }, resizeFrom = 'child', sendPermit = true, target1 = window.parent, targetOriginDefault = '*', tolerance = 0, triggerLocked = false, triggerLockedTimer = null, throttledTimer = 16, width1 = 1, widthCalcModeDefault = 'scroll', widthCalcMode = widthCalcModeDefault, win = window, onMessage = function onMessage() { warn('onMessage function not defined'); }, onReady = function onReady() {}, onPageInfo = function onPageInfo() {}, customCalcMethods = { height: function height() { warn('Custom height calculation function not defined'); return document.documentElement.offsetHeight; }, width: function width() { warn('Custom width calculation function not defined'); return document.body.scrollWidth; } }, eventHandlersByName = {}, passiveSupported = false; function noop() {} try { var options = Object.create({}, { passive: { get: function get() { passiveSupported = true; } } }); window.addEventListener('test', noop, options); window.removeEventListener('test', noop, options); } catch (error) { /* */ } function addEventListener(el, evt, func, options) { el.addEventListener(evt, func, passiveSupported ? options || {} : false); } function removeEventListener(el, evt, func) { el.removeEventListener(evt, func, false); } function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } // Based on underscore.js function throttle(func) { var context, args, result, timeout = null, previous = 0, later = function later() { previous = Date.now(); timeout = null; result = func.apply(context, args); if (!timeout) // eslint-disable-next-line no-multi-assign context = args = null; }; return function() { var now = Date.now(); if (!previous) previous = now; var remaining = throttledTimer - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > throttledTimer) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) // eslint-disable-next-line no-multi-assign context = args = null; } else if (!timeout) timeout = setTimeout(later, remaining); return result; }; } function formatLogMsg(msg) { return msgID + '[' + myID + '] ' + msg; } function log(msg) { if (logging && 'object' === typeof window.console) // eslint-disable-next-line no-console console.log(formatLogMsg(msg)); } function warn(msg) { if ('object' === typeof window.console) // eslint-disable-next-line no-console console.warn(formatLogMsg(msg)); } function init() { readDataFromParent(); log('Initialising iFrame (' + window.location.href + ')'); readDataFromPage(); setMargin(); setBodyStyle('background', bodyBackground); setBodyStyle('padding', bodyPadding); injectClearFixIntoBodyElement(); checkHeightMode(); checkWidthMode(); stopInfiniteResizingOfIFrame(); setupPublicMethods(); setupMouseEvents(); startEventListeners(); inPageLinks = setupInPageLinks(); sendSize('init', 'Init message from host page'); onReady(); } function readDataFromParent() { function strBool(str) { return 'true' === str; } var data = initMsg.substr(msgIdLen).split(':'); myID = data[0]; bodyMargin = undefined !== data[1] ? Number(data[1]) : bodyMargin // For V1 compatibility ; calculateWidth = undefined !== data[2] ? strBool(data[2]) : calculateWidth; logging = undefined !== data[3] ? strBool(data[3]) : logging; interval = undefined !== data[4] ? Number(data[4]) : interval; autoResize = undefined !== data[6] ? strBool(data[6]) : autoResize; bodyMarginStr = data[7]; heightCalcMode = undefined !== data[8] ? data[8] : heightCalcMode; bodyBackground = data[9]; bodyPadding = data[10]; tolerance = undefined !== data[11] ? Number(data[11]) : tolerance; inPageLinks.enable = undefined !== data[12] ? strBool(data[12]) : false; resizeFrom = undefined !== data[13] ? data[13] : resizeFrom; widthCalcMode = undefined !== data[14] ? data[14] : widthCalcMode; mouseEvents = undefined !== data[15] ? Boolean(data[15]) : mouseEvents; } function depricate(key) { var splitName = key.split('Callback'); if (splitName.length === 2) { var name = 'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1); this[name] = this[key]; delete this[key]; warn("Deprecated: '" + key + "' has been renamed '" + name + "'. The old method will be removed in the next major version."); } } function readDataFromPage() { function readData() { var data = window.iFrameResizer; log('Reading data from page: ' + JSON.stringify(data)); Object.keys(data).forEach(depricate, data); onMessage = 'onMessage' in data ? data.onMessage : onMessage; onReady = 'onReady' in data ? data.onReady : onReady; targetOriginDefault = 'targetOrigin' in data ? data.targetOrigin : targetOriginDefault; heightCalcMode = 'heightCalculationMethod' in data ? data.heightCalculationMethod : heightCalcMode; widthCalcMode = 'widthCalculationMethod' in data ? data.widthCalculationMethod : widthCalcMode; } function setupCustomCalcMethods(calcMode, calcFunc) { if ('function' === typeof calcMode) { log('Setup custom ' + calcFunc + 'CalcMethod'); customCalcMethods[calcFunc] = calcMode; calcMode = 'custom'; } return calcMode; } if ('iFrameResizer' in window && Object === window.iFrameResizer.constructor) { readData(); heightCalcMode = setupCustomCalcMethods(heightCalcMode, 'height'); widthCalcMode = setupCustomCalcMethods(widthCalcMode, 'width'); } log('TargetOrigin for parent set to: ' + targetOriginDefault); } function chkCSS(attr, value) { if (-1 !== value.indexOf('-')) { warn('Negative CSS value ignored for ' + attr); value = ''; } return value; } function setBodyStyle(attr, value) { if (undefined !== value && '' !== value && 'null' !== value) { document.body.style[attr] = value; log('Body ' + attr + ' set to "' + value + '"'); } } function setMargin() { // If called via V1 script, convert bodyMargin from int to str if (undefined === bodyMarginStr) bodyMarginStr = bodyMargin + 'px'; setBodyStyle('margin', chkCSS('margin', bodyMarginStr)); } function stopInfiniteResizingOfIFrame() { document.documentElement.style