/** * socket.io * Copyright(c) 2011 LearnBoost * 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(''); 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 );