123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*!
- * Ext JS Library 4.0
- * Copyright(c) 2006-2011 Sencha Inc.
- * licensing@sencha.com
- * http://www.sencha.com/license
- */
- /**
- * Barebones iframe implementation. For serious iframe work, see the ManagedIFrame extension
- * (http://www.sencha.com/forum/showthread.php?71961).
- *
- * @class Ext.ux.IFrame
- */
- Ext.define('Ext.ux.IFrame', {
- extend: 'Ext.Component',
- alias: 'widget.uxiframe',
- loadMask: 'Loading...',
- src: 'about:blank',
- renderTpl: [
- '<iframe src="{src}" name="{frameName}" width="100%" height="100%" frameborder="0"></iframe>'
- ],
- 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,
- iframeEl = me.iframeEl.dom,
- frameEl = me.getFrame();
- 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 () {
- var me = this,
- doc, prop;
- if (me.rendered) {
- try {
- doc = me.getDoc();
- if (doc) {
- Ext.EventManager.removeAll(doc);
- for (prop in doc) {
- if (doc.hasOwnProperty && doc.hasOwnProperty(prop)) {
- delete doc[prop];
- }
- }
- }
- } catch(e) { }
- }
- me.callParent();
- },
- 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(window, 'unload', me.beforeDestroy, me);
- this.el.unmask();
- this.fireEvent('load', this);
- } else if(me.src && me.src != '') {
- this.el.unmask();
- this.fireEvent('error', this);
- }
- },
- onRelayedEvent: function (event) {
- // relay event from the iframe's document to the document that owns the iframe...
- var iframeEl = this.iframeEl,
- iframeXY = iframeEl.getXY(),
- eventXY = event.getXY();
- // the event from the inner document has XY relative to that document's origin,
- // so adjust it to use the origin of the iframe in the outer document:
- event.xy = [iframeXY[0] + eventXY[0], iframeXY[1] + eventXY[1]];
- event.injectEvent(iframeEl); // blame the iframe for the event...
- event.xy = eventXY; // restore the original XY (just for safety)
- },
- 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);
- }
- }
- });
|