From 33fe59ee2181047f6f8f4937e3ea67b089395b74 Mon Sep 17 00:00:00 2001 From: Stefan Priebe Date: Mon, 2 Jun 2014 09:43:35 +0200 Subject: [PATCH] ExtJS: backport Ext.ux.IFrame from ExtJS 4.2 Signed-off-by: Stefan Priebe --- www/manager/Utils.js | 149 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/www/manager/Utils.js b/www/manager/Utils.js index 692824e8..155e849c 100644 --- a/www/manager/Utils.js +++ b/www/manager/Utils.js @@ -119,6 +119,155 @@ Ext.override(Ext.form.field.ComboBox, { } }); +Ext.define('Ext.ux.IFrame', { + extend: 'Ext.Component', + + alias: 'widget.uxiframe', + + loadMask: 'Loading...', + + src: 'about:blank', + + renderTpl: [ + '' + ], + + initComponent: function () { + this.callParent(); + + this.frameName = this.frameName || this.id + '-frame'; + + this.addEvents( + 'beforeload', + 'load' + ); + + Ext.apply(this.renderSelectors, { + iframeEl: 'iframe' + }); + }, + + 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; + }, + + beforeDestroy: function () { + this.cleanupListeners(true); + this.callParent(); + }, + + cleanupListeners: function(destroying){ + var doc, prop; + + if (this.rendered) { + try { + doc = this.getDoc(); + if (doc) { + Ext.EventManager.removeAll(doc); + if (destroying) { + for (prop in doc) { + if (doc.hasOwnProperty && doc.hasOwnProperty(prop)) { + delete doc[prop]; + } + } + } + } + } catch(e) { } + } + }, + + onLoad: function() { + var me = this, + doc = me.getDoc(), + fn = me.onRelayedEvent; + + if (doc) { + try { + Ext.EventManager.removeAll(doc); + + // These events need to be relayed from the inner document (where they stop + // bubbling) up to the outer document. This has to be done at the DOM level so + // the event reaches listeners on elements like the document body. The effected + // mechanisms that depend on this bubbling behavior are listed to the right + // of the event. + Ext.EventManager.on(doc, { + mousedown: fn, // menu dismisal (MenuManager) and Window onMouseDown (toFront) + mousemove: fn, // window resize drag detection + mouseup: fn, // window resize termination + click: fn, // not sure, but just to be safe + dblclick: fn, // not sure again + scope: me + }); + } catch(e) { + // cannot do this xss + } + + // We need to be sure we remove all our events from the iframe on unload or we're going to LEAK! + Ext.EventManager.on(this.getWin(), 'beforeunload', me.cleanupListeners, me); + + this.el.unmask(); + this.fireEvent('load', this); + + } else if(me.src && 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); + } + } +}); + Ext.define('PVE.Utils', { statics: { // this class only contains static functions -- 2.39.2