]> git.immae.eu Git - perso/Immae/Projets/packagist/ludivine-ckeditor-component.git/blame - sources/plugins/clipboard/dialogs/paste.js
Change skin and add video button
[perso/Immae/Projets/packagist/ludivine-ckeditor-component.git] / sources / plugins / clipboard / dialogs / paste.js
CommitLineData
c63493c8
IB
1/**\r
2 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\r
3 * For licensing, see LICENSE.md or http://ckeditor.com/license\r
4 */\r
5\r
6CKEDITOR.dialog.add( 'paste', function( editor ) {\r
7 var lang = editor.lang.clipboard,\r
8 clipboard = CKEDITOR.plugins.clipboard,\r
9 lastDataTransfer;\r
10\r
11 function onPasteFrameLoad( win ) {\r
12 var doc = new CKEDITOR.dom.document( win.document ),\r
13 body = doc.getBody(),\r
14 script = doc.getById( 'cke_actscrpt' );\r
15\r
16 script && script.remove();\r
17\r
18 body.setAttribute( 'contenteditable', true );\r
19\r
20 // Forward dataTransfer (#13883).\r
21 body.on( clipboard.mainPasteEvent, function( evt ) {\r
22 var dataTransfer = clipboard.initPasteDataTransfer( evt );\r
23\r
24 if ( !lastDataTransfer ) {\r
25 lastDataTransfer = dataTransfer;\r
26 } else\r
27 // For two paste with the same dataTransfer we can use that dataTransfer (two internal pastes are\r
28 // considered as an internal paste).\r
29 if ( dataTransfer != lastDataTransfer ) {\r
30 // If there were two paste with different DataTransfer objects create a new, empty, data transfer\r
31 // and use it (one internal and one external paste are considered as external paste).\r
32 lastDataTransfer = clipboard.initPasteDataTransfer();\r
33 }\r
34 } );\r
35\r
36 // IE before version 8 will leave cursor blinking inside the document after\r
37 // editor blurred unless we clean up the selection. (#4716)\r
38 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) {\r
39 doc.getWindow().on( 'blur', function() {\r
40 doc.$.selection.empty();\r
41 } );\r
42 }\r
43\r
44 doc.on( 'keydown', function( e ) {\r
45 var domEvent = e.data,\r
46 key = domEvent.getKeystroke(),\r
47 processed;\r
48\r
49 switch ( key ) {\r
50 case 27:\r
51 this.hide();\r
52 processed = 1;\r
53 break;\r
54\r
55 case 9:\r
56 case CKEDITOR.SHIFT + 9:\r
57 this.changeFocus( 1 );\r
58 processed = 1;\r
59 }\r
60\r
61 processed && domEvent.preventDefault();\r
62 }, this );\r
63\r
64 editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) );\r
65\r
66 // Handle pending focus.\r
67 if ( doc.getWindow().getFrame().removeCustomData( 'pendingFocus' ) )\r
68 body.focus();\r
69 }\r
70\r
71 // If pasteDialogCommit wasn't canceled by e.g. editor.getClipboardData\r
72 // then fire paste event.\r
73 // Do not use editor#paste, because it would start from beforePaste event.\r
74 editor.on( 'pasteDialogCommit', function( evt ) {\r
75 if ( evt.data )\r
76 editor.fire( 'paste', {\r
77 type: 'auto',\r
78 dataValue: evt.data.dataValue,\r
79 method: 'paste',\r
80 dataTransfer: evt.data.dataTransfer || clipboard.initPasteDataTransfer()\r
81 } );\r
82 }, null, null, 1000 );\r
83\r
84 return {\r
85 title: lang.title,\r
86\r
87 minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,\r
88 minHeight: CKEDITOR.env.quirks ? 250 : 245,\r
89 onShow: function() {\r
90 // FIREFOX BUG: Force the browser to render the dialog to make the to-be-\r
91 // inserted iframe editable. (#3366)\r
92 this.parts.dialog.$.offsetHeight;\r
93\r
94 this.setupContent();\r
95\r
96 // Set dialog title to the custom value (set e.g. in editor.openDialog callback) and reset this value.\r
97 // If custom title not set, use default one.\r
98 this.parts.title.setHtml( this.customTitle || lang.title );\r
99 this.customTitle = null;\r
100 },\r
101\r
102 onLoad: function() {\r
103 if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )\r
104 this.parts.contents.setStyle( 'overflow', 'hidden' );\r
105 },\r
106\r
107 onOk: function() {\r
108 this.commitContent();\r
109 },\r
110\r
111 contents: [ {\r
112 id: 'general',\r
113 label: editor.lang.common.generalTab,\r
114 elements: [\r
115 {\r
116 type: 'html',\r
117 id: 'securityMsg',\r
118 html: '<div style="white-space:normal;width:340px">' + lang.securityMsg + '</div>'\r
119 },\r
120 {\r
121 type: 'html',\r
122 id: 'pasteMsg',\r
123 html: '<div style="white-space:normal;width:340px">' + lang.pasteMsg + '</div>'\r
124 },\r
125 {\r
126 type: 'html',\r
127 id: 'editing_area',\r
128 style: 'width:100%;height:100%',\r
129 html: '',\r
130 focus: function() {\r
131 var iframe = this.getInputElement(),\r
132 doc = iframe.getFrameDocument(),\r
133 body = doc.getBody();\r
134\r
135 // Frame content may not loaded at the moment.\r
136 if ( !body || body.isReadOnly() )\r
137 iframe.setCustomData( 'pendingFocus', 1 );\r
138 else\r
139 body.focus();\r
140 },\r
141 setup: function() {\r
142 var dialog = this.getDialog();\r
143 var htmlToLoad = '<html dir="' + editor.config.contentsLangDirection + '"' +\r
144 ' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +\r
145 '<head><style>body{margin:3px;height:95%;word-break:break-all;}</style></head><body>' +\r
146 '<script id="cke_actscrpt" type="text/javascript">' +\r
147 'window.parent.CKEDITOR.tools.callFunction(' + CKEDITOR.tools.addFunction( onPasteFrameLoad, dialog ) + ',this);' +\r
148 '</script></body>' +\r
149 '</html>';\r
150\r
151 var src =\r
152 CKEDITOR.env.air ?\r
153 'javascript:void(0)' : // jshint ignore:line\r
154 ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ?\r
155 'javascript:void((function(){' + encodeURIComponent( // jshint ignore:line\r
156 'document.open();' +\r
157 '(' + CKEDITOR.tools.fixDomain + ')();' +\r
158 'document.close();'\r
159 ) + '})())"'\r
160 : '';\r
161\r
162 var iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +\r
163 ' class="cke_pasteframe"' +\r
164 ' frameborder="0" ' +\r
165 ' allowTransparency="true"' +\r
166 ' src="' + src + '"' +\r
167 ' aria-label="' + lang.pasteArea + '"' +\r
168 ' aria-describedby="' + dialog.getContentElement( 'general', 'pasteMsg' ).domId + '"' +\r
169 '></iframe>' );\r
170\r
171 // Reset last data transfer.\r
172 lastDataTransfer = null;\r
173\r
174 iframe.on( 'load', function( e ) {\r
175 e.removeListener();\r
176\r
177 var doc = iframe.getFrameDocument();\r
178 doc.write( htmlToLoad );\r
179\r
180 editor.focusManager.add( doc.getBody() );\r
181\r
182 if ( CKEDITOR.env.air )\r
183 onPasteFrameLoad.call( this, doc.getWindow().$ );\r
184 }, dialog );\r
185\r
186 iframe.setCustomData( 'dialog', dialog );\r
187\r
188 var container = this.getElement();\r
189 container.setHtml( '' );\r
190 container.append( iframe );\r
191\r
192 // IE need a redirect on focus to make\r
193 // the cursor blinking inside iframe. (#5461)\r
194 if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) {\r
195 var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute" role="presentation"></span>' );\r
196 focusGrabber.on( 'focus', function() {\r
197 // Since fixDomain is called in src attribute,\r
198 // IE needs some slight delay to correctly move focus.\r
199 setTimeout( function() {\r
200 iframe.$.contentWindow.focus();\r
201 } );\r
202 } );\r
203 container.append( focusGrabber );\r
204\r
205 // Override focus handler on field.\r
206 this.focus = function() {\r
207 focusGrabber.focus();\r
208 this.fire( 'focus' );\r
209 };\r
210 }\r
211\r
212 this.getInputElement = function() {\r
213 return iframe;\r
214 };\r
215\r
216 // Force container to scale in IE.\r
217 if ( CKEDITOR.env.ie ) {\r
218 container.setStyle( 'display', 'block' );\r
219 container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );\r
220 }\r
221 },\r
222 commit: function() {\r
223 var editor = this.getDialog().getParentEditor(),\r
224 body = this.getInputElement().getFrameDocument().getBody(),\r
225 bogus = body.getBogus(),\r
226 html;\r
227 bogus && bogus.remove();\r
228\r
229 // Saving the contents so changes until paste is complete will not take place (#7500)\r
230 html = body.getHtml();\r
231\r
232 // Opera needs some time to think about what has happened and what it should do now.\r
233 setTimeout( function() {\r
234 editor.fire( 'pasteDialogCommit', {\r
235 dataValue: html,\r
236 // Avoid error if there was no paste so lastDataTransfer is null.\r
237 dataTransfer: lastDataTransfer || clipboard.initPasteDataTransfer()\r
238 } );\r
239 }, 0 );\r
240 }\r
241 }\r
242 ]\r
243 } ]\r
244 };\r
245} );\r
246\r
247/**\r
248 * Internal event to pass paste dialog's data to the listeners.\r
249 *\r
250 * @private\r
251 * @event pasteDialogCommit\r
252 * @member CKEDITOR.editor\r
253 * @param {CKEDITOR.editor} editor This editor instance.\r
254 */\r