mirror of
https://github.com/viq/NewsBlur.git
synced 2025-08-05 16:49:45 +00:00
171 lines
3.8 KiB
JavaScript
171 lines
3.8 KiB
JavaScript
/**
|
|
* 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) {
|
|
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 () {
|
|
if (typeof window != "undefined" && 'ActiveXObject' in window){
|
|
try {
|
|
var a = new ActiveXObject('htmlfile');
|
|
return a && io.Transport.XHR.check();
|
|
} 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
|
|
);
|