@webcomponents/webcomponentsjs
Version:
Web Components Polyfills
50 lines • 2.12 kB
JavaScript
/**
@license
Copyright (c) 2017 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
*/
import PromisePolyfill from 'promise-polyfill/src/index.js';
/*
Assign the ES6 promise polyfill to window ourselves instead of using the "auto"
polyfill to work around
https://github.com/webcomponents/webcomponentsjs/issues/837
*/
if (!window.Promise) {
window.Promise = PromisePolyfill;
// save Promise API
/* eslint-disable no-self-assign */
// PromisePolyfill.prototype['catch'] = PromisePolyfill.prototype.catch;
PromisePolyfill.prototype['then'] = PromisePolyfill.prototype.then;
// PromisePolyfill.prototype['finally'] = PromisePolyfill.prototype.finally;
PromisePolyfill['all'] = PromisePolyfill.all;
PromisePolyfill['race'] = PromisePolyfill.race;
PromisePolyfill['resolve'] = PromisePolyfill.resolve;
PromisePolyfill['reject'] = PromisePolyfill.reject;
/* eslint-enable */
// approach copied from
// https://github.com/Polymer/polymer/blob/v3.0.2/lib/utils/async.js
const node = document.createTextNode('');
const twiddleNode = function twiddleNode() {
node.textContent = node.textContent.length > 0 ? '' : 'a';
};
/** @type {!Array<function():void>} */
const callbacks = [];
new MutationObserver(() => {
const len = callbacks.length;
for (let i = 0; i < len; i++) {
callbacks[i]();
}
callbacks.splice(0, len);
}).observe(node, { characterData: true });
// set _immediateFn to a MutationObserver for close-to-native timing
PromisePolyfill._immediateFn = (fn) => {
callbacks.push(fn);
twiddleNode();
};
}
//# sourceMappingURL=promise.js.map