docs: function( editor, output ) {
  			this.getHolderElement = function() {
  				var holder = this._.holder;
  
  				if ( !holder ) {
  					if ( this.isFramed ) {
  						var iframe = this.document.getById( this.id + '_frame' ),
  							parentDiv = iframe.getParent(),
  							doc = iframe.getFrameDocument();
  
  						// Make it scrollable on iOS. (#8308)
  						CKEDITOR.env.iOS && parentDiv.setStyles( {
  							'overflow': 'scroll',
  							'-webkit-overflow-scrolling': 'touch'
  						} );
  
  						var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function( ev ) {
  							this.isLoaded = true;
  							if ( this.onLoad )
  								this.onLoad();
  						}, this ) );
  
  						doc.write( frameDocTpl.output( CKEDITOR.tools.extend( {
  							css: CKEDITOR.tools.buildStyleHtml( this.css ),
  							onload: 'window.parent.CKEDITOR.tools.callFunction(' + onLoad + ');'
  						}, data ) ) );
  
  						var win = doc.getWindow();
  
  						// Register the CKEDITOR global.
  						win.$.CKEDITOR = CKEDITOR;
  
  						// Arrow keys for scrolling is only preventable with 'keypress' event in Opera (#4534).
  						doc.on( 'keydown', function( evt ) {
  							var keystroke = evt.data.getKeystroke(),
  								dir = this.document.getById( this.id ).getAttribute( 'dir' );
  
  							// Delegate key processing to block.
  							if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) {
  								evt.data.preventDefault();
  								return;
  							}
  
  							// ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl)
  							if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) {
  								if ( this.onEscape && this.onEscape( keystroke ) === false )
  									evt.data.preventDefault();
  							}
  						}, this );
  
  						holder = doc.getBody();
  						holder.unselectable();
  						CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad );
  					} else
  						holder = this.document.getById( this.id );
  
  					this._.holder = holder;
  				}
  
  				return holder;
  			};
  
  			var data = {
  				editorId: editor.id,
  				id: this.id,
  				langCode: editor.langCode,
  				dir: editor.lang.dir,
  				cls: this.className,
  				frame: '',
  				env: CKEDITOR.env.cssClass,
  				'z-index': editor.config.baseFloatZIndex + 1
  			};
  
  			if ( this.isFramed ) {
  				// With IE, the custom domain has to be taken care at first,
  				// for other browers, the 'src' attribute should be left empty to
  				// trigger iframe's 'load' event.
  				var src =
  					CKEDITOR.env.air ? 'javascript:void(0)' :
  					CKEDITOR.env.ie ? 'javascript:void(function(){' + encodeURIComponent(
  						'document.open();' +
  						// In IE, the document domain must be set any time we call document.open().
  						'(' + CKEDITOR.tools.fixDomain + ')();' +
  						'document.close();'
  					) + '}())' :
  					'';
  
  				data.frame = frameTpl.output( {
  					id: this.id + '_frame',
  					src: src
  				} );
  			}
  
  			var html = panelTpl.output( data );
  
  			if ( output )
  				output.push( html );
  
  			return html;
  		}