fef32801fb06147a97f9d074726ff232688afeca.svn-base 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * jQuery postMessage Transport Plugin 1.1.1
  3. * https://github.com/blueimp/jQuery-File-Upload
  4. *
  5. * Copyright 2011, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * http://www.opensource.org/licenses/MIT
  10. */
  11. /* global define, window, document */
  12. (function (factory) {
  13. 'use strict';
  14. if (typeof define === 'function' && define.amd) {
  15. // Register as an anonymous AMD module:
  16. define(['jquery'], factory);
  17. } else {
  18. // Browser globals:
  19. factory(window.jQuery);
  20. }
  21. }(function ($) {
  22. 'use strict';
  23. var counter = 0,
  24. names = [
  25. 'accepts',
  26. 'cache',
  27. 'contents',
  28. 'contentType',
  29. 'crossDomain',
  30. 'data',
  31. 'dataType',
  32. 'headers',
  33. 'ifModified',
  34. 'mimeType',
  35. 'password',
  36. 'processData',
  37. 'timeout',
  38. 'traditional',
  39. 'type',
  40. 'url',
  41. 'username'
  42. ],
  43. convert = function (p) {
  44. return p;
  45. };
  46. $.ajaxSetup({
  47. converters: {
  48. 'postmessage text': convert,
  49. 'postmessage json': convert,
  50. 'postmessage html': convert
  51. }
  52. });
  53. $.ajaxTransport('postmessage', function (options) {
  54. if (options.postMessage && window.postMessage) {
  55. var iframe,
  56. loc = $('<a>').prop('href', options.postMessage)[0],
  57. target = loc.protocol + '//' + loc.host,
  58. xhrUpload = options.xhr().upload;
  59. return {
  60. send: function (_, completeCallback) {
  61. counter += 1;
  62. var message = {
  63. id: 'postmessage-transport-' + counter
  64. },
  65. eventName = 'message.' + message.id;
  66. iframe = $(
  67. '<iframe style="display:none;" src="' +
  68. options.postMessage + '" name="' +
  69. message.id + '"></iframe>'
  70. ).bind('load', function () {
  71. $.each(names, function (i, name) {
  72. message[name] = options[name];
  73. });
  74. message.dataType = message.dataType.replace('postmessage ', '');
  75. $(window).bind(eventName, function (e) {
  76. e = e.originalEvent;
  77. var data = e.data,
  78. ev;
  79. if (e.origin === target && data.id === message.id) {
  80. if (data.type === 'progress') {
  81. ev = document.createEvent('Event');
  82. ev.initEvent(data.type, false, true);
  83. $.extend(ev, data);
  84. xhrUpload.dispatchEvent(ev);
  85. } else {
  86. completeCallback(
  87. data.status,
  88. data.statusText,
  89. {postmessage: data.result},
  90. data.headers
  91. );
  92. iframe.remove();
  93. $(window).unbind(eventName);
  94. }
  95. }
  96. });
  97. iframe[0].contentWindow.postMessage(
  98. message,
  99. target
  100. );
  101. }).appendTo(document.body);
  102. },
  103. abort: function () {
  104. if (iframe) {
  105. iframe.remove();
  106. }
  107. }
  108. };
  109. }
  110. });
  111. }));