Comparing version 3.1.0 to 3.1.1
@@ -416,6 +416,6 @@ // Derived from https://github.com/umdjs/umd/blob/master/templates/amdWebGlobal.js | ||
var handleMessage = function handleMessage(event) { | ||
var child = iframe.contentWindow || iframe.contentDocument.parentWindow; | ||
var child = iframe.contentWindow; | ||
if (event.source === child && event.origin === childOrigin && event.data.penpal === HANDSHAKE) { | ||
log('Parent: Received handshake, sending reply'); // If event.origin is "null", the remote protocol is file: | ||
log('Parent: Received handshake, sending reply'); // If event.origin is "null", the remote protocol is file: | ||
// and we must post messages with "*" as targetOrigin [1] | ||
@@ -422,0 +422,0 @@ // [1] https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage#Utiliser_window.postMessage_dans_les_extensions |
@@ -1,1 +0,1 @@ | ||
!function(e,n){var t={};!function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM=e.ERR_NOT_IN_IFRAME=e.ERR_CONNECTION_TIMEOUT=e.ERR_CONNECTION_DESTROYED=void 0;e.ERR_CONNECTION_DESTROYED="ConnectionDestroyed";e.ERR_CONNECTION_TIMEOUT="ConnectionTimeout";e.ERR_NOT_IN_IFRAME="NotInIframe";e.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM="IframeAlreadyAttachedToDom";var n={"http:":"80","https:":"443"},t=/^(https?:|file:)?\/\/([^\/:]+)?(:(\d+))?/,o={ERR_CONNECTION_DESTROYED:"ConnectionDestroyed",ERR_CONNECTION_TIMEOUT:"ConnectionTimeout",ERR_NOT_IN_IFRAME:"NotInIframe",ERR_IFRAME_ALREADY_ATTACHED_TO_DOM:"IframeAlreadyAttachedToDom",Promise:function(){try{return window?window.Promise:null}catch(e){return null}}(),debug:!1},r=(u=0,function(){return++u}),a=function(){if(o.debug){for(var e,n=arguments.length,t=new Array(n),r=0;r<n;r++)t[r]=arguments[r];(e=console).log.apply(e,["[Penpal]"].concat(t))}},i=function(e){var n=[];return e(function(){n.forEach(function(e){e()})}),{then:function(e){n.push(e)}}},c=function(e){var n=e.name,t=e.message,o=e.stack;return{name:n,message:t,stack:o}},d=function(e,n,t,i){var c=n.localName,d=n.local,s=n.remote,u=n.remoteOrigin,l=!1;a("".concat(c,": Connecting call sender"));var f=function(e){return function(){for(var n=arguments.length,t=new Array(n),i=0;i<n;i++)t[i]=arguments[i];if(a("".concat(c,": Sending ").concat(e,"() call")),l){var f=new Error("Unable to send ".concat(e,"() call due ")+"to destroyed connection");throw f.code="ConnectionDestroyed",f}return new o.Promise(function(n,o){var i=r();d.addEventListener("message",function t(r){if(r.source===s&&r.origin===u&&"reply"===r.data.penpal&&r.data.id===i){a("".concat(c,": Received ").concat(e,"() reply")),d.removeEventListener("message",t);var l=r.data.returnValue;r.data.returnValueIsError&&(f=l,m=new Error,Object.keys(f).forEach(function(e){return m[e]=f[e]}),l=m),("fulfilled"===r.data.resolution?n:o)(l)}var f,m}),s.postMessage({penpal:"call",id:i,methodName:e,args:t},u)})}};i.then(function(){l=!0}),t.reduce(function(e,n){return e[n]=f(n),e},e)},s=function(e,n,t){var r=e.localName,i=e.local,d=e.remote,s=e.remoteOrigin,u=!1;a("".concat(r,": Connecting call receiver"));var l=function(e){if(e.source===d&&e.origin===s&&"call"===e.data.penpal){var t=e.data,i=t.methodName,l=t.args,f=t.id;if(a("".concat(r,": Received ").concat(i,"() call")),i in n){var m=function(e){return function(n){if(a("".concat(r,": Sending ").concat(i,"() reply")),u)a("".concat(r,": Unable to send ").concat(i,"() reply due to destroyed connection"));else{var t={penpal:"reply",id:f,resolution:e,returnValue:n};"rejected"===e&&n instanceof Error&&(t.returnValue=c(n),t.returnValueIsError=!0);try{d.postMessage(t,s)}catch(e){throw"DataCloneError"===e.name&&d.postMessage({penpal:"reply",id:f,resolution:"rejected",returnValue:c(e),returnValueIsError:!0},s),e}}}};new o.Promise(function(e){return e(n[i].apply(n,l))}).then(m("fulfilled"),m("rejected"))}}};i.addEventListener("message",l),t.then(function(){u=!0,i.removeEventListener("message",l)})};var u;o.connectToChild=function(e){var r,c=e.url,u=e.appendTo,l=e.iframe,f=e.methods,m=void 0===f?{}:f,v=e.timeout;if(l&&l.parentNode){var E=new Error("connectToChild() must not be called with an iframe already attached to DOM");throw E.code="IframeAlreadyAttachedToDom",E}var p=new i(function(e){r=e}),h=window;(l=l||document.createElement("iframe")).src=c,p.then(function(){l.parentNode&&l.parentNode.removeChild(l)});var T=function(e){var o,r,a,i=document.location,c=t.exec(e);c?(o=c[1]?c[1]:i.protocol,r=c[2],a=c[4]):(o=i.protocol,r=i.hostname,a=i.port);if("file:"===o)return"null";var d=a&&a!==n[o]?":".concat(a):"";return"".concat(o,"//").concat(r).concat(d)}(c),g=new o.Promise(function(e,n){var t;void 0!==v&&(t=setTimeout(function(){var e=new Error("Connection to child timed out after ".concat(v,"ms"));e.code="ConnectionTimeout",n(e),r()},v));var o,c,f={},E=function(n){var r=l.contentWindow||l.contentDocument.parentWindow;if(n.source===r&&n.origin===T&&"handshake"===n.data.penpal){a("Parent: Received handshake, sending reply");var u="null"===n.origin?"*":n.origin;n.source.postMessage({penpal:"handshake-reply",methodNames:Object.keys(m)},u);var v={localName:"Parent",local:h,remote:r,remoteOrigin:u};c&&c();var E=new i(function(e){p.then(e),c=e});s(v,m,E),o&&o.forEach(function(e){delete f[e]}),o=n.data.methodNames,d(f,v,o,p),clearTimeout(t),e(f)}};h.addEventListener("message",E),p.then(function(){h.removeEventListener("message",E);var e=new Error("Connection destroyed");e.code="ConnectionDestroyed",n(e)}),a("Parent: Loading iframe"),(u||document.body).appendChild(l)});return{promise:g,iframe:l,destroy:r}},o.connectToParent=function(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=n.parentOrigin,r=void 0===t?"*":t,c=n.methods,u=void 0===c?{}:c,l=n.timeout;if(window===window.top){var f=new Error("connectToParent() must be called within an iframe");throw f.code="NotInIframe",f}var m=new i(function(n){e=n}),v=window,E=v.parent,p=new o.Promise(function(n,t){var o;void 0!==l&&(o=setTimeout(function(){var n=new Error("Connection to parent timed out after ".concat(l,"ms"));n.code="ConnectionTimeout",t(n),e()},l));var i=function e(t){if(("*"===r||r===t.origin)&&t.source===E&&"handshake-reply"===t.data.penpal){a("Child: Received handshake reply"),v.removeEventListener("message",e);var i={localName:"Child",local:v,remote:E,remoteOrigin:t.origin},c={};s(i,u,m),d(c,i,t.data.methodNames,m),clearTimeout(o),n(c)}};v.addEventListener("message",i),m.then(function(){v.removeEventListener("message",i);var e=new Error("Connection destroyed");e.code="ConnectionDestroyed",t(e)}),a("Child: Sending handshake"),E.postMessage({penpal:"handshake",methodNames:Object.keys(u)},r)});return{promise:p,destroy:e}};var l=o;e.default=l}(t),"function"==typeof define&&define.amd?define("Penpal",t.default):e.Penpal=t.default}(this); | ||
!function(e,n){var t={};!function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM=e.ERR_NOT_IN_IFRAME=e.ERR_CONNECTION_TIMEOUT=e.ERR_CONNECTION_DESTROYED=void 0;e.ERR_CONNECTION_DESTROYED="ConnectionDestroyed";e.ERR_CONNECTION_TIMEOUT="ConnectionTimeout";e.ERR_NOT_IN_IFRAME="NotInIframe";e.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM="IframeAlreadyAttachedToDom";var n={"http:":"80","https:":"443"},t=/^(https?:|file:)?\/\/([^\/:]+)?(:(\d+))?/,o={ERR_CONNECTION_DESTROYED:"ConnectionDestroyed",ERR_CONNECTION_TIMEOUT:"ConnectionTimeout",ERR_NOT_IN_IFRAME:"NotInIframe",ERR_IFRAME_ALREADY_ATTACHED_TO_DOM:"IframeAlreadyAttachedToDom",Promise:function(){try{return window?window.Promise:null}catch(e){return null}}(),debug:!1},r=(u=0,function(){return++u}),a=function(){if(o.debug){for(var e,n=arguments.length,t=new Array(n),r=0;r<n;r++)t[r]=arguments[r];(e=console).log.apply(e,["[Penpal]"].concat(t))}},i=function(e){var n=[];return e(function(){n.forEach(function(e){e()})}),{then:function(e){n.push(e)}}},c=function(e){var n=e.name,t=e.message,o=e.stack;return{name:n,message:t,stack:o}},d=function(e,n,t,i){var c=n.localName,d=n.local,s=n.remote,u=n.remoteOrigin,l=!1;a("".concat(c,": Connecting call sender"));var f=function(e){return function(){for(var n=arguments.length,t=new Array(n),i=0;i<n;i++)t[i]=arguments[i];if(a("".concat(c,": Sending ").concat(e,"() call")),l){var f=new Error("Unable to send ".concat(e,"() call due ")+"to destroyed connection");throw f.code="ConnectionDestroyed",f}return new o.Promise(function(n,o){var i=r();d.addEventListener("message",function t(r){if(r.source===s&&r.origin===u&&"reply"===r.data.penpal&&r.data.id===i){a("".concat(c,": Received ").concat(e,"() reply")),d.removeEventListener("message",t);var l=r.data.returnValue;r.data.returnValueIsError&&(f=l,m=new Error,Object.keys(f).forEach(function(e){return m[e]=f[e]}),l=m),("fulfilled"===r.data.resolution?n:o)(l)}var f,m}),s.postMessage({penpal:"call",id:i,methodName:e,args:t},u)})}};i.then(function(){l=!0}),t.reduce(function(e,n){return e[n]=f(n),e},e)},s=function(e,n,t){var r=e.localName,i=e.local,d=e.remote,s=e.remoteOrigin,u=!1;a("".concat(r,": Connecting call receiver"));var l=function(e){if(e.source===d&&e.origin===s&&"call"===e.data.penpal){var t=e.data,i=t.methodName,l=t.args,f=t.id;if(a("".concat(r,": Received ").concat(i,"() call")),i in n){var m=function(e){return function(n){if(a("".concat(r,": Sending ").concat(i,"() reply")),u)a("".concat(r,": Unable to send ").concat(i,"() reply due to destroyed connection"));else{var t={penpal:"reply",id:f,resolution:e,returnValue:n};"rejected"===e&&n instanceof Error&&(t.returnValue=c(n),t.returnValueIsError=!0);try{d.postMessage(t,s)}catch(e){throw"DataCloneError"===e.name&&d.postMessage({penpal:"reply",id:f,resolution:"rejected",returnValue:c(e),returnValueIsError:!0},s),e}}}};new o.Promise(function(e){return e(n[i].apply(n,l))}).then(m("fulfilled"),m("rejected"))}}};i.addEventListener("message",l),t.then(function(){u=!0,i.removeEventListener("message",l)})};var u;o.connectToChild=function(e){var r,c=e.url,u=e.appendTo,l=e.iframe,f=e.methods,m=void 0===f?{}:f,v=e.timeout;if(l&&l.parentNode){var E=new Error("connectToChild() must not be called with an iframe already attached to DOM");throw E.code="IframeAlreadyAttachedToDom",E}var p=new i(function(e){r=e}),h=window;(l=l||document.createElement("iframe")).src=c,p.then(function(){l.parentNode&&l.parentNode.removeChild(l)});var T=function(e){var o,r,a,i=document.location,c=t.exec(e);c?(o=c[1]?c[1]:i.protocol,r=c[2],a=c[4]):(o=i.protocol,r=i.hostname,a=i.port);if("file:"===o)return"null";var d=a&&a!==n[o]?":".concat(a):"";return"".concat(o,"//").concat(r).concat(d)}(c),g=new o.Promise(function(e,n){var t;void 0!==v&&(t=setTimeout(function(){var e=new Error("Connection to child timed out after ".concat(v,"ms"));e.code="ConnectionTimeout",n(e),r()},v));var o,c,f={},E=function(n){var r=l.contentWindow;if(n.source===r&&n.origin===T&&"handshake"===n.data.penpal){a("Parent: Received handshake, sending reply");var u="null"===n.origin?"*":n.origin;n.source.postMessage({penpal:"handshake-reply",methodNames:Object.keys(m)},u);var v={localName:"Parent",local:h,remote:r,remoteOrigin:u};c&&c();var E=new i(function(e){p.then(e),c=e});s(v,m,E),o&&o.forEach(function(e){delete f[e]}),o=n.data.methodNames,d(f,v,o,p),clearTimeout(t),e(f)}};h.addEventListener("message",E),p.then(function(){h.removeEventListener("message",E);var e=new Error("Connection destroyed");e.code="ConnectionDestroyed",n(e)}),a("Parent: Loading iframe"),(u||document.body).appendChild(l)});return{promise:g,iframe:l,destroy:r}},o.connectToParent=function(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=n.parentOrigin,r=void 0===t?"*":t,c=n.methods,u=void 0===c?{}:c,l=n.timeout;if(window===window.top){var f=new Error("connectToParent() must be called within an iframe");throw f.code="NotInIframe",f}var m=new i(function(n){e=n}),v=window,E=v.parent,p=new o.Promise(function(n,t){var o;void 0!==l&&(o=setTimeout(function(){var n=new Error("Connection to parent timed out after ".concat(l,"ms"));n.code="ConnectionTimeout",t(n),e()},l));var i=function e(t){if(("*"===r||r===t.origin)&&t.source===E&&"handshake-reply"===t.data.penpal){a("Child: Received handshake reply"),v.removeEventListener("message",e);var i={localName:"Child",local:v,remote:E,remoteOrigin:t.origin},c={};s(i,u,m),d(c,i,t.data.methodNames,m),clearTimeout(o),n(c)}};v.addEventListener("message",i),m.then(function(){v.removeEventListener("message",i);var e=new Error("Connection destroyed");e.code="ConnectionDestroyed",t(e)}),a("Child: Sending handshake"),E.postMessage({penpal:"handshake",methodNames:Object.keys(u)},r)});return{promise:p,destroy:e}};var l=o;e.default=l}(t),"function"==typeof define&&define.amd?define("Penpal",t.default):e.Penpal=t.default}(this); |
@@ -402,6 +402,6 @@ "use strict"; | ||
var handleMessage = function handleMessage(event) { | ||
var child = iframe.contentWindow || iframe.contentDocument.parentWindow; | ||
var child = iframe.contentWindow; | ||
if (event.source === child && event.origin === childOrigin && event.data.penpal === HANDSHAKE) { | ||
log('Parent: Received handshake, sending reply'); // If event.origin is "null", the remote protocol is file: | ||
log('Parent: Received handshake, sending reply'); // If event.origin is "null", the remote protocol is file: | ||
// and we must post messages with "*" as targetOrigin [1] | ||
@@ -408,0 +408,0 @@ // [1] https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage#Utiliser_window.postMessage_dans_les_extensions |
{ | ||
"name": "penpal", | ||
"version": "3.1.0", | ||
"version": "3.1.1", | ||
"description": "A promise-based library for communicating with iframes via postMessage.", | ||
@@ -5,0 +5,0 @@ "author": "Aaron Hardy <aaron@aaronhardy.com>", |
@@ -157,2 +157,4 @@ [![npm version](https://badge.fury.io/js/penpal.svg)](https://badge.fury.io/js/penpal) [![Build Status](https://travis-ci.org/Aaronius/penpal.svg?branch=master)](https://travis-ci.org/Aaronius/penpal) | ||
* This error will be thrown when attempting to call `Penpal.connectToParent()` from outside of an iframe context. | ||
* `Penpal.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM` | ||
* This error will be thrown when an iframe already attached to the DOM is passed to `Penpal.connectToChild()`. | ||
@@ -165,3 +167,4 @@ While these error codes are on the Penpal object itself, they are also named exports. You may import them as follows: | ||
ERR_CONNECTION_TIMEOUT, | ||
ERR_NOT_IN_IFRAME | ||
ERR_NOT_IN_IFRAME, | ||
ERR_IFRAME_ALREADY_ATTACHED_TO_DOM | ||
} from 'penpal'; | ||
@@ -168,0 +171,0 @@ ``` |
95385
9
218