(function (w) { "use strict"; // rel=preload support test if (!w.loadCSS) { w.loadCSS = function () { }; } // define on the loadCSS obj var rp = loadCSS.relpreload = {}; // rel=preload feature support test // runs once and returns a function for compat purposes rp.support = (function () { var ret; try { ret = w.document.createElement("link").relList.supports("preload"); } catch (e) { ret = false; } return function () { return ret; }; })(); // if preload isn't supported, get an asynchronous load by using a non-matching media attribute // then change that media back to its intended value on load rp.bindMediaToggle = function (link) { // remember existing media attr for ultimate state, or default to 'all' var finalMedia = link.media || "all"; function enableStylesheet() { link.media = finalMedia; } // bind load handlers to enable media if (link.addEventListener) { link.addEventListener("load", enableStylesheet); } else if (link.attachEvent) { link.attachEvent("onload", enableStylesheet); } // Set rel and non-applicable media type to start an async request // note: timeout allows this to happen async to let rendering continue in IE setTimeout(function () { link.rel = "stylesheet"; link.media = "only x"; }); // also enable media after 3 seconds, // which will catch very old browsers (android 2.x, old firefox) that don't support onload on link setTimeout(enableStylesheet, 3000); }; // loop through link elements in DOM rp.poly = function () { // double check this to prevent external calls from running if (rp.support()) { return; } var links = w.document.getElementsByTagName("link"); for (var i = 0; i < links.length; i++) { var link = links[i]; // qualify links to those with rel=preload and as=style attrs if (link.rel === "preload" && link.getAttribute("as") === "style" && !link.getAttribute("data-loadcss")) { // prevent rerunning on link link.setAttribute("data-loadcss", true); // bind listeners to toggle media back rp.bindMediaToggle(link); } } }; // if unsupported, run the polyfill if (!rp.support()) { // run once at least rp.poly(); // rerun poly on an interval until onload var run = w.setInterval(rp.poly, 500); if (w.addEventListener) { w.addEventListener("load", function () { rp.poly(); w.clearInterval(run); }); } else if (w.attachEvent) { w.attachEvent("onload", function () { rp.poly(); w.clearInterval(run); }); } } // commonjs if (typeof exports !== "undefined") { exports.loadCSS = loadCSS; } else { w.loadCSS = loadCSS; } }(typeof global !== "undefined" ? global : this));