joicomponents
Version:
Design patterns to build native web components
76 lines (69 loc) • 2.72 kB
JavaScript
/**
* @license
* Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
(function () {
'use strict';
function onAsyncLoadWithTE() {
window.WebComponents3.bootstrapTemplatePolyfill();
window.WebComponents1.flushWaitingFunctions();
}
function loadScriptAsync(url, onAsyncLoad) {
var newScript = document.createElement('script');
newScript.src = url;
onAsyncLoad && newScript.addEventListener('load', onAsyncLoad);
document.head.append(newScript);
}
window.WebComponents1 = {
waitFor: function (waitFn) {
if (!waitFn)
return;
if (window.WebComponents1._waitingFunctions) {
window.WebComponents1._waitingFunctions.push(waitFn);
} else if (waitFn instanceof Function) {
waitFn();
customElements.upgrade(document);
}
},
_waitingFunctions: [],
flushWaitingFunctions: function () {
window.WebComponents2.pauseCustomElementsPolyfill();
return Promise.all(window.WebComponents1._waitingFunctions.map(function (fn) {
return fn instanceof Function ? fn() : fn;
})).then(function () {
window.WebComponents1._waitingFunctions = undefined;
window.WebComponents2.restartCustomElementsPolyfill();
}).catch(function (err) {
console.error(err);
});
}
};
window.WebComponents2 = {
pauseCustomElementsPolyfill: function () {
if (window.customElements && customElements.polyfillWrapFlushCallback)
customElements.polyfillWrapFlushCallback(function () {
});
},
restartCustomElementsPolyfill: function () {
if (!window.customElements || !customElements.polyfillWrapFlushCallback)
return;
customElements.upgrade(document);
customElements.polyfillWrapFlushCallback(function (originalFlushCallback) {
originalFlushCallback();
});
}
};
window.WebComponents3 = {
bootstrapTemplatePolyfill: function () {
if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap)
HTMLTemplateElement.bootstrap(window.document);
}
};
var url = "https://rawgit.com/webcomponents/webcomponentsjs/master/bundles/webcomponents-sd-ce.js";
loadScriptAsync(url, window.WebComponents1.flushWaitingFunctions);
})();