| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | 
							- 'use strict';
 
- var eventUtils = require('./event')
 
-   , browser = require('./browser')
 
-   ;
 
- var debug = function() {};
 
- if (process.env.NODE_ENV !== 'production') {
 
-   debug = require('debug')('sockjs-client:utils:iframe');
 
- }
 
- module.exports = {
 
-   WPrefix: '_jp'
 
- , currentWindowId: null
 
- , polluteGlobalNamespace: function() {
 
-     if (!(module.exports.WPrefix in global)) {
 
-       global[module.exports.WPrefix] = {};
 
-     }
 
-   }
 
- , postMessage: function(type, data) {
 
-     if (global.parent !== global) {
 
-       global.parent.postMessage(JSON.stringify({
 
-         windowId: module.exports.currentWindowId
 
-       , type: type
 
-       , data: data || ''
 
-       }), '*');
 
-     } else {
 
-       debug('Cannot postMessage, no parent window.', type, data);
 
-     }
 
-   }
 
- , createIframe: function(iframeUrl, errorCallback) {
 
-     var iframe = global.document.createElement('iframe');
 
-     var tref, unloadRef;
 
-     var unattach = function() {
 
-       debug('unattach');
 
-       clearTimeout(tref);
 
-       // Explorer had problems with that.
 
-       try {
 
-         iframe.onload = null;
 
-       } catch (x) {
 
-         // intentionally empty
 
-       }
 
-       iframe.onerror = null;
 
-     };
 
-     var cleanup = function() {
 
-       debug('cleanup');
 
-       if (iframe) {
 
-         unattach();
 
-         // This timeout makes chrome fire onbeforeunload event
 
-         // within iframe. Without the timeout it goes straight to
 
-         // onunload.
 
-         setTimeout(function() {
 
-           if (iframe) {
 
-             iframe.parentNode.removeChild(iframe);
 
-           }
 
-           iframe = null;
 
-         }, 0);
 
-         eventUtils.unloadDel(unloadRef);
 
-       }
 
-     };
 
-     var onerror = function(err) {
 
-       debug('onerror', err);
 
-       if (iframe) {
 
-         cleanup();
 
-         errorCallback(err);
 
-       }
 
-     };
 
-     var post = function(msg, origin) {
 
-       debug('post', msg, origin);
 
-       setTimeout(function() {
 
-         try {
 
-           // When the iframe is not loaded, IE raises an exception
 
-           // on 'contentWindow'.
 
-           if (iframe && iframe.contentWindow) {
 
-             iframe.contentWindow.postMessage(msg, origin);
 
-           }
 
-         } catch (x) {
 
-           // intentionally empty
 
-         }
 
-       }, 0);
 
-     };
 
-     iframe.src = iframeUrl;
 
-     iframe.style.display = 'none';
 
-     iframe.style.position = 'absolute';
 
-     iframe.onerror = function() {
 
-       onerror('onerror');
 
-     };
 
-     iframe.onload = function() {
 
-       debug('onload');
 
-       // `onload` is triggered before scripts on the iframe are
 
-       // executed. Give it few seconds to actually load stuff.
 
-       clearTimeout(tref);
 
-       tref = setTimeout(function() {
 
-         onerror('onload timeout');
 
-       }, 2000);
 
-     };
 
-     global.document.body.appendChild(iframe);
 
-     tref = setTimeout(function() {
 
-       onerror('timeout');
 
-     }, 15000);
 
-     unloadRef = eventUtils.unloadAdd(cleanup);
 
-     return {
 
-       post: post
 
-     , cleanup: cleanup
 
-     , loaded: unattach
 
-     };
 
-   }
 
- /* eslint no-undef: "off", new-cap: "off" */
 
- , createHtmlfile: function(iframeUrl, errorCallback) {
 
-     var axo = ['Active'].concat('Object').join('X');
 
-     var doc = new global[axo]('htmlfile');
 
-     var tref, unloadRef;
 
-     var iframe;
 
-     var unattach = function() {
 
-       clearTimeout(tref);
 
-       iframe.onerror = null;
 
-     };
 
-     var cleanup = function() {
 
-       if (doc) {
 
-         unattach();
 
-         eventUtils.unloadDel(unloadRef);
 
-         iframe.parentNode.removeChild(iframe);
 
-         iframe = doc = null;
 
-         CollectGarbage();
 
-       }
 
-     };
 
-     var onerror = function(r) {
 
-       debug('onerror', r);
 
-       if (doc) {
 
-         cleanup();
 
-         errorCallback(r);
 
-       }
 
-     };
 
-     var post = function(msg, origin) {
 
-       try {
 
-         // When the iframe is not loaded, IE raises an exception
 
-         // on 'contentWindow'.
 
-         setTimeout(function() {
 
-           if (iframe && iframe.contentWindow) {
 
-               iframe.contentWindow.postMessage(msg, origin);
 
-           }
 
-         }, 0);
 
-       } catch (x) {
 
-         // intentionally empty
 
-       }
 
-     };
 
-     doc.open();
 
-     doc.write('<html><s' + 'cript>' +
 
-               'document.domain="' + global.document.domain + '";' +
 
-               '</s' + 'cript></html>');
 
-     doc.close();
 
-     doc.parentWindow[module.exports.WPrefix] = global[module.exports.WPrefix];
 
-     var c = doc.createElement('div');
 
-     doc.body.appendChild(c);
 
-     iframe = doc.createElement('iframe');
 
-     c.appendChild(iframe);
 
-     iframe.src = iframeUrl;
 
-     iframe.onerror = function() {
 
-       onerror('onerror');
 
-     };
 
-     tref = setTimeout(function() {
 
-       onerror('timeout');
 
-     }, 15000);
 
-     unloadRef = eventUtils.unloadAdd(cleanup);
 
-     return {
 
-       post: post
 
-     , cleanup: cleanup
 
-     , loaded: unattach
 
-     };
 
-   }
 
- };
 
- module.exports.iframeEnabled = false;
 
- if (global.document) {
 
-   // postMessage misbehaves in konqueror 4.6.5 - the messages are delivered with
 
-   // huge delay, or not at all.
 
-   module.exports.iframeEnabled = (typeof global.postMessage === 'function' ||
 
-     typeof global.postMessage === 'object') && (!browser.isKonqueror());
 
- }
 
 
  |