| /** |
| * socket.io |
| * Copyright(c) 2011 LearnBoost <dev@learnboost.com> |
| * MIT Licensed |
| */ |
| |
| (function (exports, io) { |
| |
| /** |
| * Expose constructor. |
| */ |
| |
| exports.htmlfile = HTMLFile; |
| |
| /** |
| * The HTMLFile transport creates a `forever iframe` based transport |
| * for Internet Explorer. Regular forever iframe implementations will |
| * continuously trigger the browsers buzy indicators. If the forever iframe |
| * is created inside a `htmlfile` these indicators will not be trigged. |
| * |
| * @constructor |
| * @extends {io.Transport.XHR} |
| * @api public |
| */ |
| |
| function HTMLFile (socket) { |
| io.Transport.XHR.apply(this, arguments); |
| }; |
| |
| /** |
| * Inherits from XHR transport. |
| */ |
| |
| io.util.inherit(HTMLFile, io.Transport.XHR); |
| |
| /** |
| * Transport name |
| * |
| * @api public |
| */ |
| |
| HTMLFile.prototype.name = 'htmlfile'; |
| |
| /** |
| * Creates a new ActiveX `htmlfile` with a forever loading iframe |
| * that can be used to listen to messages. Inside the generated |
| * `htmlfile` a reference will be made to the HTMLFile transport. |
| * |
| * @api private |
| */ |
| |
| HTMLFile.prototype.get = function () { |
| this.doc = new ActiveXObject('htmlfile'); |
| this.doc.open(); |
| this.doc.write('<html></html>'); |
| this.doc.close(); |
| this.doc.parentWindow.s = this; |
| |
| var iframeC = this.doc.createElement('div'); |
| iframeC.className = 'socketio'; |
| |
| this.doc.body.appendChild(iframeC); |
| this.iframe = this.doc.createElement('iframe'); |
| |
| iframeC.appendChild(this.iframe); |
| |
| var self = this |
| , query = io.util.query(this.socket.options.query, 't='+ +new Date); |
| |
| this.iframe.src = this.prepareUrl() + query; |
| |
| io.util.on(window, 'unload', function () { |
| self.destroy(); |
| }); |
| }; |
| |
| /** |
| * The Socket.IO server will write script tags inside the forever |
| * iframe, this function will be used as callback for the incoming |
| * information. |
| * |
| * @param {String} data The message |
| * @param {document} doc Reference to the context |
| * @api private |
| */ |
| |
| HTMLFile.prototype._ = function (data, doc) { |
| // unescape all forward slashes. see GH-1251 |
| data = data.replace(/\\\//g, '/'); |
| this.onData(data); |
| try { |
| var script = doc.getElementsByTagName('script')[0]; |
| script.parentNode.removeChild(script); |
| } catch (e) { } |
| }; |
| |
| /** |
| * Destroy the established connection, iframe and `htmlfile`. |
| * And calls the `CollectGarbage` function of Internet Explorer |
| * to release the memory. |
| * |
| * @api private |
| */ |
| |
| HTMLFile.prototype.destroy = function () { |
| if (this.iframe){ |
| try { |
| this.iframe.src = 'about:blank'; |
| } catch(e){} |
| |
| this.doc = null; |
| this.iframe.parentNode.removeChild(this.iframe); |
| this.iframe = null; |
| |
| CollectGarbage(); |
| } |
| }; |
| |
| /** |
| * Disconnects the established connection. |
| * |
| * @returns {Transport} Chaining. |
| * @api public |
| */ |
| |
| HTMLFile.prototype.close = function () { |
| this.destroy(); |
| return io.Transport.XHR.prototype.close.call(this); |
| }; |
| |
| /** |
| * Checks if the browser supports this transport. The browser |
| * must have an `ActiveXObject` implementation. |
| * |
| * @return {Boolean} |
| * @api public |
| */ |
| |
| HTMLFile.check = function (socket) { |
| if (typeof window != "undefined" && 'ActiveXObject' in window){ |
| try { |
| var a = new ActiveXObject('htmlfile'); |
| return a && io.Transport.XHR.check(socket); |
| } catch(e){} |
| } |
| return false; |
| }; |
| |
| /** |
| * Check if cross domain requests are supported. |
| * |
| * @returns {Boolean} |
| * @api public |
| */ |
| |
| HTMLFile.xdomainCheck = function () { |
| // we can probably do handling for sub-domains, we should |
| // test that it's cross domain but a subdomain here |
| return false; |
| }; |
| |
| /** |
| * Add the transport to your public io.transports array. |
| * |
| * @api private |
| */ |
| |
| io.transports.push('htmlfile'); |
| |
| })( |
| 'undefined' != typeof io ? io.Transport : module.exports |
| , 'undefined' != typeof io ? io : module.parent.exports |
| ); |