mirror of
https://github.com/Polymer/polymer.git
synced 2025-02-25 18:55:30 -06:00
109 lines
3.7 KiB
HTML
109 lines
3.7 KiB
HTML
<!--
|
|
@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
|
|
-->
|
|
|
|
<link rel="import" href="boot.html">
|
|
|
|
<script>
|
|
|
|
(function() {
|
|
|
|
'use strict';
|
|
|
|
// run a callback when HTMLImports are ready or immediately if
|
|
// this api is not available.
|
|
function whenImportsReady(cb) {
|
|
if (window.HTMLImports) {
|
|
HTMLImports.whenReady(cb);
|
|
} else {
|
|
cb();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convenience method for importing an HTML document imperatively.
|
|
*
|
|
* This method creates a new `<link rel="import">` element with
|
|
* the provided URL and appends it to the document to start loading.
|
|
* In the `onload` callback, the `import` property of the `link`
|
|
* element will contain the imported document contents.
|
|
*
|
|
* @memberof Polymer
|
|
* @method importHref
|
|
* @param {string} href URL to document to load.
|
|
* @param {Function=} onload Callback to notify when an import successfully
|
|
* loaded.
|
|
* @param {Function=} onerror Callback to notify when an import
|
|
* unsuccessfully loaded.
|
|
* @param {boolean=} optAsync True if the import should be loaded `async`.
|
|
* Defaults to `false`.
|
|
* @return {HTMLLinkElement} The link element for the URL to be loaded.
|
|
*/
|
|
Polymer.importHref = function(href, onload, onerror, optAsync) {
|
|
let link =
|
|
document.head.querySelector('link[href="' + href + '"][import-href]');
|
|
if (!link) {
|
|
link = document.createElement('link');
|
|
link.rel = 'import';
|
|
link.href = href;
|
|
link.setAttribute('import-href', '');
|
|
}
|
|
// always ensure link has `async` attribute if user specified one,
|
|
// even if it was previously not async. This is considered less confusing.
|
|
if (optAsync) {
|
|
link.setAttribute('async', '');
|
|
}
|
|
// NOTE: the link may now be in 3 states: (1) pending insertion,
|
|
// (2) inflight, (3) already laoded. In each case, we need to add
|
|
// event listeners to process callbacks.
|
|
let cleanup = function() {
|
|
link.removeEventListener('load', loadListener);
|
|
link.removeEventListener('error', errorListener);
|
|
}
|
|
let loadListener = function(event) {
|
|
cleanup();
|
|
// In case of a successful load, cache the load event on the link so
|
|
// that it can be used to short-circuit this method in the future when
|
|
// it is called with the same href param.
|
|
link.__dynamicImportLoaded = true;
|
|
if (onload) {
|
|
whenImportsReady(() => {
|
|
onload(event);
|
|
});
|
|
}
|
|
};
|
|
let errorListener = function(event) {
|
|
cleanup();
|
|
// In case of an error, remove the link from the document so that it
|
|
// will be automatically created again the next time `importHref` is
|
|
// called.
|
|
if (link.parentNode) {
|
|
link.parentNode.removeChild(link);
|
|
}
|
|
if (onerror) {
|
|
whenImportsReady(() => {
|
|
onerror(event);
|
|
});
|
|
}
|
|
};
|
|
link.addEventListener('load', loadListener);
|
|
link.addEventListener('error', errorListener);
|
|
if (link.parentNode == null) {
|
|
document.head.appendChild(link);
|
|
// if the link already loaded, dispatch a fake load event
|
|
// so that listeners are called and get a proper event argument.
|
|
} else if (link.__dynamicImportLoaded) {
|
|
link.dispatchEvent(new Event('load'));
|
|
}
|
|
return link;
|
|
};
|
|
|
|
})();
|
|
</script>
|