Subversion-Projekte lars-tiefland.cienc

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

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