diff --git a/bower.json b/bower.json index a39f331..886ea1e 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "across-tabs", "description": "Easily communicate among browser tabs(supports cross-origin)", - "version": "0.1.9", + "version": "1.0.0", "homepage": "https://github.com/wingify/across-tabs", "bugs": "https://github.com/wingify/across-tabs/issues", "author": { diff --git a/dist/across-tabs.js b/dist/across-tabs.js index b0bb981..5c683c2 100644 --- a/dist/across-tabs.js +++ b/dist/across-tabs.js @@ -1,6 +1,6 @@ /*! * - * across-tabs "0.1.9" + * across-tabs "1.0.0" * https://github.com/wingify/across-tabs.js * MIT licensed * @@ -165,6 +165,8 @@ return /******/ (function(modules) { // webpackBootstrap this.Tab = _tab2.default; _extends(this, config); + _tab4.default.config = config; + if (this.shouldInitImmediately) { this.init(); } @@ -559,7 +561,8 @@ return /******/ (function(modules) { // webpackBootstrap */ var tabUtils = { - tabs: [] + tabs: [], + config: {} }; /** @@ -639,7 +642,7 @@ return /******/ (function(modules) { // webpackBootstrap tabUtils.closeTab = function (id) { var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id); - if (tab) { + if (tab && tab.ref) { tab.ref.close(); tab.status = _TabStatusEnum2.default.CLOSE; } @@ -655,9 +658,10 @@ return /******/ (function(modules) { // webpackBootstrap var i = void 0; for (i = 0; i < tabUtils.tabs.length; i++) { - // --tabUtils.tabs.length; - tabUtils.tabs[i].ref.close(); - tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE; + if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) { + tabUtils.tabs[i].ref.close(); + tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE; + } } return tabUtils; @@ -704,10 +708,12 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Boolean} isSiteInsideFrame */ tabUtils.sendMessage = function (target, msg, isSiteInsideFrame) { + var origin = tabUtils.config.origin || '*'; + if (isSiteInsideFrame) { - target.ref[0].postMessage(msg, '*'); + target.ref[0].postMessage(msg, origin); } else { - target.ref.top.postMessage(msg, '*'); + target.ref.top.postMessage(msg, origin); } }; @@ -1173,6 +1179,11 @@ return /******/ (function(modules) { // webpackBootstrap return false; } + // `origin` check for secureity point of view + if (_tab2.default.config.origin && _tab2.default.config.origin !== message.origin) { + return false; + } + if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) { PostMessageListener._onLoad(data); } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) { @@ -1352,6 +1363,11 @@ return /******/ (function(modules) { // webpackBootstrap return; } + // `origin` check for secureity point of view + if (this.config.origin && this.config.origin !== message.origin) { + return; + } + // cancel timeout window.clearTimeout(this.timeout); @@ -1462,8 +1478,11 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'sendMessageToParent', value: function sendMessageToParent(msg) { + var origin = void 0; + if (window.top.opener) { - window.top.opener.postMessage(msg, '*'); + origin = this.config.origin || '*'; + window.top.opener.postMessage(msg, origin); } } }, { diff --git a/dist/across-tabs.js.map b/dist/across-tabs.js.map index e795476..a3f7a14 100644 --- a/dist/across-tabs.js.map +++ b/dist/across-tabs.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 3b250f80d9f276aed65b","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["AcrossTabs","Parent","Child","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","i","getAll","openedTabs","getOpened","length","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","id","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","target","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","key","value","returnPreference","obj","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","prototype","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","onCommunication","evt","_setData","sendMessageToParent","onInitialize","onParentCommunication","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 3b250f80d9f276aed65b\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: []\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n // --tabUtils.tabs.length;\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, '*');\n } else {\n target.ref.top.postMessage(msg, '*');\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n if (window.top.opener) {\n window.top.opener.postMessage(msg, '*');\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 26244148bfca180cb691","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["AcrossTabs","Parent","Child","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","i","getAll","openedTabs","getOpened","length","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","id","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","target","origin","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","key","value","returnPreference","obj","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","prototype","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","onCommunication","evt","_setData","sendMessageToParent","onInitialize","onParentCommunication","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 26244148bfca180cb691\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n tabUtils.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: [],\n config: {}\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab && tab.ref) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n let origin = tabUtils.config.origin || '*';\n\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, origin);\n } else {\n target.ref.top.postMessage(msg, origin);\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n // `origin` check for secureity point of view\n if (tabUtils.config.origin && tabUtils.config.origin !== message.origin) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // `origin` check for secureity point of view\n if (this.config.origin && this.config.origin !== message.origin) {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n let origin;\n\n if (window.top.opener) {\n origin = this.config.origin || '*';\n window.top.opener.postMessage(msg, origin);\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/across-tabs.min.js b/dist/across-tabs.min.js index 8e02dd2..0927fd6 100644 --- a/dist/across-tabs.min.js +++ b/dist/across-tabs.min.js @@ -1,13 +1,13 @@ /*! * - * across-tabs "0.1.9" + * across-tabs "1.0.0" * https://github.com/wingify/across-tabs.js * MIT licensed * * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar) * */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("AcrossTabs",[],t):"object"==typeof exports?exports.AcrossTabs=t():e.AcrossTabs=t()}(this,function(){return function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={exports:{},id:a,loaded:!1};return e[a].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),o=a(i),r=n(11),s=a(r),u={Parent:o["default"],Child:s["default"]};t["default"]=u,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t0;i>>>=1,o+=o)1&i&&(a=o+a);return a}},e._hexAligner=e._getIntAligner(16),e.prototype.toString=function(){return this.hexString},e}(n),t["default"]=n,e.exports=t["default"]},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={disable:function(e){if(!e)return!1;var t=void 0,n=document.querySelectorAll("["+e+"]");for(t=0;t-1?c._onLoad(t):t.indexOf(f["default"].CUSTOM)>-1?c._onCustomMessage(t):t.indexOf(f["default"].ON_BEFORE_UNLOAD)>-1&&c._onBeforeUnload(t))},t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t-1&&(this.config.onParentDisconnect&&this.config.onParentDisconnect(),window.removeEventListener("message",function(e){return t.onCommunication(e)})),a.indexOf(u["default"].HANDSHAKE_WITH_PARENT)>-1){var i=void 0;n=a.split(u["default"].HANDSHAKE_WITH_PARENT)[1],this._setData(n),this._parseData(n),i=u["default"].CUSTOM+JSON.stringify({id:this.tabId,isSiteInsideFrame:this.config.isSiteInsideFrame}),this.sendMessageToParent(i),this.config.onInitialize&&this.config.onInitialize()}if(a.indexOf(u["default"].PARENT_COMMUNICATED)>-1){n=a.split(u["default"].PARENT_COMMUNICATED)[1];try{n=JSON.parse(n)}catch(o){throw new Error(l["default"].INVALID_JSON)}this.config.onParentCommunication&&this.config.onParentCommunication(n)}}}},{key:"addListeners",value:function(){var e=this;window.onbeforeunload=function(t){var n=u["default"].ON_BEFORE_UNLOAD+JSON.stringify({id:e.tabId,isSiteInsideFrame:e.config.isSiteInsideFrame});e.sendMessageToParent(n)},window.removeEventListener("message",function(t){return e.onCommunication(t)}),window.addEventListener("message",function(t){return e.onCommunication(t)})}},{key:"setHandshakeExpiry",value:function(){var e=this;return window.setTimeout(function(){e.config.onHandShakeExpiry&&e.config.onHandShakeExpiry()},this.handshakeExpiryLimit)}},{key:"sendMessageToParent",value:function(e){window.top.opener&&window.top.opener.postMessage(e,"*")}},{key:"getTabInfo",value:function(){return{id:this.tabId,name:this.tabName,parentName:this.tabParentName,isSiteInsideFrame:this.config.isSiteInsideFrame}}},{key:"init",value:function(){this.isSessionStorageSupported=this._isSessionStorage(),this.addListeners(),this._restoreData(),this.sendMessageToParent(u["default"].LOADED+JSON.stringify(this.getTabInfo())),this.timeout=this.setHandshakeExpiry(),this.config.onReady&&this.config.onReady()}}]),e}();t["default"]=f,e.exports=t["default"]}])}); +var n=void 0;n=function(){function e(){}return e.generate=function(){var t=e._getRandomInt,n=e._hexAligner;return n(t(32),8)+"-"+n(t(16),4)+"-"+n(16384|t(12),4)+"-"+n(32768|t(14),4)+"-"+n(t(48),12)},e._getRandomInt=function(e){return e<0?NaN:e<=30?0|Math.random()*(1<0;i>>>=1,o+=o)1&i&&(a=o+a);return a}},e._hexAligner=e._getIntAligner(16),e.prototype.toString=function(){return this.hexString},e}(n),t["default"]=n,e.exports=t["default"]},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={disable:function(e){if(!e)return!1;var t=void 0,n=document.querySelectorAll("["+e+"]");for(t=0;t-1?c._onLoad(t):t.indexOf(f["default"].CUSTOM)>-1?c._onCustomMessage(t):t.indexOf(f["default"].ON_BEFORE_UNLOAD)>-1&&c._onBeforeUnload(t)))},t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t-1&&(this.config.onParentDisconnect&&this.config.onParentDisconnect(),window.removeEventListener("message",function(e){return t.onCommunication(e)})),a.indexOf(u["default"].HANDSHAKE_WITH_PARENT)>-1){var i=void 0;n=a.split(u["default"].HANDSHAKE_WITH_PARENT)[1],this._setData(n),this._parseData(n),i=u["default"].CUSTOM+JSON.stringify({id:this.tabId,isSiteInsideFrame:this.config.isSiteInsideFrame}),this.sendMessageToParent(i),this.config.onInitialize&&this.config.onInitialize()}if(a.indexOf(u["default"].PARENT_COMMUNICATED)>-1){n=a.split(u["default"].PARENT_COMMUNICATED)[1];try{n=JSON.parse(n)}catch(o){throw new Error(l["default"].INVALID_JSON)}this.config.onParentCommunication&&this.config.onParentCommunication(n)}}}},{key:"addListeners",value:function(){var e=this;window.onbeforeunload=function(t){var n=u["default"].ON_BEFORE_UNLOAD+JSON.stringify({id:e.tabId,isSiteInsideFrame:e.config.isSiteInsideFrame});e.sendMessageToParent(n)},window.removeEventListener("message",function(t){return e.onCommunication(t)}),window.addEventListener("message",function(t){return e.onCommunication(t)})}},{key:"setHandshakeExpiry",value:function(){var e=this;return window.setTimeout(function(){e.config.onHandShakeExpiry&&e.config.onHandShakeExpiry()},this.handshakeExpiryLimit)}},{key:"sendMessageToParent",value:function(e){var t=void 0;window.top.opener&&(t=this.config.origin||"*",window.top.opener.postMessage(e,t))}},{key:"getTabInfo",value:function(){return{id:this.tabId,name:this.tabName,parentName:this.tabParentName,isSiteInsideFrame:this.config.isSiteInsideFrame}}},{key:"init",value:function(){this.isSessionStorageSupported=this._isSessionStorage(),this.addListeners(),this._restoreData(),this.sendMessageToParent(u["default"].LOADED+JSON.stringify(this.getTabInfo())),this.timeout=this.setHandshakeExpiry(),this.config.onReady&&this.config.onReady()}}]),e}();t["default"]=f,e.exports=t["default"]}])}); //# sourceMappingURL=across-tabs.min.js.map \ No newline at end of file diff --git a/dist/across-tabs.min.js.map b/dist/across-tabs.min.js.map index b0821df..fc2da01 100644 --- a/dist/across-tabs.min.js.map +++ b/dist/across-tabs.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///across-tabs.min.js","webpack:///webpack/bootstrap 2c725a658beab6d3ae05","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_parent","_parent2","_child","_child2","AcrossTabs","Parent","Child","_classCallCheck","instance","Constructor","TypeError","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","_tab","_tab2","_tab3","_tab4","_dom","_dom2","_TabStatusEnum","_TabStatusEnum2","_WarningTextEnum","_WarningTextEnum2","_PostMessageEventNamesEnum","_PostMessageEventNamesEnum2","_postmessage","_postmessage2","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","getAll","openedTabs","getOpened","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","_this","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","_this2","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","_uuid","_uuid2","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","_array","_array2","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","returnPreference","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","evt","onCommunication","_setData","sendMessageToParent","onInitialize","onParentCommunication","_this3","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","/*!\n * \n * across-tabs \"0.1.9\"\n * https://github.com/wingify/across-tabs.js\n * MIT licensed\n * \n * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar)\n * \n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _parent = __webpack_require__(1);\n\t\n\tvar _parent2 = _interopRequireDefault(_parent);\n\t\n\tvar _child = __webpack_require__(11);\n\t\n\tvar _child2 = _interopRequireDefault(_child);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Expose Parent and Child modules on AcrossTabs Object\n\t * @type {Object}\n\t */\n\tvar AcrossTabs = {\n\t Parent: _parent2.default,\n\t Child: _child2.default\n\t};\n\t\n\texports.default = AcrossTabs;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(2);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _tab3 = __webpack_require__(3);\n\t\n\tvar _tab4 = _interopRequireDefault(_tab3);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _postmessage = __webpack_require__(10);\n\t\n\tvar _postmessage2 = _interopRequireDefault(_postmessage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar heartBeat = void 0,\n\t tab = void 0;\n\t\n\t// Named Class expression\n\t\n\tvar Parent = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Parent(config) {\n\t _classCallCheck(this, Parent);\n\t\n\t config = config || {};\n\t if (typeof config.heartBeatInterval === 'undefined') {\n\t config.heartBeatInterval = 500;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t // reset tabs with every new Object\n\t _tab4.default.tabs = [];\n\t\n\t this.Tab = _tab2.default;\n\t _extends(this, config);\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Parent, [{\n\t key: 'addInterval',\n\t value: function addInterval() {\n\t var i = void 0,\n\t tabs = _tab4.default.getAll(),\n\t openedTabs = _tab4.default.getOpened();\n\t\n\t // don't poll if all tabs are in CLOSED states\n\t if (!openedTabs || !openedTabs.length) {\n\t window.clearInterval(heartBeat); // stop the interval\n\t heartBeat = null;\n\t return false;\n\t }\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t if (this.removeClosedTabs) {\n\t this.watchStatus(tabs[i]);\n\t }\n\t /**\n\t * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n\t * irrespective of heatbeat controller\n\t */\n\t if (tabs[i]) {\n\t tabs[i].status = tabs[i].ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN;\n\t }\n\t }\n\t\n\t // Call the user-defined callback after every polling operation is operted in a single run\n\t if (this.onPollingCallback) {\n\t this.onPollingCallback();\n\t }\n\t }\n\t }, {\n\t key: 'startPollingTabs',\n\t\n\t\n\t /**\n\t * Poll all tabs for their status - OPENED / CLOSED\n\t * An interval is created which checks for last and current status.\n\t * There's a property on window i.e. `closed` which returns true for the closed window.\n\t * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n\t */\n\t value: function startPollingTabs() {\n\t var _this = this;\n\t\n\t heartBeat = window.setInterval(function () {\n\t return _this.addInterval();\n\t }, this.heartBeatInterval);\n\t }\n\t }, {\n\t key: 'watchStatus',\n\t\n\t\n\t /**\n\t * Compare tab status - OPEN vs CLOSE\n\t * @param {Object} tab\n\t */\n\t value: function watchStatus(tab) {\n\t if (!tab) {\n\t return false;\n\t }\n\t var newStatus = tab.ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN,\n\t oldStatus = tab.status;\n\t\n\t // If last and current status(inside a polling interval) are same, don't do anything\n\t if (!newStatus || newStatus === oldStatus) {\n\t return false;\n\t }\n\t\n\t // OPEN to CLOSE state\n\t if (oldStatus === _TabStatusEnum2.default.OPEN && newStatus === _TabStatusEnum2.default.CLOSE) {\n\t // remove tab from tabUtils\n\t _tab4.default._remove(tab);\n\t }\n\t // Change from CLOSE to OPEN state is never gonna happen ;)\n\t }\n\t }, {\n\t key: 'onChildUnload',\n\t\n\t\n\t /**\n\t * Called when a child is refreshed/closed\n\t * @param {Object} ev - Event\n\t */\n\t value: function onChildUnload(ev) {\n\t if (this.onChildDisconnect) {\n\t this.onChildDisconnect(ev.detail);\n\t }\n\t }\n\t\n\t /**\n\t * Enable link/btn, which got disabled on clicking.\n\t * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n\t * @param {Object} ev - Event\n\t */\n\t\n\t }, {\n\t key: 'customEventUnListener',\n\t value: function customEventUnListener(ev) {\n\t this.enableElements();\n\t if (this.onHandshakeCallback) {\n\t this.onHandshakeCallback(ev.detail);\n\t }\n\t }\n\t }, {\n\t key: 'addEventListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage, native and custom listeners to the window\n\t */\n\t value: function addEventListeners() {\n\t var _this2 = this;\n\t\n\t window.removeEventListener('message', _postmessage2.default.onNewTab);\n\t window.addEventListener('message', _postmessage2.default.onNewTab);\n\t\n\t window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n\t window.addEventListener('toggleElementDisabledAttribute', function (ev) {\n\t return _this2.customEventUnListener(ev);\n\t });\n\t\n\t window.removeEventListener('onChildUnload', this.onChildUnload);\n\t window.addEventListener('onChildUnload', function (ev) {\n\t return _this2.onChildUnload(ev);\n\t });\n\t\n\t // Let children tabs know when Parent is closed / refereshed.\n\t window.onbeforeunload = function () {\n\t _tab4.default.broadCastAll(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED);\n\t };\n\t }\n\t }, {\n\t key: 'enableElements',\n\t\n\t\n\t /**\n\t * API methods exposed for Public\n\t *\n\t * Re-enable the link/btn which got disabled on clicking\n\t */\n\t value: function enableElements() {\n\t _dom2.default.enable('data-tab-opener');\n\t }\n\t }, {\n\t key: 'getAllTabs',\n\t\n\t\n\t /**\n\t * Return list of all tabs\n\t * @return {Array}\n\t */\n\t value: function getAllTabs() {\n\t return _tab4.default.getAll();\n\t }\n\t }, {\n\t key: 'getOpenedTabs',\n\t\n\t\n\t /**\n\t * Return list of all OPENED tabs\n\t * @return {Array}\n\t */\n\t value: function getOpenedTabs() {\n\t return _tab4.default.getOpened();\n\t }\n\t }, {\n\t key: 'getClosedTabs',\n\t\n\t\n\t /**\n\t * Return list of all CLOSED tabs\n\t * @return {Array}\n\t */\n\t value: function getClosedTabs() {\n\t return _tab4.default.getClosed();\n\t }\n\t\n\t /**\n\t * Close all tabs at once\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'closeAllTabs',\n\t value: function closeAllTabs() {\n\t return _tab4.default.closeAll();\n\t }\n\t }, {\n\t key: 'closeTab',\n\t\n\t\n\t /**\n\t * Close a specific tab\n\t * @return {Object}\n\t */\n\t value: function closeTab(id) {\n\t return _tab4.default.closeTab(id);\n\t }\n\t }, {\n\t key: 'broadCastAll',\n\t\n\t\n\t /**\n\t * Send a postmessage to all OPENED tabs\n\t * @return {Object}\n\t */\n\t value: function broadCastAll(msg) {\n\t return _tab4.default.broadCastAll(msg);\n\t }\n\t\n\t /**\n\t * Send a postmessage to a specific tab\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'broadCastTo',\n\t value: function broadCastTo(id, msg) {\n\t return _tab4.default.broadCastTo(id, msg);\n\t }\n\t\n\t /**\n\t * Open a new tab. Config has to be passed with some required keys\n\t * @return {Object} tab\n\t */\n\t\n\t }, {\n\t key: 'openNewTab',\n\t value: function openNewTab(config) {\n\t if (!config) {\n\t throw new Error(_WarningTextEnum2.default.CONFIG_REQUIRED);\n\t }\n\t\n\t var url = config.url;\n\t\n\t if (!url) {\n\t throw new Error(_WarningTextEnum2.default.URL_REQUIRED);\n\t }\n\t\n\t tab = new this.Tab();\n\t tab.create(config);\n\t\n\t // If polling is already there, don't set it again\n\t if (!heartBeat) {\n\t this.startPollingTabs();\n\t }\n\t\n\t return tab;\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t\n\t /**\n\t * API methods exposed for Public ends here\n\t **/\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.addEventListeners();\n\t }\n\t }]);\n\t\n\t return Parent;\n\t}();\n\t\n\t;\n\t\n\texports.default = Parent;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _uuid = __webpack_require__(8);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Tab = function () {\n\t /**\n\t * Invoked when the object is instantiated\n\t */\n\t function Tab() {\n\t _classCallCheck(this, Tab);\n\t\n\t // Set name of Parent tab if not already defined\n\t window.name = window.name || 'PARENT_TAB';\n\t }\n\t\n\t _createClass(Tab, [{\n\t key: 'create',\n\t\n\t /**\n\t * Open a new tab\n\t * @param {Object} config - Refer API for config keys\n\t * @return {Object} this\n\t */\n\t value: function create(config) {\n\t config = config || {};\n\t _extends(this, config);\n\t this.id = _uuid2.default.generate() || _tab2.default.tabs.length + 1;\n\t this.status = 'open';\n\t // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n\t this.ref = window.open(this.url, '_blank', config.windowFeatures);\n\t\n\t _dom2.default.disable('data-tab-opener');\n\t\n\t window.newlyTabOpened = {\n\t id: this.id,\n\t name: this.name,\n\t ref: this.ref\n\t };\n\t\n\t // Push it to the list of tabs\n\t _tab2.default.addNew(this);\n\t\n\t // Return reference for chaining purpose\n\t return this;\n\t }\n\t }]);\n\t\n\t return Tab;\n\t}();\n\t\n\t;\n\t\n\texports.default = Tab;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * A Tab utility file to deal with tab operations\n\t */\n\t\n\tvar tabUtils = {\n\t tabs: []\n\t};\n\t\n\t/**\n\t * Remove a tab from a list of all tabs.\n\t * This is required when users opts for removing the closed tabs from the list of tabs.\n\t * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n\t * @param {Object} tab\n\t */\n\ttabUtils._remove = function (tab) {\n\t var index = void 0;\n\t\n\t index = _array2.default.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n\t tabUtils.tabs.splice(index, 1);\n\t};\n\t\n\t/**\n\t * As explained in `event-listeners/postmessage.js` file,\n\t * the data received from postmessage API is further processed based on our convention\n\t * @param {String} msg\n\t * @return {String} modified msg\n\t */\n\ttabUtils._preProcessMessage = function (msg) {\n\t // make msg always an object to support JSON support\n\t try {\n\t msg = JSON.stringify(msg);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (msg.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) === -1) {\n\t msg = _PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED + msg;\n\t }\n\t\n\t return msg;\n\t};\n\t/**\n\t * Add a new tab to the Array of tabs\n\t * @param {Object} tab\n\t * @return {Object} - this\n\t */\n\ttabUtils.addNew = function (tab) {\n\t tabUtils.tabs.push(tab);\n\t return undefined;\n\t};\n\t/**\n\t * Filter out all the opened tabs\n\t * @return {Array} - only the opened tabs\n\t */\n\ttabUtils.getOpened = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.OPEN;\n\t });\n\t};\n\t/**\n\t * Filter out all the closed tabs\n\t * @return {Array} - only the closed tabs\n\t */\n\ttabUtils.getClosed = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.CLOSE;\n\t });\n\t};\n\t/**\n\t * To get list of all tabs(closed/opened).\n\t * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n\t * @return {Array} - list of all tabs\n\t */\n\ttabUtils.getAll = function () {\n\t return tabUtils.tabs;\n\t};\n\t\n\t/**\n\t * Close a specific tab\n\t * @param {String} id\n\t * @return {Object} this\n\t */\n\ttabUtils.closeTab = function (id) {\n\t var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id);\n\t\n\t if (tab) {\n\t tab.ref.close();\n\t tab.status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t // --tabUtils.tabs.length;\n\t};\n\t/**\n\t * Close all opened tabs using a native method `close` available on window.open reference.\n\t * @return {tabUtils} this\n\t */\n\ttabUtils.closeAll = function () {\n\t var i = void 0;\n\t\n\t for (i = 0; i < tabUtils.tabs.length; i++) {\n\t // --tabUtils.tabs.length;\n\t tabUtils.tabs[i].ref.close();\n\t tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastAll = function (msg, isSiteInsideFrame) {\n\t var i = void 0,\n\t tabs = tabUtils.getOpened();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to a specific Child tab\n\t * @param {String} id\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastTo = function (id, msg, isSiteInsideFrame) {\n\t var targetedTab = void 0,\n\t tabs = tabUtils.getAll();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t targetedTab = _array2.default.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n\t tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\t\n\t return tabUtils;\n\t};\n\t\n\t/**\n\t * Send a postMessage to the desired window/frame\n\t * @param {Object} target\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.sendMessage = function (target, msg, isSiteInsideFrame) {\n\t if (isSiteInsideFrame) {\n\t target.ref[0].postMessage(msg, '*');\n\t } else {\n\t target.ref.top.postMessage(msg, '*');\n\t }\n\t};\n\t\n\texports.default = tabUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for different event names used for tab-communication\n\t * @type {Object}\n\t */\n\tvar PostMessageEventNamesEnum = {\n\t LOADED: '__TAB__LOADED_EVENT__',\n\t CUSTOM: '__TAB__CUSTOM_EVENT__',\n\t ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n\t PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n\t HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n\t PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n\t};\n\t\n\texports.default = PostMessageEventNamesEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar arrayUtils = {};\n\t\n\t/**\n\t * Different type of data needed after searching an item(Object) within data(Array of Objects).\n\t * 1. `INDEX` returns just the index at which the item was present\n\t * 2. `OBJECT` returns the matched object\n\t * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n\t */\n\tvar returnPreferenceEnum = {\n\t INDEX: 'index',\n\t OBJECT: 'object',\n\t BOTH: 'both'\n\t};\n\t\n\t/**\n\t * Search for an item(Object) within a data-set(Array Of Objects)\n\t * @param {Array of Objects} data\n\t * @param {String} key - Unique key to search on the basis of\n\t * @param {String} value - The matching criteria\n\t * @param {String} returnPreference - what kind of output is needed\n\t * @return {Object}\n\t */\n\tarrayUtils.searchByKeyName = function (data, key, value, returnPreference) {\n\t if (!data || !key) {\n\t return false;\n\t }\n\t\n\t returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n\t var i = void 0,\n\t obj = void 0,\n\t returnData = void 0,\n\t index = -1;\n\t\n\t for (i = 0; i < data.length; i++) {\n\t obj = data[i];\n\t // Number matching support\n\t if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n\t index = i;\n\t break;\n\t } else if (isNaN(value) && obj[key] === value) {\n\t // String exact matching support\n\t index = i;\n\t break;\n\t }\n\t }\n\t\n\t if (index === -1) {\n\t // item not found\n\t data[index] = {}; // for consistency\n\t }\n\t\n\t switch (returnPreference) {\n\t case returnPreferenceEnum.INDEX:\n\t returnData = index;\n\t break;\n\t case returnPreferenceEnum.BOTH:\n\t returnData = {\n\t obj: data[index],\n\t index: index\n\t };\n\t break;\n\t case returnPreferenceEnum.OBJECT:\n\t default:\n\t returnData = data[index];\n\t break;\n\t }\n\t\n\t return returnData;\n\t};\n\t\n\texports.default = arrayUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for Tab status(still opened / closed) used for tab-communication\n\t * @type {Object}\n\t */\n\tvar TabStatusEnum = {\n\t OPEN: 'open',\n\t CLOSE: 'close'\n\t};\n\t\n\texports.default = TabStatusEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for showing various warnings to suser when things done wrong\n\t * @type {Object}\n\t */\n\tvar WarningTextEnum = {\n\t INVALID_JSON: 'Invalid JSON Object!',\n\t INVALID_DATA: 'Some wrong message is being sent by Parent.',\n\t CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n\t URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n\t};\n\t\n\texports.default = WarningTextEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * UUID.js: The RFC-compliant UUID generator for JavaScript.\n\t * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n\t *\n\t * @author LiosK\n\t * @version v3.3.0\n\t * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n\t */\n\t\n\t/** @constructor */\n\tvar UUID = void 0;\n\t\n\tUUID = function () {\n\t 'use strict';\n\t\n\t /** @lends UUID */\n\t\n\t function UUID() {}\n\t\n\t /**\n\t * The simplest function to get an UUID string.\n\t * @returns {string} A version 4 UUID string.\n\t */\n\t UUID.generate = function () {\n\t var rand = UUID._getRandomInt,\n\t hex = UUID._hexAligner;\n\t\n\t // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n\t return hex(rand(32), 8) + // time_low\n\t '-' + hex(rand(16), 4) + // time_mid\n\t '-' + hex(0x4000 | rand(12), 4) + // time_hi_and_version\n\t '-' + hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n\t '-' + hex(rand(48), 12); // node\n\t };\n\t\n\t /**\n\t * Returns an unsigned x-bit random integer.\n\t * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n\t * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n\t */\n\t UUID._getRandomInt = function (x) {\n\t if (x < 0) {\n\t return NaN;\n\t }\n\t if (x <= 30) {\n\t return 0 | Math.random() * (1 << x);\n\t }\n\t if (x <= 53) {\n\t return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n\t }\n\t\n\t return NaN;\n\t };\n\t\n\t /**\n\t * Returns a function that converts an integer to a zero-filled string.\n\t * @param {int} radix\n\t * @returns {function(num, length)}\n\t */\n\t UUID._getIntAligner = function (radix) {\n\t return function (num, length) {\n\t var str = num.toString(radix),\n\t i = length - str.length,\n\t z = '0';\n\t\n\t for (; i > 0; i >>>= 1, z += z) {\n\t if (i & 1) {\n\t str = z + str;\n\t }\n\t }\n\t return str;\n\t };\n\t };\n\t\n\t UUID._hexAligner = UUID._getIntAligner(16);\n\t\n\t /**\n\t * Returns UUID string representation.\n\t * @returns {string} {@link UUID#hexString}.\n\t */\n\t UUID.prototype.toString = function () {\n\t return this.hexString;\n\t };\n\t\n\t return UUID;\n\t}(UUID);\n\t\n\texports.default = UUID;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n\t * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n\t * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n\t * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n\t *\n\t * Open Tab\n\t */\n\tvar domUtils = {\n\t disable: function disable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].setAttribute('disabled', 'disabled');\n\t }\n\t },\n\t enable: function enable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].removeAttribute('disabled');\n\t }\n\t }\n\t};\n\t\n\texports.default = domUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar PostMessageListener = {};\n\t\n\t/*\n\t * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n\t * -------------------------------------------------------------------------------\n\t *\n\t * 1. First convetion\n\t Since data can be sent or receieved via postmessge API in the form of strings,\n\t the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n\t This is easy to maintain and deal with data.\n\t\n\t * 2. Second Convetions\n\t With every data, there's an associated message identifier.\n\t A message identifier helps in knowing the intention of what event actually is for.\n\t For eg: To send data after proper establishment from Child tab,\n\t Parent tab acknowledges the connection by returning the true identity of the Child tab.\n\t This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\t\n\t So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n\t So, while reading the message, it has to be first checked up with the defined event names\n\t and then after successful match, the message is split using the Event-name as a delimiter.\n\t The first entry if the event name and the second one is the actual data.\n\t *\n\t */\n\t\n\t/**\n\t * OnLoad Event - it serves as an communication establishment source from Child tab\n\t */\n\tPostMessageListener._onLoad = function (data) {\n\t var tabs = void 0,\n\t dataToSend = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.LOADED)[1];\n\t\n\t // Child was opened but parent got refereshed, opened a tab i.e.\n\t // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n\t if (tabInfo) {\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t // If Child knows its UUID, means Parent was refreshed and Child did not\n\t if (tabInfo.id) {\n\t tabs = _tab2.default.getAll();\n\t if (tabs.length) {\n\t window.newlyTabOpened = tabs[tabs.length - 1];\n\t window.newlyTabOpened.id = tabInfo.id;\n\t window.newlyTabOpened.name = tabInfo.name;\n\t }\n\t }\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t\n\t if (window.newlyTabOpened) {\n\t try {\n\t dataToSend = _PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT;\n\t dataToSend += JSON.stringify({\n\t id: window.newlyTabOpened.id,\n\t name: window.newlyTabOpened.name,\n\t parentName: window.name\n\t });\n\t _tab2.default.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * onCustomMessage Event - Any sort of custom message by child is treated here\n\t * @param {Object} data\n\t *\n\t * The method fires an event to notify Parent regarding Child's behavior\n\t */\n\tPostMessageListener._onCustomMessage = function (data) {\n\t var tabInfo = data.split(_PostMessageEventNamesEnum2.default.CUSTOM)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('toggleElementDisabledAttribute', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t window.newlyTabOpened = null;\n\t};\n\t\n\t/**\n\t * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n\t * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n\t *\n\t * It sets the newlyTabOpened variable accordingly\n\t *\n\t * @param {Object} data\n\t */\n\tPostMessageListener._onBeforeUnload = function (data) {\n\t var tabs = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (_tab2.default.tabs.length) {\n\t tabs = _tab2.default.getAll();\n\t window.newlyTabOpened = _array2.default.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('onChildUnload', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t};\n\t\n\t/**\n\t * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n\t * @param {Object} message\n\t */\n\tPostMessageListener.onNewTab = function (message) {\n\t var data = message.data;\n\t\n\t /**\n\t * Safe check - This happens when CHild Tab gets closed just after sending a message.\n\t * No need to go further from this point.\n\t * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n\t */\n\t if (!data || typeof data !== 'string' || !_tab2.default.tabs.length) {\n\t return false;\n\t }\n\t\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) {\n\t PostMessageListener._onLoad(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) {\n\t PostMessageListener._onCustomMessage(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD) > -1) {\n\t PostMessageListener._onBeforeUnload(data);\n\t }\n\t};\n\t\n\texports.default = PostMessageListener;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Child = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Child(config) {\n\t _classCallCheck(this, Child);\n\t\n\t this.sessionStorageKey = '__vwo_new_tab_info__';\n\t\n\t if (!config) {\n\t config = {};\n\t }\n\t if (typeof config.handshakeExpiryLimit === 'undefined') {\n\t config.handshakeExpiryLimit = 5000;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t this.tabName = window.name;\n\t this.tabId = null;\n\t this.tabParentName = null;\n\t\n\t _extends(this, config);\n\t this.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Child, [{\n\t key: '_isSessionStorage',\n\t\n\t\n\t /**\n\t * Check is sessionStorage is present on window\n\t * @return {Boolean} [description]\n\t */\n\t value: function _isSessionStorage() {\n\t if ('sessionStorage' in window && window.sessionStorage) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: '_getData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _getData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t return window.sessionStorage.getItem(this.sessionStorageKey);\n\t }\n\t }, {\n\t key: '_setData',\n\t\n\t\n\t /**\n\t * Set stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _setData(dataReceived) {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n\t return dataReceived;\n\t }\n\t }, {\n\t key: '_restoreData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage and parse it\n\t * @return {Object} data\n\t */\n\t value: function _restoreData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t if (this.isSessionStorageSupported) {\n\t var storedData = this._getData();\n\t\n\t this._parseData(storedData);\n\t }\n\t }\n\t }, {\n\t key: '_parseData',\n\t\n\t\n\t /**\n\t * Parse data fetched from sessionStorage\n\t * @param {String} dataReceived\n\t */\n\t value: function _parseData(dataReceived) {\n\t var actualData = void 0;\n\t\n\t // Expecting JSON data\n\t try {\n\t actualData = JSON.parse(dataReceived);\n\t this.tabId = actualData && actualData.id;\n\t this.tabParentName = actualData && actualData.parentName;\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_DATA);\n\t };\n\t }\n\t }, {\n\t key: 'onCommunication',\n\t\n\t\n\t /**\n\t * The core of this file\n\t * This method receives the postmessage from Parent\n\t * after establishing a proper communication channel between Parent tab and Child tab.\n\t * It removes the handshake timeout.\n\t * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n\t *\n\t * @param {String} message\n\t */\n\t value: function onCommunication(message) {\n\t var _this = this;\n\t\n\t var dataReceived = void 0,\n\t data = message.data;\n\t\n\t if (!data || typeof data !== 'string') {\n\t return;\n\t }\n\t\n\t // cancel timeout\n\t window.clearTimeout(this.timeout);\n\t\n\t // When Parent tab gets closed or refereshed\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED) > -1) {\n\t // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n\t if (this.config.onParentDisconnect) {\n\t this.config.onParentDisconnect();\n\t }\n\t\n\t // remove postMessage listener since no Parent is there to communicate with\n\t window.removeEventListener('message', function (evt) {\n\t return _this.onCommunication(evt);\n\t });\n\t }\n\t\n\t /**\n\t * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n\t * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n\t */\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT) > -1) {\n\t var msg = void 0;\n\t\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT)[1];\n\t\n\t // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n\t this._setData(dataReceived);\n\t this._parseData(dataReceived);\n\t\n\t msg = _PostMessageEventNamesEnum2.default.CUSTOM + JSON.stringify({\n\t id: this.tabId,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t });\n\t this.sendMessageToParent(msg);\n\t\n\t if (this.config.onInitialize) {\n\t this.config.onInitialize();\n\t }\n\t }\n\t\n\t // Whenever Parent tab communicates once the communication channel is established\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) > -1) {\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED)[1];\n\t\n\t try {\n\t dataReceived = JSON.parse(dataReceived);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n\t if (this.config.onParentCommunication) {\n\t this.config.onParentCommunication(dataReceived);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'addListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage and onbeforeunload event listeners\n\t */\n\t value: function addListeners() {\n\t var _this2 = this;\n\t\n\t window.onbeforeunload = function (evt) {\n\t var msg = _PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD + JSON.stringify({\n\t id: _this2.tabId,\n\t isSiteInsideFrame: _this2.config.isSiteInsideFrame\n\t });\n\t\n\t _this2.sendMessageToParent(msg);\n\t };\n\t\n\t window.removeEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t window.addEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t }\n\t }, {\n\t key: 'setHandshakeExpiry',\n\t\n\t\n\t /**\n\t * Call a user-defined method `onHandShakeExpiry`\n\t * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n\t * @return {Function}\n\t */\n\t value: function setHandshakeExpiry() {\n\t var _this3 = this;\n\t\n\t return window.setTimeout(function () {\n\t if (_this3.config.onHandShakeExpiry) {\n\t _this3.config.onHandShakeExpiry();\n\t }\n\t }, this.handshakeExpiryLimit);\n\t }\n\t\n\t /**\n\t * API starts here ->\n\t *\n\t * Send a postmessage to the corresponding Parent tab\n\t * @param {String} msg\n\t = */\n\t\n\t }, {\n\t key: 'sendMessageToParent',\n\t value: function sendMessageToParent(msg) {\n\t if (window.top.opener) {\n\t window.top.opener.postMessage(msg, '*');\n\t }\n\t }\n\t }, {\n\t key: 'getTabInfo',\n\t\n\t\n\t /**\n\t * Get current Tab info i.e. id, name and parentName\n\t * @return {Object} tab-info\n\t */\n\t value: function getTabInfo() {\n\t return {\n\t id: this.tabId,\n\t name: this.tabName,\n\t parentName: this.tabParentName,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t };\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t /**\n\t * API ends here ->\n\t */\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.isSessionStorageSupported = this._isSessionStorage();\n\t this.addListeners();\n\t this._restoreData();\n\t this.sendMessageToParent(_PostMessageEventNamesEnum2.default.LOADED + JSON.stringify(this.getTabInfo()));\n\t this.timeout = this.setHandshakeExpiry();\n\t\n\t if (this.config.onReady) {\n\t this.config.onReady();\n\t }\n\t }\n\t }]);\n\t\n\t return Child;\n\t}();\n\t\n\t;\n\t\n\texports.default = Child;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** across-tabs.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 2c725a658beab6d3ae05\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: []\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n // --tabUtils.tabs.length;\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, '*');\n } else {\n target.ref.top.postMessage(msg, '*');\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n if (window.top.opener) {\n window.top.opener.postMessage(msg, '*');\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///across-tabs.min.js","webpack:///webpack/bootstrap d7c09f519413fa8dc6a4","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_parent","_parent2","_child","_child2","AcrossTabs","Parent","Child","_classCallCheck","instance","Constructor","TypeError","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","_tab","_tab2","_tab3","_tab4","_dom","_dom2","_TabStatusEnum","_TabStatusEnum2","_WarningTextEnum","_WarningTextEnum2","_PostMessageEventNamesEnum","_PostMessageEventNamesEnum2","_postmessage","_postmessage2","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","getAll","openedTabs","getOpened","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","_this","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","_this2","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","_uuid","_uuid2","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","_array","_array2","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","origin","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","returnPreference","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","evt","onCommunication","_setData","sendMessageToParent","onInitialize","onParentCommunication","_this3","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","/*!\n * \n * across-tabs \"1.0.0\"\n * https://github.com/wingify/across-tabs.js\n * MIT licensed\n * \n * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar)\n * \n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"AcrossTabs\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AcrossTabs\"] = factory();\n\telse\n\t\troot[\"AcrossTabs\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _parent = __webpack_require__(1);\n\t\n\tvar _parent2 = _interopRequireDefault(_parent);\n\t\n\tvar _child = __webpack_require__(11);\n\t\n\tvar _child2 = _interopRequireDefault(_child);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Expose Parent and Child modules on AcrossTabs Object\n\t * @type {Object}\n\t */\n\tvar AcrossTabs = {\n\t Parent: _parent2.default,\n\t Child: _child2.default\n\t};\n\t\n\texports.default = AcrossTabs;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(2);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _tab3 = __webpack_require__(3);\n\t\n\tvar _tab4 = _interopRequireDefault(_tab3);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _postmessage = __webpack_require__(10);\n\t\n\tvar _postmessage2 = _interopRequireDefault(_postmessage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar heartBeat = void 0,\n\t tab = void 0;\n\t\n\t// Named Class expression\n\t\n\tvar Parent = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Parent(config) {\n\t _classCallCheck(this, Parent);\n\t\n\t config = config || {};\n\t if (typeof config.heartBeatInterval === 'undefined') {\n\t config.heartBeatInterval = 500;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t // reset tabs with every new Object\n\t _tab4.default.tabs = [];\n\t\n\t this.Tab = _tab2.default;\n\t _extends(this, config);\n\t\n\t _tab4.default.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Parent, [{\n\t key: 'addInterval',\n\t value: function addInterval() {\n\t var i = void 0,\n\t tabs = _tab4.default.getAll(),\n\t openedTabs = _tab4.default.getOpened();\n\t\n\t // don't poll if all tabs are in CLOSED states\n\t if (!openedTabs || !openedTabs.length) {\n\t window.clearInterval(heartBeat); // stop the interval\n\t heartBeat = null;\n\t return false;\n\t }\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t if (this.removeClosedTabs) {\n\t this.watchStatus(tabs[i]);\n\t }\n\t /**\n\t * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n\t * irrespective of heatbeat controller\n\t */\n\t if (tabs[i]) {\n\t tabs[i].status = tabs[i].ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN;\n\t }\n\t }\n\t\n\t // Call the user-defined callback after every polling operation is operted in a single run\n\t if (this.onPollingCallback) {\n\t this.onPollingCallback();\n\t }\n\t }\n\t }, {\n\t key: 'startPollingTabs',\n\t\n\t\n\t /**\n\t * Poll all tabs for their status - OPENED / CLOSED\n\t * An interval is created which checks for last and current status.\n\t * There's a property on window i.e. `closed` which returns true for the closed window.\n\t * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n\t */\n\t value: function startPollingTabs() {\n\t var _this = this;\n\t\n\t heartBeat = window.setInterval(function () {\n\t return _this.addInterval();\n\t }, this.heartBeatInterval);\n\t }\n\t }, {\n\t key: 'watchStatus',\n\t\n\t\n\t /**\n\t * Compare tab status - OPEN vs CLOSE\n\t * @param {Object} tab\n\t */\n\t value: function watchStatus(tab) {\n\t if (!tab) {\n\t return false;\n\t }\n\t var newStatus = tab.ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN,\n\t oldStatus = tab.status;\n\t\n\t // If last and current status(inside a polling interval) are same, don't do anything\n\t if (!newStatus || newStatus === oldStatus) {\n\t return false;\n\t }\n\t\n\t // OPEN to CLOSE state\n\t if (oldStatus === _TabStatusEnum2.default.OPEN && newStatus === _TabStatusEnum2.default.CLOSE) {\n\t // remove tab from tabUtils\n\t _tab4.default._remove(tab);\n\t }\n\t // Change from CLOSE to OPEN state is never gonna happen ;)\n\t }\n\t }, {\n\t key: 'onChildUnload',\n\t\n\t\n\t /**\n\t * Called when a child is refreshed/closed\n\t * @param {Object} ev - Event\n\t */\n\t value: function onChildUnload(ev) {\n\t if (this.onChildDisconnect) {\n\t this.onChildDisconnect(ev.detail);\n\t }\n\t }\n\t\n\t /**\n\t * Enable link/btn, which got disabled on clicking.\n\t * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n\t * @param {Object} ev - Event\n\t */\n\t\n\t }, {\n\t key: 'customEventUnListener',\n\t value: function customEventUnListener(ev) {\n\t this.enableElements();\n\t if (this.onHandshakeCallback) {\n\t this.onHandshakeCallback(ev.detail);\n\t }\n\t }\n\t }, {\n\t key: 'addEventListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage, native and custom listeners to the window\n\t */\n\t value: function addEventListeners() {\n\t var _this2 = this;\n\t\n\t window.removeEventListener('message', _postmessage2.default.onNewTab);\n\t window.addEventListener('message', _postmessage2.default.onNewTab);\n\t\n\t window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n\t window.addEventListener('toggleElementDisabledAttribute', function (ev) {\n\t return _this2.customEventUnListener(ev);\n\t });\n\t\n\t window.removeEventListener('onChildUnload', this.onChildUnload);\n\t window.addEventListener('onChildUnload', function (ev) {\n\t return _this2.onChildUnload(ev);\n\t });\n\t\n\t // Let children tabs know when Parent is closed / refereshed.\n\t window.onbeforeunload = function () {\n\t _tab4.default.broadCastAll(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED);\n\t };\n\t }\n\t }, {\n\t key: 'enableElements',\n\t\n\t\n\t /**\n\t * API methods exposed for Public\n\t *\n\t * Re-enable the link/btn which got disabled on clicking\n\t */\n\t value: function enableElements() {\n\t _dom2.default.enable('data-tab-opener');\n\t }\n\t }, {\n\t key: 'getAllTabs',\n\t\n\t\n\t /**\n\t * Return list of all tabs\n\t * @return {Array}\n\t */\n\t value: function getAllTabs() {\n\t return _tab4.default.getAll();\n\t }\n\t }, {\n\t key: 'getOpenedTabs',\n\t\n\t\n\t /**\n\t * Return list of all OPENED tabs\n\t * @return {Array}\n\t */\n\t value: function getOpenedTabs() {\n\t return _tab4.default.getOpened();\n\t }\n\t }, {\n\t key: 'getClosedTabs',\n\t\n\t\n\t /**\n\t * Return list of all CLOSED tabs\n\t * @return {Array}\n\t */\n\t value: function getClosedTabs() {\n\t return _tab4.default.getClosed();\n\t }\n\t\n\t /**\n\t * Close all tabs at once\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'closeAllTabs',\n\t value: function closeAllTabs() {\n\t return _tab4.default.closeAll();\n\t }\n\t }, {\n\t key: 'closeTab',\n\t\n\t\n\t /**\n\t * Close a specific tab\n\t * @return {Object}\n\t */\n\t value: function closeTab(id) {\n\t return _tab4.default.closeTab(id);\n\t }\n\t }, {\n\t key: 'broadCastAll',\n\t\n\t\n\t /**\n\t * Send a postmessage to all OPENED tabs\n\t * @return {Object}\n\t */\n\t value: function broadCastAll(msg) {\n\t return _tab4.default.broadCastAll(msg);\n\t }\n\t\n\t /**\n\t * Send a postmessage to a specific tab\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'broadCastTo',\n\t value: function broadCastTo(id, msg) {\n\t return _tab4.default.broadCastTo(id, msg);\n\t }\n\t\n\t /**\n\t * Open a new tab. Config has to be passed with some required keys\n\t * @return {Object} tab\n\t */\n\t\n\t }, {\n\t key: 'openNewTab',\n\t value: function openNewTab(config) {\n\t if (!config) {\n\t throw new Error(_WarningTextEnum2.default.CONFIG_REQUIRED);\n\t }\n\t\n\t var url = config.url;\n\t\n\t if (!url) {\n\t throw new Error(_WarningTextEnum2.default.URL_REQUIRED);\n\t }\n\t\n\t tab = new this.Tab();\n\t tab.create(config);\n\t\n\t // If polling is already there, don't set it again\n\t if (!heartBeat) {\n\t this.startPollingTabs();\n\t }\n\t\n\t return tab;\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t\n\t /**\n\t * API methods exposed for Public ends here\n\t **/\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.addEventListeners();\n\t }\n\t }]);\n\t\n\t return Parent;\n\t}();\n\t\n\t;\n\t\n\texports.default = Parent;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _uuid = __webpack_require__(8);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Tab = function () {\n\t /**\n\t * Invoked when the object is instantiated\n\t */\n\t function Tab() {\n\t _classCallCheck(this, Tab);\n\t\n\t // Set name of Parent tab if not already defined\n\t window.name = window.name || 'PARENT_TAB';\n\t }\n\t\n\t _createClass(Tab, [{\n\t key: 'create',\n\t\n\t /**\n\t * Open a new tab\n\t * @param {Object} config - Refer API for config keys\n\t * @return {Object} this\n\t */\n\t value: function create(config) {\n\t config = config || {};\n\t _extends(this, config);\n\t this.id = _uuid2.default.generate() || _tab2.default.tabs.length + 1;\n\t this.status = 'open';\n\t // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n\t this.ref = window.open(this.url, '_blank', config.windowFeatures);\n\t\n\t _dom2.default.disable('data-tab-opener');\n\t\n\t window.newlyTabOpened = {\n\t id: this.id,\n\t name: this.name,\n\t ref: this.ref\n\t };\n\t\n\t // Push it to the list of tabs\n\t _tab2.default.addNew(this);\n\t\n\t // Return reference for chaining purpose\n\t return this;\n\t }\n\t }]);\n\t\n\t return Tab;\n\t}();\n\t\n\t;\n\t\n\texports.default = Tab;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * A Tab utility file to deal with tab operations\n\t */\n\t\n\tvar tabUtils = {\n\t tabs: [],\n\t config: {}\n\t};\n\t\n\t/**\n\t * Remove a tab from a list of all tabs.\n\t * This is required when users opts for removing the closed tabs from the list of tabs.\n\t * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n\t * @param {Object} tab\n\t */\n\ttabUtils._remove = function (tab) {\n\t var index = void 0;\n\t\n\t index = _array2.default.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n\t tabUtils.tabs.splice(index, 1);\n\t};\n\t\n\t/**\n\t * As explained in `event-listeners/postmessage.js` file,\n\t * the data received from postmessage API is further processed based on our convention\n\t * @param {String} msg\n\t * @return {String} modified msg\n\t */\n\ttabUtils._preProcessMessage = function (msg) {\n\t // make msg always an object to support JSON support\n\t try {\n\t msg = JSON.stringify(msg);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (msg.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) === -1) {\n\t msg = _PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED + msg;\n\t }\n\t\n\t return msg;\n\t};\n\t/**\n\t * Add a new tab to the Array of tabs\n\t * @param {Object} tab\n\t * @return {Object} - this\n\t */\n\ttabUtils.addNew = function (tab) {\n\t tabUtils.tabs.push(tab);\n\t return undefined;\n\t};\n\t/**\n\t * Filter out all the opened tabs\n\t * @return {Array} - only the opened tabs\n\t */\n\ttabUtils.getOpened = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.OPEN;\n\t });\n\t};\n\t/**\n\t * Filter out all the closed tabs\n\t * @return {Array} - only the closed tabs\n\t */\n\ttabUtils.getClosed = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.CLOSE;\n\t });\n\t};\n\t/**\n\t * To get list of all tabs(closed/opened).\n\t * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n\t * @return {Array} - list of all tabs\n\t */\n\ttabUtils.getAll = function () {\n\t return tabUtils.tabs;\n\t};\n\t\n\t/**\n\t * Close a specific tab\n\t * @param {String} id\n\t * @return {Object} this\n\t */\n\ttabUtils.closeTab = function (id) {\n\t var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id);\n\t\n\t if (tab && tab.ref) {\n\t tab.ref.close();\n\t tab.status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t // --tabUtils.tabs.length;\n\t};\n\t/**\n\t * Close all opened tabs using a native method `close` available on window.open reference.\n\t * @return {tabUtils} this\n\t */\n\ttabUtils.closeAll = function () {\n\t var i = void 0;\n\t\n\t for (i = 0; i < tabUtils.tabs.length; i++) {\n\t if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n\t tabUtils.tabs[i].ref.close();\n\t tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastAll = function (msg, isSiteInsideFrame) {\n\t var i = void 0,\n\t tabs = tabUtils.getOpened();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to a specific Child tab\n\t * @param {String} id\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastTo = function (id, msg, isSiteInsideFrame) {\n\t var targetedTab = void 0,\n\t tabs = tabUtils.getAll();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t targetedTab = _array2.default.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n\t tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\t\n\t return tabUtils;\n\t};\n\t\n\t/**\n\t * Send a postMessage to the desired window/frame\n\t * @param {Object} target\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.sendMessage = function (target, msg, isSiteInsideFrame) {\n\t var origin = tabUtils.config.origin || '*';\n\t\n\t if (isSiteInsideFrame) {\n\t target.ref[0].postMessage(msg, origin);\n\t } else {\n\t target.ref.top.postMessage(msg, origin);\n\t }\n\t};\n\t\n\texports.default = tabUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for different event names used for tab-communication\n\t * @type {Object}\n\t */\n\tvar PostMessageEventNamesEnum = {\n\t LOADED: '__TAB__LOADED_EVENT__',\n\t CUSTOM: '__TAB__CUSTOM_EVENT__',\n\t ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n\t PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n\t HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n\t PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n\t};\n\t\n\texports.default = PostMessageEventNamesEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar arrayUtils = {};\n\t\n\t/**\n\t * Different type of data needed after searching an item(Object) within data(Array of Objects).\n\t * 1. `INDEX` returns just the index at which the item was present\n\t * 2. `OBJECT` returns the matched object\n\t * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n\t */\n\tvar returnPreferenceEnum = {\n\t INDEX: 'index',\n\t OBJECT: 'object',\n\t BOTH: 'both'\n\t};\n\t\n\t/**\n\t * Search for an item(Object) within a data-set(Array Of Objects)\n\t * @param {Array of Objects} data\n\t * @param {String} key - Unique key to search on the basis of\n\t * @param {String} value - The matching criteria\n\t * @param {String} returnPreference - what kind of output is needed\n\t * @return {Object}\n\t */\n\tarrayUtils.searchByKeyName = function (data, key, value, returnPreference) {\n\t if (!data || !key) {\n\t return false;\n\t }\n\t\n\t returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n\t var i = void 0,\n\t obj = void 0,\n\t returnData = void 0,\n\t index = -1;\n\t\n\t for (i = 0; i < data.length; i++) {\n\t obj = data[i];\n\t // Number matching support\n\t if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n\t index = i;\n\t break;\n\t } else if (isNaN(value) && obj[key] === value) {\n\t // String exact matching support\n\t index = i;\n\t break;\n\t }\n\t }\n\t\n\t if (index === -1) {\n\t // item not found\n\t data[index] = {}; // for consistency\n\t }\n\t\n\t switch (returnPreference) {\n\t case returnPreferenceEnum.INDEX:\n\t returnData = index;\n\t break;\n\t case returnPreferenceEnum.BOTH:\n\t returnData = {\n\t obj: data[index],\n\t index: index\n\t };\n\t break;\n\t case returnPreferenceEnum.OBJECT:\n\t default:\n\t returnData = data[index];\n\t break;\n\t }\n\t\n\t return returnData;\n\t};\n\t\n\texports.default = arrayUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for Tab status(still opened / closed) used for tab-communication\n\t * @type {Object}\n\t */\n\tvar TabStatusEnum = {\n\t OPEN: 'open',\n\t CLOSE: 'close'\n\t};\n\t\n\texports.default = TabStatusEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for showing various warnings to suser when things done wrong\n\t * @type {Object}\n\t */\n\tvar WarningTextEnum = {\n\t INVALID_JSON: 'Invalid JSON Object!',\n\t INVALID_DATA: 'Some wrong message is being sent by Parent.',\n\t CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n\t URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n\t};\n\t\n\texports.default = WarningTextEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * UUID.js: The RFC-compliant UUID generator for JavaScript.\n\t * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n\t *\n\t * @author LiosK\n\t * @version v3.3.0\n\t * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n\t */\n\t\n\t/** @constructor */\n\tvar UUID = void 0;\n\t\n\tUUID = function () {\n\t 'use strict';\n\t\n\t /** @lends UUID */\n\t\n\t function UUID() {}\n\t\n\t /**\n\t * The simplest function to get an UUID string.\n\t * @returns {string} A version 4 UUID string.\n\t */\n\t UUID.generate = function () {\n\t var rand = UUID._getRandomInt,\n\t hex = UUID._hexAligner;\n\t\n\t // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n\t return hex(rand(32), 8) + // time_low\n\t '-' + hex(rand(16), 4) + // time_mid\n\t '-' + hex(0x4000 | rand(12), 4) + // time_hi_and_version\n\t '-' + hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n\t '-' + hex(rand(48), 12); // node\n\t };\n\t\n\t /**\n\t * Returns an unsigned x-bit random integer.\n\t * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n\t * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n\t */\n\t UUID._getRandomInt = function (x) {\n\t if (x < 0) {\n\t return NaN;\n\t }\n\t if (x <= 30) {\n\t return 0 | Math.random() * (1 << x);\n\t }\n\t if (x <= 53) {\n\t return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n\t }\n\t\n\t return NaN;\n\t };\n\t\n\t /**\n\t * Returns a function that converts an integer to a zero-filled string.\n\t * @param {int} radix\n\t * @returns {function(num, length)}\n\t */\n\t UUID._getIntAligner = function (radix) {\n\t return function (num, length) {\n\t var str = num.toString(radix),\n\t i = length - str.length,\n\t z = '0';\n\t\n\t for (; i > 0; i >>>= 1, z += z) {\n\t if (i & 1) {\n\t str = z + str;\n\t }\n\t }\n\t return str;\n\t };\n\t };\n\t\n\t UUID._hexAligner = UUID._getIntAligner(16);\n\t\n\t /**\n\t * Returns UUID string representation.\n\t * @returns {string} {@link UUID#hexString}.\n\t */\n\t UUID.prototype.toString = function () {\n\t return this.hexString;\n\t };\n\t\n\t return UUID;\n\t}(UUID);\n\t\n\texports.default = UUID;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n\t * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n\t * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n\t * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n\t *\n\t * Open Tab\n\t */\n\tvar domUtils = {\n\t disable: function disable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].setAttribute('disabled', 'disabled');\n\t }\n\t },\n\t enable: function enable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].removeAttribute('disabled');\n\t }\n\t }\n\t};\n\t\n\texports.default = domUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar PostMessageListener = {};\n\t\n\t/*\n\t * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n\t * -------------------------------------------------------------------------------\n\t *\n\t * 1. First convetion\n\t Since data can be sent or receieved via postmessge API in the form of strings,\n\t the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n\t This is easy to maintain and deal with data.\n\t\n\t * 2. Second Convetions\n\t With every data, there's an associated message identifier.\n\t A message identifier helps in knowing the intention of what event actually is for.\n\t For eg: To send data after proper establishment from Child tab,\n\t Parent tab acknowledges the connection by returning the true identity of the Child tab.\n\t This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\t\n\t So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n\t So, while reading the message, it has to be first checked up with the defined event names\n\t and then after successful match, the message is split using the Event-name as a delimiter.\n\t The first entry if the event name and the second one is the actual data.\n\t *\n\t */\n\t\n\t/**\n\t * OnLoad Event - it serves as an communication establishment source from Child tab\n\t */\n\tPostMessageListener._onLoad = function (data) {\n\t var tabs = void 0,\n\t dataToSend = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.LOADED)[1];\n\t\n\t // Child was opened but parent got refereshed, opened a tab i.e.\n\t // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n\t if (tabInfo) {\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t // If Child knows its UUID, means Parent was refreshed and Child did not\n\t if (tabInfo.id) {\n\t tabs = _tab2.default.getAll();\n\t if (tabs.length) {\n\t window.newlyTabOpened = tabs[tabs.length - 1];\n\t window.newlyTabOpened.id = tabInfo.id;\n\t window.newlyTabOpened.name = tabInfo.name;\n\t }\n\t }\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t\n\t if (window.newlyTabOpened) {\n\t try {\n\t dataToSend = _PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT;\n\t dataToSend += JSON.stringify({\n\t id: window.newlyTabOpened.id,\n\t name: window.newlyTabOpened.name,\n\t parentName: window.name\n\t });\n\t _tab2.default.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * onCustomMessage Event - Any sort of custom message by child is treated here\n\t * @param {Object} data\n\t *\n\t * The method fires an event to notify Parent regarding Child's behavior\n\t */\n\tPostMessageListener._onCustomMessage = function (data) {\n\t var tabInfo = data.split(_PostMessageEventNamesEnum2.default.CUSTOM)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('toggleElementDisabledAttribute', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t window.newlyTabOpened = null;\n\t};\n\t\n\t/**\n\t * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n\t * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n\t *\n\t * It sets the newlyTabOpened variable accordingly\n\t *\n\t * @param {Object} data\n\t */\n\tPostMessageListener._onBeforeUnload = function (data) {\n\t var tabs = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (_tab2.default.tabs.length) {\n\t tabs = _tab2.default.getAll();\n\t window.newlyTabOpened = _array2.default.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('onChildUnload', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t};\n\t\n\t/**\n\t * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n\t * @param {Object} message\n\t */\n\tPostMessageListener.onNewTab = function (message) {\n\t var data = message.data;\n\t\n\t /**\n\t * Safe check - This happens when CHild Tab gets closed just after sending a message.\n\t * No need to go further from this point.\n\t * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n\t */\n\t if (!data || typeof data !== 'string' || !_tab2.default.tabs.length) {\n\t return false;\n\t }\n\t\n\t // `origin` check for secureity point of view\n\t if (_tab2.default.config.origin && _tab2.default.config.origin !== message.origin) {\n\t return false;\n\t }\n\t\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) {\n\t PostMessageListener._onLoad(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) {\n\t PostMessageListener._onCustomMessage(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD) > -1) {\n\t PostMessageListener._onBeforeUnload(data);\n\t }\n\t};\n\t\n\texports.default = PostMessageListener;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Child = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Child(config) {\n\t _classCallCheck(this, Child);\n\t\n\t this.sessionStorageKey = '__vwo_new_tab_info__';\n\t\n\t if (!config) {\n\t config = {};\n\t }\n\t if (typeof config.handshakeExpiryLimit === 'undefined') {\n\t config.handshakeExpiryLimit = 5000;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t this.tabName = window.name;\n\t this.tabId = null;\n\t this.tabParentName = null;\n\t\n\t _extends(this, config);\n\t this.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Child, [{\n\t key: '_isSessionStorage',\n\t\n\t\n\t /**\n\t * Check is sessionStorage is present on window\n\t * @return {Boolean} [description]\n\t */\n\t value: function _isSessionStorage() {\n\t if ('sessionStorage' in window && window.sessionStorage) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: '_getData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _getData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t return window.sessionStorage.getItem(this.sessionStorageKey);\n\t }\n\t }, {\n\t key: '_setData',\n\t\n\t\n\t /**\n\t * Set stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _setData(dataReceived) {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n\t return dataReceived;\n\t }\n\t }, {\n\t key: '_restoreData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage and parse it\n\t * @return {Object} data\n\t */\n\t value: function _restoreData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t if (this.isSessionStorageSupported) {\n\t var storedData = this._getData();\n\t\n\t this._parseData(storedData);\n\t }\n\t }\n\t }, {\n\t key: '_parseData',\n\t\n\t\n\t /**\n\t * Parse data fetched from sessionStorage\n\t * @param {String} dataReceived\n\t */\n\t value: function _parseData(dataReceived) {\n\t var actualData = void 0;\n\t\n\t // Expecting JSON data\n\t try {\n\t actualData = JSON.parse(dataReceived);\n\t this.tabId = actualData && actualData.id;\n\t this.tabParentName = actualData && actualData.parentName;\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_DATA);\n\t };\n\t }\n\t }, {\n\t key: 'onCommunication',\n\t\n\t\n\t /**\n\t * The core of this file\n\t * This method receives the postmessage from Parent\n\t * after establishing a proper communication channel between Parent tab and Child tab.\n\t * It removes the handshake timeout.\n\t * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n\t *\n\t * @param {String} message\n\t */\n\t value: function onCommunication(message) {\n\t var _this = this;\n\t\n\t var dataReceived = void 0,\n\t data = message.data;\n\t\n\t if (!data || typeof data !== 'string') {\n\t return;\n\t }\n\t\n\t // `origin` check for secureity point of view\n\t if (this.config.origin && this.config.origin !== message.origin) {\n\t return;\n\t }\n\t\n\t // cancel timeout\n\t window.clearTimeout(this.timeout);\n\t\n\t // When Parent tab gets closed or refereshed\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED) > -1) {\n\t // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n\t if (this.config.onParentDisconnect) {\n\t this.config.onParentDisconnect();\n\t }\n\t\n\t // remove postMessage listener since no Parent is there to communicate with\n\t window.removeEventListener('message', function (evt) {\n\t return _this.onCommunication(evt);\n\t });\n\t }\n\t\n\t /**\n\t * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n\t * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n\t */\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT) > -1) {\n\t var msg = void 0;\n\t\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT)[1];\n\t\n\t // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n\t this._setData(dataReceived);\n\t this._parseData(dataReceived);\n\t\n\t msg = _PostMessageEventNamesEnum2.default.CUSTOM + JSON.stringify({\n\t id: this.tabId,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t });\n\t this.sendMessageToParent(msg);\n\t\n\t if (this.config.onInitialize) {\n\t this.config.onInitialize();\n\t }\n\t }\n\t\n\t // Whenever Parent tab communicates once the communication channel is established\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) > -1) {\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED)[1];\n\t\n\t try {\n\t dataReceived = JSON.parse(dataReceived);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n\t if (this.config.onParentCommunication) {\n\t this.config.onParentCommunication(dataReceived);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'addListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage and onbeforeunload event listeners\n\t */\n\t value: function addListeners() {\n\t var _this2 = this;\n\t\n\t window.onbeforeunload = function (evt) {\n\t var msg = _PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD + JSON.stringify({\n\t id: _this2.tabId,\n\t isSiteInsideFrame: _this2.config.isSiteInsideFrame\n\t });\n\t\n\t _this2.sendMessageToParent(msg);\n\t };\n\t\n\t window.removeEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t window.addEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t }\n\t }, {\n\t key: 'setHandshakeExpiry',\n\t\n\t\n\t /**\n\t * Call a user-defined method `onHandShakeExpiry`\n\t * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n\t * @return {Function}\n\t */\n\t value: function setHandshakeExpiry() {\n\t var _this3 = this;\n\t\n\t return window.setTimeout(function () {\n\t if (_this3.config.onHandShakeExpiry) {\n\t _this3.config.onHandShakeExpiry();\n\t }\n\t }, this.handshakeExpiryLimit);\n\t }\n\t\n\t /**\n\t * API starts here ->\n\t *\n\t * Send a postmessage to the corresponding Parent tab\n\t * @param {String} msg\n\t = */\n\t\n\t }, {\n\t key: 'sendMessageToParent',\n\t value: function sendMessageToParent(msg) {\n\t var origin = void 0;\n\t\n\t if (window.top.opener) {\n\t origin = this.config.origin || '*';\n\t window.top.opener.postMessage(msg, origin);\n\t }\n\t }\n\t }, {\n\t key: 'getTabInfo',\n\t\n\t\n\t /**\n\t * Get current Tab info i.e. id, name and parentName\n\t * @return {Object} tab-info\n\t */\n\t value: function getTabInfo() {\n\t return {\n\t id: this.tabId,\n\t name: this.tabName,\n\t parentName: this.tabParentName,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t };\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t /**\n\t * API ends here ->\n\t */\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.isSessionStorageSupported = this._isSessionStorage();\n\t this.addListeners();\n\t this._restoreData();\n\t this.sendMessageToParent(_PostMessageEventNamesEnum2.default.LOADED + JSON.stringify(this.getTabInfo()));\n\t this.timeout = this.setHandshakeExpiry();\n\t\n\t if (this.config.onReady) {\n\t this.config.onReady();\n\t }\n\t }\n\t }]);\n\t\n\t return Child;\n\t}();\n\t\n\t;\n\t\n\texports.default = Child;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** across-tabs.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap d7c09f519413fa8dc6a4\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n tabUtils.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: [],\n config: {}\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab && tab.ref) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n let origin = tabUtils.config.origin || '*';\n\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, origin);\n } else {\n target.ref.top.postMessage(msg, origin);\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n // `origin` check for secureity point of view\n if (tabUtils.config.origin && tabUtils.config.origin !== message.origin) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // `origin` check for secureity point of view\n if (this.config.origin && this.config.origin !== message.origin) {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n let origin;\n\n if (window.top.opener) {\n origin = this.config.origin || '*';\n window.top.opener.postMessage(msg, origin);\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/across-tabs.this.js b/dist/across-tabs.this.js index 462d5a3..8b3f069 100644 --- a/dist/across-tabs.this.js +++ b/dist/across-tabs.this.js @@ -1,6 +1,6 @@ /*! * - * across-tabs "0.1.9" + * across-tabs "1.0.0" * https://github.com/wingify/across-tabs.js * MIT licensed * @@ -156,6 +156,8 @@ this["AcrossTabs"] = this.Tab = _tab2.default; _extends(this, config); + _tab4.default.config = config; + if (this.shouldInitImmediately) { this.init(); } @@ -550,7 +552,8 @@ this["AcrossTabs"] = */ var tabUtils = { - tabs: [] + tabs: [], + config: {} }; /** @@ -630,7 +633,7 @@ this["AcrossTabs"] = tabUtils.closeTab = function (id) { var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id); - if (tab) { + if (tab && tab.ref) { tab.ref.close(); tab.status = _TabStatusEnum2.default.CLOSE; } @@ -646,9 +649,10 @@ this["AcrossTabs"] = var i = void 0; for (i = 0; i < tabUtils.tabs.length; i++) { - // --tabUtils.tabs.length; - tabUtils.tabs[i].ref.close(); - tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE; + if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) { + tabUtils.tabs[i].ref.close(); + tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE; + } } return tabUtils; @@ -695,10 +699,12 @@ this["AcrossTabs"] = * @param {Boolean} isSiteInsideFrame */ tabUtils.sendMessage = function (target, msg, isSiteInsideFrame) { + var origin = tabUtils.config.origin || '*'; + if (isSiteInsideFrame) { - target.ref[0].postMessage(msg, '*'); + target.ref[0].postMessage(msg, origin); } else { - target.ref.top.postMessage(msg, '*'); + target.ref.top.postMessage(msg, origin); } }; @@ -1164,6 +1170,11 @@ this["AcrossTabs"] = return false; } + // `origin` check for secureity point of view + if (_tab2.default.config.origin && _tab2.default.config.origin !== message.origin) { + return false; + } + if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) { PostMessageListener._onLoad(data); } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) { @@ -1343,6 +1354,11 @@ this["AcrossTabs"] = return; } + // `origin` check for secureity point of view + if (this.config.origin && this.config.origin !== message.origin) { + return; + } + // cancel timeout window.clearTimeout(this.timeout); @@ -1453,8 +1469,11 @@ this["AcrossTabs"] = }, { key: 'sendMessageToParent', value: function sendMessageToParent(msg) { + var origin = void 0; + if (window.top.opener) { - window.top.opener.postMessage(msg, '*'); + origin = this.config.origin || '*'; + window.top.opener.postMessage(msg, origin); } } }, { diff --git a/dist/across-tabs.this.js.map b/dist/across-tabs.this.js.map index ceaddb0..ec7e26f 100644 --- a/dist/across-tabs.this.js.map +++ b/dist/across-tabs.this.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 8c7008500c890f72f432","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["AcrossTabs","Parent","Child","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","i","getAll","openedTabs","getOpened","length","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","id","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","target","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","key","value","returnPreference","obj","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","prototype","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","onCommunication","evt","_setData","sendMessageToParent","onInitialize","onParentCommunication","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.this.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 8c7008500c890f72f432\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: []\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n // --tabUtils.tabs.length;\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, '*');\n } else {\n target.ref.top.postMessage(msg, '*');\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n if (window.top.opener) {\n window.top.opener.postMessage(msg, '*');\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap e95f92d42d4e342b4957","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["AcrossTabs","Parent","Child","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","i","getAll","openedTabs","getOpened","length","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","id","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","target","origin","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","key","value","returnPreference","obj","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","prototype","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","onCommunication","evt","_setData","sendMessageToParent","onInitialize","onParentCommunication","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.this.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap e95f92d42d4e342b4957\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n tabUtils.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: [],\n config: {}\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab && tab.ref) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n let origin = tabUtils.config.origin || '*';\n\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, origin);\n } else {\n target.ref.top.postMessage(msg, origin);\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n // `origin` check for secureity point of view\n if (tabUtils.config.origin && tabUtils.config.origin !== message.origin) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // `origin` check for secureity point of view\n if (this.config.origin && this.config.origin !== message.origin) {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n let origin;\n\n if (window.top.opener) {\n origin = this.config.origin || '*';\n window.top.opener.postMessage(msg, origin);\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/across-tabs.this.min.js b/dist/across-tabs.this.min.js index 9e0c437..f0011d3 100644 --- a/dist/across-tabs.this.min.js +++ b/dist/across-tabs.this.min.js @@ -1,13 +1,13 @@ /*! * - * across-tabs "0.1.9" + * across-tabs "1.0.0" * https://github.com/wingify/across-tabs.js * MIT licensed * * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar) * */ -this.AcrossTabs=function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={exports:{},id:a,loaded:!1};return e[a].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),r=a(i),o=n(11),s=a(o),u={Parent:r["default"],Child:s["default"]};t["default"]=u,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0;i>>>=1,r+=r)1&i&&(a=r+a);return a}},e._hexAligner=e._getIntAligner(16),e.prototype.toString=function(){return this.hexString},e}(n),t["default"]=n,e.exports=t["default"]},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={disable:function(e){if(!e)return!1;var t=void 0,n=document.querySelectorAll("["+e+"]");for(t=0;t-1?c._onLoad(t):t.indexOf(f["default"].CUSTOM)>-1?c._onCustomMessage(t):t.indexOf(f["default"].ON_BEFORE_UNLOAD)>-1&&c._onBeforeUnload(t))},t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t-1&&(this.config.onParentDisconnect&&this.config.onParentDisconnect(),window.removeEventListener("message",function(e){return t.onCommunication(e)})),a.indexOf(u["default"].HANDSHAKE_WITH_PARENT)>-1){var i=void 0;n=a.split(u["default"].HANDSHAKE_WITH_PARENT)[1],this._setData(n),this._parseData(n),i=u["default"].CUSTOM+JSON.stringify({id:this.tabId,isSiteInsideFrame:this.config.isSiteInsideFrame}),this.sendMessageToParent(i),this.config.onInitialize&&this.config.onInitialize()}if(a.indexOf(u["default"].PARENT_COMMUNICATED)>-1){n=a.split(u["default"].PARENT_COMMUNICATED)[1];try{n=JSON.parse(n)}catch(r){throw new Error(l["default"].INVALID_JSON)}this.config.onParentCommunication&&this.config.onParentCommunication(n)}}}},{key:"addListeners",value:function(){var e=this;window.onbeforeunload=function(t){var n=u["default"].ON_BEFORE_UNLOAD+JSON.stringify({id:e.tabId,isSiteInsideFrame:e.config.isSiteInsideFrame});e.sendMessageToParent(n)},window.removeEventListener("message",function(t){return e.onCommunication(t)}),window.addEventListener("message",function(t){return e.onCommunication(t)})}},{key:"setHandshakeExpiry",value:function(){var e=this;return window.setTimeout(function(){e.config.onHandShakeExpiry&&e.config.onHandShakeExpiry()},this.handshakeExpiryLimit)}},{key:"sendMessageToParent",value:function(e){window.top.opener&&window.top.opener.postMessage(e,"*")}},{key:"getTabInfo",value:function(){return{id:this.tabId,name:this.tabName,parentName:this.tabParentName,isSiteInsideFrame:this.config.isSiteInsideFrame}}},{key:"init",value:function(){this.isSessionStorageSupported=this._isSessionStorage(),this.addListeners(),this._restoreData(),this.sendMessageToParent(u["default"].LOADED+JSON.stringify(this.getTabInfo())),this.timeout=this.setHandshakeExpiry(),this.config.onReady&&this.config.onReady()}}]),e}();t["default"]=f,e.exports=t["default"]}]); +var n=void 0;n=function(){function e(){}return e.generate=function(){var t=e._getRandomInt,n=e._hexAligner;return n(t(32),8)+"-"+n(t(16),4)+"-"+n(16384|t(12),4)+"-"+n(32768|t(14),4)+"-"+n(t(48),12)},e._getRandomInt=function(e){return e<0?NaN:e<=30?0|Math.random()*(1<0;i>>>=1,r+=r)1&i&&(a=r+a);return a}},e._hexAligner=e._getIntAligner(16),e.prototype.toString=function(){return this.hexString},e}(n),t["default"]=n,e.exports=t["default"]},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={disable:function(e){if(!e)return!1;var t=void 0,n=document.querySelectorAll("["+e+"]");for(t=0;t-1?c._onLoad(t):t.indexOf(f["default"].CUSTOM)>-1?c._onCustomMessage(t):t.indexOf(f["default"].ON_BEFORE_UNLOAD)>-1&&c._onBeforeUnload(t)))},t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t-1&&(this.config.onParentDisconnect&&this.config.onParentDisconnect(),window.removeEventListener("message",function(e){return t.onCommunication(e)})),a.indexOf(u["default"].HANDSHAKE_WITH_PARENT)>-1){var i=void 0;n=a.split(u["default"].HANDSHAKE_WITH_PARENT)[1],this._setData(n),this._parseData(n),i=u["default"].CUSTOM+JSON.stringify({id:this.tabId,isSiteInsideFrame:this.config.isSiteInsideFrame}),this.sendMessageToParent(i),this.config.onInitialize&&this.config.onInitialize()}if(a.indexOf(u["default"].PARENT_COMMUNICATED)>-1){n=a.split(u["default"].PARENT_COMMUNICATED)[1];try{n=JSON.parse(n)}catch(r){throw new Error(l["default"].INVALID_JSON)}this.config.onParentCommunication&&this.config.onParentCommunication(n)}}}},{key:"addListeners",value:function(){var e=this;window.onbeforeunload=function(t){var n=u["default"].ON_BEFORE_UNLOAD+JSON.stringify({id:e.tabId,isSiteInsideFrame:e.config.isSiteInsideFrame});e.sendMessageToParent(n)},window.removeEventListener("message",function(t){return e.onCommunication(t)}),window.addEventListener("message",function(t){return e.onCommunication(t)})}},{key:"setHandshakeExpiry",value:function(){var e=this;return window.setTimeout(function(){e.config.onHandShakeExpiry&&e.config.onHandShakeExpiry()},this.handshakeExpiryLimit)}},{key:"sendMessageToParent",value:function(e){var t=void 0;window.top.opener&&(t=this.config.origin||"*",window.top.opener.postMessage(e,t))}},{key:"getTabInfo",value:function(){return{id:this.tabId,name:this.tabName,parentName:this.tabParentName,isSiteInsideFrame:this.config.isSiteInsideFrame}}},{key:"init",value:function(){this.isSessionStorageSupported=this._isSessionStorage(),this.addListeners(),this._restoreData(),this.sendMessageToParent(u["default"].LOADED+JSON.stringify(this.getTabInfo())),this.timeout=this.setHandshakeExpiry(),this.config.onReady&&this.config.onReady()}}]),e}();t["default"]=f,e.exports=t["default"]}]); //# sourceMappingURL=across-tabs.this.min.js.map \ No newline at end of file diff --git a/dist/across-tabs.this.min.js.map b/dist/across-tabs.this.min.js.map index 5cf5735..6d141a7 100644 --- a/dist/across-tabs.this.min.js.map +++ b/dist/across-tabs.this.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///across-tabs.this.min.js","webpack:///webpack/bootstrap 894c3b3a23141dceec6e","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["this","modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_parent","_parent2","_child","_child2","AcrossTabs","Parent","Child","_classCallCheck","instance","Constructor","TypeError","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","_tab","_tab2","_tab3","_tab4","_dom","_dom2","_TabStatusEnum","_TabStatusEnum2","_WarningTextEnum","_WarningTextEnum2","_PostMessageEventNamesEnum","_PostMessageEventNamesEnum2","_postmessage","_postmessage2","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","getAll","openedTabs","getOpened","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","_this","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","_this2","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","_uuid","_uuid2","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","_array","_array2","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","returnPreference","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","evt","onCommunication","_setData","sendMessageToParent","onInitialize","onParentCommunication","_this3","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.this.min.js","sourcesContent":["/*!\n * \n * across-tabs \"0.1.9\"\n * https://github.com/wingify/across-tabs.js\n * MIT licensed\n * \n * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar)\n * \n */\nthis[\"AcrossTabs\"] =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _parent = __webpack_require__(1);\n\t\n\tvar _parent2 = _interopRequireDefault(_parent);\n\t\n\tvar _child = __webpack_require__(11);\n\t\n\tvar _child2 = _interopRequireDefault(_child);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Expose Parent and Child modules on AcrossTabs Object\n\t * @type {Object}\n\t */\n\tvar AcrossTabs = {\n\t Parent: _parent2.default,\n\t Child: _child2.default\n\t};\n\t\n\texports.default = AcrossTabs;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(2);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _tab3 = __webpack_require__(3);\n\t\n\tvar _tab4 = _interopRequireDefault(_tab3);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _postmessage = __webpack_require__(10);\n\t\n\tvar _postmessage2 = _interopRequireDefault(_postmessage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar heartBeat = void 0,\n\t tab = void 0;\n\t\n\t// Named Class expression\n\t\n\tvar Parent = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Parent(config) {\n\t _classCallCheck(this, Parent);\n\t\n\t config = config || {};\n\t if (typeof config.heartBeatInterval === 'undefined') {\n\t config.heartBeatInterval = 500;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t // reset tabs with every new Object\n\t _tab4.default.tabs = [];\n\t\n\t this.Tab = _tab2.default;\n\t _extends(this, config);\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Parent, [{\n\t key: 'addInterval',\n\t value: function addInterval() {\n\t var i = void 0,\n\t tabs = _tab4.default.getAll(),\n\t openedTabs = _tab4.default.getOpened();\n\t\n\t // don't poll if all tabs are in CLOSED states\n\t if (!openedTabs || !openedTabs.length) {\n\t window.clearInterval(heartBeat); // stop the interval\n\t heartBeat = null;\n\t return false;\n\t }\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t if (this.removeClosedTabs) {\n\t this.watchStatus(tabs[i]);\n\t }\n\t /**\n\t * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n\t * irrespective of heatbeat controller\n\t */\n\t if (tabs[i]) {\n\t tabs[i].status = tabs[i].ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN;\n\t }\n\t }\n\t\n\t // Call the user-defined callback after every polling operation is operted in a single run\n\t if (this.onPollingCallback) {\n\t this.onPollingCallback();\n\t }\n\t }\n\t }, {\n\t key: 'startPollingTabs',\n\t\n\t\n\t /**\n\t * Poll all tabs for their status - OPENED / CLOSED\n\t * An interval is created which checks for last and current status.\n\t * There's a property on window i.e. `closed` which returns true for the closed window.\n\t * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n\t */\n\t value: function startPollingTabs() {\n\t var _this = this;\n\t\n\t heartBeat = window.setInterval(function () {\n\t return _this.addInterval();\n\t }, this.heartBeatInterval);\n\t }\n\t }, {\n\t key: 'watchStatus',\n\t\n\t\n\t /**\n\t * Compare tab status - OPEN vs CLOSE\n\t * @param {Object} tab\n\t */\n\t value: function watchStatus(tab) {\n\t if (!tab) {\n\t return false;\n\t }\n\t var newStatus = tab.ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN,\n\t oldStatus = tab.status;\n\t\n\t // If last and current status(inside a polling interval) are same, don't do anything\n\t if (!newStatus || newStatus === oldStatus) {\n\t return false;\n\t }\n\t\n\t // OPEN to CLOSE state\n\t if (oldStatus === _TabStatusEnum2.default.OPEN && newStatus === _TabStatusEnum2.default.CLOSE) {\n\t // remove tab from tabUtils\n\t _tab4.default._remove(tab);\n\t }\n\t // Change from CLOSE to OPEN state is never gonna happen ;)\n\t }\n\t }, {\n\t key: 'onChildUnload',\n\t\n\t\n\t /**\n\t * Called when a child is refreshed/closed\n\t * @param {Object} ev - Event\n\t */\n\t value: function onChildUnload(ev) {\n\t if (this.onChildDisconnect) {\n\t this.onChildDisconnect(ev.detail);\n\t }\n\t }\n\t\n\t /**\n\t * Enable link/btn, which got disabled on clicking.\n\t * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n\t * @param {Object} ev - Event\n\t */\n\t\n\t }, {\n\t key: 'customEventUnListener',\n\t value: function customEventUnListener(ev) {\n\t this.enableElements();\n\t if (this.onHandshakeCallback) {\n\t this.onHandshakeCallback(ev.detail);\n\t }\n\t }\n\t }, {\n\t key: 'addEventListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage, native and custom listeners to the window\n\t */\n\t value: function addEventListeners() {\n\t var _this2 = this;\n\t\n\t window.removeEventListener('message', _postmessage2.default.onNewTab);\n\t window.addEventListener('message', _postmessage2.default.onNewTab);\n\t\n\t window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n\t window.addEventListener('toggleElementDisabledAttribute', function (ev) {\n\t return _this2.customEventUnListener(ev);\n\t });\n\t\n\t window.removeEventListener('onChildUnload', this.onChildUnload);\n\t window.addEventListener('onChildUnload', function (ev) {\n\t return _this2.onChildUnload(ev);\n\t });\n\t\n\t // Let children tabs know when Parent is closed / refereshed.\n\t window.onbeforeunload = function () {\n\t _tab4.default.broadCastAll(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED);\n\t };\n\t }\n\t }, {\n\t key: 'enableElements',\n\t\n\t\n\t /**\n\t * API methods exposed for Public\n\t *\n\t * Re-enable the link/btn which got disabled on clicking\n\t */\n\t value: function enableElements() {\n\t _dom2.default.enable('data-tab-opener');\n\t }\n\t }, {\n\t key: 'getAllTabs',\n\t\n\t\n\t /**\n\t * Return list of all tabs\n\t * @return {Array}\n\t */\n\t value: function getAllTabs() {\n\t return _tab4.default.getAll();\n\t }\n\t }, {\n\t key: 'getOpenedTabs',\n\t\n\t\n\t /**\n\t * Return list of all OPENED tabs\n\t * @return {Array}\n\t */\n\t value: function getOpenedTabs() {\n\t return _tab4.default.getOpened();\n\t }\n\t }, {\n\t key: 'getClosedTabs',\n\t\n\t\n\t /**\n\t * Return list of all CLOSED tabs\n\t * @return {Array}\n\t */\n\t value: function getClosedTabs() {\n\t return _tab4.default.getClosed();\n\t }\n\t\n\t /**\n\t * Close all tabs at once\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'closeAllTabs',\n\t value: function closeAllTabs() {\n\t return _tab4.default.closeAll();\n\t }\n\t }, {\n\t key: 'closeTab',\n\t\n\t\n\t /**\n\t * Close a specific tab\n\t * @return {Object}\n\t */\n\t value: function closeTab(id) {\n\t return _tab4.default.closeTab(id);\n\t }\n\t }, {\n\t key: 'broadCastAll',\n\t\n\t\n\t /**\n\t * Send a postmessage to all OPENED tabs\n\t * @return {Object}\n\t */\n\t value: function broadCastAll(msg) {\n\t return _tab4.default.broadCastAll(msg);\n\t }\n\t\n\t /**\n\t * Send a postmessage to a specific tab\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'broadCastTo',\n\t value: function broadCastTo(id, msg) {\n\t return _tab4.default.broadCastTo(id, msg);\n\t }\n\t\n\t /**\n\t * Open a new tab. Config has to be passed with some required keys\n\t * @return {Object} tab\n\t */\n\t\n\t }, {\n\t key: 'openNewTab',\n\t value: function openNewTab(config) {\n\t if (!config) {\n\t throw new Error(_WarningTextEnum2.default.CONFIG_REQUIRED);\n\t }\n\t\n\t var url = config.url;\n\t\n\t if (!url) {\n\t throw new Error(_WarningTextEnum2.default.URL_REQUIRED);\n\t }\n\t\n\t tab = new this.Tab();\n\t tab.create(config);\n\t\n\t // If polling is already there, don't set it again\n\t if (!heartBeat) {\n\t this.startPollingTabs();\n\t }\n\t\n\t return tab;\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t\n\t /**\n\t * API methods exposed for Public ends here\n\t **/\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.addEventListeners();\n\t }\n\t }]);\n\t\n\t return Parent;\n\t}();\n\t\n\t;\n\t\n\texports.default = Parent;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _uuid = __webpack_require__(8);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Tab = function () {\n\t /**\n\t * Invoked when the object is instantiated\n\t */\n\t function Tab() {\n\t _classCallCheck(this, Tab);\n\t\n\t // Set name of Parent tab if not already defined\n\t window.name = window.name || 'PARENT_TAB';\n\t }\n\t\n\t _createClass(Tab, [{\n\t key: 'create',\n\t\n\t /**\n\t * Open a new tab\n\t * @param {Object} config - Refer API for config keys\n\t * @return {Object} this\n\t */\n\t value: function create(config) {\n\t config = config || {};\n\t _extends(this, config);\n\t this.id = _uuid2.default.generate() || _tab2.default.tabs.length + 1;\n\t this.status = 'open';\n\t // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n\t this.ref = window.open(this.url, '_blank', config.windowFeatures);\n\t\n\t _dom2.default.disable('data-tab-opener');\n\t\n\t window.newlyTabOpened = {\n\t id: this.id,\n\t name: this.name,\n\t ref: this.ref\n\t };\n\t\n\t // Push it to the list of tabs\n\t _tab2.default.addNew(this);\n\t\n\t // Return reference for chaining purpose\n\t return this;\n\t }\n\t }]);\n\t\n\t return Tab;\n\t}();\n\t\n\t;\n\t\n\texports.default = Tab;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * A Tab utility file to deal with tab operations\n\t */\n\t\n\tvar tabUtils = {\n\t tabs: []\n\t};\n\t\n\t/**\n\t * Remove a tab from a list of all tabs.\n\t * This is required when users opts for removing the closed tabs from the list of tabs.\n\t * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n\t * @param {Object} tab\n\t */\n\ttabUtils._remove = function (tab) {\n\t var index = void 0;\n\t\n\t index = _array2.default.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n\t tabUtils.tabs.splice(index, 1);\n\t};\n\t\n\t/**\n\t * As explained in `event-listeners/postmessage.js` file,\n\t * the data received from postmessage API is further processed based on our convention\n\t * @param {String} msg\n\t * @return {String} modified msg\n\t */\n\ttabUtils._preProcessMessage = function (msg) {\n\t // make msg always an object to support JSON support\n\t try {\n\t msg = JSON.stringify(msg);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (msg.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) === -1) {\n\t msg = _PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED + msg;\n\t }\n\t\n\t return msg;\n\t};\n\t/**\n\t * Add a new tab to the Array of tabs\n\t * @param {Object} tab\n\t * @return {Object} - this\n\t */\n\ttabUtils.addNew = function (tab) {\n\t tabUtils.tabs.push(tab);\n\t return undefined;\n\t};\n\t/**\n\t * Filter out all the opened tabs\n\t * @return {Array} - only the opened tabs\n\t */\n\ttabUtils.getOpened = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.OPEN;\n\t });\n\t};\n\t/**\n\t * Filter out all the closed tabs\n\t * @return {Array} - only the closed tabs\n\t */\n\ttabUtils.getClosed = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.CLOSE;\n\t });\n\t};\n\t/**\n\t * To get list of all tabs(closed/opened).\n\t * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n\t * @return {Array} - list of all tabs\n\t */\n\ttabUtils.getAll = function () {\n\t return tabUtils.tabs;\n\t};\n\t\n\t/**\n\t * Close a specific tab\n\t * @param {String} id\n\t * @return {Object} this\n\t */\n\ttabUtils.closeTab = function (id) {\n\t var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id);\n\t\n\t if (tab) {\n\t tab.ref.close();\n\t tab.status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t // --tabUtils.tabs.length;\n\t};\n\t/**\n\t * Close all opened tabs using a native method `close` available on window.open reference.\n\t * @return {tabUtils} this\n\t */\n\ttabUtils.closeAll = function () {\n\t var i = void 0;\n\t\n\t for (i = 0; i < tabUtils.tabs.length; i++) {\n\t // --tabUtils.tabs.length;\n\t tabUtils.tabs[i].ref.close();\n\t tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastAll = function (msg, isSiteInsideFrame) {\n\t var i = void 0,\n\t tabs = tabUtils.getOpened();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to a specific Child tab\n\t * @param {String} id\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastTo = function (id, msg, isSiteInsideFrame) {\n\t var targetedTab = void 0,\n\t tabs = tabUtils.getAll();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t targetedTab = _array2.default.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n\t tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\t\n\t return tabUtils;\n\t};\n\t\n\t/**\n\t * Send a postMessage to the desired window/frame\n\t * @param {Object} target\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.sendMessage = function (target, msg, isSiteInsideFrame) {\n\t if (isSiteInsideFrame) {\n\t target.ref[0].postMessage(msg, '*');\n\t } else {\n\t target.ref.top.postMessage(msg, '*');\n\t }\n\t};\n\t\n\texports.default = tabUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for different event names used for tab-communication\n\t * @type {Object}\n\t */\n\tvar PostMessageEventNamesEnum = {\n\t LOADED: '__TAB__LOADED_EVENT__',\n\t CUSTOM: '__TAB__CUSTOM_EVENT__',\n\t ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n\t PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n\t HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n\t PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n\t};\n\t\n\texports.default = PostMessageEventNamesEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar arrayUtils = {};\n\t\n\t/**\n\t * Different type of data needed after searching an item(Object) within data(Array of Objects).\n\t * 1. `INDEX` returns just the index at which the item was present\n\t * 2. `OBJECT` returns the matched object\n\t * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n\t */\n\tvar returnPreferenceEnum = {\n\t INDEX: 'index',\n\t OBJECT: 'object',\n\t BOTH: 'both'\n\t};\n\t\n\t/**\n\t * Search for an item(Object) within a data-set(Array Of Objects)\n\t * @param {Array of Objects} data\n\t * @param {String} key - Unique key to search on the basis of\n\t * @param {String} value - The matching criteria\n\t * @param {String} returnPreference - what kind of output is needed\n\t * @return {Object}\n\t */\n\tarrayUtils.searchByKeyName = function (data, key, value, returnPreference) {\n\t if (!data || !key) {\n\t return false;\n\t }\n\t\n\t returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n\t var i = void 0,\n\t obj = void 0,\n\t returnData = void 0,\n\t index = -1;\n\t\n\t for (i = 0; i < data.length; i++) {\n\t obj = data[i];\n\t // Number matching support\n\t if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n\t index = i;\n\t break;\n\t } else if (isNaN(value) && obj[key] === value) {\n\t // String exact matching support\n\t index = i;\n\t break;\n\t }\n\t }\n\t\n\t if (index === -1) {\n\t // item not found\n\t data[index] = {}; // for consistency\n\t }\n\t\n\t switch (returnPreference) {\n\t case returnPreferenceEnum.INDEX:\n\t returnData = index;\n\t break;\n\t case returnPreferenceEnum.BOTH:\n\t returnData = {\n\t obj: data[index],\n\t index: index\n\t };\n\t break;\n\t case returnPreferenceEnum.OBJECT:\n\t default:\n\t returnData = data[index];\n\t break;\n\t }\n\t\n\t return returnData;\n\t};\n\t\n\texports.default = arrayUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for Tab status(still opened / closed) used for tab-communication\n\t * @type {Object}\n\t */\n\tvar TabStatusEnum = {\n\t OPEN: 'open',\n\t CLOSE: 'close'\n\t};\n\t\n\texports.default = TabStatusEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for showing various warnings to suser when things done wrong\n\t * @type {Object}\n\t */\n\tvar WarningTextEnum = {\n\t INVALID_JSON: 'Invalid JSON Object!',\n\t INVALID_DATA: 'Some wrong message is being sent by Parent.',\n\t CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n\t URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n\t};\n\t\n\texports.default = WarningTextEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * UUID.js: The RFC-compliant UUID generator for JavaScript.\n\t * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n\t *\n\t * @author LiosK\n\t * @version v3.3.0\n\t * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n\t */\n\t\n\t/** @constructor */\n\tvar UUID = void 0;\n\t\n\tUUID = function () {\n\t 'use strict';\n\t\n\t /** @lends UUID */\n\t\n\t function UUID() {}\n\t\n\t /**\n\t * The simplest function to get an UUID string.\n\t * @returns {string} A version 4 UUID string.\n\t */\n\t UUID.generate = function () {\n\t var rand = UUID._getRandomInt,\n\t hex = UUID._hexAligner;\n\t\n\t // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n\t return hex(rand(32), 8) + // time_low\n\t '-' + hex(rand(16), 4) + // time_mid\n\t '-' + hex(0x4000 | rand(12), 4) + // time_hi_and_version\n\t '-' + hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n\t '-' + hex(rand(48), 12); // node\n\t };\n\t\n\t /**\n\t * Returns an unsigned x-bit random integer.\n\t * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n\t * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n\t */\n\t UUID._getRandomInt = function (x) {\n\t if (x < 0) {\n\t return NaN;\n\t }\n\t if (x <= 30) {\n\t return 0 | Math.random() * (1 << x);\n\t }\n\t if (x <= 53) {\n\t return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n\t }\n\t\n\t return NaN;\n\t };\n\t\n\t /**\n\t * Returns a function that converts an integer to a zero-filled string.\n\t * @param {int} radix\n\t * @returns {function(num, length)}\n\t */\n\t UUID._getIntAligner = function (radix) {\n\t return function (num, length) {\n\t var str = num.toString(radix),\n\t i = length - str.length,\n\t z = '0';\n\t\n\t for (; i > 0; i >>>= 1, z += z) {\n\t if (i & 1) {\n\t str = z + str;\n\t }\n\t }\n\t return str;\n\t };\n\t };\n\t\n\t UUID._hexAligner = UUID._getIntAligner(16);\n\t\n\t /**\n\t * Returns UUID string representation.\n\t * @returns {string} {@link UUID#hexString}.\n\t */\n\t UUID.prototype.toString = function () {\n\t return this.hexString;\n\t };\n\t\n\t return UUID;\n\t}(UUID);\n\t\n\texports.default = UUID;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n\t * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n\t * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n\t * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n\t *\n\t * Open Tab\n\t */\n\tvar domUtils = {\n\t disable: function disable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].setAttribute('disabled', 'disabled');\n\t }\n\t },\n\t enable: function enable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].removeAttribute('disabled');\n\t }\n\t }\n\t};\n\t\n\texports.default = domUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar PostMessageListener = {};\n\t\n\t/*\n\t * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n\t * -------------------------------------------------------------------------------\n\t *\n\t * 1. First convetion\n\t Since data can be sent or receieved via postmessge API in the form of strings,\n\t the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n\t This is easy to maintain and deal with data.\n\t\n\t * 2. Second Convetions\n\t With every data, there's an associated message identifier.\n\t A message identifier helps in knowing the intention of what event actually is for.\n\t For eg: To send data after proper establishment from Child tab,\n\t Parent tab acknowledges the connection by returning the true identity of the Child tab.\n\t This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\t\n\t So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n\t So, while reading the message, it has to be first checked up with the defined event names\n\t and then after successful match, the message is split using the Event-name as a delimiter.\n\t The first entry if the event name and the second one is the actual data.\n\t *\n\t */\n\t\n\t/**\n\t * OnLoad Event - it serves as an communication establishment source from Child tab\n\t */\n\tPostMessageListener._onLoad = function (data) {\n\t var tabs = void 0,\n\t dataToSend = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.LOADED)[1];\n\t\n\t // Child was opened but parent got refereshed, opened a tab i.e.\n\t // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n\t if (tabInfo) {\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t // If Child knows its UUID, means Parent was refreshed and Child did not\n\t if (tabInfo.id) {\n\t tabs = _tab2.default.getAll();\n\t if (tabs.length) {\n\t window.newlyTabOpened = tabs[tabs.length - 1];\n\t window.newlyTabOpened.id = tabInfo.id;\n\t window.newlyTabOpened.name = tabInfo.name;\n\t }\n\t }\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t\n\t if (window.newlyTabOpened) {\n\t try {\n\t dataToSend = _PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT;\n\t dataToSend += JSON.stringify({\n\t id: window.newlyTabOpened.id,\n\t name: window.newlyTabOpened.name,\n\t parentName: window.name\n\t });\n\t _tab2.default.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * onCustomMessage Event - Any sort of custom message by child is treated here\n\t * @param {Object} data\n\t *\n\t * The method fires an event to notify Parent regarding Child's behavior\n\t */\n\tPostMessageListener._onCustomMessage = function (data) {\n\t var tabInfo = data.split(_PostMessageEventNamesEnum2.default.CUSTOM)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('toggleElementDisabledAttribute', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t window.newlyTabOpened = null;\n\t};\n\t\n\t/**\n\t * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n\t * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n\t *\n\t * It sets the newlyTabOpened variable accordingly\n\t *\n\t * @param {Object} data\n\t */\n\tPostMessageListener._onBeforeUnload = function (data) {\n\t var tabs = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (_tab2.default.tabs.length) {\n\t tabs = _tab2.default.getAll();\n\t window.newlyTabOpened = _array2.default.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('onChildUnload', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t};\n\t\n\t/**\n\t * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n\t * @param {Object} message\n\t */\n\tPostMessageListener.onNewTab = function (message) {\n\t var data = message.data;\n\t\n\t /**\n\t * Safe check - This happens when CHild Tab gets closed just after sending a message.\n\t * No need to go further from this point.\n\t * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n\t */\n\t if (!data || typeof data !== 'string' || !_tab2.default.tabs.length) {\n\t return false;\n\t }\n\t\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) {\n\t PostMessageListener._onLoad(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) {\n\t PostMessageListener._onCustomMessage(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD) > -1) {\n\t PostMessageListener._onBeforeUnload(data);\n\t }\n\t};\n\t\n\texports.default = PostMessageListener;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Child = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Child(config) {\n\t _classCallCheck(this, Child);\n\t\n\t this.sessionStorageKey = '__vwo_new_tab_info__';\n\t\n\t if (!config) {\n\t config = {};\n\t }\n\t if (typeof config.handshakeExpiryLimit === 'undefined') {\n\t config.handshakeExpiryLimit = 5000;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t this.tabName = window.name;\n\t this.tabId = null;\n\t this.tabParentName = null;\n\t\n\t _extends(this, config);\n\t this.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Child, [{\n\t key: '_isSessionStorage',\n\t\n\t\n\t /**\n\t * Check is sessionStorage is present on window\n\t * @return {Boolean} [description]\n\t */\n\t value: function _isSessionStorage() {\n\t if ('sessionStorage' in window && window.sessionStorage) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: '_getData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _getData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t return window.sessionStorage.getItem(this.sessionStorageKey);\n\t }\n\t }, {\n\t key: '_setData',\n\t\n\t\n\t /**\n\t * Set stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _setData(dataReceived) {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n\t return dataReceived;\n\t }\n\t }, {\n\t key: '_restoreData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage and parse it\n\t * @return {Object} data\n\t */\n\t value: function _restoreData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t if (this.isSessionStorageSupported) {\n\t var storedData = this._getData();\n\t\n\t this._parseData(storedData);\n\t }\n\t }\n\t }, {\n\t key: '_parseData',\n\t\n\t\n\t /**\n\t * Parse data fetched from sessionStorage\n\t * @param {String} dataReceived\n\t */\n\t value: function _parseData(dataReceived) {\n\t var actualData = void 0;\n\t\n\t // Expecting JSON data\n\t try {\n\t actualData = JSON.parse(dataReceived);\n\t this.tabId = actualData && actualData.id;\n\t this.tabParentName = actualData && actualData.parentName;\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_DATA);\n\t };\n\t }\n\t }, {\n\t key: 'onCommunication',\n\t\n\t\n\t /**\n\t * The core of this file\n\t * This method receives the postmessage from Parent\n\t * after establishing a proper communication channel between Parent tab and Child tab.\n\t * It removes the handshake timeout.\n\t * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n\t *\n\t * @param {String} message\n\t */\n\t value: function onCommunication(message) {\n\t var _this = this;\n\t\n\t var dataReceived = void 0,\n\t data = message.data;\n\t\n\t if (!data || typeof data !== 'string') {\n\t return;\n\t }\n\t\n\t // cancel timeout\n\t window.clearTimeout(this.timeout);\n\t\n\t // When Parent tab gets closed or refereshed\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED) > -1) {\n\t // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n\t if (this.config.onParentDisconnect) {\n\t this.config.onParentDisconnect();\n\t }\n\t\n\t // remove postMessage listener since no Parent is there to communicate with\n\t window.removeEventListener('message', function (evt) {\n\t return _this.onCommunication(evt);\n\t });\n\t }\n\t\n\t /**\n\t * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n\t * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n\t */\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT) > -1) {\n\t var msg = void 0;\n\t\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT)[1];\n\t\n\t // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n\t this._setData(dataReceived);\n\t this._parseData(dataReceived);\n\t\n\t msg = _PostMessageEventNamesEnum2.default.CUSTOM + JSON.stringify({\n\t id: this.tabId,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t });\n\t this.sendMessageToParent(msg);\n\t\n\t if (this.config.onInitialize) {\n\t this.config.onInitialize();\n\t }\n\t }\n\t\n\t // Whenever Parent tab communicates once the communication channel is established\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) > -1) {\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED)[1];\n\t\n\t try {\n\t dataReceived = JSON.parse(dataReceived);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n\t if (this.config.onParentCommunication) {\n\t this.config.onParentCommunication(dataReceived);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'addListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage and onbeforeunload event listeners\n\t */\n\t value: function addListeners() {\n\t var _this2 = this;\n\t\n\t window.onbeforeunload = function (evt) {\n\t var msg = _PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD + JSON.stringify({\n\t id: _this2.tabId,\n\t isSiteInsideFrame: _this2.config.isSiteInsideFrame\n\t });\n\t\n\t _this2.sendMessageToParent(msg);\n\t };\n\t\n\t window.removeEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t window.addEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t }\n\t }, {\n\t key: 'setHandshakeExpiry',\n\t\n\t\n\t /**\n\t * Call a user-defined method `onHandShakeExpiry`\n\t * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n\t * @return {Function}\n\t */\n\t value: function setHandshakeExpiry() {\n\t var _this3 = this;\n\t\n\t return window.setTimeout(function () {\n\t if (_this3.config.onHandShakeExpiry) {\n\t _this3.config.onHandShakeExpiry();\n\t }\n\t }, this.handshakeExpiryLimit);\n\t }\n\t\n\t /**\n\t * API starts here ->\n\t *\n\t * Send a postmessage to the corresponding Parent tab\n\t * @param {String} msg\n\t = */\n\t\n\t }, {\n\t key: 'sendMessageToParent',\n\t value: function sendMessageToParent(msg) {\n\t if (window.top.opener) {\n\t window.top.opener.postMessage(msg, '*');\n\t }\n\t }\n\t }, {\n\t key: 'getTabInfo',\n\t\n\t\n\t /**\n\t * Get current Tab info i.e. id, name and parentName\n\t * @return {Object} tab-info\n\t */\n\t value: function getTabInfo() {\n\t return {\n\t id: this.tabId,\n\t name: this.tabName,\n\t parentName: this.tabParentName,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t };\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t /**\n\t * API ends here ->\n\t */\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.isSessionStorageSupported = this._isSessionStorage();\n\t this.addListeners();\n\t this._restoreData();\n\t this.sendMessageToParent(_PostMessageEventNamesEnum2.default.LOADED + JSON.stringify(this.getTabInfo()));\n\t this.timeout = this.setHandshakeExpiry();\n\t\n\t if (this.config.onReady) {\n\t this.config.onReady();\n\t }\n\t }\n\t }]);\n\t\n\t return Child;\n\t}();\n\t\n\t;\n\t\n\texports.default = Child;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ]);\n\n\n/** WEBPACK FOOTER **\n ** across-tabs.this.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 894c3b3a23141dceec6e\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: []\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n // --tabUtils.tabs.length;\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, '*');\n } else {\n target.ref.top.postMessage(msg, '*');\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n if (window.top.opener) {\n window.top.opener.postMessage(msg, '*');\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///across-tabs.this.min.js","webpack:///webpack/bootstrap 6e5f03bab31995356316","webpack:///./src/index.js","webpack:///./src/parent.js","webpack:///./src/tab.js","webpack:///./src/utils/tab.js","webpack:///./src/enums/PostMessageEventNamesEnum.js","webpack:///./src/utils/array.js","webpack:///./src/enums/TabStatusEnum.js","webpack:///./src/enums/WarningTextEnum.js","webpack:///./src/vendor/uuid.js","webpack:///./src/utils/dom.js","webpack:///./src/event-listeners/postmessage.js","webpack:///./src/child.js"],"names":["this","modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_parent","_parent2","_child","_child2","AcrossTabs","Parent","Child","_classCallCheck","instance","Constructor","TypeError","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","_tab","_tab2","_tab3","_tab4","_dom","_dom2","_TabStatusEnum","_TabStatusEnum2","_WarningTextEnum","_WarningTextEnum2","_PostMessageEventNamesEnum","_PostMessageEventNamesEnum2","_postmessage","_postmessage2","heartBeat","tab","config","heartBeatInterval","shouldInitImmediately","tabs","Tab","init","getAll","openedTabs","getOpened","window","clearInterval","removeClosedTabs","watchStatus","status","ref","closed","CLOSE","OPEN","onPollingCallback","_this","setInterval","addInterval","newStatus","oldStatus","_remove","ev","onChildDisconnect","detail","enableElements","onHandshakeCallback","_this2","removeEventListener","onNewTab","addEventListener","customEventUnListener","onChildUnload","onbeforeunload","broadCastAll","PARENT_DISCONNECTED","enable","getClosed","closeAll","closeTab","msg","broadCastTo","Error","CONFIG_REQUIRED","url","URL_REQUIRED","create","startPollingTabs","addEventListeners","_uuid","_uuid2","name","generate","open","windowFeatures","disable","newlyTabOpened","addNew","_array","_array2","tabUtils","index","searchByKeyName","splice","_preProcessMessage","JSON","stringify","e","INVALID_JSON","indexOf","PARENT_COMMUNICATED","push","filter","close","isSiteInsideFrame","sendMessage","targetedTab","origin","postMessage","top","PostMessageEventNamesEnum","LOADED","CUSTOM","ON_BEFORE_UNLOAD","HANDSHAKE_WITH_PARENT","arrayUtils","returnPreferenceEnum","INDEX","OBJECT","BOTH","data","returnPreference","returnData","isNaN","parseInt","TabStatusEnum","WarningTextEnum","INVALID_DATA","UUID","rand","_getRandomInt","hex","_hexAligner","x","NaN","Math","random","_getIntAligner","radix","num","str","toString","z","hexString","domUtils","selector","ATOpenerElems","document","querySelectorAll","setAttribute","removeAttribute","PostMessageListener","_onLoad","dataToSend","tabInfo","split","parse","parentName","_onCustomMessage","event","CustomEvent","dispatchEvent","_onBeforeUnload","message","sessionStorageKey","handshakeExpiryLimit","tabName","tabId","tabParentName","sessionStorage","isSessionStorageSupported","getItem","dataReceived","setItem","storedData","_getData","_parseData","actualData","clearTimeout","timeout","onParentDisconnect","evt","onCommunication","_setData","sendMessageToParent","onInitialize","onParentCommunication","_this3","setTimeout","onHandShakeExpiry","opener","_isSessionStorage","addListeners","_restoreData","getTabInfo","setHandshakeExpiry","onReady"],"mappings":"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","file":"across-tabs.this.min.js","sourcesContent":["/*!\n * \n * across-tabs \"1.0.0\"\n * https://github.com/wingify/across-tabs.js\n * MIT licensed\n * \n * Copyright (C) 2017-2018 Wingify - A project by Varun Malhotra(https://github.com/softvar)\n * \n */\nthis[\"AcrossTabs\"] =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _parent = __webpack_require__(1);\n\t\n\tvar _parent2 = _interopRequireDefault(_parent);\n\t\n\tvar _child = __webpack_require__(11);\n\t\n\tvar _child2 = _interopRequireDefault(_child);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Expose Parent and Child modules on AcrossTabs Object\n\t * @type {Object}\n\t */\n\tvar AcrossTabs = {\n\t Parent: _parent2.default,\n\t Child: _child2.default\n\t};\n\t\n\texports.default = AcrossTabs;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(2);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _tab3 = __webpack_require__(3);\n\t\n\tvar _tab4 = _interopRequireDefault(_tab3);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _postmessage = __webpack_require__(10);\n\t\n\tvar _postmessage2 = _interopRequireDefault(_postmessage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar heartBeat = void 0,\n\t tab = void 0;\n\t\n\t// Named Class expression\n\t\n\tvar Parent = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Parent(config) {\n\t _classCallCheck(this, Parent);\n\t\n\t config = config || {};\n\t if (typeof config.heartBeatInterval === 'undefined') {\n\t config.heartBeatInterval = 500;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t // reset tabs with every new Object\n\t _tab4.default.tabs = [];\n\t\n\t this.Tab = _tab2.default;\n\t _extends(this, config);\n\t\n\t _tab4.default.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Parent, [{\n\t key: 'addInterval',\n\t value: function addInterval() {\n\t var i = void 0,\n\t tabs = _tab4.default.getAll(),\n\t openedTabs = _tab4.default.getOpened();\n\t\n\t // don't poll if all tabs are in CLOSED states\n\t if (!openedTabs || !openedTabs.length) {\n\t window.clearInterval(heartBeat); // stop the interval\n\t heartBeat = null;\n\t return false;\n\t }\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t if (this.removeClosedTabs) {\n\t this.watchStatus(tabs[i]);\n\t }\n\t /**\n\t * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n\t * irrespective of heatbeat controller\n\t */\n\t if (tabs[i]) {\n\t tabs[i].status = tabs[i].ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN;\n\t }\n\t }\n\t\n\t // Call the user-defined callback after every polling operation is operted in a single run\n\t if (this.onPollingCallback) {\n\t this.onPollingCallback();\n\t }\n\t }\n\t }, {\n\t key: 'startPollingTabs',\n\t\n\t\n\t /**\n\t * Poll all tabs for their status - OPENED / CLOSED\n\t * An interval is created which checks for last and current status.\n\t * There's a property on window i.e. `closed` which returns true for the closed window.\n\t * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n\t */\n\t value: function startPollingTabs() {\n\t var _this = this;\n\t\n\t heartBeat = window.setInterval(function () {\n\t return _this.addInterval();\n\t }, this.heartBeatInterval);\n\t }\n\t }, {\n\t key: 'watchStatus',\n\t\n\t\n\t /**\n\t * Compare tab status - OPEN vs CLOSE\n\t * @param {Object} tab\n\t */\n\t value: function watchStatus(tab) {\n\t if (!tab) {\n\t return false;\n\t }\n\t var newStatus = tab.ref.closed ? _TabStatusEnum2.default.CLOSE : _TabStatusEnum2.default.OPEN,\n\t oldStatus = tab.status;\n\t\n\t // If last and current status(inside a polling interval) are same, don't do anything\n\t if (!newStatus || newStatus === oldStatus) {\n\t return false;\n\t }\n\t\n\t // OPEN to CLOSE state\n\t if (oldStatus === _TabStatusEnum2.default.OPEN && newStatus === _TabStatusEnum2.default.CLOSE) {\n\t // remove tab from tabUtils\n\t _tab4.default._remove(tab);\n\t }\n\t // Change from CLOSE to OPEN state is never gonna happen ;)\n\t }\n\t }, {\n\t key: 'onChildUnload',\n\t\n\t\n\t /**\n\t * Called when a child is refreshed/closed\n\t * @param {Object} ev - Event\n\t */\n\t value: function onChildUnload(ev) {\n\t if (this.onChildDisconnect) {\n\t this.onChildDisconnect(ev.detail);\n\t }\n\t }\n\t\n\t /**\n\t * Enable link/btn, which got disabled on clicking.\n\t * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n\t * @param {Object} ev - Event\n\t */\n\t\n\t }, {\n\t key: 'customEventUnListener',\n\t value: function customEventUnListener(ev) {\n\t this.enableElements();\n\t if (this.onHandshakeCallback) {\n\t this.onHandshakeCallback(ev.detail);\n\t }\n\t }\n\t }, {\n\t key: 'addEventListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage, native and custom listeners to the window\n\t */\n\t value: function addEventListeners() {\n\t var _this2 = this;\n\t\n\t window.removeEventListener('message', _postmessage2.default.onNewTab);\n\t window.addEventListener('message', _postmessage2.default.onNewTab);\n\t\n\t window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n\t window.addEventListener('toggleElementDisabledAttribute', function (ev) {\n\t return _this2.customEventUnListener(ev);\n\t });\n\t\n\t window.removeEventListener('onChildUnload', this.onChildUnload);\n\t window.addEventListener('onChildUnload', function (ev) {\n\t return _this2.onChildUnload(ev);\n\t });\n\t\n\t // Let children tabs know when Parent is closed / refereshed.\n\t window.onbeforeunload = function () {\n\t _tab4.default.broadCastAll(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED);\n\t };\n\t }\n\t }, {\n\t key: 'enableElements',\n\t\n\t\n\t /**\n\t * API methods exposed for Public\n\t *\n\t * Re-enable the link/btn which got disabled on clicking\n\t */\n\t value: function enableElements() {\n\t _dom2.default.enable('data-tab-opener');\n\t }\n\t }, {\n\t key: 'getAllTabs',\n\t\n\t\n\t /**\n\t * Return list of all tabs\n\t * @return {Array}\n\t */\n\t value: function getAllTabs() {\n\t return _tab4.default.getAll();\n\t }\n\t }, {\n\t key: 'getOpenedTabs',\n\t\n\t\n\t /**\n\t * Return list of all OPENED tabs\n\t * @return {Array}\n\t */\n\t value: function getOpenedTabs() {\n\t return _tab4.default.getOpened();\n\t }\n\t }, {\n\t key: 'getClosedTabs',\n\t\n\t\n\t /**\n\t * Return list of all CLOSED tabs\n\t * @return {Array}\n\t */\n\t value: function getClosedTabs() {\n\t return _tab4.default.getClosed();\n\t }\n\t\n\t /**\n\t * Close all tabs at once\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'closeAllTabs',\n\t value: function closeAllTabs() {\n\t return _tab4.default.closeAll();\n\t }\n\t }, {\n\t key: 'closeTab',\n\t\n\t\n\t /**\n\t * Close a specific tab\n\t * @return {Object}\n\t */\n\t value: function closeTab(id) {\n\t return _tab4.default.closeTab(id);\n\t }\n\t }, {\n\t key: 'broadCastAll',\n\t\n\t\n\t /**\n\t * Send a postmessage to all OPENED tabs\n\t * @return {Object}\n\t */\n\t value: function broadCastAll(msg) {\n\t return _tab4.default.broadCastAll(msg);\n\t }\n\t\n\t /**\n\t * Send a postmessage to a specific tab\n\t * @return {Object}\n\t */\n\t\n\t }, {\n\t key: 'broadCastTo',\n\t value: function broadCastTo(id, msg) {\n\t return _tab4.default.broadCastTo(id, msg);\n\t }\n\t\n\t /**\n\t * Open a new tab. Config has to be passed with some required keys\n\t * @return {Object} tab\n\t */\n\t\n\t }, {\n\t key: 'openNewTab',\n\t value: function openNewTab(config) {\n\t if (!config) {\n\t throw new Error(_WarningTextEnum2.default.CONFIG_REQUIRED);\n\t }\n\t\n\t var url = config.url;\n\t\n\t if (!url) {\n\t throw new Error(_WarningTextEnum2.default.URL_REQUIRED);\n\t }\n\t\n\t tab = new this.Tab();\n\t tab.create(config);\n\t\n\t // If polling is already there, don't set it again\n\t if (!heartBeat) {\n\t this.startPollingTabs();\n\t }\n\t\n\t return tab;\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t\n\t /**\n\t * API methods exposed for Public ends here\n\t **/\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.addEventListeners();\n\t }\n\t }]);\n\t\n\t return Parent;\n\t}();\n\t\n\t;\n\t\n\texports.default = Parent;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _uuid = __webpack_require__(8);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _dom = __webpack_require__(9);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Tab = function () {\n\t /**\n\t * Invoked when the object is instantiated\n\t */\n\t function Tab() {\n\t _classCallCheck(this, Tab);\n\t\n\t // Set name of Parent tab if not already defined\n\t window.name = window.name || 'PARENT_TAB';\n\t }\n\t\n\t _createClass(Tab, [{\n\t key: 'create',\n\t\n\t /**\n\t * Open a new tab\n\t * @param {Object} config - Refer API for config keys\n\t * @return {Object} this\n\t */\n\t value: function create(config) {\n\t config = config || {};\n\t _extends(this, config);\n\t this.id = _uuid2.default.generate() || _tab2.default.tabs.length + 1;\n\t this.status = 'open';\n\t // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n\t this.ref = window.open(this.url, '_blank', config.windowFeatures);\n\t\n\t _dom2.default.disable('data-tab-opener');\n\t\n\t window.newlyTabOpened = {\n\t id: this.id,\n\t name: this.name,\n\t ref: this.ref\n\t };\n\t\n\t // Push it to the list of tabs\n\t _tab2.default.addNew(this);\n\t\n\t // Return reference for chaining purpose\n\t return this;\n\t }\n\t }]);\n\t\n\t return Tab;\n\t}();\n\t\n\t;\n\t\n\texports.default = Tab;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _TabStatusEnum = __webpack_require__(6);\n\t\n\tvar _TabStatusEnum2 = _interopRequireDefault(_TabStatusEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * A Tab utility file to deal with tab operations\n\t */\n\t\n\tvar tabUtils = {\n\t tabs: [],\n\t config: {}\n\t};\n\t\n\t/**\n\t * Remove a tab from a list of all tabs.\n\t * This is required when users opts for removing the closed tabs from the list of tabs.\n\t * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n\t * @param {Object} tab\n\t */\n\ttabUtils._remove = function (tab) {\n\t var index = void 0;\n\t\n\t index = _array2.default.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n\t tabUtils.tabs.splice(index, 1);\n\t};\n\t\n\t/**\n\t * As explained in `event-listeners/postmessage.js` file,\n\t * the data received from postmessage API is further processed based on our convention\n\t * @param {String} msg\n\t * @return {String} modified msg\n\t */\n\ttabUtils._preProcessMessage = function (msg) {\n\t // make msg always an object to support JSON support\n\t try {\n\t msg = JSON.stringify(msg);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (msg.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) === -1) {\n\t msg = _PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED + msg;\n\t }\n\t\n\t return msg;\n\t};\n\t/**\n\t * Add a new tab to the Array of tabs\n\t * @param {Object} tab\n\t * @return {Object} - this\n\t */\n\ttabUtils.addNew = function (tab) {\n\t tabUtils.tabs.push(tab);\n\t return undefined;\n\t};\n\t/**\n\t * Filter out all the opened tabs\n\t * @return {Array} - only the opened tabs\n\t */\n\ttabUtils.getOpened = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.OPEN;\n\t });\n\t};\n\t/**\n\t * Filter out all the closed tabs\n\t * @return {Array} - only the closed tabs\n\t */\n\ttabUtils.getClosed = function () {\n\t return tabUtils.tabs.filter(function (tab) {\n\t return tab.status === _TabStatusEnum2.default.CLOSE;\n\t });\n\t};\n\t/**\n\t * To get list of all tabs(closed/opened).\n\t * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n\t * @return {Array} - list of all tabs\n\t */\n\ttabUtils.getAll = function () {\n\t return tabUtils.tabs;\n\t};\n\t\n\t/**\n\t * Close a specific tab\n\t * @param {String} id\n\t * @return {Object} this\n\t */\n\ttabUtils.closeTab = function (id) {\n\t var tab = _array2.default.searchByKeyName(tabUtils.tabs, 'id', id);\n\t\n\t if (tab && tab.ref) {\n\t tab.ref.close();\n\t tab.status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t\n\t return tabUtils;\n\t // --tabUtils.tabs.length;\n\t};\n\t/**\n\t * Close all opened tabs using a native method `close` available on window.open reference.\n\t * @return {tabUtils} this\n\t */\n\ttabUtils.closeAll = function () {\n\t var i = void 0;\n\t\n\t for (i = 0; i < tabUtils.tabs.length; i++) {\n\t if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n\t tabUtils.tabs[i].ref.close();\n\t tabUtils.tabs[i].status = _TabStatusEnum2.default.CLOSE;\n\t }\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastAll = function (msg, isSiteInsideFrame) {\n\t var i = void 0,\n\t tabs = tabUtils.getOpened();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t for (i = 0; i < tabs.length; i++) {\n\t tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n\t }\n\t\n\t return tabUtils;\n\t};\n\t/**\n\t * Send a postmessage to a specific Child tab\n\t * @param {String} id\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.broadCastTo = function (id, msg, isSiteInsideFrame) {\n\t var targetedTab = void 0,\n\t tabs = tabUtils.getAll();\n\t\n\t msg = tabUtils._preProcessMessage(msg);\n\t\n\t targetedTab = _array2.default.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n\t tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\t\n\t return tabUtils;\n\t};\n\t\n\t/**\n\t * Send a postMessage to the desired window/frame\n\t * @param {Object} target\n\t * @param {String} msg\n\t * @param {Boolean} isSiteInsideFrame\n\t */\n\ttabUtils.sendMessage = function (target, msg, isSiteInsideFrame) {\n\t var origin = tabUtils.config.origin || '*';\n\t\n\t if (isSiteInsideFrame) {\n\t target.ref[0].postMessage(msg, origin);\n\t } else {\n\t target.ref.top.postMessage(msg, origin);\n\t }\n\t};\n\t\n\texports.default = tabUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for different event names used for tab-communication\n\t * @type {Object}\n\t */\n\tvar PostMessageEventNamesEnum = {\n\t LOADED: '__TAB__LOADED_EVENT__',\n\t CUSTOM: '__TAB__CUSTOM_EVENT__',\n\t ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n\t PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n\t HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n\t PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n\t};\n\t\n\texports.default = PostMessageEventNamesEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar arrayUtils = {};\n\t\n\t/**\n\t * Different type of data needed after searching an item(Object) within data(Array of Objects).\n\t * 1. `INDEX` returns just the index at which the item was present\n\t * 2. `OBJECT` returns the matched object\n\t * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n\t */\n\tvar returnPreferenceEnum = {\n\t INDEX: 'index',\n\t OBJECT: 'object',\n\t BOTH: 'both'\n\t};\n\t\n\t/**\n\t * Search for an item(Object) within a data-set(Array Of Objects)\n\t * @param {Array of Objects} data\n\t * @param {String} key - Unique key to search on the basis of\n\t * @param {String} value - The matching criteria\n\t * @param {String} returnPreference - what kind of output is needed\n\t * @return {Object}\n\t */\n\tarrayUtils.searchByKeyName = function (data, key, value, returnPreference) {\n\t if (!data || !key) {\n\t return false;\n\t }\n\t\n\t returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n\t var i = void 0,\n\t obj = void 0,\n\t returnData = void 0,\n\t index = -1;\n\t\n\t for (i = 0; i < data.length; i++) {\n\t obj = data[i];\n\t // Number matching support\n\t if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n\t index = i;\n\t break;\n\t } else if (isNaN(value) && obj[key] === value) {\n\t // String exact matching support\n\t index = i;\n\t break;\n\t }\n\t }\n\t\n\t if (index === -1) {\n\t // item not found\n\t data[index] = {}; // for consistency\n\t }\n\t\n\t switch (returnPreference) {\n\t case returnPreferenceEnum.INDEX:\n\t returnData = index;\n\t break;\n\t case returnPreferenceEnum.BOTH:\n\t returnData = {\n\t obj: data[index],\n\t index: index\n\t };\n\t break;\n\t case returnPreferenceEnum.OBJECT:\n\t default:\n\t returnData = data[index];\n\t break;\n\t }\n\t\n\t return returnData;\n\t};\n\t\n\texports.default = arrayUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for Tab status(still opened / closed) used for tab-communication\n\t * @type {Object}\n\t */\n\tvar TabStatusEnum = {\n\t OPEN: 'open',\n\t CLOSE: 'close'\n\t};\n\t\n\texports.default = TabStatusEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * Enum for showing various warnings to suser when things done wrong\n\t * @type {Object}\n\t */\n\tvar WarningTextEnum = {\n\t INVALID_JSON: 'Invalid JSON Object!',\n\t INVALID_DATA: 'Some wrong message is being sent by Parent.',\n\t CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n\t URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n\t};\n\t\n\texports.default = WarningTextEnum;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * UUID.js: The RFC-compliant UUID generator for JavaScript.\n\t * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n\t *\n\t * @author LiosK\n\t * @version v3.3.0\n\t * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n\t */\n\t\n\t/** @constructor */\n\tvar UUID = void 0;\n\t\n\tUUID = function () {\n\t 'use strict';\n\t\n\t /** @lends UUID */\n\t\n\t function UUID() {}\n\t\n\t /**\n\t * The simplest function to get an UUID string.\n\t * @returns {string} A version 4 UUID string.\n\t */\n\t UUID.generate = function () {\n\t var rand = UUID._getRandomInt,\n\t hex = UUID._hexAligner;\n\t\n\t // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n\t return hex(rand(32), 8) + // time_low\n\t '-' + hex(rand(16), 4) + // time_mid\n\t '-' + hex(0x4000 | rand(12), 4) + // time_hi_and_version\n\t '-' + hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n\t '-' + hex(rand(48), 12); // node\n\t };\n\t\n\t /**\n\t * Returns an unsigned x-bit random integer.\n\t * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n\t * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n\t */\n\t UUID._getRandomInt = function (x) {\n\t if (x < 0) {\n\t return NaN;\n\t }\n\t if (x <= 30) {\n\t return 0 | Math.random() * (1 << x);\n\t }\n\t if (x <= 53) {\n\t return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n\t }\n\t\n\t return NaN;\n\t };\n\t\n\t /**\n\t * Returns a function that converts an integer to a zero-filled string.\n\t * @param {int} radix\n\t * @returns {function(num, length)}\n\t */\n\t UUID._getIntAligner = function (radix) {\n\t return function (num, length) {\n\t var str = num.toString(radix),\n\t i = length - str.length,\n\t z = '0';\n\t\n\t for (; i > 0; i >>>= 1, z += z) {\n\t if (i & 1) {\n\t str = z + str;\n\t }\n\t }\n\t return str;\n\t };\n\t };\n\t\n\t UUID._hexAligner = UUID._getIntAligner(16);\n\t\n\t /**\n\t * Returns UUID string representation.\n\t * @returns {string} {@link UUID#hexString}.\n\t */\n\t UUID.prototype.toString = function () {\n\t return this.hexString;\n\t };\n\t\n\t return UUID;\n\t}(UUID);\n\t\n\texports.default = UUID;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/**\n\t * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n\t * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n\t * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n\t * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n\t *\n\t * Open Tab\n\t */\n\tvar domUtils = {\n\t disable: function disable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].setAttribute('disabled', 'disabled');\n\t }\n\t },\n\t enable: function enable(selector) {\n\t if (!selector) {\n\t return false;\n\t }\n\t\n\t var i = void 0,\n\t ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\t\n\t for (i = 0; i < ATOpenerElems.length; i++) {\n\t ATOpenerElems[i].removeAttribute('disabled');\n\t }\n\t }\n\t};\n\t\n\texports.default = domUtils;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _array = __webpack_require__(5);\n\t\n\tvar _array2 = _interopRequireDefault(_array);\n\t\n\tvar _tab = __webpack_require__(3);\n\t\n\tvar _tab2 = _interopRequireDefault(_tab);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar PostMessageListener = {};\n\t\n\t/*\n\t * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n\t * -------------------------------------------------------------------------------\n\t *\n\t * 1. First convetion\n\t Since data can be sent or receieved via postmessge API in the form of strings,\n\t the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n\t This is easy to maintain and deal with data.\n\t\n\t * 2. Second Convetions\n\t With every data, there's an associated message identifier.\n\t A message identifier helps in knowing the intention of what event actually is for.\n\t For eg: To send data after proper establishment from Child tab,\n\t Parent tab acknowledges the connection by returning the true identity of the Child tab.\n\t This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\t\n\t So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n\t So, while reading the message, it has to be first checked up with the defined event names\n\t and then after successful match, the message is split using the Event-name as a delimiter.\n\t The first entry if the event name and the second one is the actual data.\n\t *\n\t */\n\t\n\t/**\n\t * OnLoad Event - it serves as an communication establishment source from Child tab\n\t */\n\tPostMessageListener._onLoad = function (data) {\n\t var tabs = void 0,\n\t dataToSend = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.LOADED)[1];\n\t\n\t // Child was opened but parent got refereshed, opened a tab i.e.\n\t // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n\t if (tabInfo) {\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t // If Child knows its UUID, means Parent was refreshed and Child did not\n\t if (tabInfo.id) {\n\t tabs = _tab2.default.getAll();\n\t if (tabs.length) {\n\t window.newlyTabOpened = tabs[tabs.length - 1];\n\t window.newlyTabOpened.id = tabInfo.id;\n\t window.newlyTabOpened.name = tabInfo.name;\n\t }\n\t }\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t\n\t if (window.newlyTabOpened) {\n\t try {\n\t dataToSend = _PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT;\n\t dataToSend += JSON.stringify({\n\t id: window.newlyTabOpened.id,\n\t name: window.newlyTabOpened.name,\n\t parentName: window.name\n\t });\n\t _tab2.default.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * onCustomMessage Event - Any sort of custom message by child is treated here\n\t * @param {Object} data\n\t *\n\t * The method fires an event to notify Parent regarding Child's behavior\n\t */\n\tPostMessageListener._onCustomMessage = function (data) {\n\t var tabInfo = data.split(_PostMessageEventNamesEnum2.default.CUSTOM)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('toggleElementDisabledAttribute', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t window.newlyTabOpened = null;\n\t};\n\t\n\t/**\n\t * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n\t * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n\t *\n\t * It sets the newlyTabOpened variable accordingly\n\t *\n\t * @param {Object} data\n\t */\n\tPostMessageListener._onBeforeUnload = function (data) {\n\t var tabs = void 0,\n\t tabInfo = data.split(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD)[1];\n\t\n\t try {\n\t tabInfo = JSON.parse(tabInfo);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t\n\t if (_tab2.default.tabs.length) {\n\t tabs = _tab2.default.getAll();\n\t window.newlyTabOpened = _array2.default.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n\t }\n\t\n\t // CustomEvent is not supported in IE and so does this library\n\t var event = new CustomEvent('onChildUnload', { 'detail': tabInfo });\n\t\n\t window.dispatchEvent(event);\n\t};\n\t\n\t/**\n\t * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n\t * @param {Object} message\n\t */\n\tPostMessageListener.onNewTab = function (message) {\n\t var data = message.data;\n\t\n\t /**\n\t * Safe check - This happens when CHild Tab gets closed just after sending a message.\n\t * No need to go further from this point.\n\t * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n\t */\n\t if (!data || typeof data !== 'string' || !_tab2.default.tabs.length) {\n\t return false;\n\t }\n\t\n\t // `origin` check for secureity point of view\n\t if (_tab2.default.config.origin && _tab2.default.config.origin !== message.origin) {\n\t return false;\n\t }\n\t\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.LOADED) > -1) {\n\t PostMessageListener._onLoad(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.CUSTOM) > -1) {\n\t PostMessageListener._onCustomMessage(data);\n\t } else if (data.indexOf(_PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD) > -1) {\n\t PostMessageListener._onBeforeUnload(data);\n\t }\n\t};\n\t\n\texports.default = PostMessageListener;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _PostMessageEventNamesEnum = __webpack_require__(4);\n\t\n\tvar _PostMessageEventNamesEnum2 = _interopRequireDefault(_PostMessageEventNamesEnum);\n\t\n\tvar _WarningTextEnum = __webpack_require__(7);\n\t\n\tvar _WarningTextEnum2 = _interopRequireDefault(_WarningTextEnum);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Named Class expression\n\tvar Child = function () {\n\t /**\n\t * Involed when object is instantiated\n\t * Set flags/variables and calls init method to attach event listeners\n\t * @param {Object} config - Refer API/docs for config keys\n\t */\n\t function Child(config) {\n\t _classCallCheck(this, Child);\n\t\n\t this.sessionStorageKey = '__vwo_new_tab_info__';\n\t\n\t if (!config) {\n\t config = {};\n\t }\n\t if (typeof config.handshakeExpiryLimit === 'undefined') {\n\t config.handshakeExpiryLimit = 5000;\n\t }\n\t if (typeof config.shouldInitImmediately === 'undefined') {\n\t config.shouldInitImmediately = true;\n\t }\n\t\n\t this.tabName = window.name;\n\t this.tabId = null;\n\t this.tabParentName = null;\n\t\n\t _extends(this, config);\n\t this.config = config;\n\t\n\t if (this.shouldInitImmediately) {\n\t this.init();\n\t }\n\t }\n\t\n\t _createClass(Child, [{\n\t key: '_isSessionStorage',\n\t\n\t\n\t /**\n\t * Check is sessionStorage is present on window\n\t * @return {Boolean} [description]\n\t */\n\t value: function _isSessionStorage() {\n\t if ('sessionStorage' in window && window.sessionStorage) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: '_getData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _getData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t return window.sessionStorage.getItem(this.sessionStorageKey);\n\t }\n\t }, {\n\t key: '_setData',\n\t\n\t\n\t /**\n\t * Set stored data from sessionStorage\n\t * @return {Object} data\n\t */\n\t value: function _setData(dataReceived) {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n\t return dataReceived;\n\t }\n\t }, {\n\t key: '_restoreData',\n\t\n\t\n\t /**\n\t * Get stored data from sessionStorage and parse it\n\t * @return {Object} data\n\t */\n\t value: function _restoreData() {\n\t if (!this.isSessionStorageSupported) {\n\t return false;\n\t }\n\t\n\t if (this.isSessionStorageSupported) {\n\t var storedData = this._getData();\n\t\n\t this._parseData(storedData);\n\t }\n\t }\n\t }, {\n\t key: '_parseData',\n\t\n\t\n\t /**\n\t * Parse data fetched from sessionStorage\n\t * @param {String} dataReceived\n\t */\n\t value: function _parseData(dataReceived) {\n\t var actualData = void 0;\n\t\n\t // Expecting JSON data\n\t try {\n\t actualData = JSON.parse(dataReceived);\n\t this.tabId = actualData && actualData.id;\n\t this.tabParentName = actualData && actualData.parentName;\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_DATA);\n\t };\n\t }\n\t }, {\n\t key: 'onCommunication',\n\t\n\t\n\t /**\n\t * The core of this file\n\t * This method receives the postmessage from Parent\n\t * after establishing a proper communication channel between Parent tab and Child tab.\n\t * It removes the handshake timeout.\n\t * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n\t *\n\t * @param {String} message\n\t */\n\t value: function onCommunication(message) {\n\t var _this = this;\n\t\n\t var dataReceived = void 0,\n\t data = message.data;\n\t\n\t if (!data || typeof data !== 'string') {\n\t return;\n\t }\n\t\n\t // `origin` check for secureity point of view\n\t if (this.config.origin && this.config.origin !== message.origin) {\n\t return;\n\t }\n\t\n\t // cancel timeout\n\t window.clearTimeout(this.timeout);\n\t\n\t // When Parent tab gets closed or refereshed\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_DISCONNECTED) > -1) {\n\t // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n\t if (this.config.onParentDisconnect) {\n\t this.config.onParentDisconnect();\n\t }\n\t\n\t // remove postMessage listener since no Parent is there to communicate with\n\t window.removeEventListener('message', function (evt) {\n\t return _this.onCommunication(evt);\n\t });\n\t }\n\t\n\t /**\n\t * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n\t * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n\t */\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT) > -1) {\n\t var msg = void 0;\n\t\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.HANDSHAKE_WITH_PARENT)[1];\n\t\n\t // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n\t this._setData(dataReceived);\n\t this._parseData(dataReceived);\n\t\n\t msg = _PostMessageEventNamesEnum2.default.CUSTOM + JSON.stringify({\n\t id: this.tabId,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t });\n\t this.sendMessageToParent(msg);\n\t\n\t if (this.config.onInitialize) {\n\t this.config.onInitialize();\n\t }\n\t }\n\t\n\t // Whenever Parent tab communicates once the communication channel is established\n\t if (data.indexOf(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED) > -1) {\n\t dataReceived = data.split(_PostMessageEventNamesEnum2.default.PARENT_COMMUNICATED)[1];\n\t\n\t try {\n\t dataReceived = JSON.parse(dataReceived);\n\t } catch (e) {\n\t throw new Error(_WarningTextEnum2.default.INVALID_JSON);\n\t }\n\t // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n\t if (this.config.onParentCommunication) {\n\t this.config.onParentCommunication(dataReceived);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'addListeners',\n\t\n\t\n\t /**\n\t * Attach postmessage and onbeforeunload event listeners\n\t */\n\t value: function addListeners() {\n\t var _this2 = this;\n\t\n\t window.onbeforeunload = function (evt) {\n\t var msg = _PostMessageEventNamesEnum2.default.ON_BEFORE_UNLOAD + JSON.stringify({\n\t id: _this2.tabId,\n\t isSiteInsideFrame: _this2.config.isSiteInsideFrame\n\t });\n\t\n\t _this2.sendMessageToParent(msg);\n\t };\n\t\n\t window.removeEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t window.addEventListener('message', function (evt) {\n\t return _this2.onCommunication(evt);\n\t });\n\t }\n\t }, {\n\t key: 'setHandshakeExpiry',\n\t\n\t\n\t /**\n\t * Call a user-defined method `onHandShakeExpiry`\n\t * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n\t * @return {Function}\n\t */\n\t value: function setHandshakeExpiry() {\n\t var _this3 = this;\n\t\n\t return window.setTimeout(function () {\n\t if (_this3.config.onHandShakeExpiry) {\n\t _this3.config.onHandShakeExpiry();\n\t }\n\t }, this.handshakeExpiryLimit);\n\t }\n\t\n\t /**\n\t * API starts here ->\n\t *\n\t * Send a postmessage to the corresponding Parent tab\n\t * @param {String} msg\n\t = */\n\t\n\t }, {\n\t key: 'sendMessageToParent',\n\t value: function sendMessageToParent(msg) {\n\t var origin = void 0;\n\t\n\t if (window.top.opener) {\n\t origin = this.config.origin || '*';\n\t window.top.opener.postMessage(msg, origin);\n\t }\n\t }\n\t }, {\n\t key: 'getTabInfo',\n\t\n\t\n\t /**\n\t * Get current Tab info i.e. id, name and parentName\n\t * @return {Object} tab-info\n\t */\n\t value: function getTabInfo() {\n\t return {\n\t id: this.tabId,\n\t name: this.tabName,\n\t parentName: this.tabParentName,\n\t isSiteInsideFrame: this.config.isSiteInsideFrame\n\t };\n\t }\n\t }, {\n\t key: 'init',\n\t\n\t /**\n\t * API ends here ->\n\t */\n\t\n\t /**\n\t * Invoked on object instantiation unless user pass a key to call it explicitly\n\t */\n\t value: function init() {\n\t this.isSessionStorageSupported = this._isSessionStorage();\n\t this.addListeners();\n\t this._restoreData();\n\t this.sendMessageToParent(_PostMessageEventNamesEnum2.default.LOADED + JSON.stringify(this.getTabInfo()));\n\t this.timeout = this.setHandshakeExpiry();\n\t\n\t if (this.config.onReady) {\n\t this.config.onReady();\n\t }\n\t }\n\t }]);\n\t\n\t return Child;\n\t}();\n\t\n\t;\n\t\n\texports.default = Child;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ]);\n\n\n/** WEBPACK FOOTER **\n ** across-tabs.this.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 6e5f03bab31995356316\n **/","import Parent from './parent';\nimport Child from './child';\n\n/**\n * Expose Parent and Child modules on AcrossTabs Object\n * @type {Object}\n */\nconst AcrossTabs = {\n Parent: Parent,\n Child: Child\n};\n\nexport default AcrossTabs;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import Tab from './tab';\n\nimport tabUtils from './utils/tab';\nimport domUtils from './utils/dom';\n\nimport TabStatusEnum from './enums/TabStatusEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\n\nimport PostMessageListener from './event-listeners/postmessage';\n\nlet heartBeat, tab;\n\n// Named Class expression\nclass Parent {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n config = config || {};\n if (typeof config.heartBeatInterval === 'undefined') {\n config.heartBeatInterval = 500;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n // reset tabs with every new Object\n tabUtils.tabs = [];\n\n this.Tab = Tab;\n Object.assign(this, config);\n\n tabUtils.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n addInterval() {\n let i,\n tabs = tabUtils.getAll(),\n openedTabs = tabUtils.getOpened();\n\n // don't poll if all tabs are in CLOSED states\n if (!openedTabs || !openedTabs.length) {\n window.clearInterval(heartBeat); // stop the interval\n heartBeat = null;\n return false;\n }\n\n for (i = 0; i < tabs.length; i++) {\n if (this.removeClosedTabs) {\n this.watchStatus(tabs[i]);\n }\n /**\n * The check is required since tab would be removed when closed(in case of `removeClosedTabs` flag),\n * irrespective of heatbeat controller\n */\n if (tabs[i]) {\n tabs[i].status = tabs[i].ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN;\n }\n }\n\n // Call the user-defined callback after every polling operation is operted in a single run\n if (this.onPollingCallback) {\n this.onPollingCallback();\n }\n };\n\n /**\n * Poll all tabs for their status - OPENED / CLOSED\n * An interval is created which checks for last and current status.\n * There's a property on window i.e. `closed` which returns true for the closed window.\n * And one can see `true` only in another tab when the tab was opened by the same `another` tab.\n */\n startPollingTabs() {\n heartBeat = window.setInterval(() => this.addInterval(), this.heartBeatInterval);\n };\n\n /**\n * Compare tab status - OPEN vs CLOSE\n * @param {Object} tab\n */\n watchStatus(tab) {\n if (!tab) { return false; }\n let newStatus = tab.ref.closed ? TabStatusEnum.CLOSE : TabStatusEnum.OPEN,\n oldStatus = tab.status;\n\n // If last and current status(inside a polling interval) are same, don't do anything\n if (!newStatus || newStatus === oldStatus) { return false; }\n\n // OPEN to CLOSE state\n if (oldStatus === TabStatusEnum.OPEN && newStatus === TabStatusEnum.CLOSE) {\n // remove tab from tabUtils\n tabUtils._remove(tab);\n }\n // Change from CLOSE to OPEN state is never gonna happen ;)\n };\n\n /**\n * Called when a child is refreshed/closed\n * @param {Object} ev - Event\n */\n onChildUnload(ev) {\n if (this.onChildDisconnect) {\n this.onChildDisconnect(ev.detail);\n }\n }\n\n /**\n * Enable link/btn, which got disabled on clicking.\n * Note: works only when `data-tab-opener=\"heatmap\"` is used on the respective element\n * @param {Object} ev - Event\n */\n customEventUnListener(ev) {\n this.enableElements();\n if (this.onHandshakeCallback) {\n this.onHandshakeCallback(ev.detail);\n }\n };\n\n /**\n * Attach postmessage, native and custom listeners to the window\n */\n addEventListeners() {\n window.removeEventListener('message', PostMessageListener.onNewTab);\n window.addEventListener('message', PostMessageListener.onNewTab);\n\n window.removeEventListener('toggleElementDisabledAttribute', this.customEventUnListener);\n window.addEventListener('toggleElementDisabledAttribute', ev => this.customEventUnListener(ev));\n\n window.removeEventListener('onChildUnload', this.onChildUnload);\n window.addEventListener('onChildUnload', ev => this.onChildUnload(ev));\n\n // Let children tabs know when Parent is closed / refereshed.\n window.onbeforeunload = () => {\n tabUtils.broadCastAll(PostMessageEventNamesEnum.PARENT_DISCONNECTED);\n };\n };\n\n /**\n * API methods exposed for Public\n *\n * Re-enable the link/btn which got disabled on clicking\n */\n enableElements() {\n domUtils.enable('data-tab-opener');\n };\n\n /**\n * Return list of all tabs\n * @return {Array}\n */\n getAllTabs() {\n return tabUtils.getAll();\n };\n\n /**\n * Return list of all OPENED tabs\n * @return {Array}\n */\n getOpenedTabs() {\n return tabUtils.getOpened();\n };\n\n /**\n * Return list of all CLOSED tabs\n * @return {Array}\n */\n getClosedTabs() {\n return tabUtils.getClosed();\n }\n\n /**\n * Close all tabs at once\n * @return {Object}\n */\n closeAllTabs() {\n return tabUtils.closeAll();\n };\n\n /**\n * Close a specific tab\n * @return {Object}\n */\n closeTab(id) {\n return tabUtils.closeTab(id);\n };\n\n /**\n * Send a postmessage to all OPENED tabs\n * @return {Object}\n */\n broadCastAll(msg) {\n return tabUtils.broadCastAll(msg);\n }\n\n /**\n * Send a postmessage to a specific tab\n * @return {Object}\n */\n broadCastTo(id, msg) {\n return tabUtils.broadCastTo(id, msg);\n }\n\n /**\n * Open a new tab. Config has to be passed with some required keys\n * @return {Object} tab\n */\n openNewTab(config) {\n if (!config) {\n throw new Error(WarningTextEnum.CONFIG_REQUIRED);\n }\n\n let url = config.url;\n\n if (!url) {\n throw new Error(WarningTextEnum.URL_REQUIRED);\n }\n\n tab = new this.Tab();\n tab.create(config);\n\n // If polling is already there, don't set it again\n if (!heartBeat) {\n this.startPollingTabs();\n }\n\n return tab;\n\n };\n\n /**\n * API methods exposed for Public ends here\n **/\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.addEventListeners();\n };\n};\n\nexport default Parent;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/parent.js\n **/","import tabUtils from './utils/tab';\nimport UUID from './vendor/uuid';\nimport domUtils from './utils/dom';\n\n// Named Class expression\nclass Tab {\n /**\n * Invoked when the object is instantiated\n */\n constructor() {\n // Set name of Parent tab if not already defined\n window.name = window.name || 'PARENT_TAB';\n };\n /**\n * Open a new tab\n * @param {Object} config - Refer API for config keys\n * @return {Object} this\n */\n create(config) {\n config = config || {};\n Object.assign(this, config);\n this.id = UUID.generate() || (tabUtils.tabs.length + 1);\n this.status = 'open';\n // Refere https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features for WindowFeatures\n this.ref = window.open(\n this.url,\n '_blank',\n config.windowFeatures);\n\n domUtils.disable('data-tab-opener');\n\n window.newlyTabOpened = {\n id: this.id,\n name: this.name,\n ref: this.ref\n };\n\n // Push it to the list of tabs\n tabUtils.addNew(this);\n\n // Return reference for chaining purpose\n return this;\n };\n};\n\nexport default Tab;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/tab.js\n **/","/**\n * A Tab utility file to deal with tab operations\n */\n\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\nimport arrayUtils from './array';\nimport TabStatusEnum from '../enums/TabStatusEnum';\nimport WarningTextEnum from '../enums/WarningTextEnum';\n\nlet tabUtils = {\n tabs: [],\n config: {}\n};\n\n/**\n * Remove a tab from a list of all tabs.\n * This is required when users opts for removing the closed tabs from the list of tabs.\n * This can be done explictly by passing `removeClosedTabs` key while instantiating Parent.\n * @param {Object} tab\n */\ntabUtils._remove = (tab) => {\n let index;\n\n index = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', tab.id, 'index');\n tabUtils.tabs.splice(index, 1);\n};\n\n/**\n * As explained in `event-listeners/postmessage.js` file,\n * the data received from postmessage API is further processed based on our convention\n * @param {String} msg\n * @return {String} modified msg\n */\ntabUtils._preProcessMessage = (msg) => {\n // make msg always an object to support JSON support\n try {\n msg = JSON.stringify(msg);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (msg.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) === -1) {\n msg = PostMessageEventNamesEnum.PARENT_COMMUNICATED + msg;\n }\n\n return msg;\n};\n/**\n * Add a new tab to the Array of tabs\n * @param {Object} tab\n * @return {Object} - this\n */\ntabUtils.addNew = (tab) => {\n tabUtils.tabs.push(tab);\n return this;\n};\n/**\n * Filter out all the opened tabs\n * @return {Array} - only the opened tabs\n */\ntabUtils.getOpened = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.OPEN);\n};\n/**\n * Filter out all the closed tabs\n * @return {Array} - only the closed tabs\n */\ntabUtils.getClosed = () => {\n return tabUtils.tabs.filter(tab => tab.status === TabStatusEnum.CLOSE);\n};\n/**\n * To get list of all tabs(closed/opened).\n * Note: Closed tabs will not be returned if `removeClosedTabs` key is paased while instantiaiting Parent.\n * @return {Array} - list of all tabs\n */\ntabUtils.getAll = () => {\n return tabUtils.tabs;\n};\n\n/**\n * Close a specific tab\n * @param {String} id\n * @return {Object} this\n */\ntabUtils.closeTab = (id) => {\n let tab = arrayUtils.searchByKeyName(tabUtils.tabs, 'id', id);\n\n if (tab && tab.ref) {\n tab.ref.close();\n tab.status = TabStatusEnum.CLOSE;\n }\n\n return tabUtils;\n // --tabUtils.tabs.length;\n};\n/**\n * Close all opened tabs using a native method `close` available on window.open reference.\n * @return {tabUtils} this\n */\ntabUtils.closeAll = () => {\n let i;\n\n for (i = 0; i < tabUtils.tabs.length; i++) {\n if (tabUtils.tabs[i] && tabUtils.tabs[i].ref) {\n tabUtils.tabs[i].ref.close();\n tabUtils.tabs[i].status = TabStatusEnum.CLOSE;\n }\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to every opened Child tab(excluding itself i.e Parent Tab)\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastAll = (msg, isSiteInsideFrame) => {\n let i, tabs = tabUtils.getOpened();\n\n msg = tabUtils._preProcessMessage(msg);\n\n for (i = 0; i < tabs.length; i++) {\n tabUtils.sendMessage(tabs[i], msg, isSiteInsideFrame);\n }\n\n return tabUtils;\n};\n/**\n * Send a postmessage to a specific Child tab\n * @param {String} id\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.broadCastTo = (id, msg, isSiteInsideFrame) => {\n let targetedTab,\n tabs = tabUtils.getAll();\n\n msg = tabUtils._preProcessMessage(msg);\n\n targetedTab = arrayUtils.searchByKeyName(tabs, 'id', id); // TODO: tab.id\n tabUtils.sendMessage(targetedTab, msg, isSiteInsideFrame);\n\n return tabUtils;\n};\n\n/**\n * Send a postMessage to the desired window/frame\n * @param {Object} target\n * @param {String} msg\n * @param {Boolean} isSiteInsideFrame\n */\ntabUtils.sendMessage = (target, msg, isSiteInsideFrame) => {\n let origin = tabUtils.config.origin || '*';\n\n if (isSiteInsideFrame) {\n target.ref[0].postMessage(msg, origin);\n } else {\n target.ref.top.postMessage(msg, origin);\n }\n\n};\n\nexport default tabUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/tab.js\n **/","/**\n * Enum for different event names used for tab-communication\n * @type {Object}\n */\nconst PostMessageEventNamesEnum = {\n LOADED: '__TAB__LOADED_EVENT__',\n CUSTOM: '__TAB__CUSTOM_EVENT__',\n ON_BEFORE_UNLOAD: '__TAB__ON_BEFORE_UNLOAD__',\n PARENT_DISCONNECTED: '__PARENT_DISCONNECTED__',\n HANDSHAKE_WITH_PARENT: '__HANDSHAKE_WITH_PARENT__',\n PARENT_COMMUNICATED: '__PARENT_COMMUNICATED__'\n};\n\nexport default PostMessageEventNamesEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/PostMessageEventNamesEnum.js\n **/","let arrayUtils = {};\n\n/**\n * Different type of data needed after searching an item(Object) within data(Array of Objects).\n * 1. `INDEX` returns just the index at which the item was present\n * 2. `OBJECT` returns the matched object\n * 3. `BOTH` returns an object { obj: matched_object, index: index_found }\n */\nlet returnPreferenceEnum = {\n INDEX: 'index',\n OBJECT: 'object',\n BOTH: 'both'\n};\n\n/**\n * Search for an item(Object) within a data-set(Array Of Objects)\n * @param {Array of Objects} data\n * @param {String} key - Unique key to search on the basis of\n * @param {String} value - The matching criteria\n * @param {String} returnPreference - what kind of output is needed\n * @return {Object}\n */\narrayUtils.searchByKeyName = (data, key, value, returnPreference) => {\n if (!data || !key) { return false; }\n\n returnPreference = returnPreference || returnPreferenceEnum[1]; // default to Object\n let i, obj, returnData, index = -1;\n\n for (i = 0; i < data.length; i++) {\n obj = data[i];\n // Number matching support\n if (!isNaN(value) && parseInt(obj[key], 10) === parseInt(value, 10)) {\n index = i;\n break;\n } else if (isNaN(value) && obj[key] === value) { // String exact matching support\n index = i;\n break;\n }\n }\n\n if (index === -1) { // item not found\n data[index] = {}; // for consistency\n }\n\n switch (returnPreference) {\n case returnPreferenceEnum.INDEX:\n returnData = index;\n break;\n case returnPreferenceEnum.BOTH:\n returnData = {\n obj: data[index],\n index: index\n };\n break;\n case returnPreferenceEnum.OBJECT:\n default:\n returnData = data[index];\n break;\n }\n\n return returnData;\n\n};\n\nexport default arrayUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/array.js\n **/","/**\n * Enum for Tab status(still opened / closed) used for tab-communication\n * @type {Object}\n */\nconst TabStatusEnum = {\n OPEN: 'open',\n CLOSE: 'close'\n};\n\nexport default TabStatusEnum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/TabStatusEnum.js\n **/","/**\n * Enum for showing various warnings to suser when things done wrong\n * @type {Object}\n */\nconst WarningTextEnum = {\n INVALID_JSON: 'Invalid JSON Object!',\n INVALID_DATA: 'Some wrong message is being sent by Parent.',\n CONFIG_REQUIRED: 'Configuration options required. Please read docs.',\n URL_REQUIRED: 'Url is needed for creating and opening a new window/tab. Please read docs.'\n};\n\nexport default WarningTextEnum;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/enums/WarningTextEnum.js\n **/","/**\n * UUID.js: The RFC-compliant UUID generator for JavaScript.\n * ES6 port of only `generate` method of UUID by Varun Malhotra under MIT License\n *\n * @author LiosK\n * @version v3.3.0\n * @license The MIT License: Copyright (c) 2010-2016 LiosK.\n */\n\n/** @constructor */\nlet UUID;\n\nUUID = (function () {\n 'use strict';\n\n /** @lends UUID */\n function UUID() {}\n\n /**\n * The simplest function to get an UUID string.\n * @returns {string} A version 4 UUID string.\n */\n UUID.generate = function () {\n let rand = UUID._getRandomInt, hex = UUID._hexAligner;\n\n // [\"timeLow\", \"timeMid\", \"timeHiAndVersion\", \"clockSeqHiAndReserved\", \"clockSeqLow\", \"node\"]\n return hex(rand(32), 8) + // time_low\n '-' +\n hex(rand(16), 4) + // time_mid\n '-' +\n hex(0x4000 | rand(12), 4) + // time_hi_and_version\n '-' +\n hex(0x8000 | rand(14), 4) + // clock_seq_hi_and_reserved clock_seq_low\n '-' +\n hex(rand(48), 12); // node\n };\n\n /**\n * Returns an unsigned x-bit random integer.\n * @param {int} x A positive integer ranging from 0 to 53, inclusive.\n * @returns {int} An unsigned x-bit random integer (0 <= f(x) < 2^x).\n */\n UUID._getRandomInt = function (x) {\n if (x < 0) {\n return NaN;\n }\n if (x <= 30) {\n return (0 | Math.random() * (1 << x));\n }\n if (x <= 53) {\n return (0 | Math.random() * (1 << 30)) +\n (0 | Math.random() * (1 << x - 30)) * (1 << 30);\n }\n\n return NaN;\n };\n\n /**\n * Returns a function that converts an integer to a zero-filled string.\n * @param {int} radix\n * @returns {function(num, length)}\n */\n UUID._getIntAligner = function (radix) {\n return function (num, length) {\n let str = num.toString(radix), i = length - str.length, z = '0';\n\n for (; i > 0; i >>>= 1, z += z) {\n if (i & 1) {\n str = z + str;\n }\n }\n return str;\n };\n };\n\n UUID._hexAligner = UUID._getIntAligner(16);\n\n /**\n * Returns UUID string representation.\n * @returns {string} {@link UUID#hexString}.\n */\n UUID.prototype.toString = function () {\n return this.hexString;\n };\n\n return UUID;\n\n})(UUID);\n\nexport default UUID;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/uuid.js\n **/","/**\n * This utility helps enabling/disabling the Link/Button on the Parent Tab.\n * As soon as, user clicks on link/btn to open a new tab, the link/btn gets disabled.\n * Once child communicates for the first time with the Parent, the link/btn is re-enabled to open up new tab.\n * This feature is toggleable and can be used explicitly putting a data attribute on the link/btn.\n *\n * Open Tab\n */\nlet domUtils = {\n disable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].setAttribute('disabled', 'disabled');\n }\n },\n enable: (selector) => {\n if (!selector) { return false; }\n\n let i, ATOpenerElems = document.querySelectorAll('[' + selector + ']');\n\n for (i = 0; i < ATOpenerElems.length; i++) {\n ATOpenerElems[i].removeAttribute('disabled');\n }\n }\n};\n\nexport default domUtils;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/dom.js\n **/","import arrayUtils from '../utils/array';\nimport tabUtils from '../utils/tab';\nimport WarningTextEnum from '../enums/WarningTextEnum';\nimport PostMessageEventNamesEnum from '../enums/PostMessageEventNamesEnum';\n\nlet PostMessageListener = {};\n\n/*\n * Custom PostMessage Convetions Followed - Sending and Receieving data gracefully\n * -------------------------------------------------------------------------------\n *\n * 1. First convetion\n Since data can be sent or receieved via postmessge API in the form of strings,\n the library stores data as stringified JSON object and while reading it, parses the JSON stringified earlier.\n This is easy to maintain and deal with data.\n\n * 2. Second Convetions\n With every data, there's an associated message identifier.\n A message identifier helps in knowing the intention of what event actually is for.\n For eg: To send data after proper establishment from Child tab,\n Parent tab acknowledges the connection by returning the true identity of the Child tab.\n This is done via prepending the Event name i.e. HANDSHAKE_WTIH_PARENT\n\n So the postmessage's message would like: `HANDSHAKE_WTIH_PARENT{\"id\": 123, \"name\": \"Hello World!\"}`.\n So, while reading the message, it has to be first checked up with the defined event names\n and then after successful match, the message is split using the Event-name as a delimiter.\n The first entry if the event name and the second one is the actual data.\n *\n */\n\n/**\n * OnLoad Event - it serves as an communication establishment source from Child tab\n */\nPostMessageListener._onLoad = (data) => {\n let tabs,\n dataToSend,\n tabInfo = data.split(PostMessageEventNamesEnum.LOADED)[1];\n\n // Child was opened but parent got refereshed, opened a tab i.e.\n // last opened tab will get refreshed(browser behavior). WOW! Handle this now.\n if (tabInfo) {\n try {\n tabInfo = JSON.parse(tabInfo);\n // If Child knows its UUID, means Parent was refreshed and Child did not\n if (tabInfo.id) {\n tabs = tabUtils.getAll();\n if (tabs.length) {\n window.newlyTabOpened = tabs[tabs.length - 1];\n window.newlyTabOpened.id = tabInfo.id;\n window.newlyTabOpened.name = tabInfo.name;\n }\n }\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n\n if (window.newlyTabOpened) {\n try {\n dataToSend = PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT;\n dataToSend += JSON.stringify({\n id: window.newlyTabOpened.id,\n name: window.newlyTabOpened.name,\n parentName: window.name\n });\n tabUtils.sendMessage(window.newlyTabOpened, dataToSend, tabInfo.isSiteInsideFrame);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n }\n};\n\n/**\n * onCustomMessage Event - Any sort of custom message by child is treated here\n * @param {Object} data\n *\n * The method fires an event to notify Parent regarding Child's behavior\n */\nPostMessageListener._onCustomMessage = (data) => {\n let tabInfo = data.split(PostMessageEventNamesEnum.CUSTOM)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('toggleElementDisabledAttribute', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n window.newlyTabOpened = null;\n};\n\n/**\n * onBeforeUnload Event - Tells parent that either Child tab was closed or refreshed.\n * Child uses native `ON_BEFORE_UNLOAD` method to notify Parent.\n *\n * It sets the newlyTabOpened variable accordingly\n *\n * @param {Object} data\n */\nPostMessageListener._onBeforeUnload = (data) => {\n let tabs, tabInfo = data.split(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD)[1];\n\n try {\n tabInfo = JSON.parse(tabInfo);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n\n if (tabUtils.tabs.length) {\n tabs = tabUtils.getAll();\n window.newlyTabOpened = arrayUtils.searchByKeyName(tabs, 'id', tabInfo.id) || window.newlyTabOpened;\n }\n\n // CustomEvent is not supported in IE and so does this library\n let event = new CustomEvent('onChildUnload', {'detail': tabInfo});\n\n window.dispatchEvent(event);\n};\n\n/**\n * onNewTab - It's the entry point for data processing after receiving any postmessage form any Child Tab\n * @param {Object} message\n */\nPostMessageListener.onNewTab = (message) => {\n let data = message.data;\n\n /**\n * Safe check - This happens when CHild Tab gets closed just after sending a message.\n * No need to go further from this point.\n * Tab status is automatically fetched using our polling mechanism written in `Parent.js` file.\n */\n if (!data || typeof data !== 'string' || !tabUtils.tabs.length) {\n return false;\n }\n\n // `origin` check for secureity point of view\n if (tabUtils.config.origin && tabUtils.config.origin !== message.origin) {\n return false;\n }\n\n if (data.indexOf(PostMessageEventNamesEnum.LOADED) > -1) {\n PostMessageListener._onLoad(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.CUSTOM) > -1) {\n PostMessageListener._onCustomMessage(data);\n } else if (data.indexOf(PostMessageEventNamesEnum.ON_BEFORE_UNLOAD) > -1) {\n PostMessageListener._onBeforeUnload(data);\n }\n};\n\nexport default PostMessageListener;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/event-listeners/postmessage.js\n **/","import PostMessageEventNamesEnum from './enums/PostMessageEventNamesEnum';\nimport WarningTextEnum from './enums/WarningTextEnum';\n\n// Named Class expression\nclass Child {\n /**\n * Involed when object is instantiated\n * Set flags/variables and calls init method to attach event listeners\n * @param {Object} config - Refer API/docs for config keys\n */\n constructor(config) {\n this.sessionStorageKey = '__vwo_new_tab_info__';\n\n if (!config) {\n config = {};\n }\n if (typeof config.handshakeExpiryLimit === 'undefined') {\n config.handshakeExpiryLimit = 5000;\n }\n if (typeof config.shouldInitImmediately === 'undefined') {\n config.shouldInitImmediately = true;\n }\n\n this.tabName = window.name;\n this.tabId = null;\n this.tabParentName = null;\n\n Object.assign(this, config);\n this.config = config;\n\n if (this.shouldInitImmediately) {\n this.init();\n }\n };\n\n /**\n * Check is sessionStorage is present on window\n * @return {Boolean} [description]\n */\n _isSessionStorage() {\n if ('sessionStorage' in window && window.sessionStorage) {\n return true;\n }\n return false;\n };\n\n /**\n * Get stored data from sessionStorage\n * @return {Object} data\n */\n _getData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n return window.sessionStorage.getItem(this.sessionStorageKey);\n };\n\n /**\n * Set stored data from sessionStorage\n * @return {Object} data\n */\n _setData(dataReceived) {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n window.sessionStorage.setItem(this.sessionStorageKey, dataReceived);\n return dataReceived;\n };\n\n /**\n * Get stored data from sessionStorage and parse it\n * @return {Object} data\n */\n _restoreData() {\n if (!this.isSessionStorageSupported) {\n return false;\n }\n\n if (this.isSessionStorageSupported) {\n let storedData = this._getData();\n\n this._parseData(storedData);\n }\n };\n\n /**\n * Parse data fetched from sessionStorage\n * @param {String} dataReceived\n */\n _parseData(dataReceived) {\n let actualData;\n\n // Expecting JSON data\n try {\n actualData = JSON.parse(dataReceived);\n this.tabId = actualData && actualData.id;\n this.tabParentName = actualData && actualData.parentName;\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_DATA);\n };\n };\n\n /**\n * The core of this file\n * This method receives the postmessage from Parent\n * after establishing a proper communication channel between Parent tab and Child tab.\n * It removes the handshake timeout.\n * Based on the type of postmessage event, it sets/parses or calls user defined callbacks\n *\n * @param {String} message\n */\n onCommunication(message) {\n let dataReceived,\n data = message.data;\n\n if (!data || typeof data !== 'string') {\n return;\n }\n\n // `origin` check for secureity point of view\n if (this.config.origin && this.config.origin !== message.origin) {\n return;\n }\n\n // cancel timeout\n window.clearTimeout(this.timeout);\n\n // When Parent tab gets closed or refereshed\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_DISCONNECTED) > -1) {\n // Call user-defined `onParentDisconnect` callback when Parent tab gets closed or refereshed.\n if (this.config.onParentDisconnect) {\n this.config.onParentDisconnect();\n }\n\n // remove postMessage listener since no Parent is there to communicate with\n window.removeEventListener('message', evt => this.onCommunication(evt));\n }\n\n /**\n * When Parent sends an Acknowledgement to the Child's request of setting up a communication channel\n * along with the tab's identity i.e. id, name and it's parent(itself) to the child tab.\n */\n if (data.indexOf(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT) > -1) {\n let msg;\n\n dataReceived = data.split(PostMessageEventNamesEnum.HANDSHAKE_WITH_PARENT)[1];\n\n // Set data to sessionStorage so that when page reloads it can directly read the past info till the session lives\n this._setData(dataReceived);\n this._parseData(dataReceived);\n\n msg = PostMessageEventNamesEnum.CUSTOM + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n this.sendMessageToParent(msg);\n\n if (this.config.onInitialize) {\n this.config.onInitialize();\n }\n }\n\n // Whenever Parent tab communicates once the communication channel is established\n if (data.indexOf(PostMessageEventNamesEnum.PARENT_COMMUNICATED) > -1) {\n dataReceived = data.split(PostMessageEventNamesEnum.PARENT_COMMUNICATED)[1];\n\n try {\n dataReceived = JSON.parse(dataReceived);\n } catch (e) {\n throw new Error(WarningTextEnum.INVALID_JSON);\n }\n // Call user-defined `onParentCommunication` callback when Parent sends a message to Parent tab\n if (this.config.onParentCommunication) {\n this.config.onParentCommunication(dataReceived);\n }\n }\n };\n\n /**\n * Attach postmessage and onbeforeunload event listeners\n */\n addListeners() {\n window.onbeforeunload = (evt) => {\n let msg = PostMessageEventNamesEnum.ON_BEFORE_UNLOAD + JSON.stringify({\n id: this.tabId,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n });\n\n this.sendMessageToParent(msg);\n };\n\n window.removeEventListener('message', evt => this.onCommunication(evt));\n window.addEventListener('message', evt => this.onCommunication(evt));\n };\n\n /**\n * Call a user-defined method `onHandShakeExpiry`\n * if the Parent doesn't recieve a first handshake message within the configurable `handshakeExpiryLimit`\n * @return {Function}\n */\n setHandshakeExpiry() {\n return window.setTimeout(() => {\n if (this.config.onHandShakeExpiry) {\n this.config.onHandShakeExpiry();\n }\n }, this.handshakeExpiryLimit);\n }\n\n /**\n * API starts here ->\n *\n * Send a postmessage to the corresponding Parent tab\n * @param {String} msg\n= */\n sendMessageToParent(msg) {\n let origin;\n\n if (window.top.opener) {\n origin = this.config.origin || '*';\n window.top.opener.postMessage(msg, origin);\n }\n };\n\n /**\n * Get current Tab info i.e. id, name and parentName\n * @return {Object} tab-info\n */\n getTabInfo() {\n return {\n id: this.tabId,\n name: this.tabName,\n parentName: this.tabParentName,\n isSiteInsideFrame: this.config.isSiteInsideFrame\n };\n };\n /**\n * API ends here ->\n */\n\n /**\n * Invoked on object instantiation unless user pass a key to call it explicitly\n */\n init() {\n this.isSessionStorageSupported = this._isSessionStorage();\n this.addListeners();\n this._restoreData();\n this.sendMessageToParent(PostMessageEventNamesEnum.LOADED + JSON.stringify(this.getTabInfo()));\n this.timeout = this.setHandshakeExpiry();\n\n if (this.config.onReady) {\n this.config.onReady();\n }\n }\n};\n\nexport default Child;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/child.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index f3257b7..3cb2a45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "across-tabs", - "version": "0.1.9", + "version": "1.0.0", "description": "Easily communicate among browser tabs(supports cross-origin)", "main": "dist/across-tabs.js", "scripts": {