(function( exports, $ ){ var api = wp.customize; api.Previewer = api.Messenger.extend({ refreshBuffer: 250, /** * Requires params: * - iframe - a selector or jQuery element * - form - a selector or jQuery element * - url - the URL of preview frame */ initialize: function( params, options ) { $.extend( this, options || {} ); this.loaderUuid = 0; /* * Wrap this.refresh to prevent it from hammering the servers: * * If refresh is called once and no other refresh requests are * loading, trigger the request immediately. * * If refresh is called while another refresh request is loading, * debounce the refresh requests: * 1. Stop the loading request (as it is instantly outdated). * 2. Trigger the new request once refresh hasn't been called for * self.refreshBuffer milliseconds. */ this.refresh = (function( self ) { var refresh = self.refresh, callback = function() { timeout = null; refresh.call( self ); }, timeout; return function() { if ( typeof timeout !== 'number' ) { if ( self.loading ) { self.loading.remove(); delete self.loading; self.loader(); } else { return callback(); } } clearTimeout( timeout ); timeout = setTimeout( callback, self.refreshBuffer ); }; })( this ); this.iframe = api.ensure( params.iframe ); this.form = api.ensure( params.form ); this.container = this.iframe.parent(); api.Messenger.prototype.initialize.call( this, params.url, { targetWindow: this.iframe[0].contentWindow }); this._formOriginalProps = { target: this.form.prop('target'), action: this.form.prop('action') }; this.bind( 'url', function( url ) { // Bail if we're navigating to the current url, to a different origin, or wp-admin. if ( this.url() == url || 0 !== url.indexOf( this.origin() + '/' ) || -1 !== url.indexOf( 'wp-admin' ) ) return; this.url( url ); this.refresh(); }); this.refresh(); // Prevent the form from saving when enter is pressed. this.form.on( 'keydown', function( e ) { if ( 13 === e.which ) // Enter e.preventDefault(); }); }, loader: function() { var self = this, name; if ( this.loading ) return this.loading; name = this.iframe.prop('name'); this.loading = $('