/** * Barebones iframe implementation. */Ext.define('Ext.ux.IFrame', { extend: 'Ext.Component', alias: 'widget.uxiframe', loadMask: 'Loading...', src: 'about:blank', renderTpl: [ '<iframe src="{src}" id="{id}-iframeEl" data-ref="iframeEl" name="{frameName}" width="100%" height="100%" frameborder="0"></iframe>' ], childEls: ['iframeEl'], initComponent: function () { this.callParent(); this.frameName = this.frameName || this.id + '-frame'; }, initEvents : function() { var me = this; me.callParent(); me.iframeEl.on('load', me.onLoad, me); }, initRenderData: function() { return Ext.apply(this.callParent(), { src: this.src, frameName: this.frameName }); }, getBody: function() { var doc = this.getDoc(); return doc.body || doc.documentElement; }, getDoc: function() { try { return this.getWin().document; } catch (ex) { return null; } }, getWin: function() { var me = this, name = me.frameName, win = Ext.isIE ? me.iframeEl.dom.contentWindow : window.frames[name]; return win; }, getFrame: function() { var me = this; return me.iframeEl.dom; }, onLoad: function() { var me = this, doc = me.getDoc(); if (doc) { this.el.unmask(); this.fireEvent('load', this); } else if (me.src) { this.el.unmask(); this.fireEvent('error', this); } }, load: function (src) { var me = this, text = me.loadMask, frame = me.getFrame(); if (me.fireEvent('beforeload', me, src) !== false) { if (text && me.el) { me.el.mask(text); } frame.src = me.src = (src || me.src); } }}); /* * Note: Event relayers are not needed here because the combination of the gesture system and * normal focus/blur will handle it. * Tested with the examples/classic/desktop app. */ /* * TODO items: * * Iframe should clean up any Ext.dom.Element wrappers around its window, document * documentElement and body when it is destroyed. This helps prevent "Permission Denied" * errors in IE when Ext.dom.GarbageCollector tries to access those objects on an orphaned * iframe. Permission Denied errors can occur in one of the following 2 scenarios: * * a. When an iframe is removed from the document, and all references to it have been * removed, IE will "clear" the window object. At this point the window object becomes * completely inaccessible - accessing any of its properties results in a "Permission * Denied" error. http://msdn.microsoft.com/en-us/library/ie/hh180174(v=vs.85).aspx * * b. When an iframe is unloaded (either by navigating to a new url, or via document.open/ * document.write, new html and body elements are created and the old the html and body * elements are orphaned. Accessing the html and body elements or any of their properties * results in a "Permission Denied" error. */