Simplified iframe initialization

Rather than attach a function to the window and trigger it from a script
tag in the document body, it's much simpler to just use the references
we already have to execute the code immediately and directly.

This also fixes issues in Firefox where reaching in and adding functions
to the window wasn't allowed.

Change-Id: If7a84edf6ae4549b19ce36a3477311c46dbadea7
This commit is contained in:
Trevor Parscal 2013-04-15 11:38:28 -07:00
parent cec856032a
commit 17c9aadf8f

View file

@ -68,45 +68,42 @@ ve.inheritClass( ve.ui.Frame, ve.EventEmitter );
* @emits initialize * @emits initialize
*/ */
ve.ui.Frame.prototype.onLoad = function () { ve.ui.Frame.prototype.onLoad = function () {
var win = this.$.prop( 'contentWindow' ), var interval, rules,
win = this.$.prop( 'contentWindow' ),
doc = win.document, doc = win.document,
stylesheets = this.config.stylesheets, style = doc.createElement( 'style' ),
initialize = ve.bind( function () { initialize = ve.bind( function () {
this.initialized = true; this.initialized = true;
this.emit( 'initialize' ); this.emit( 'initialize' );
}, this ); }, this );
// Initialize contents // Initialize contents
win.setup = function () {
var interval, rules,
style = doc.createElement( 'style' );
// Import all stylesheets
style.textContent = '@import "' + stylesheets.join( '";\n@import "' ) + '";';
doc.body.appendChild( style );
// Poll for access to stylesheet content
interval = setInterval( function () {
try {
// MAGIC: only accessible when the stylesheet is loaded
rules = style.sheet.cssRules;
// If that didn't throw an exception, we're done loading
clearInterval( interval );
// Protect against IE running interval one extra time after clearing
if ( !this.initialized ) {
initialize();
}
} catch ( e ) {}
} );
};
doc.open(); doc.open();
doc.write( doc.write(
'<body style="padding:0;margin:0;">' + '<body style="padding:0;margin:0;">' +
'<div class="ve-ui-frame-content"></div><script>setup();</script>' + '<div class="ve-ui-frame-content"></div>' +
'</body>' '</body>'
); );
doc.close(); doc.close();
// Import all stylesheets
style.textContent = '@import "' + this.config.stylesheets.join( '";\n@import "' ) + '";';
doc.body.appendChild( style );
// Poll for access to stylesheet content
interval = setInterval( ve.bind( function () {
try {
// MAGIC: only accessible when the stylesheet is loaded
rules = style.sheet.cssRules;
// If that didn't throw an exception, we're done loading
clearInterval( interval );
// Protect against IE running interval one extra time after clearing
if ( !this.initialized ) {
initialize();
}
} catch ( e ) { }
}, this ), 10 );
// Properties // Properties
this.$$ = ve.ui.get$$( doc, this ); this.$$ = ve.ui.get$$( doc, this );
this.$content = this.$$( '.ve-ui-frame-content' ); this.$content = this.$$( '.ve-ui-frame-content' );