Files
ArtPlayer/docs/compiled/artplayer-tool-iframe.legacy.js
T

8 lines
9.3 KiB
JavaScript

/*!
* artplayer-tool-iframe.js v1.1.0
* Github: https://github.com/zhw2590582/ArtPlayer
* (c) 2017-2026 Harvey Zhao
* Released under the MIT License.
*/
!function(e,t){"object"===typeof exports&&"undefined"!==typeof module?module.exports=t():"function"==typeof define&&define.amd?(e.ArtplayerToolIframe=t(),define(function(){return e.ArtplayerToolIframe})):(e="undefined"!==typeof globalThis?globalThis:e||self).ArtplayerToolIframe=t()}(this,function(){"use strict";var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,i=(t,n,r)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r;const a="artplayer-tool-iframe:session";function c(e){const t=e.__artplayerIframe;if(1===(null==t?void 0:t.version)&&"string"===typeof t.document&&t.document&&["inject","message","ack","leave","resume","fragment"].includes(t.phase))return t}function d(e,a,c){return d=((e,t)=>{for(var n in t||(t={}))o.call(t,n)&&i(e,n,t[n]);if(r)for(var n of r(t))s.call(t,n)&&i(e,n,t[n]);return e})({},e),t(d,n({__artplayerIframe:{version:1,document:a,phase:c}}));var d}function u(e,t){if(void 0!==e.source&&null!==e.source&&e.source!==t)return!1;const n=e.data;return"object"===typeof n&&null!==n&&"type"in n&&"string"===typeof n.type}let l;const f=new WeakMap,m=new WeakMap;let h=0;function p(e,t){t?m.set(e,t):m.delete(e)}function w(e,t=new Error("The instance has been destroyed")){const n=f.get(e);if(n)for(const r of[...n])r.cancel(t)}const v=new WeakMap;function y(e){var t;const n=e.$iframe;return(null==(t=n.hasAttribute)?void 0:t.call(n,"srcdoc"))?`srcdoc:${n.getAttribute("srcdoc")}`:`src:${r=n.src||"",r.split("#")[0]}`;var r}function g(e){var t,n,r,o;const s=e.$iframe;return(null==(t=s.hasAttribute)?void 0:t.call(s,"srcdoc"))?`srcdoc:${s.getAttribute("srcdoc")}`:`src:${null!=(o=null!=(r=null==(n=s.getAttribute)?void 0:n.call(s,"src"))?r:s.src)?o:""}`}function b(e,t){t.waiting||(t.documentId?t.cancelPrevious=function(e){const t=[...f.get(e)||[]];return e=>{for(const n of t)n.cancel(e)}}(e):w(e,new Error("The iframe document has changed"))),t.waiting=!0,e.injected=!1}function E(e,t,n){const r=g(e);if(!n.length&&r===t.rawSource)return;const o=function(e,t,n){return y(e)!==t.source||!!t.documentId&&(g(e)!==t.rawSource||n.some(t=>{var n,r;return"srcdoc"===t.attributeName||"src"===t.attributeName&&!(null==(r=(n=e.$iframe).hasAttribute)?void 0:r.call(n,"srcdoc"))}))}(e,t,n);t.rawSource=r,t.source=y(e),o&&b(e,t)}function M(e){var t;const n=v.get(e);if(!n||e.destroyed)return;E(e,n,(null==(t=n.observer)?void 0:t.takeRecords())||[])}function j(e,t,n){var r;t.hasHandshake&&t.documentId!==n&&(t.cancelPrevious?t.cancelPrevious(new Error("The iframe document has changed")):t.waiting||w(e,new Error("The iframe document has changed"))),t.cancelPrevious=void 0,t.documentId=n,t.hasHandshake=!0,t.waiting=!1,e.injected=!0;try{null==(r=e.$iframe.contentWindow)||r.postMessage(d({type:a,data:void 0,id:0},n,"ack"),"*")}catch(o){}}function T(e,t){var n,r,o;const s=v.get(e);if(!s)return!1;M(e);const i=c(t);if(i&&t.type===a)return"resume"===i.phase?j(e,s,i.document):i.document===s.documentId&&("leave"===i.phase?function(e,t){t.cancelPrevious?t.cancelPrevious(new Error("The iframe document has changed")):t.waiting||w(e,new Error("The iframe document has changed")),t.cancelPrevious=void 0,t.waiting=!0,e.injected=!1}(e,s):"fragment"===i.phase&&s.cancelPrevious&&!(null==(r=(n=e.$iframe).hasAttribute)?void 0:r.call(n,"srcdoc"))&&t.data===e.$iframe.src&&j(e,s,i.document)),!0;if("inject"===t.type){if("inject"===(null==i?void 0:i.phase)){if(s.waiting&&i.document===s.documentId)return!0;j(e,s,i.document)}else s.waiting&&(null==(o=s.cancelPrevious)||o.call(s,new Error("The iframe document has changed")),s.cancelPrevious=void 0,s.documentId=void 0),s.hasHandshake=!0,s.waiting=!1;return!1}return Boolean(i&&(s.waiting&&!s.cancelPrevious||i.document!==s.documentId))}const k=new WeakMap;function P(e){const t=window,n=e.onMessage,r=[()=>t.removeEventListener("message",n)];k.set(e,()=>{let e,t=!1;for(const o of r)try{o()}catch(n){t||(t=!0,e=n)}if(t)throw e}),t.addEventListener("message",n),e.$iframe.src=e.url;const o=function(e){const t={source:y(e),rawSource:g(e),hasHandshake:!1,waiting:!1};return v.set(e,t),p(e,{prepare:()=>M(e),envelope:e=>t.documentId?d(e,t.documentId,"message"):e}),{start(){"function"===typeof window.MutationObserver&&(t.observer=new window.MutationObserver(n=>{e.destroyed||E(e,t,n)}),t.observer.observe(e.$iframe,{attributes:!0,attributeOldValue:!0,attributeFilter:["src","srcdoc"]}))},dispose(){var n;v.delete(e),p(e,void 0),t.cancelPrevious=void 0,null==(n=t.observer)||n.disconnect()}}}(e);r.push(o.dispose),o.start()}function I(e){const t=k.get(e);k.delete(e);try{null==t||t()}finally{w(e)}}class ${static get iframe(){return window.top!==window}static postMessage({type:e,data:t,id:n=0}){if(!$.iframe)throw new Error('The "ArtplayerToolIframe.postMessage" method can only be used in iframe');var r;window.parent.postMessage((r={type:e,data:t,id:n},l&&("inject"===r.type||l.acknowledged)?d(r,l.id,"inject"===r.type?"inject":"message"):r),"*")}static onMessage(e){return t=this,n=null,r=function*(){if(!$.iframe)throw new Error('The "ArtplayerToolIframe.onMessage" method can only be used in iframe');if(!u(e,window.parent)||function(e){const t=c(e);return!!t&&(e.type===a?(l&&t.document===l.id&&"ack"===t.phase&&(l.acknowledged=!0),!0):!l||t.document!==l.id)}(e.data))return;const{type:t,data:n,id:r}=e.data;if("commit"===t)try{if(n.match(/\bresolve\((.*?)\)/)){const e=`return new Promise(function(resolve){\n${n}\n})`,t=yield new Function(e)();$.postMessage({type:"response",data:t,id:r})}else{const e=new Function(n)();$.postMessage({type:"response",data:e,id:r})}}catch(o){throw $.postMessage({type:"error",data:o.message,id:r}),o}},new Promise((e,o)=>{var s=e=>{try{a(r.next(e))}catch(t){o(t)}},i=e=>{try{a(r.throw(e))}catch(t){o(t)}},a=t=>t.done?e(t.value):Promise.resolve(t.value).then(s,i);a((r=r.apply(t,n)).next())});var t,n,r}static inject(){if(!$.iframe)throw new Error('The "ArtplayerToolIframe.inject" method can only be used in iframe');!function(){var e;if((null==l?void 0:l.owner)===window.document&&l)return;const t=new Uint32Array(4);(null==(e=window.crypto)?void 0:e.getRandomValues)?window.crypto.getRandomValues(t):t.forEach((e,n)=>t[n]=Math.floor(4294967296*Math.random())),l={owner:window.document,id:`${Date.now()}-${Array.from(t).join("-")}`,acknowledged:!1,lifecycle:!1,receivers:new Set}}(),$.postMessage({type:"inject"}),function(e){const t=l,n=!t.receivers.has(e),r=!t.lifecycle,o=(e,n)=>{if(t.acknowledged)try{window.parent.postMessage(d({type:a,data:n,id:0},t.id,e),"*")}catch(r){}},s=()=>o("leave"),i=()=>o("fragment",window.location.href),c=e=>{e.persisted&&o("resume")};try{if(window.addEventListener("message",e),t.receivers.add(e),!r)return;window.addEventListener("pagehide",s),window.addEventListener("pageshow",c),window.addEventListener("hashchange",i),t.lifecycle=!0}catch(u){const o=[];r&&(o.push(()=>window.removeEventListener("pagehide",s)),o.push(()=>window.removeEventListener("pageshow",c)),o.push(()=>window.removeEventListener("hashchange",i))),n&&o.push(()=>window.removeEventListener("message",e));for(const e of o)try{e()}catch(f){}throw n&&t.receivers.delete(e),u}}($.onMessage)}constructor({iframe:e,url:t}){if(e instanceof HTMLIFrameElement===!1)throw new TypeError('"option.iframe" needs to be a HTMLIFrameElement');if("string"!==typeof t)throw new TypeError('"option.url" needs to be a string');this.url=t,this.$iframe=e,this.promises={},this.injected=!1,this.destroyed=!1,this.messageCallback=()=>null,this.onMessage=this.onMessage.bind(this);try{P(this)}catch(n){this.destroyed=!0;try{I(this)}catch(r){}throw n}}onMessage(e){if(this.destroyed||!u(e,this.$iframe.contentWindow)||T(this,e.data))return;const{type:t,data:n,id:r}=e.data;if("inject"===t)this.injected=!0;void 0!==r&&Object.prototype.hasOwnProperty.call(this.promises,r)&&this.promises[r]&&("error"===t?this.promises[r].reject(new Error(n)):this.promises[r].resove(n),delete this.promises[r]),this.messageCallback&&this.messageCallback({type:t,data:n})}postMessage(e){return M(this),function(e,{type:t,data:n}){return new Promise((r,o)=>{if(e.destroyed)return void o(new Error("The instance has been destroyed"));const s=f.get(e)||new Set;f.set(e,s);const i=t=>!!s.delete(t)&&(void 0!==t.timer&&clearTimeout(t.timer),void 0!==t.id&&delete e.promises[t.id],s.size||f.delete(e),!0),a={callbacks:{resove(e){i(a)&&r(e)},reject(e){i(a)&&o(e)}},cancel(e){i(a)&&o(e)}};s.add(a);const c=()=>{var r,o;if(a.timer=void 0,s.has(a))if(e.destroyed)a.cancel(new Error("The instance has been destroyed"));else try{if(null==(r=m.get(e))||r.prepare(),!s.has(a))return;if(e.injected){const r=Math.max(Date.now(),h+1);h=r,a.id=r,e.promises[r]=a.callbacks;const s={type:t,data:n,id:r};e.$iframe.contentWindow.postMessage((null==(o=m.get(e))?void 0:o.envelope(s))||s,"*")}else a.timer=setTimeout(c,200)}catch(i){a.cancel(i)}};c()})}(this,e)}commit(e){if("function"!==typeof e)throw new TypeError('"commit.callback" needs to be a function');const t=e.toString(),n=t.substring(t.indexOf("{")+1,t.lastIndexOf("}"));return this.postMessage({type:"commit",data:n})}message(e){if("function"!==typeof e)throw new TypeError('"message.callback" needs to be a function');this.messageCallback=e}destroy(){this.destroyed=!0,I(this)}}return $});