123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /**
- * 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.
- */
|