UNPKG

9.49 kBJavaScriptView Raw
1/***************************************************************************************
2 * (c) 2017 Adobe. All rights reserved.
3 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License. You may obtain a copy
5 * of the License at http://www.apache.org/licenses/LICENSE-2.0
6 *
7 * Unless required by applicable law or agreed to in writing, software distributed under
8 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9 * OF ANY KIND, either express or implied. See the License for the specific language
10 * governing permissions and limitations under the License.
11 ****************************************************************************************/(function(){'use strict';function a(a,b,c){return b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function b(b){for(var c=1;c<arguments.length;c++){var d=null==arguments[c]?{}:arguments[c],e=Object.keys(d);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(d).filter(function(a){return Object.getOwnPropertyDescriptor(d,a).enumerable}))),e.forEach(function(c){a(b,c,d[c])})}return b}var c=function(a,b){return b={exports:{}},a(b,b.exports),b.exports}(function(a,b){Object.defineProperty(b,"__esModule",{value:!0}),b.default=b.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM=b.ERR_NOT_IN_IFRAME=b.ERR_CONNECTION_TIMEOUT=b.ERR_CONNECTION_DESTROYED=void 0;var c="handshake-reply",d="call",e="reply",f="fulfilled",g="rejected",h="message",i="ConnectionDestroyed";b.ERR_CONNECTION_DESTROYED=i;b.ERR_CONNECTION_TIMEOUT="ConnectionTimeout";b.ERR_NOT_IN_IFRAME="NotInIframe";b.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM="IframeAlreadyAttachedToDom";var j={"http:":"80","https:":"443"},k=/^(https?:|file:)?\/\/([^/:]+)?(:(\d+))?/,l={ERR_CONNECTION_DESTROYED:i,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(a){return null}}(),debug:!1},m=function(){var a=0;return function(){return++a}}(),n=function(){if(l.debug){for(var a,b=arguments.length,c=Array(b),d=0;d<b;d++)c[d]=arguments[d];(a=console).log.apply(a,["[Penpal]"].concat(c))}},o=function(a){var b,c,d,e=document.location,f=k.exec(a);if(f?(b=f[1]?f[1]:e.protocol,c=f[2],d=f[4]):(b=e.protocol,c=e.hostname,d=e.port),"file:"===b)return"null";var g=d&&d!==j[b]?":".concat(d):"";return"".concat(b,"//").concat(c).concat(g)},p=function(a){var b=[];return a(function(){b.forEach(function(a){a()})}),{then:function(a){b.push(a)}}},q=function(a){var b=a.name,c=a.message,d=a.stack;return{name:b,message:c,stack:d}},r=function(a){var b=new Error;return Object.keys(a).forEach(function(c){return b[c]=a[c]}),b},s=function(a,b,c,g,j){var k=b.localName,o=b.local,p=b.remote,q=b.remoteOrigin,s=!1;n("".concat(k,": Connecting call sender"));var t=function(a){return function(){for(var b=arguments.length,c=Array(b),j=0;j<b;j++)c[j]=arguments[j];if(n("".concat(k,": Sending ").concat(a,"() call")),p.closed&&g(),s){var t=new Error("Unable to send ".concat(a,"() call due ")+"to destroyed connection");throw t.code=i,t}return new l.Promise(function(b,g){var i=m();o.addEventListener(h,function c(d){if(d.source===p&&d.origin===q&&d.data.penpal===e&&d.data.id===i){n("".concat(k,": Received ").concat(a,"() reply")),o.removeEventListener(h,c);var j=d.data.returnValue;d.data.returnValueIsError&&(j=r(j)),(d.data.resolution===f?b:g)(j)}}),p.postMessage({penpal:d,id:i,methodName:a,args:c},q)})}};j.then(function(){s=!0}),c.reduce(function(a,b){return a[b]=t(b),a},a)},t=function(a,b,c){var i=a.localName,j=a.local,k=a.remote,m=a.remoteOrigin,o=!1;n("".concat(i,": Connecting call receiver"));var p=function(a){if(a.source===k&&a.origin===m&&a.data.penpal===d){var c=a.data,h=c.methodName,j=c.args,p=c.id;if(n("".concat(i,": Received ").concat(h,"() call")),h in b){var r=function(a){return function(b){if(n("".concat(i,": Sending ").concat(h,"() reply")),o)return void n("".concat(i,": Unable to send ").concat(h,"() reply due to destroyed connection"));var c={penpal:e,id:p,resolution:a,returnValue:b};a===g&&b instanceof Error&&(c.returnValue=q(b),c.returnValueIsError=!0);try{k.postMessage(c,m)}catch(a){throw a.name==="DataCloneError"&&k.postMessage({penpal:e,id:p,resolution:g,returnValue:q(a),returnValueIsError:!0},m),a}}};new l.Promise(function(a){return a(b[h].apply(b,j))}).then(r(f),r(g))}}};j.addEventListener(h,p),c.then(function(){o=!0,j.removeEventListener(h,p)})};l.connectToChild=function(a){var b=a.url,d=a.appendTo,e=a.iframe,f=a.methods,g=void 0===f?{}:f,j=a.timeout;if(e&&e.parentNode){var k=new Error("connectToChild() must not be called with an iframe already attached to DOM");throw k.code="IframeAlreadyAttachedToDom",k}var m,q=new p(function(a){m=a}),r=window;e=e||document.createElement("iframe"),e.src=b;var u=o(b),v=new l.Promise(function(a,b){var f;j!==void 0&&(f=setTimeout(function(){var a=new Error("Connection to child timed out after ".concat(j,"ms"));a.code="ConnectionTimeout",b(a),m()},j));var k,l,o={},v=function(b){var d=e.contentWindow;if(b.source===d&&b.origin===u&&b.data.penpal==="handshake"){n("Parent: Received handshake, sending reply");var h="null"===b.origin?"*":b.origin;b.source.postMessage({penpal:c,methodNames:Object.keys(g)},h);var i={localName:"Parent",local:r,remote:d,remoteOrigin:h};l&&l();var j=new p(function(a){q.then(a),l=a});t(i,g,j),k&&k.forEach(function(a){delete o[a]}),k=b.data.methodNames,s(o,i,k,m,q),clearTimeout(f),a(o)}};r.addEventListener(h,v),n("Parent: Loading iframe"),(d||document.body).appendChild(e);var w=setInterval(function(){document.contains(e)||(clearInterval(w),m())},60000);q.then(function(){e.parentNode&&e.parentNode.removeChild(e),r.removeEventListener(h,v),clearInterval(w);var a=new Error("Connection destroyed");a.code=i,b(a)})});return{promise:v,iframe:e,destroy:m}},l.connectToParent=function(){var a=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{},b=a.parentOrigin,d=void 0===b?"*":b,e=a.methods,f=void 0===e?{}:e,g=a.timeout;if(window===window.top){var j=new Error("connectToParent() must be called within an iframe");throw j.code="NotInIframe",j}var k,m=new p(function(a){k=a}),o=window,q=o.parent,r=new l.Promise(function(a,b){var e;g!==void 0&&(e=setTimeout(function(){var a=new Error("Connection to parent timed out after ".concat(g,"ms"));a.code="ConnectionTimeout",b(a),k()},g));var j=function b(g){if(("*"===d||d===g.origin)&&g.source===q&&g.data.penpal===c){n("Child: Received handshake reply"),o.removeEventListener(h,b);var i={localName:"Child",local:o,remote:q,remoteOrigin:g.origin},j={};t(i,f,m),s(j,i,g.data.methodNames,k,m),clearTimeout(e),a(j)}};o.addEventListener(h,j),m.then(function(){o.removeEventListener(h,j);var a=new Error("Connection destroyed");a.code=i,b(a)}),n("Child: Sending handshake"),q.postMessage({penpal:"handshake",methodNames:Object.keys(f)},d)});return{promise:r,destroy:k}};b.default=l}),d=function(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}(c),e=c.ERR_IFRAME_ALREADY_ATTACHED_TO_DOM,f=c.ERR_NOT_IN_IFRAME,g=c.ERR_CONNECTION_TIMEOUT,h=c.ERR_CONNECTION_DESTROYED;const i=function(a){this.moduleName=a};["log","info","warn","error"].forEach(a=>{i.prototype[a]=function(){if(i.enabled){for(var b=arguments.length,c=Array(b),d=0;d<b;d++)c[d]=arguments[d];console[a]("[".concat(this.moduleName,"]"),...c)}}}),i.enabled=!1;(a=>{const b=document.createElement("style");b.appendChild(document.createTextNode(a)),document.head.appendChild(b)})("\n html, body {\n background-color: transparent !important;\n }\n");const j=new i("ExtensionBridge:Child");let k,l={};const m=a=>{const b=l[a];if(b)return b.bind(l);throw new Error("Unable to call ".concat(a," on the extension. The extension must register a ").concat(a," function using extensionBridge.register()."))},n=(a,b)=>function(){for(var c=arguments.length,d=Array(c),e=0;e<c;e++)d[e]=arguments[e];let f;return"function"==typeof d[0]&&(f=d.shift(),console.warn("Passing a callback to extensionBridge."+a+"() has been deprecated. The method now returns a promise that should be used instead.")),k.then(c=>{if(c[a])return c[a](...d);throw new Error("An error occurred while opening ".concat(b,". The shared view is unavailable."))}).then(a=>(f&&f(a),a))};k=d.connectToParent({methods:{init:function(){m("init")(...arguments)},validate:function(){return Promise.resolve(m("validate")(...arguments)).then(a=>{if("boolean"!=typeof a)throw new Error("The extension attempted to return a non-boolean value from validate: ".concat(a));return a})},getSettings:function(){return Promise.resolve(m("getSettings")(...arguments)).then(a=>{if("object"!=typeof a)throw new Error("The extension attempted to return a non-object value from getSettings: "+a);return a})}}}).promise;const o={openCodeEditor:n("openCodeEditor","code editor"),openDataElementSelector:n("openDataElementSelector","data element selector"),openRegexTester:n("openRegexTester","regex tester"),register(a){l=b({},a),k.then(a=>a.extensionRegistered()),j.log("Methods registered by extension.")},setDebug(a){d.debug=a,i.enabled=a}};window.addEventListener("focus",()=>{k.then(a=>a.markAsDirty())});const p=a=>{Promise.resolve(o[a.methodName](...a.args)).then(a.resolve,a.reject)},q=window.extensionBridge._callQueue;for(;q.length;)p(q.shift());q.push=p})();