css.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. if (typeof window !== 'undefined') {
  3. var waitSeconds = 100;
  4. var head = document.getElementsByTagName('head')[0];
  5. // get all link tags in the page
  6. var links = document.getElementsByTagName('link');
  7. var linkHrefs = [];
  8. for (var i = 0; i < links.length; i++) {
  9. linkHrefs.push(links[i].href);
  10. }
  11. var isWebkit = !!window.navigator.userAgent.match(/AppleWebKit\/([^ ;]*)/);
  12. var webkitLoadCheck = function(link, callback) {
  13. setTimeout(function() {
  14. for (var i = 0; i < document.styleSheets.length; i++) {
  15. var sheet = document.styleSheets[i];
  16. if (sheet.href === link.href) {
  17. return callback();
  18. }
  19. }
  20. webkitLoadCheck(link, callback);
  21. }, 10);
  22. };
  23. var noop = function() {};
  24. var loadCSS = function(url) {
  25. return new Promise(function(resolve, reject) {
  26. var timeout = setTimeout(function() {
  27. reject('Unable to load CSS');
  28. }, waitSeconds * 1000);
  29. var _callback = function(error) {
  30. clearTimeout(timeout);
  31. link.onload = link.onerror = noop;
  32. setTimeout(function() {
  33. if (error) {
  34. reject(error);
  35. }
  36. else {
  37. resolve('');
  38. }
  39. }, 7);
  40. };
  41. var link = document.createElement('link');
  42. link.type = 'text/css';
  43. link.rel = 'stylesheet';
  44. link.href = url;
  45. if (!isWebkit) {
  46. link.onload = function() {
  47. _callback();
  48. }
  49. } else {
  50. webkitLoadCheck(link, _callback);
  51. }
  52. link.onerror = function(event) {
  53. _callback(event.error || new Error('Error loading CSS file.'));
  54. };
  55. head.appendChild(link);
  56. });
  57. };
  58. exports.fetch = function(load) {
  59. // dont reload styles loaded in the head
  60. for (var i = 0; i < linkHrefs.length; i++)
  61. if (load.address == linkHrefs[i])
  62. return '';
  63. return loadCSS(load.address);
  64. };
  65. }