UNPKG

cross-domain-utils

Version:
746 lines 30.9 kB
!function(root, factory) { "object" == typeof exports && "object" == typeof module ? module.exports = factory() : "function" == typeof define && define.amd ? define("crossDomainUtils", [], factory) : "object" == typeof exports ? exports.crossDomainUtils = factory() : root.crossDomainUtils = factory(); }("undefined" != typeof self ? self : this, (function() { return function(modules) { var installedModules = {}; function __webpack_require__(moduleId) { if (installedModules[moduleId]) return installedModules[moduleId].exports; var module = installedModules[moduleId] = { i: moduleId, l: !1, exports: {} }; modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); module.l = !0; return module.exports; } __webpack_require__.m = modules; __webpack_require__.c = installedModules; __webpack_require__.d = function(exports, name, getter) { __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { enumerable: !0, get: getter }); }; __webpack_require__.r = function(exports) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); Object.defineProperty(exports, "__esModule", { value: !0 }); }; __webpack_require__.t = function(value, mode) { 1 & mode && (value = __webpack_require__(value)); if (8 & mode) return value; if (4 & mode && "object" == typeof value && value && value.__esModule) return value; var ns = Object.create(null); __webpack_require__.r(ns); Object.defineProperty(ns, "default", { enumerable: !0, value: value }); if (2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); return ns; }; __webpack_require__.n = function(module) { var getter = module && module.__esModule ? function() { return module.default; } : function() { return module; }; __webpack_require__.d(getter, "a", getter); return getter; }; __webpack_require__.o = function(object, property) { return {}.hasOwnProperty.call(object, property); }; __webpack_require__.p = ""; return __webpack_require__(__webpack_require__.s = 0); }([ function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); __webpack_require__.d(__webpack_exports__, "getActualProtocol", (function() { return getActualProtocol; })); __webpack_require__.d(__webpack_exports__, "getProtocol", (function() { return getProtocol; })); __webpack_require__.d(__webpack_exports__, "isFileProtocol", (function() { return isFileProtocol; })); __webpack_require__.d(__webpack_exports__, "isAboutProtocol", (function() { return isAboutProtocol; })); __webpack_require__.d(__webpack_exports__, "isMockProtocol", (function() { return isMockProtocol; })); __webpack_require__.d(__webpack_exports__, "getParent", (function() { return getParent; })); __webpack_require__.d(__webpack_exports__, "getOpener", (function() { return getOpener; })); __webpack_require__.d(__webpack_exports__, "canReadFromWindow", (function() { return canReadFromWindow; })); __webpack_require__.d(__webpack_exports__, "getActualDomain", (function() { return getActualDomain; })); __webpack_require__.d(__webpack_exports__, "getDomain", (function() { return getDomain; })); __webpack_require__.d(__webpack_exports__, "isBlankDomain", (function() { return isBlankDomain; })); __webpack_require__.d(__webpack_exports__, "isActuallySameDomain", (function() { return isActuallySameDomain; })); __webpack_require__.d(__webpack_exports__, "isSameDomain", (function() { return isSameDomain; })); __webpack_require__.d(__webpack_exports__, "assertSameDomain", (function() { return assertSameDomain; })); __webpack_require__.d(__webpack_exports__, "getParents", (function() { return getParents; })); __webpack_require__.d(__webpack_exports__, "isAncestorParent", (function() { return isAncestorParent; })); __webpack_require__.d(__webpack_exports__, "getFrames", (function() { return getFrames; })); __webpack_require__.d(__webpack_exports__, "getAllChildFrames", (function() { return getAllChildFrames; })); __webpack_require__.d(__webpack_exports__, "getTop", (function() { return getTop; })); __webpack_require__.d(__webpack_exports__, "getNextOpener", (function() { return getNextOpener; })); __webpack_require__.d(__webpack_exports__, "getUltimateTop", (function() { return getUltimateTop; })); __webpack_require__.d(__webpack_exports__, "getAllFramesInWindow", (function() { return getAllFramesInWindow; })); __webpack_require__.d(__webpack_exports__, "getAllWindows", (function() { return getAllWindows; })); __webpack_require__.d(__webpack_exports__, "isTop", (function() { return isTop; })); __webpack_require__.d(__webpack_exports__, "isFrameWindowClosed", (function() { return isFrameWindowClosed; })); __webpack_require__.d(__webpack_exports__, "isWindowClosed", (function() { return isWindowClosed; })); __webpack_require__.d(__webpack_exports__, "linkFrameWindow", (function() { return linkFrameWindow; })); __webpack_require__.d(__webpack_exports__, "getUserAgent", (function() { return getUserAgent; })); __webpack_require__.d(__webpack_exports__, "getFrameByName", (function() { return getFrameByName; })); __webpack_require__.d(__webpack_exports__, "findChildFrameByName", (function() { return findChildFrameByName; })); __webpack_require__.d(__webpack_exports__, "findFrameByName", (function() { return findFrameByName; })); __webpack_require__.d(__webpack_exports__, "isParent", (function() { return isParent; })); __webpack_require__.d(__webpack_exports__, "isOpener", (function() { return isOpener; })); __webpack_require__.d(__webpack_exports__, "getAncestor", (function() { return getAncestor; })); __webpack_require__.d(__webpack_exports__, "getAncestors", (function() { return getAncestors; })); __webpack_require__.d(__webpack_exports__, "isAncestor", (function() { return isAncestor; })); __webpack_require__.d(__webpack_exports__, "isPopup", (function() { return isPopup; })); __webpack_require__.d(__webpack_exports__, "isIframe", (function() { return isIframe; })); __webpack_require__.d(__webpack_exports__, "isFullpage", (function() { return isFullpage; })); __webpack_require__.d(__webpack_exports__, "getDistanceFromTop", (function() { return getDistanceFromTop; })); __webpack_require__.d(__webpack_exports__, "getNthParent", (function() { return getNthParent; })); __webpack_require__.d(__webpack_exports__, "getNthParentFromTop", (function() { return getNthParentFromTop; })); __webpack_require__.d(__webpack_exports__, "isSameTopWindow", (function() { return isSameTopWindow; })); __webpack_require__.d(__webpack_exports__, "matchDomain", (function() { return matchDomain; })); __webpack_require__.d(__webpack_exports__, "stringifyDomainPattern", (function() { return stringifyDomainPattern; })); __webpack_require__.d(__webpack_exports__, "getDomainFromUrl", (function() { return getDomainFromUrl; })); __webpack_require__.d(__webpack_exports__, "onCloseWindow", (function() { return onCloseWindow; })); __webpack_require__.d(__webpack_exports__, "isWindow", (function() { return isWindow; })); __webpack_require__.d(__webpack_exports__, "isBrowser", (function() { return isBrowser; })); __webpack_require__.d(__webpack_exports__, "isCurrentDomain", (function() { return isCurrentDomain; })); __webpack_require__.d(__webpack_exports__, "isMockDomain", (function() { return isMockDomain; })); __webpack_require__.d(__webpack_exports__, "normalizeMockUrl", (function() { return normalizeMockUrl; })); __webpack_require__.d(__webpack_exports__, "getFrameForWindow", (function() { return getFrameForWindow; })); __webpack_require__.d(__webpack_exports__, "closeWindow", (function() { return closeWindow; })); __webpack_require__.d(__webpack_exports__, "TYPES", (function() { return TYPES; })); __webpack_require__.d(__webpack_exports__, "PROTOCOL", (function() { return PROTOCOL; })); __webpack_require__.d(__webpack_exports__, "WILDCARD", (function() { return WILDCARD; })); __webpack_require__.d(__webpack_exports__, "WINDOW_TYPE", (function() { return WINDOW_TYPE; })); function isRegex(item) { return "[object RegExp]" === {}.toString.call(item); } var PROTOCOL = { MOCK: "mock:", FILE: "file:", ABOUT: "about:" }; var WILDCARD = "*"; var WINDOW_TYPE = { IFRAME: "iframe", POPUP: "popup" }; var IE_WIN_ACCESS_ERROR = "Call was rejected by callee.\r\n"; function getActualProtocol(win) { void 0 === win && (win = window); return win.location.protocol; } function getProtocol(win) { void 0 === win && (win = window); if (win.mockDomain) { var protocol = win.mockDomain.split("//")[0]; if (protocol) return protocol; } return getActualProtocol(win); } function isFileProtocol(win) { void 0 === win && (win = window); return getProtocol(win) === PROTOCOL.FILE; } function isAboutProtocol(win) { void 0 === win && (win = window); return getProtocol(win) === PROTOCOL.ABOUT; } function isMockProtocol(win) { void 0 === win && (win = window); return getProtocol(win) === PROTOCOL.MOCK; } function getParent(win) { void 0 === win && (win = window); if (win) try { if (win.parent && win.parent !== win) return win.parent; } catch (err) {} } function getOpener(win) { void 0 === win && (win = window); if (win && !getParent(win)) try { return win.opener; } catch (err) {} } function canReadFromWindow(win) { try { return !0; } catch (err) {} return !1; } function getActualDomain(win) { void 0 === win && (win = window); var location = win.location; if (!location) throw new Error("Can not read window location"); var protocol = getActualProtocol(win); if (!protocol) throw new Error("Can not read window protocol"); if (protocol === PROTOCOL.FILE) return PROTOCOL.FILE + "//"; if (protocol === PROTOCOL.ABOUT) { var parent = getParent(win); return parent && canReadFromWindow() ? getActualDomain(parent) : PROTOCOL.ABOUT + "//"; } var host = location.host; if (!host) throw new Error("Can not read window host"); return protocol + "//" + host; } function getDomain(win) { void 0 === win && (win = window); var domain = getActualDomain(win); return domain && win.mockDomain && 0 === win.mockDomain.indexOf(PROTOCOL.MOCK) ? win.mockDomain : domain; } function isBlankDomain(win) { try { if (!win.location.href) return !0; if ("about:blank" === win.location.href) return !0; } catch (err) {} return !1; } function isActuallySameDomain(win) { try { if (win === window) return !0; } catch (err) {} try { var desc = Object.getOwnPropertyDescriptor(win, "location"); if (desc && !1 === desc.enumerable) return !1; } catch (err) {} try { if (isAboutProtocol(win) && canReadFromWindow()) return !0; } catch (err) {} try { if (isMockProtocol(win) && canReadFromWindow()) return !0; } catch (err) {} try { if (getActualDomain(win) === getActualDomain(window)) return !0; } catch (err) {} return !1; } function isSameDomain(win) { if (!isActuallySameDomain(win)) return !1; try { if (win === window) return !0; if (isAboutProtocol(win) && canReadFromWindow()) return !0; if (getDomain(window) === getDomain(win)) return !0; } catch (err) {} return !1; } function assertSameDomain(win) { if (!isSameDomain(win)) throw new Error("Expected window to be same domain"); return win; } function getParents(win) { var result = []; try { for (;win.parent !== win; ) { result.push(win.parent); win = win.parent; } } catch (err) {} return result; } function isAncestorParent(parent, child) { if (!parent || !child) return !1; var childParent = getParent(child); return childParent ? childParent === parent : -1 !== getParents(child).indexOf(parent); } function getFrames(win) { var result = []; var frames; try { frames = win.frames; } catch (err) { frames = win; } var len; try { len = frames.length; } catch (err) {} if (0 === len) return result; if (len) { for (var i = 0; i < len; i++) { var frame = void 0; try { frame = frames[i]; } catch (err) { continue; } result.push(frame); } return result; } for (var _i = 0; _i < 100; _i++) { var _frame = void 0; try { _frame = frames[_i]; } catch (err) { return result; } if (!_frame) return result; result.push(_frame); } return result; } function getAllChildFrames(win) { var result = []; for (var _i3 = 0, _getFrames2 = getFrames(win); _i3 < _getFrames2.length; _i3++) { var frame = _getFrames2[_i3]; result.push(frame); for (var _i5 = 0, _getAllChildFrames2 = getAllChildFrames(frame); _i5 < _getAllChildFrames2.length; _i5++) result.push(_getAllChildFrames2[_i5]); } return result; } function getTop(win) { void 0 === win && (win = window); try { if (win.top) return win.top; } catch (err) {} if (getParent(win) === win) return win; try { if (isAncestorParent(window, win) && window.top) return window.top; } catch (err) {} try { if (isAncestorParent(win, window) && window.top) return window.top; } catch (err) {} for (var _i7 = 0, _getAllChildFrames4 = getAllChildFrames(win); _i7 < _getAllChildFrames4.length; _i7++) { var frame = _getAllChildFrames4[_i7]; try { if (frame.top) return frame.top; } catch (err) {} if (getParent(frame) === frame) return frame; } } function getNextOpener(win) { void 0 === win && (win = window); return getOpener(getTop(win) || win); } function getUltimateTop(win) { void 0 === win && (win = window); var opener = getNextOpener(win); return opener ? getUltimateTop(opener) : top; } function getAllFramesInWindow(win) { var top = getTop(win); if (!top) throw new Error("Can not determine top window"); var result = [].concat(getAllChildFrames(top), [ top ]); -1 === result.indexOf(win) && (result = [].concat(result, [ win ], getAllChildFrames(win))); return result; } function getAllWindows(win) { void 0 === win && (win = window); var frames = getAllFramesInWindow(win); var opener = getNextOpener(win); return opener ? [].concat(getAllWindows(opener), frames) : frames; } function isTop(win) { return win === getTop(win); } function isFrameWindowClosed(frame) { if (!frame.contentWindow) return !0; if (!frame.parentNode) return !0; var doc = frame.ownerDocument; if (doc && doc.documentElement && !doc.documentElement.contains(frame)) { var parent = frame; for (;parent.parentNode && parent.parentNode !== parent; ) parent = parent.parentNode; if (!parent.host || !doc.documentElement.contains(parent.host)) return !0; } return !1; } var iframeWindows = []; var iframeFrames = []; function isWindowClosed(win, allowMock) { void 0 === allowMock && (allowMock = !0); try { if (win === window) return !1; } catch (err) { return !0; } try { if (!win) return !0; } catch (err) { return !0; } try { if (win.closed) return !0; } catch (err) { return !err || err.message !== IE_WIN_ACCESS_ERROR; } if (allowMock && isSameDomain(win)) try { if (win.mockclosed) return !0; } catch (err) {} try { if (!win.parent || !win.top) return !0; } catch (err) {} var iframeIndex = function(collection, item) { for (var i = 0; i < collection.length; i++) try { if (collection[i] === item) return i; } catch (err) {} return -1; }(iframeWindows, win); if (-1 !== iframeIndex) { var frame = iframeFrames[iframeIndex]; if (frame && isFrameWindowClosed(frame)) return !0; } return !1; } function linkFrameWindow(frame) { !function() { for (var i = 0; i < iframeWindows.length; i++) { var closed = !1; try { closed = iframeWindows[i].closed; } catch (err) {} if (closed) { iframeFrames.splice(i, 1); iframeWindows.splice(i, 1); } } }(); if (frame && frame.contentWindow) try { iframeWindows.push(frame.contentWindow); iframeFrames.push(frame); } catch (err) {} } function getUserAgent(win) { return (win = win || window).navigator.mockUserAgent || win.navigator.userAgent; } function getFrameByName(win, name) { var winFrames = getFrames(win); for (var _i9 = 0; _i9 < winFrames.length; _i9++) { var childFrame = winFrames[_i9]; try { if (isSameDomain(childFrame) && childFrame.name === name && -1 !== winFrames.indexOf(childFrame)) return childFrame; } catch (err) {} } try { if (-1 !== winFrames.indexOf(win.frames[name])) return win.frames[name]; } catch (err) {} try { if (-1 !== winFrames.indexOf(win[name])) return win[name]; } catch (err) {} } function findChildFrameByName(win, name) { var frame = getFrameByName(win, name); if (frame) return frame; for (var _i11 = 0, _getFrames4 = getFrames(win); _i11 < _getFrames4.length; _i11++) { var namedFrame = findChildFrameByName(_getFrames4[_i11], name); if (namedFrame) return namedFrame; } } function findFrameByName(win, name) { return getFrameByName(win, name) || findChildFrameByName(getTop(win) || win, name); } function isParent(win, frame) { var frameParent = getParent(frame); if (frameParent) return frameParent === win; for (var _i13 = 0, _getFrames6 = getFrames(win); _i13 < _getFrames6.length; _i13++) if (_getFrames6[_i13] === frame) return !0; return !1; } function isOpener(parent, child) { return parent === getOpener(child); } function getAncestor(win) { void 0 === win && (win = window); return getOpener(win = win || window) || getParent(win) || void 0; } function getAncestors(win) { var results = []; var ancestor = win; for (;ancestor; ) (ancestor = getAncestor(ancestor)) && results.push(ancestor); return results; } function isAncestor(parent, child) { var actualParent = getAncestor(child); if (actualParent) return actualParent === parent; if (child === parent) return !1; if (getTop(child) === child) return !1; for (var _i15 = 0, _getFrames8 = getFrames(parent); _i15 < _getFrames8.length; _i15++) if (_getFrames8[_i15] === child) return !0; return !1; } function isPopup(win) { void 0 === win && (win = window); return Boolean(getOpener(win)); } function isIframe(win) { void 0 === win && (win = window); return Boolean(getParent(win)); } function isFullpage(win) { void 0 === win && (win = window); return Boolean(!isIframe(win) && !isPopup(win)); } function anyMatch(collection1, collection2) { for (var _i17 = 0; _i17 < collection1.length; _i17++) { var item1 = collection1[_i17]; for (var _i19 = 0; _i19 < collection2.length; _i19++) if (item1 === collection2[_i19]) return !0; } return !1; } function getDistanceFromTop(win) { void 0 === win && (win = window); var distance = 0; var parent = win; for (;parent; ) (parent = getParent(parent)) && (distance += 1); return distance; } function getNthParent(win, n) { void 0 === n && (n = 1); var parent = win; for (var i = 0; i < n; i++) { if (!parent) return; parent = getParent(parent); } return parent; } function getNthParentFromTop(win, n) { void 0 === n && (n = 1); return getNthParent(win, getDistanceFromTop(win) - n); } function isSameTopWindow(win1, win2) { var top1 = getTop(win1) || win1; var top2 = getTop(win2) || win2; try { if (top1 && top2) return top1 === top2; } catch (err) {} var allFrames1 = getAllFramesInWindow(win1); var allFrames2 = getAllFramesInWindow(win2); if (anyMatch(allFrames1, allFrames2)) return !0; var opener1 = getOpener(top1); var opener2 = getOpener(top2); return opener1 && anyMatch(getAllFramesInWindow(opener1), allFrames2) || opener2 && anyMatch(getAllFramesInWindow(opener2), allFrames1), !1; } function matchDomain(pattern, origin) { if ("string" == typeof pattern) { if ("string" == typeof origin) return pattern === WILDCARD || origin === pattern; if (isRegex(origin)) return !1; if (Array.isArray(origin)) return !1; } return isRegex(pattern) ? isRegex(origin) ? pattern.toString() === origin.toString() : !Array.isArray(origin) && Boolean(origin.match(pattern)) : !!Array.isArray(pattern) && (Array.isArray(origin) ? JSON.stringify(pattern) === JSON.stringify(origin) : !isRegex(origin) && pattern.some((function(subpattern) { return matchDomain(subpattern, origin); }))); } function stringifyDomainPattern(pattern) { return Array.isArray(pattern) ? "(" + pattern.join(" | ") + ")" : isRegex(pattern) ? "RegExp(" + pattern.toString() + ")" : pattern.toString(); } function getDomainFromUrl(url) { return url.match(/^(https?|mock|file):\/\//) ? url.split("/").slice(0, 3).join("/") : getDomain(); } function onCloseWindow(win, callback, delay, maxtime) { void 0 === delay && (delay = 1e3); void 0 === maxtime && (maxtime = 1 / 0); var timeout; !function check() { if (isWindowClosed(win)) { timeout && clearTimeout(timeout); return callback(); } if (maxtime <= 0) clearTimeout(timeout); else { maxtime -= delay; timeout = setTimeout(check, delay); } }(); return { cancel: function() { timeout && clearTimeout(timeout); } }; } function isWindow(obj) { try { if (obj === window) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if ("[object Window]" === {}.toString.call(obj)) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if (window.Window && obj instanceof window.Window) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if (obj && obj.self === obj) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if (obj && obj.parent === obj) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if (obj && obj.top === obj) return !0; } catch (err) { if (err && err.message === IE_WIN_ACCESS_ERROR) return !0; } try { if (obj && "__unlikely_value__" === obj.__cross_domain_utils_window_check__) return !1; } catch (err) { return !0; } try { if ("postMessage" in obj && "self" in obj && "location" in obj) return !0; } catch (err) {} return !1; } function isBrowser() { return "undefined" != typeof window && void 0 !== window.location; } function isCurrentDomain(domain) { return !!isBrowser() && getDomain() === domain; } function isMockDomain(domain) { return 0 === domain.indexOf(PROTOCOL.MOCK); } function normalizeMockUrl(url) { if (!isMockDomain(getDomainFromUrl(url))) return url; throw new Error("Mock urls not supported out of test mode"); } function getFrameForWindow(win) { if (isSameDomain(win)) return assertSameDomain(win).frameElement; for (var _i21 = 0, _document$querySelect2 = document.querySelectorAll("iframe"); _i21 < _document$querySelect2.length; _i21++) { var frame = _document$querySelect2[_i21]; if (frame && frame.contentWindow && frame.contentWindow === win) return frame; } } function closeWindow(win) { if (isIframe(win)) { var frame = getFrameForWindow(win); if (frame && frame.parentElement) { frame.parentElement.removeChild(frame); return; } } try { win.close(); } catch (err) {} } var TYPES = !0; } ]); }));