cross-domain-utils
Version:
Javascript module template.
746 lines • 30.9 kB
JavaScript
!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;
} ]);
}));