cross-channel
Version:
Cross window messaging
1,551 lines (1,366 loc) • 53 kB
JavaScript
!function(e){function r(e,r,o){return 4===arguments.length?t.apply(this,arguments):void n(e,{declarative:!0,deps:r,declare:o})}function t(e,r,t,o){n(e,{declarative:!1,deps:r,executingRequire:t,execute:o})}function n(e,r){r.name=e,e in v||(v[e]=r),r.normalizedDeps=r.deps}function o(e,r){if(r[e.groupIndex]=r[e.groupIndex]||[],-1==g.call(r[e.groupIndex],e)){r[e.groupIndex].push(e);for(var t=0,n=e.normalizedDeps.length;n>t;t++){var a=e.normalizedDeps[t],u=v[a];if(u&&!u.evaluated){var d=e.groupIndex+(u.declarative!=e.declarative);if(void 0===u.groupIndex||u.groupIndex<d){if(void 0!==u.groupIndex&&(r[u.groupIndex].splice(g.call(r[u.groupIndex],u),1),0==r[u.groupIndex].length))throw new TypeError("Mixed dependency cycle detected");u.groupIndex=d}o(u,r)}}}}function a(e){var r=v[e];r.groupIndex=0;var t=[];o(r,t);for(var n=!!r.declarative==t.length%2,a=t.length-1;a>=0;a--){for(var u=t[a],i=0;i<u.length;i++){var s=u[i];n?d(s):l(s)}n=!n}}function u(e){return y[e]||(y[e]={name:e,dependencies:[],exports:{},importers:[]})}function d(r){if(!r.module){var t=r.module=u(r.name),n=r.module.exports,o=r.declare.call(e,function(e,r){if(t.locked=!0,"object"==typeof e)for(var o in e)n[o]=e[o];else n[e]=r;for(var a=0,u=t.importers.length;u>a;a++){var d=t.importers[a];if(!d.locked)for(var i=0;i<d.dependencies.length;++i)d.dependencies[i]===t&&d.setters[i](n)}return t.locked=!1,r},{id:r.name});t.setters=o.setters,t.execute=o.execute;for(var a=0,i=r.normalizedDeps.length;i>a;a++){var l,s=r.normalizedDeps[a],c=v[s],f=y[s];f?l=f.exports:c&&!c.declarative?l=c.esModule:c?(d(c),f=c.module,l=f.exports):l=p(s),f&&f.importers?(f.importers.push(t),t.dependencies.push(f)):t.dependencies.push(null),t.setters[a]&&t.setters[a](l)}}}function i(e){var r,t=v[e];if(t)t.declarative?f(e,[]):t.evaluated||l(t),r=t.module.exports;else if(r=p(e),!r)throw new Error("Unable to load dependency "+e+".");return(!t||t.declarative)&&r&&r.__useDefault?r["default"]:r}function l(r){if(!r.module){var t={},n=r.module={exports:t,id:r.name};if(!r.executingRequire)for(var o=0,a=r.normalizedDeps.length;a>o;o++){var u=r.normalizedDeps[o],d=v[u];d&&l(d)}r.evaluated=!0;var c=r.execute.call(e,function(e){for(var t=0,n=r.deps.length;n>t;t++)if(r.deps[t]==e)return i(r.normalizedDeps[t]);throw new TypeError("Module "+e+" not declared as a dependency.")},t,n);void 0!==typeof c&&(n.exports=c),t=n.exports,t&&t.__esModule?r.esModule=t:r.esModule=s(t)}}function s(r){var t={};if(("object"==typeof r||"function"==typeof r)&&r!==e)if(m)for(var n in r)"default"!==n&&c(t,r,n);else{var o=r&&r.hasOwnProperty;for(var n in r)"default"===n||o&&!r.hasOwnProperty(n)||(t[n]=r[n])}return t["default"]=r,x(t,"__useDefault",{value:!0}),t}function c(e,r,t){try{var n;(n=Object.getOwnPropertyDescriptor(r,t))&&x(e,t,n)}catch(o){return e[t]=r[t],!1}}function f(r,t){var n=v[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,a=n.normalizedDeps.length;a>o;o++){var u=n.normalizedDeps[o];-1==g.call(t,u)&&(v[u]?f(u,t):p(u))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function p(e){if(I[e])return I[e];if("@node/"==e.substr(0,6))return I[e]=s(D(e.substr(6)));var r=v[e];if(!r)throw"Module "+e+" not present.";return a(e),f(e,[]),v[e]=void 0,r.declarative&&x(r.module.exports,"__esModule",{value:!0}),I[e]=r.declarative?r.module.exports:r.esModule}var v={},g=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},m=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(h){m=!1}var x;!function(){try{Object.defineProperty({},"a",{})&&(x=Object.defineProperty)}catch(e){x=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var y={},D="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,I={"@empty":{}};return function(e,n,o,a){return function(u){u(function(u){for(var d={_nodeRequire:D,register:r,registerDynamic:t,get:p,set:function(e,r){I[e]=r},newModule:function(e){return e}},i=0;i<n.length;i++)(function(e,r){r&&r.__esModule?I[e]=r:I[e]=s(r)})(n[i],arguments[i]);a(d);var l=p(e[0]);if(e.length>1)for(var i=1;i<e.length;i++)p(e[i]);return o?l["default"]:l})}}}("undefined"!=typeof self?self:global)
(["1"], [], true, function($__System) {
var require = this.require, exports = this.exports, module = this.module;
$__System.registerDynamic('2', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var validTypes = { object: true, symbol: true };
module.exports = function () {
var symbol;
if (typeof Symbol !== 'function') return false;
symbol = Symbol('test symbol');
try {
String(symbol);
} catch (e) {
return false;
}
// Return 'true' also for polyfills
if (!validTypes[typeof Symbol.iterator]) return false;
if (!validTypes[typeof Symbol.toPrimitive]) return false;
if (!validTypes[typeof Symbol.toStringTag]) return false;
return true;
};
return module.exports;
});
$__System.registerDynamic('3', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function () {
var assign = Object.assign,
obj;
if (typeof assign !== 'function') return false;
obj = { foo: 'raz' };
assign(obj, { bar: 'dwa' }, { trzy: 'trzy' });
return obj.foo + obj.bar + obj.trzy === 'razdwatrzy';
};
return module.exports;
});
$__System.registerDynamic('4', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function () {
try {
Object.keys('primitive');
return true;
} catch (e) {
return false;
}
};
return module.exports;
});
$__System.registerDynamic('5', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var keys = Object.keys;
module.exports = function (object) {
return keys(object == null ? object : Object(object));
};
return module.exports;
});
$__System.registerDynamic('6', ['4', '5'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = $__require('4')() ? Object.keys : $__require('5');
return module.exports;
});
$__System.registerDynamic("7", [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function (value) {
if (value == null) throw new TypeError("Cannot use null or undefined");
return value;
};
return module.exports;
});
$__System.registerDynamic('8', ['6', '7'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var keys = $__require('6'),
value = $__require('7'),
max = Math.max;
module.exports = function (dest, src /*, …srcn*/) {
var error,
i,
l = max(arguments.length, 2),
assign;
dest = Object(value(dest));
assign = function (key) {
try {
dest[key] = src[key];
} catch (e) {
if (!error) error = e;
}
};
for (i = 1; i < l; ++i) {
src = arguments[i];
keys(src).forEach(assign);
}
if (error !== undefined) throw error;
return dest;
};
return module.exports;
});
$__System.registerDynamic('9', ['3', '8'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = $__require('3')() ? Object.assign : $__require('8');
return module.exports;
});
$__System.registerDynamic('a', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var forEach = Array.prototype.forEach,
create = Object.create;
var process = function (src, obj) {
var key;
for (key in src) obj[key] = src[key];
};
module.exports = function (options /*, …options*/) {
var result = create(null);
forEach.call(arguments, function (options) {
if (options == null) return;
process(Object(options), result);
});
return result;
};
return module.exports;
});
$__System.registerDynamic('b', [], true, function ($__require, exports, module) {
// Deprecated
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function (obj) {
return typeof obj === 'function';
};
return module.exports;
});
$__System.registerDynamic('c', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var str = 'razdwatrzy';
module.exports = function () {
if (typeof str.contains !== 'function') return false;
return str.contains('dwa') === true && str.contains('foo') === false;
};
return module.exports;
});
$__System.registerDynamic('d', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var indexOf = String.prototype.indexOf;
module.exports = function (searchString /*, position*/) {
return indexOf.call(this, searchString, arguments[1]) > -1;
};
return module.exports;
});
$__System.registerDynamic('e', ['c', 'd'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = $__require('c')() ? String.prototype.contains : $__require('d');
return module.exports;
});
$__System.registerDynamic('f', ['9', 'a', 'b', 'e'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var assign = $__require('9'),
normalizeOpts = $__require('a'),
isCallable = $__require('b'),
contains = $__require('e'),
d;
d = module.exports = function (dscr, value /*, options*/) {
var c, e, w, options, desc;
if (arguments.length < 2 || typeof dscr !== 'string') {
options = value;
value = dscr;
dscr = null;
} else {
options = arguments[2];
}
if (dscr == null) {
c = w = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
w = contains.call(dscr, 'w');
}
desc = { value: value, configurable: c, enumerable: e, writable: w };
return !options ? desc : assign(normalizeOpts(options), desc);
};
d.gs = function (dscr, get, set /*, options*/) {
var c, e, options, desc;
if (typeof dscr !== 'string') {
options = set;
set = get;
get = dscr;
dscr = null;
} else {
options = arguments[3];
}
if (get == null) {
get = undefined;
} else if (!isCallable(get)) {
options = get;
get = set = undefined;
} else if (set == null) {
set = undefined;
} else if (!isCallable(set)) {
options = set;
set = undefined;
}
if (dscr == null) {
c = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
}
desc = { get: get, set: set, configurable: c, enumerable: e };
return !options ? desc : assign(normalizeOpts(options), desc);
};
return module.exports;
});
$__System.registerDynamic('10', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function (x) {
if (!x) return false;
if (typeof x === 'symbol') return true;
if (!x.constructor) return false;
if (x.constructor.name !== 'Symbol') return false;
return x[x.constructor.toStringTag] === 'Symbol';
};
return module.exports;
});
$__System.registerDynamic('11', ['10'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var isSymbol = $__require('10');
module.exports = function (value) {
if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
return value;
};
return module.exports;
});
$__System.registerDynamic('12', ['f', '11'], true, function ($__require, exports, module) {
// ES2015 Symbol polyfill for environments that do not support it (or partially support it)
'use strict';
var define,
global = this || self,
GLOBAL = global;
var d = $__require('f'),
validateSymbol = $__require('11'),
create = Object.create,
defineProperties = Object.defineProperties,
defineProperty = Object.defineProperty,
objPrototype = Object.prototype,
NativeSymbol,
SymbolPolyfill,
HiddenSymbol,
globalSymbols = create(null),
isNativeSafe;
if (typeof Symbol === 'function') {
NativeSymbol = Symbol;
try {
String(NativeSymbol());
isNativeSafe = true;
} catch (ignore) {}
}
var generateName = function () {
var created = create(null);
return function (desc) {
var postfix = 0,
name,
ie11BugWorkaround;
while (created[desc + (postfix || '')]) ++postfix;
desc += postfix || '';
created[desc] = true;
name = '@@' + desc;
defineProperty(objPrototype, name, d.gs(null, function (value) {
// For IE11 issue see:
// https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
// ie11-broken-getters-on-dom-objects
// https://github.com/medikoo/es6-symbol/issues/12
if (ie11BugWorkaround) return;
ie11BugWorkaround = true;
defineProperty(this, name, d(value));
ie11BugWorkaround = false;
}));
return name;
};
}();
// Internal constructor (not one exposed) for creating Symbol instances.
// This one is used to ensure that `someSymbol instanceof Symbol` always return false
HiddenSymbol = function Symbol(description) {
if (this instanceof HiddenSymbol) throw new TypeError('TypeError: Symbol is not a constructor');
return SymbolPolyfill(description);
};
// Exposed `Symbol` constructor
// (returns instances of HiddenSymbol)
module.exports = SymbolPolyfill = function Symbol(description) {
var symbol;
if (this instanceof Symbol) throw new TypeError('TypeError: Symbol is not a constructor');
if (isNativeSafe) return NativeSymbol(description);
symbol = create(HiddenSymbol.prototype);
description = description === undefined ? '' : String(description);
return defineProperties(symbol, {
__description__: d('', description),
__name__: d('', generateName(description))
});
};
defineProperties(SymbolPolyfill, {
for: d(function (key) {
if (globalSymbols[key]) return globalSymbols[key];
return globalSymbols[key] = SymbolPolyfill(String(key));
}),
keyFor: d(function (s) {
var key;
validateSymbol(s);
for (key in globalSymbols) if (globalSymbols[key] === s) return key;
}),
// If there's native implementation of given symbol, let's fallback to it
// to ensure proper interoperability with other native functions e.g. Array.from
hasInstance: d('', NativeSymbol && NativeSymbol.hasInstance || SymbolPolyfill('hasInstance')),
isConcatSpreadable: d('', NativeSymbol && NativeSymbol.isConcatSpreadable || SymbolPolyfill('isConcatSpreadable')),
iterator: d('', NativeSymbol && NativeSymbol.iterator || SymbolPolyfill('iterator')),
match: d('', NativeSymbol && NativeSymbol.match || SymbolPolyfill('match')),
replace: d('', NativeSymbol && NativeSymbol.replace || SymbolPolyfill('replace')),
search: d('', NativeSymbol && NativeSymbol.search || SymbolPolyfill('search')),
species: d('', NativeSymbol && NativeSymbol.species || SymbolPolyfill('species')),
split: d('', NativeSymbol && NativeSymbol.split || SymbolPolyfill('split')),
toPrimitive: d('', NativeSymbol && NativeSymbol.toPrimitive || SymbolPolyfill('toPrimitive')),
toStringTag: d('', NativeSymbol && NativeSymbol.toStringTag || SymbolPolyfill('toStringTag')),
unscopables: d('', NativeSymbol && NativeSymbol.unscopables || SymbolPolyfill('unscopables'))
});
// Internal tweaks for real symbol producer
defineProperties(HiddenSymbol.prototype, {
constructor: d(SymbolPolyfill),
toString: d('', function () {
return this.__name__;
})
});
// Proper implementation of methods exposed on Symbol.prototype
// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
defineProperties(SymbolPolyfill.prototype, {
toString: d(function () {
return 'Symbol (' + validateSymbol(this).__description__ + ')';
}),
valueOf: d(function () {
return validateSymbol(this);
})
});
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d('', function () {
var symbol = validateSymbol(this);
if (typeof symbol === 'symbol') return symbol;
return symbol.toString();
}));
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d('c', 'Symbol'));
// Proper implementaton of toPrimitive and toStringTag for returned symbol instances
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag, d('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
// Note: It's important to define `toPrimitive` as last one, as some implementations
// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
// And that may invoke error in definition flow:
// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive, d('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
return module.exports;
});
$__System.registerDynamic('13', ['2', '12'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = $__require('2')() ? Symbol : $__require('12');
return module.exports;
});
$__System.registerDynamic('14', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function () {
return function () {};
};
return module.exports;
});
$__System.registerDynamic('15', ['14'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var createNoop = $__require('14');
function Handler(callback, identifier) {
callback = callback || createNoop();
if (callback[identifier]) {
return callback[identifier];
} else {
callback[identifier] = this;
this.callback = callback;
this.next = undefined;
this.prev = undefined;
}
}
Handler.prototype.call = function (event) {
var callback = this.callback;
callback(event);
};
module.exports = Handler;
return module.exports;
});
$__System.registerDynamic('16', ['13', '15'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var Symbol = $__require('13');
var Handler = $__require('15');
function HandlersCollection() {
this.head = new Handler();
this.tail = new Handler();
this.head.next = this.tail;
this.tail.prev = this.head;
this.identifier = Symbol();
}
HandlersCollection.prototype = {
constructor: HandlersCollection,
handle: function (event) {
var handler = this.head.next;
while (handler) {
handler.call(event);
handler = handler.next;
}
},
push: function (callback) {
var handler = new Handler(callback, this.identifier);
var last = this.tail.prev;
if (handler.next) {
//is already in collection
return;
}
handler.next = this.tail;
this.tail.prev = handler;
handler.prev = last;
last.next = handler;
},
remove: function (callback) {
var handler = new Handler(callback, this.identifier);
var prev = handler.prev;
var next = handler.next;
if (prev) {
prev.next = next;
}
if (next) {
next.prev = prev;
}
},
empty: function () {
this.head.next = this.tail;
this.tail.prev = this.head;
}
};
module.exports = HandlersCollection;
return module.exports;
});
$__System.registerDynamic('17', ['18', '19', '1a', '1b', '1c', '1d'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var generateRandomKey = $__require('1a');
var getCrossChildWindows = $__require('1b').getCrossOriginChildren;
var environment = $__require('1c');
var locationOrigin = $__require('1d').origin;
var global = environment.global;
var window = environment.window;
var key = generateRandomKey();
/*
Known issues:
1. Safari detection of a structured clonning support when DOM is sent. String(e.data).indexOf("Null") !== -1. See https://gist.github.com/ryanseddon/4583494
2. IE8's events are triggered synchronously, which may lead to to unexpected results.
3. Firefox 41 and below do not support sending File/Blob objects see bug
5. Probbaly: IE<=9 doesn't like you to call postMessage as soon as page loads. Use a setTimeout to wait one or two seconds before calling postMessage.
6. IE8-11 doesn't support postMessage on different tabs and origins.
7. Worker structured clonning support (from MDN): Chrome >=13, Firefox >=8, IE>=10.0, Opera >=11.5, Safari>=6
Links:
* http://blogs.msdn.com/b/ieinternals/archive/2009/09/16/bugs-in-ie8-support-for-html5-postmessage-sessionstorage-and-localstorage.aspx
Todo:
1. Add `window.open` & `window.opener` messaging
*/
function Transport(name) {
this.port1 = window.top;
this.port2 = global;
this.origin = '*';
this.listener = null;
this.name = name;
this.key = key;
}
Transport.supported = Boolean(global.postMessage);
Transport.EVENT_TYPE = 'message';
Transport.prototype = {
constructor: Transport,
send: function (data) {
var origin = this.origin;
var message = new Message(data, this);
var windows = getCrossChildWindows(this.port1);
var index = -1;
this.port1.postMessage(message, origin); //always send message to a top window
while (++index in windows) {
windows[index].postMessage(message, origin);
}
},
onMessageEvent: function (handler) {
var transport = this;
var port2 = this.port2;
function listener(event) {
var messageEvent = new MessageEvent(event);
if ((event.source === port2 || locationOrigin !== event.origin) && 'key' in messageEvent && 'sourceChannel' in messageEvent && transport.name === messageEvent.sourceChannel //events on the same channel
&& transport.key !== messageEvent.key //skip returned back events
) {
handler(messageEvent);
}
}
port2.removeEventListener(Transport.EVENT_TYPE, this.listener);
port2.addEventListener(Transport.EVENT_TYPE, listener);
this.listener = listener;
},
close: function () {
this.port2.removeEventListener(Transport.EVENT_TYPE, this.listener);
this.listener = null;
}
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('1e', ['18', '19', '1a', '1b', '1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var generateRandomKey = $__require('1a');
var getAllWindows = $__require('1b').getAll;
var environment = $__require('1c');
var global = environment.global;
var window = environment.window;
/*
Known issues:
1. Safari detection of a structured clonning support when DOM is sent. String(e.data).indexOf("Null") !== -1. See https://gist.github.com/ryanseddon/4583494
2. IE8's events are triggered synchronously, which may lead to to unexpected results.
3. Firefox 41 and below do not support sending File/Blob objects see bug
5. Probbaly: IE<=9 doesn't like you to call postMessage as soon as page loads. Use a setTimeout to wait one or two seconds before calling postMessage.
6. IE8-11 doen't support postMessage on different tabs and origins.
7. Worker structured clonning support (from MDN): Chrome >=13, Firefox >=8, IE>=10.0, Opera >=11.5, Safari>=6
Links:
* http://blogs.msdn.com/b/ieinternals/archive/2009/09/16/bugs-in-ie8-support-for-html5-postmessage-sessionstorage-and-localstorage.aspx
Todo:
1. Add `window.open` & `window.opener` messaging
*/
function Transport(name) {
this.port1 = window.top;
this.port2 = global;
this.origin = '*';
this.listener = null;
this.name = name;
this.key = generateRandomKey();
}
Transport.supported = Boolean(global.postMessage);
Transport.EVENT_TYPE = 'message';
Transport.prototype = {
constructor: Transport,
send: function (data) {
var origin = this.origin;
var message = new Message(data, this);
var windows = getAllWindows(this.port1);
var index = -1;
while (++index in windows) {
windows[index].postMessage(message, origin);
}
},
onMessageEvent: function (handler) {
var transport = this;
var port2 = transport.port2;
function listener(event) {
var messageEvent = new MessageEvent(event);
if ('key' in messageEvent && 'sourceChannel' in messageEvent && transport.name === messageEvent.sourceChannel //events on the same channel
&& transport.key !== messageEvent.key //skip returned back events
) {
handler(messageEvent);
}
}
port2.removeEventListener(Transport.EVENT_TYPE, transport.listener);
port2.addEventListener(Transport.EVENT_TYPE, listener);
transport.listener = listener;
},
close: function () {
this.port2.removeEventListener(Transport.EVENT_TYPE, this.listener);
this.listener = null;
}
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('1f', ['18', '19', '1a', '1b', '1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var generateRandomKey = $__require('1a');
var getAllWindows = $__require('1b').getAll;
var environment = $__require('1c');
/*
Known issues:
1. From NW to child window - NO
2. From child window to NW - NO
3. From child frame to child window - NO
4. From child window to child frame - NO
5. <iframe nwfaketop> disables message bubbling to the parent frame
*/
var global = environment.global;
function getGUI(window) {
return window && window.nwDispatcher.requireNwGui();
}
function whenGuiReadyThen(callback) {
var gui = getGUI(global.window);
if (gui) {
callback(gui);
return;
}
var timerId = setInterval(function () {
gui = getGUI(global.window);
if (gui) {
clearInterval(timerId);
callback(gui);
}
}, 4);
}
function getNWWindowThen(callback) {
whenGuiReadyThen(function (gui) {
var nwWindow = gui.Window.get();
callback(nwWindow);
});
}
function Transport(name) {
var transport = this;
// this.port - computed value
this.origin = '*'; //location = window.location, location && (location.origin || (location.protocol + '//' + location.host)) || '*'
this.listener = null;
this.name = name;
this.key = generateRandomKey();
this.nwLoadedListener = function () {
var listener = transport.listener;
var port = transport.port;
if (listener) {
//port.removeEventListener(Transport.EVENT_TYPE, listener)
port.addEventListener(Transport.EVENT_TYPE, listener);
}
};
getNWWindowThen(function (nwWindow) {
//listen when page is refreshed
nwWindow.on('loaded', transport.nwLoadedListener);
});
}
Transport.supported = Boolean(environment.is.node && environment.is.nodeWebkit);
Transport.EVENT_TYPE = 'message';
Transport.prototype = {
constructor: Transport,
send: function (data) {
var transport = this;
var origin = this.origin;
var message = new Message(data, this);
getNWWindowThen(function (nwWindow) {
var browserWindow = transport.port;
var topBrowserWindow = browserWindow.top;
var browserFrames = getAllWindows(topBrowserWindow);
// try {
// if (global.__nwWindowsStore) {
// browserFrames = Object.keys(global.__nwWindowsStore)
// .map(function(id) {
// return global.__nwWindowsStore[id];
// })
// .map(function(nwWindow) {
// var browserWindow = nwWindow.window;
// return getAllWindows(browserWindow.top)
// })
// .reduce(function(allBrowserWindows, browserWindows) {
// return allBrowserWindows.concat(browserWindows)
// }, [])
// }
// }
// catch (err) {
// setTimeout(console.error.bind(console, err), 4000)
//
// }
var index = -1;
while (++index in browserFrames) {
//.replace(/'/g, '\\\'')
nwWindow.eval(browserFrames[index].frameElement || null, 'window.postMessage(' + JSON.stringify(message.asJSON()) + ', "' + origin + '")');
}
});
},
onMessageEvent: function (handler) {
var transport = this;
function listener(e) {
var window = this;
var nativeMessageEventWorks = window.MessageEvent && window.MessageEvent.length;
var event = nativeMessageEventWorks ? new window.MessageEvent(Transport.EVENT_TYPE, e) : e; //fixes crashes in NWjs, when read `e.data`
var messageEvent = new MessageEvent(event);
if ('key' in messageEvent && 'sourceChannel' in messageEvent && transport.name === messageEvent.sourceChannel //events on the same channel
&& transport.key !== messageEvent.key //skip returned back events
) {
handler(messageEvent);
}
}
getNWWindowThen(function () {
var port = transport.port;
port.removeEventListener(Transport.EVENT_TYPE, transport.listener);
port.addEventListener(Transport.EVENT_TYPE, listener);
transport.listener = listener;
});
},
close: function () {
var transport = this;
getNWWindowThen(function (nwWindow) {
transport.port.removeEventListener(Transport.EVENT_TYPE, transport.listener);
transport.listener = null;
nwWindow.removeListener('loaded', transport.nwLoadedListener);
});
}
};
//computed `this.port`
Object.defineProperty(Transport.prototype, 'port', {
get: function () {
return global.window;
},
set: function (value) {}
});
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('20', ['21'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var noop = $__require('21');
function Transport() {}
Transport.prototype = {
constructor: Transport,
send: noop,
onMessageEvent: noop,
close: noop
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('22', ['18', '19', '1a', '1c', '21'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var generateRandomKey = $__require('1a');
var environment = $__require('1c');
var noop = $__require('21');
var global = environment.global;
var chrome = global.chrome;
var extension = typeof browser === 'object' && browser;
var runtime = extension && extension.runtime || chrome && (chrome.runtime || chrome.extension);
var tabs = extension && extension.tabs || chrome && chrome.tabs;
var detection = runtime && runtime.onMessage;
/*
Reference:
https://developer.chrome.com/extensions/messaging
http://www.adambarth.com/experimental/crx/docs/messaging.html (Chrome <=19 )
https://developer.chrome.com/extensions/content_scripts#host-page-communication
http://stackoverflow.com/questions/10526995/can-a-site-invoke-a-browser-extension
If you need to support Chrome 19 and earlier, use chrome.extention.onRequest and chrome.extention.sendRequest
For Chrome 20 - 25, use chrome.extension.onMessage and chrome.extension.sendMessage
For Chrome 26+ use chrome.runtime.onMessage and chrome.runtime.sendMessage
Getting manifest config
chrome.runtime.getManifest()
*/
function Transport(name) {
this.port = runtime;
this.tabs = tabs;
this.name = name;
this.key = generateRandomKey();
this.listener = noop;
}
Transport.supported = Boolean(detection);
Transport.prototype = {
constructor: Transport,
send: function (data) {
var message = new Message(data, this);
var transport = this;
this.port.sendMessage(message);
if (this.tabs) {
this.tabs.query({}, function (tabs) {
var i = -1;
while (++i in tabs) {
transport.tabs.sendMessage(tabs[i].id, message, function () {
var err = runtime.lastError;
});
}
});
}
//this.port.sendMessage(extensionId, message)
},
onMessageEvent: function (handler) {
var transport = this;
// Fired when a message is sent from another extension/app (by runtime.sendMessage). Cannot be used in a content script.
// chrome.runtime.onMessageExternal.addListener(function (request, sender, sendResponse){})
function listener(message, sender) {
var messageEvent = new MessageEvent({
data: message,
origin: sender.tab ? sender.tab.url : sender.url
});
if ('sourceChannel' in messageEvent && 'key' in messageEvent && transport.name === messageEvent.sourceChannel //events on the same channel
&& transport.key !== messageEvent.key //skip returned back events
) {
handler(messageEvent);
}
}
this.port.onMessage.removeListener(this.listener);
//this.port.onMessageExternal.removeListener(this.listener)
this.port.onMessage.addListener(listener);
//this.port.onMessageExternal.addListener(listener)
this.listener = listener;
},
close: function () {
this.port.onMessage.removeListener(this.listener);
//this.port.onMessageExternal.removeListener(this.listener)
this.listener = noop;
}
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('23', ['18', '19', '1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var environment = $__require('1c');
var global = environment.global;
function Transport(name) {
this.port = new global.BroadcastChannel(name);
}
Transport.supported = Boolean(global.BroadcastChannel);
Transport.EVENT_TYPE = 'message';
Transport.prototype = {
constructor: Transport,
send: function (data) {
var message = new Message(data);
this.port.postMessage(message);
},
onMessageEvent: function (handler) {
this.port.addEventListener(Transport.EVENT_TYPE, function (event) {
var messageEvent = new MessageEvent(event);
handler(messageEvent);
});
},
close: function () {
this.port.close();
}
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('18', ['1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var environment = $__require('1c');
var window = environment.window;
var EventConstructor = window.MessageEvent || Object;
function MessageEvent(config) {
config = config || {};
var message = config.data || {};
if (typeof message === 'string') {
try {
message = JSON.parse(message);
} catch (err) {
console.error(err, event);
}
}
Object.defineProperties(this, {
'type': {
value: 'message',
writable: false
},
'data': {
value: message.data, //extract usefull data from a message
writable: false
},
'timeStamp': {
value: config.timeStamp || 0,
writable: false
},
'origin': {
value: config.origin || config.url || '',
writable: false
},
'key': {
value: message.key,
writable: false
},
'sourceChannel': {
value: message.sourceChannel,
writable: false
}
});
}
MessageEvent.prototype = Object.create(EventConstructor.prototype, { constructor: { writable: true, configurable: true, value: MessageEvent } });
module.exports = MessageEvent;
return module.exports;
});
$__System.registerDynamic('21', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function () {};
return module.exports;
});
$__System.registerDynamic('24', ['21'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var noop = $__require('21');
var DOMConstructor = typeof Node === 'function' ? Node : noop;
module.exports = function (element) {
return element instanceof DOMConstructor;
};
return module.exports;
});
$__System.registerDynamic('19', ['24'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var isDOMNode = $__require('24');
/**
* Message entity constructor
* @param {*} data - any data to be transfered
* @param {Object} [source] - source sent from
*/
function Message(data, source) {
source = source || {};
this.data = data;
this.key = source.key;
this.sourceChannel = source.name;
}
Message.prototype.asJSON = function () {
if (isDOMNode(this.data)) {
throw new DOMException('Failed to execute "postMessage" on "CrossChannel": ' + this.data.constructor.name + ' object could not be cloned.', 'DataCloneError');
}
return JSON.stringify(this);
};
Message.prototype.toString = Message.prototype.asJSON;
module.exports = Message;
return module.exports;
});
$__System.registerDynamic('1a', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
module.exports = function generateRandomKey() {
return Math.round(Math.random() * Math.pow(10, 15));
};
return module.exports;
});
$__System.registerDynamic('1d', ['1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var environment = $__require('1c');
var global = environment.global;
module.exports = {
get origin() {
var window = global.window;
var location = window && window.location;
var origin = location && (location.origin || location.protocol + '//' + location.host);
return origin;
},
set origin(value) {}
};
return module.exports;
});
$__System.registerDynamic('1b', ['1c'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var environment = $__require('1c');
module.exports = {
isSameOrigin: function (win, currentWin) {
try {
if (win.location.origin) {
if (environment.is.nw) {
return true; //workaround for NWJS app when external origin have full privileges
} else {
return win.location.origin === currentWin.location.origin;
}
} else {
return win.location.host === currentWin.location.host && win.location.protocol === currentWin.location.protocol;
}
} catch (err) {
return false;
}
},
getCrossOriginChildren: function getCrossOriginChildren(topWin) {
var crossOriginFrames = [];
var frames = topWin.frames;
var currentWin = environment.global.window;
var win;
var i = frames.length;
var isSameOrigin = module.exports.isSameOrigin;
while (i--) {
win = frames[i];
if (!isSameOrigin(win, currentWin)) {
crossOriginFrames.push(win);
}
//include deeper level frames
crossOriginFrames = crossOriginFrames.concat(getCrossOriginChildren(win));
}
return crossOriginFrames;
},
getSameOriginChildren: function getSameOriginChildren(topWin) {
var sameOriginFrames = [];
var frames = topWin.frames;
var currentWin = environment.global.window;
var win;
var i = frames.length;
var isSameOrigin = module.exports.isSameOrigin;
while (i--) {
win = frames[i];
if (isSameOrigin(win, currentWin)) {
sameOriginFrames.push(win);
}
//include deeper level frames
sameOriginFrames = sameOriginFrames.concat(getSameOriginChildren(win));
}
return sameOriginFrames;
},
/**
* Returns a collection of all child frames/iframes windows objects. Takes into a count deeper nested frames.
* @param [Window] topWin - Main document window, where to search child frames
* @returns [Array] - Array of all child windows.
*/
getAllChildren: function getAllChildren(topWin) {
var childFrames = [];
var frames = topWin.frames;
var win;
var i = frames.length;
while (i--) {
win = frames[i];
childFrames.push(win);
//include deeper level frames
childFrames = childFrames.concat(getAllChildren(win));
}
return childFrames;
},
/**
* Returns a collection of cross origin frames/iframes windows objects. Takes into a count deeper nested frames.
* @param [Window] topWin - Main document window, where to search child frames
* @returns [Array] - Array of same origin windows.
*/
getSameOrigin: function (topWin) {
var getSameOriginChildren = module.exports.getSameOriginChildren;
var isSameOrigin = module.exports.isSameOrigin;
var windows = getSameOriginChildren(topWin);
var currentWin = environment.global.window;
if (isSameOrigin(topWin, currentWin)) {
windows.push(topWin);
}
return windows;
},
/**
* Returns a collection of cross origin frames/iframes windows objects. Takes into a count deeper nested frames.
* @param [Window] topWin - Main document window, where to search child frames
* @returns [Array] - Array of cross origin child windows.
*/
getCrossOrigin: function (topWin) {
var getCrossOriginChildren = module.exports.getCrossOriginChildren;
var isSameOrigin = module.exports.isSameOrigin;
var windows = getCrossOriginChildren(topWin);
var currentWin = environment.global.window;
if (!isSameOrigin(topWin, currentWin)) {
windows.push(topWin);
}
return windows;
},
getAll: function (topWin) {
if (!topWin) {
return [];
}
var children = module.exports.getAllChildren(topWin);
var windows = [topWin].concat(children);
return windows;
}
};
return module.exports;
});
$__System.registerDynamic('25', ['18', '19', '1a', '1c', '1d', '1b'], true, function ($__require, exports, module) {
'use strict';
/* Known possible issues:
1. IE dispathes events on a `document`. if ('v'=='\v')
2. Firefox dispatches event on `body`
3. IE 8 doesn't have `key` and `newValue` properties in an event. if (document.documentMode < 9)
4. In iOS event is not fired between tabs
5. IE 10-11 dispatches event before storage modification and `newValue` is not new but old
6. IE 10-11 doesn't dispatch event in frames of the second tab
Links:
* http://blogs.msdn.com/b/ieinternals/archive/2009/09/16/bugs-in-ie8-support-for-html5-postmessage-sessionstorage-and-localstorage.aspx
*/
var define,
global = this || self,
GLOBAL = global;
var MessageEvent = $__require('18');
var Message = $__require('19');
var generateRandomKey = $__require('1a');
var environment = $__require('1c');
var locationOrigin = $__require('1d').origin;
var getOriginWindows = $__require('1b').getSameOrigin;
var global = environment.global;
var window = environment.window;
var navigator = window.navigator;
var document = window.document;
var storageSupported = function () {
try {
return 'localStorage' in global && global.localStorage !== null;
} catch (e) {
return false;
}
}();
var URL = typeof window.URL === 'function' && window.URL;
var StorageEvent = window.StorageEvent || {};
var edgeBrowser = navigator && 'msSaveBlob' in navigator && document && !('documentMode' in document); // && 'StyleMedia' in window
//IE and Edge fix, Opera <=12 fix
if (storageSupported && (typeof StorageEvent === 'object' || StorageEvent.length === 0)) {
StorageEvent = function (eventType, params) {
params = params || {};
var event = document.createEvent('Event');
event.initEvent('storage', false, false);
event.key = params.key || '';
event.oldValue = params.oldValue || '';
event.newValue = params.newValue || '';
event.url = params.url || '';
event.storageArea = params.storageArea || null;
return event;
};
StorageEvent.prototype = window.Event.prototype;
}
function Transport(name) {
this.port1 = global.localStorage; // sessionStorage || globalStorage
this.port2 = window; //document || body
this.listener = null;
this.name = name;
this.key = generateRandomKey();
this.latestEventData = undefined;
}
Transport.supported = Boolean(storageSupported);
Transport.STORAGE_KEY = '__cross-channel_message';
Transport.EVENT_TYPE = 'storage';
Transport.prototype = {
constructor: Transport,
send: function (data) {
var message = new Message(data, this);
var port1 = this.port1;
var port2 = this.port2;
var messageJSON;
var windows;
var index;
message.changeTrigger = generateRandomKey();
messageJSON = message.asJSON();
setTimeout(function () {
var storageEvent = new StorageEvent(Transport.EVENT_TYPE, { newValue: messageJSON });
try {
port1.setItem(Transport.STORAGE_KEY, messageJSON);
} catch (err) {
console.error(err);
}
if (edgeBrowser) {
// fix: Edge doesn't dispatch event in frames of the current window
windows = getOriginWindows(port2.top);
index = -1;
while (++index in windows) {
windows[index].dispatchEvent(storageEvent);
}
} else {
port2.dispatchEvent(storageEvent);
}
}, 0);
},
onMessageEvent: function (handler) {
var transport = this;
var port2 = this.port2;
function listener(event) {
event.data = event.newValue;
event.origin = URL && event.url && new URL(event.url).origin || locationOrigin; //fix for some specific issues when 'storage' event is dispached across origins
var messageEvent = new MessageEvent(event);
if ('key' in messageEvent && 'sourceChannel' in messageEvent && transport.name === messageEvent.sourceChannel // events on the same channel
&& transport.key !== messageEvent.key // skip returned back events
&& transport.latestEventData !== event.data && event.origin === locationOrigin) {
transport.latestEventData = event.data; // fix: previous IE handles event twice
handler(messageEvent);
}
}
port2.removeEventListener(Transport.EVENT_TYPE, this.listener);
port2.addEventListener(Transport.EVENT_TYPE, listener);
this.listener = listener;
},
close: function () {
this.port2.removeEventListener(Transport.EVENT_TYPE, this.listener);
this.listener = null;
this.latestEventData = undefined;
}
};
module.exports = Transport;
return module.exports;
});
$__System.registerDynamic('26', ['17', '1e', '1f', '20', '22', '23', '25'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var PostMessageCrossTransport = $__require('17');
var PostMessageTransport = $__require('1e');
var NwTransport = $__require('1f');
var BlankTransport = $__require('20');
var ExtensionTransport = $__require('22');
var BroadcastChannelTransport = $__require('23');
var StorageTransport = $__require('25');
var SameOrigin = function () {
switch (true) {
case ExtensionTransport.supported:
return ExtensionTransport;
case BroadcastChannelTransport.supported:
return BroadcastChannelTransport;
case StorageTransport.supported:
return StorageTransport;
case NwTransport.supported:
return NwTransport;
case PostMessageTransport.supported:
return PostMessageTransport;
default:
return BlankTransport;
}
}();
var CrossOrigin = function () {
switch (true) {
case SameOrigin === PostMessageTransport:
return BlankTransport;
case PostMessageCrossTransport.supported:
return PostMessageCrossTransport;
default:
return BlankTransport;
}
}();
module.exports = {
SameOrigin: SameOrigin,
CrossOrigin: CrossOrigin
};
return module.exports;
});
$__System.registerDynamic('27', ['26'], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var SameOriginTransport = $__require('26').SameOrigin;
var CrossOriginTransport = $__require('26').CrossOrigin;
function Channel(id) {
this.sameTransport = new SameOriginTransport(id);
this.crossTransport = new CrossOriginTransport(id);
}
Channel.prototype = {
constructor: Channel,
send: function (data) {
this.sameTransport.send(data);
this.crossTransport.send(data);
},
onMessageEvent: function (handler) {
this.sameTransport.onMessageEvent(handler);
this.crossTransport.onMessageEvent(handler);
},
close: function () {
this.sameTransport.close();
this.crossTransport.close();
}
};
module.exports = Channel;
return module.exports;
});
$__System.registerDynamic('1c', [], true, function ($__require, exports, module) {
'use strict';
var define,
global = this || self,
GLOBAL = global;
var __filename = 'utils\\environment.js',
__dirname = '';
!function (self, nodeGlobal, browserWindow, undefined) {
var window = self.window || browserWindow || {};
var location = window.location || {};
var global = nodeGlobal || ('top' in window ? window.top.global || {} : {}); //NodeJS `global`
//NodeJS context
var isNode = 'process' in global && global.global === global && typeof __dirname !== 'undefined';
// Node-webkit context
var isNodeWebkit = 'process' in global && ('_nw_app' in global.process || '__node_webkit' in global.process || 'node-webkit' in global.process.versions);
// NWJS context
var isNW = 'process' in global && ('__nwjs' in global.process || 'nw' in global.process.versions);
// var isExtension = (function(){
// try {
// return Boolean(window.top && window.top.location.protocol === 'chrome-extension:')
// }
// catch(err) {
// return false
// }
// }())
module.exports = {
window: window,
global: global,
location: l