229 lines
6.8 KiB
JavaScript
229 lines
6.8 KiB
JavaScript
|
/**
|
|||
|
* @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
|
|||
|
* For licensing, see LICENSE.md or http://ckeditor.com/license
|
|||
|
*/
|
|||
|
|
|||
|
CKEDITOR.dialog.add( 'paste', function( editor ) {
|
|||
|
var lang = editor.lang.clipboard;
|
|||
|
|
|||
|
function onPasteFrameLoad( win ) {
|
|||
|
var doc = new CKEDITOR.dom.document( win.document ),
|
|||
|
body = doc.getBody(),
|
|||
|
script = doc.getById( 'cke_actscrpt' );
|
|||
|
|
|||
|
script && script.remove();
|
|||
|
|
|||
|
body.setAttribute( 'contenteditable', true );
|
|||
|
|
|||
|
// IE before version 8 will leave cursor blinking inside the document after
|
|||
|
// editor blurred unless we clean up the selection. (#4716)
|
|||
|
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) {
|
|||
|
doc.getWindow().on( 'blur', function() {
|
|||
|
doc.$.selection.empty();
|
|||
|
} );
|
|||
|
}
|
|||
|
|
|||
|
doc.on( 'keydown', function( e ) {
|
|||
|
var domEvent = e.data,
|
|||
|
key = domEvent.getKeystroke(),
|
|||
|
processed;
|
|||
|
|
|||
|
switch ( key ) {
|
|||
|
case 27:
|
|||
|
this.hide();
|
|||
|
processed = 1;
|
|||
|
break;
|
|||
|
|
|||
|
case 9:
|
|||
|
case CKEDITOR.SHIFT + 9:
|
|||
|
this.changeFocus( 1 );
|
|||
|
processed = 1;
|
|||
|
}
|
|||
|
|
|||
|
processed && domEvent.preventDefault();
|
|||
|
}, this );
|
|||
|
|
|||
|
editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) );
|
|||
|
|
|||
|
// Handle pending focus.
|
|||
|
if ( doc.getWindow().getFrame().removeCustomData( 'pendingFocus' ) )
|
|||
|
body.focus();
|
|||
|
}
|
|||
|
|
|||
|
// If pasteDialogCommit wasn't canceled by e.g. editor.getClipboardData
|
|||
|
// then fire paste event.
|
|||
|
// Do not use editor#paste, because it would start from beforePaste event.
|
|||
|
editor.on( 'pasteDialogCommit', function( evt ) {
|
|||
|
if ( evt.data )
|
|||
|
editor.fire( 'paste', { type: 'auto', dataValue: evt.data } );
|
|||
|
}, null, null, 1000 );
|
|||
|
|
|||
|
return {
|
|||
|
title: lang.title,
|
|||
|
|
|||
|
minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
|
|||
|
minHeight: CKEDITOR.env.quirks ? 250 : 245,
|
|||
|
onShow: function() {
|
|||
|
// FIREFOX BUG: Force the browser to render the dialog to make the to-be-
|
|||
|
// inserted iframe editable. (#3366)
|
|||
|
this.parts.dialog.$.offsetHeight;
|
|||
|
|
|||
|
this.setupContent();
|
|||
|
|
|||
|
// Set dialog title to the custom value (set e.g. in editor.openDialog callback) and reset this value.
|
|||
|
// If custom title not set, use default one.
|
|||
|
this.parts.title.setHtml( this.customTitle || lang.title );
|
|||
|
this.customTitle = null;
|
|||
|
},
|
|||
|
|
|||
|
onLoad: function() {
|
|||
|
if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )
|
|||
|
this.parts.contents.setStyle( 'overflow', 'hidden' );
|
|||
|
},
|
|||
|
|
|||
|
onOk: function() {
|
|||
|
this.commitContent();
|
|||
|
},
|
|||
|
|
|||
|
contents: [
|
|||
|
{
|
|||
|
id: 'general',
|
|||
|
label: editor.lang.common.generalTab,
|
|||
|
elements: [
|
|||
|
{
|
|||
|
type: 'html',
|
|||
|
id: 'securityMsg',
|
|||
|
html: '<div style="white-space:normal;width:340px">' + lang.securityMsg + '</div>'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'html',
|
|||
|
id: 'pasteMsg',
|
|||
|
html: '<div style="white-space:normal;width:340px">' + lang.pasteMsg + '</div>'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'html',
|
|||
|
id: 'editing_area',
|
|||
|
style: 'width:100%;height:100%',
|
|||
|
html: '',
|
|||
|
focus: function() {
|
|||
|
var iframe = this.getInputElement(),
|
|||
|
doc = iframe.getFrameDocument(),
|
|||
|
body = doc.getBody();
|
|||
|
|
|||
|
// Frame content may not loaded at the moment.
|
|||
|
if ( !body || body.isReadOnly() )
|
|||
|
iframe.setCustomData( 'pendingFocus', 1 );
|
|||
|
else
|
|||
|
body.focus();
|
|||
|
},
|
|||
|
setup: function() {
|
|||
|
var dialog = this.getDialog();
|
|||
|
var htmlToLoad = '<html dir="' + editor.config.contentsLangDirection + '"' +
|
|||
|
' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +
|
|||
|
'<head><style>body{margin:3px;height:95%}</style></head><body>' +
|
|||
|
'<script id="cke_actscrpt" type="text/javascript">' +
|
|||
|
'window.parent.CKEDITOR.tools.callFunction(' + CKEDITOR.tools.addFunction( onPasteFrameLoad, dialog ) + ',this);' +
|
|||
|
'</script></body>' +
|
|||
|
'</html>';
|
|||
|
|
|||
|
var src =
|
|||
|
CKEDITOR.env.air ?
|
|||
|
'javascript:void(0)' :
|
|||
|
CKEDITOR.env.ie ?
|
|||
|
'javascript:void((function(){' + encodeURIComponent(
|
|||
|
'document.open();' +
|
|||
|
'(' + CKEDITOR.tools.fixDomain + ')();' +
|
|||
|
'document.close();'
|
|||
|
) + '})())"'
|
|||
|
: '';
|
|||
|
|
|||
|
var iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
|
|||
|
' class="cke_pasteframe"' +
|
|||
|
' frameborder="0" ' +
|
|||
|
' allowTransparency="true"' +
|
|||
|
' src="' + src + '"' +
|
|||
|
' role="region"' +
|
|||
|
' aria-label="' + lang.pasteArea + '"' +
|
|||
|
' aria-describedby="' + dialog.getContentElement( 'general', 'pasteMsg' ).domId + '"' +
|
|||
|
' aria-multiple="true"' +
|
|||
|
'></iframe>' );
|
|||
|
|
|||
|
iframe.on( 'load', function( e ) {
|
|||
|
e.removeListener();
|
|||
|
|
|||
|
var doc = iframe.getFrameDocument();
|
|||
|
doc.write( htmlToLoad );
|
|||
|
|
|||
|
editor.focusManager.add( doc.getBody() );
|
|||
|
|
|||
|
if ( CKEDITOR.env.air )
|
|||
|
onPasteFrameLoad.call( this, doc.getWindow().$ );
|
|||
|
}, dialog );
|
|||
|
|
|||
|
iframe.setCustomData( 'dialog', dialog );
|
|||
|
|
|||
|
var container = this.getElement();
|
|||
|
container.setHtml( '' );
|
|||
|
container.append( iframe );
|
|||
|
|
|||
|
// IE need a redirect on focus to make
|
|||
|
// the cursor blinking inside iframe. (#5461)
|
|||
|
if ( CKEDITOR.env.ie ) {
|
|||
|
var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute" role="presentation"></span>' );
|
|||
|
focusGrabber.on( 'focus', function() {
|
|||
|
// Since fixDomain is called in src attribute,
|
|||
|
// IE needs some slight delay to correctly move focus.
|
|||
|
setTimeout( function() {
|
|||
|
iframe.$.contentWindow.focus();
|
|||
|
} );
|
|||
|
} );
|
|||
|
container.append( focusGrabber );
|
|||
|
|
|||
|
// Override focus handler on field.
|
|||
|
this.focus = function() {
|
|||
|
focusGrabber.focus();
|
|||
|
this.fire( 'focus' );
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
this.getInputElement = function() {
|
|||
|
return iframe;
|
|||
|
};
|
|||
|
|
|||
|
// Force container to scale in IE.
|
|||
|
if ( CKEDITOR.env.ie ) {
|
|||
|
container.setStyle( 'display', 'block' );
|
|||
|
container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
|
|||
|
}
|
|||
|
},
|
|||
|
commit: function( data ) {
|
|||
|
var editor = this.getDialog().getParentEditor(),
|
|||
|
body = this.getInputElement().getFrameDocument().getBody(),
|
|||
|
bogus = body.getBogus(),
|
|||
|
html;
|
|||
|
bogus && bogus.remove();
|
|||
|
|
|||
|
// Saving the contents so changes until paste is complete will not take place (#7500)
|
|||
|
html = body.getHtml();
|
|||
|
|
|||
|
// Opera needs some time to think about what has happened and what it should do now.
|
|||
|
setTimeout( function() {
|
|||
|
editor.fire( 'pasteDialogCommit', html );
|
|||
|
}, 0 );
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
};
|
|||
|
} );
|
|||
|
|
|||
|
/**
|
|||
|
* Internal event to pass paste dialog's data to the listeners.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @event pasteDialogCommit
|
|||
|
* @member CKEDITOR.editor
|
|||
|
* @param {CKEDITOR.editor} editor This editor instance.
|
|||
|
*/
|