docs: function getClipboardDataByPastebin( evt, callback ) {
  			var doc = editor.document,
  				editable = editor.editable(),
  				cancel = function( evt ) {
  					evt.cancel();
  				},
  				blurListener;
  
  			// Avoid recursions on 'paste' event or consequent paste too fast. (#5730)
  			if ( doc.getById( 'cke_pastebin' ) )
  				return;
  
  			var sel = editor.getSelection();
  			var bms = sel.createBookmarks();
  
  			// #11384. On IE9+ we use native selectionchange (i.e. editor#selectionCheck) to cache the most
  			// recent selection which we then lock on editable blur. See selection.js for more info.
  			// selectionchange fired before getClipboardDataByPastebin() cached selection
  			// before creating bookmark (cached selection will be invalid, because bookmarks modified the DOM),
  			// so we need to fire selectionchange one more time, to store current seleciton.
  			// Selection will be locked when we focus pastebin.
  			if ( CKEDITOR.env.ie )
  				sel.root.fire( 'selectionchange' );
  
  			// Create container to paste into.
  			// For rich content we prefer to use "body" since it holds
  			// the least possibility to be splitted by pasted content, while this may
  			// breaks the text selection on a frame-less editable, "div" would be
  			// the best one in that case.
  			// In another case on old IEs moving the selection into a "body" paste bin causes error panic.
  			// Body can't be also used for Opera which fills it with <br>
  			// what is indistinguishable from pasted <br> (copying <br> in Opera isn't possible,
  			// but it can be copied from other browser).
  			var pastebin = new CKEDITOR.dom.element(
  				( CKEDITOR.env.webkit || editable.is( 'body' ) ) && !CKEDITOR.env.ie ? 'body' : 'div', doc );
  
  			pastebin.setAttributes( {
  				id: 'cke_pastebin',
  				'data-cke-temp': '1'
  			} );
  
  			var containerOffset = 0,
  				offsetParent,
  				win = doc.getWindow();
  
  			if ( CKEDITOR.env.webkit ) {
  				// It's better to paste close to the real paste destination, so inherited styles
  				// (which Webkits will try to compensate by styling span) differs less from the destination's one.
  				editable.append( pastebin );
  				// Style pastebin like .cke_editable, to minimize differences between origin and destination. (#9754)
  				pastebin.addClass( 'cke_editable' );
  
  				// Compensate position of offsetParent.
  				if ( !editable.is( 'body' ) ) {
  					// We're not able to get offsetParent from pastebin (body element), so check whether
  					// its parent (editable) is positioned.
  					if ( editable.getComputedStyle( 'position' ) != 'static' )
  						offsetParent = editable;
  					// And if not - safely get offsetParent from editable.
  					else
  						offsetParent = CKEDITOR.dom.element.get( editable.$.offsetParent );
  
  					containerOffset = offsetParent.getDocumentPosition().y;
  				}
  			} else {
  				// Opera and IE doesn't allow to append to html element.
  				editable.getAscendant( CKEDITOR.env.ie ? 'body' : 'html', 1 ).append( pastebin );
  			}
  
  			pastebin.setStyles( {
  				position: 'absolute',
  				// Position the bin at the top (+10 for safety) of viewport to avoid any subsequent document scroll.
  				top: ( win.getScrollPosition().y - containerOffset + 10 ) + 'px',
  				width: '1px',
  				// Caret has to fit in that height, otherwise browsers like Chrome & Opera will scroll window to show it.
  				// Set height equal to viewport's height - 20px (safety gaps), minimum 1px.
  				height: Math.max( 1, win.getViewPaneSize().height - 20 ) + 'px',
  				overflow: 'hidden',
  				// Reset styles that can mess up pastebin position.
  				margin: 0,
  				padding: 0
  			} );
  
  			// Check if the paste bin now establishes new editing host.
  			var isEditingHost = pastebin.getParent().isReadOnly();
  
  			if ( isEditingHost ) {
  				// Hide the paste bin.
  				pastebin.setOpacity( 0 );
  				// And make it editable.
  				pastebin.setAttribute( 'contenteditable', true );
  			}
  			// Transparency is not enough since positioned non-editing host always shows
  			// resize handler, pull it off the screen instead.
  			else
  				pastebin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-1000px' );
  
  			editor.on( 'selectionChange', cancel, null, null, 0 );
  
  			// Webkit fill fire blur on editable when moving selection to
  			// pastebin (if body is used). Cancel it because it causes incorrect
  			// selection lock in case of inline editor (#10644).
  			// The same seems to apply to Firefox (#10787).
  			if ( CKEDITOR.env.webkit || CKEDITOR.env.gecko )
  				blurListener = editable.once( 'blur', cancel, null, null, -100 );
  
  			// Temporarily move selection to the pastebin.
  			isEditingHost && pastebin.focus();
  			var range = new CKEDITOR.dom.range( pastebin );
  			range.selectNodeContents( pastebin );
  			var selPastebin = range.select();
  
  			// If non-native paste is executed, IE will open security alert and blur editable.
  			// Editable will then lock selection inside itself and after accepting security alert
  			// this selection will be restored. We overwrite stored selection, so it's restored
  			// in pastebin. (#9552)
  			if ( CKEDITOR.env.ie ) {
  				blurListener = editable.once( 'blur', function( evt ) {
  					editor.lockSelection( selPastebin );
  				} );
  			}
  
  			var scrollTop = CKEDITOR.document.getWindow().getScrollPosition().y;
  
  			// Wait a while and grab the pasted contents.
  			setTimeout( function() {
  				// Restore main window's scroll position which could have been changed
  				// by browser in cases described in #9771.
  				if ( CKEDITOR.env.webkit )
  					CKEDITOR.document.getBody().$.scrollTop = scrollTop;
  
  				// Blur will be fired only on non-native paste. In other case manually remove listener.
  				blurListener && blurListener.removeListener();
  
  				// Restore properly the document focus. (#8849)
  				if ( CKEDITOR.env.ie )
  					editable.focus();
  
  				// IE7: selection must go before removing pastebin. (#8691)
  				sel.selectBookmarks( bms );
  				pastebin.remove();
  
  				// Grab the HTML contents.
  				// We need to look for a apple style wrapper on webkit it also adds
  				// a div wrapper if you copy/paste the body of the editor.
  				// Remove hidden div and restore selection.
  				var bogusSpan;
  				if ( CKEDITOR.env.webkit && ( bogusSpan = pastebin.getFirst() ) && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) )
  					pastebin = bogusSpan;
  
  				editor.removeListener( 'selectionChange', cancel );
  				callback( pastebin.getHtml() );
  			}, 0 );
  		}