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