data-uri.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*!
  2. {
  3. "name": "Data URI",
  4. "property": "datauri",
  5. "caniuse": "datauri",
  6. "tags": ["url"],
  7. "builderAliases": ["url_data_uri"],
  8. "async": true,
  9. "notes": [{
  10. "name": "Wikipedia article",
  11. "href": "https://en.wikipedia.org/wiki/Data_URI_scheme"
  12. }],
  13. "warnings": ["Support in Internet Explorer 8 is limited to images and linked resources like CSS files, not HTML files"]
  14. }
  15. !*/
  16. /* DOC
  17. Detects support for data URIs. Provides a subproperty to report support for data URIs over 32kb in size:
  18. ```javascript
  19. Modernizr.datauri // true
  20. Modernizr.datauri.over32kb // false in IE8
  21. ```
  22. */
  23. define(['Modernizr', 'addTest'], function(Modernizr, addTest) {
  24. // https://github.com/Modernizr/Modernizr/issues/14
  25. Modernizr.addAsyncTest(function() {
  26. // IE7 throw a mixed content warning on HTTPS for this test, so we'll
  27. // just blacklist it (we know it doesn't support data URIs anyway)
  28. // https://github.com/Modernizr/Modernizr/issues/362
  29. if (navigator.userAgent.indexOf('MSIE 7.') !== -1) {
  30. // Keep the test async
  31. setTimeout(function() {
  32. addTest('datauri', false);
  33. }, 10);
  34. }
  35. var datauri = new Image();
  36. datauri.onerror = function() {
  37. addTest('datauri', false);
  38. };
  39. datauri.onload = function() {
  40. if (datauri.width === 1 && datauri.height === 1) {
  41. testOver32kb();
  42. }
  43. else {
  44. addTest('datauri', false);
  45. }
  46. };
  47. datauri.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
  48. // Once we have datauri, let's check to see if we can use data URIs over
  49. // 32kb (IE8 can't). https://github.com/Modernizr/Modernizr/issues/321
  50. function testOver32kb() {
  51. var datauriBig = new Image();
  52. datauriBig.onerror = function() {
  53. addTest('datauri', true);
  54. Modernizr.datauri = new Boolean(true);
  55. Modernizr.datauri.over32kb = false;
  56. };
  57. datauriBig.onload = function() {
  58. addTest('datauri', true);
  59. Modernizr.datauri = new Boolean(true);
  60. Modernizr.datauri.over32kb = (datauriBig.width === 1 && datauriBig.height === 1);
  61. };
  62. var base64str = 'R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
  63. while (base64str.length < 33000) {
  64. base64str = '\r\n' + base64str;
  65. }
  66. datauriBig.src = 'data:image/gif;base64,' + base64str;
  67. }
  68. });
  69. });