1 /* 2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. 3 For licensing, see LICENSE.html or http://ckeditor.com/license 4 */ 5 6 CKEDITOR.dialog.add( 'paste', function( editor ) 7 { 8 var lang = editor.lang.clipboard; 9 var isCustomDomain = CKEDITOR.env.isCustomDomain(); 10 11 function onPasteFrameLoad( win ) 12 { 13 var doc = new CKEDITOR.dom.document( win.document ), 14 docElement = doc.$; 15 16 var script = doc.getById( 'cke_actscrpt' ); 17 script && script.remove(); 18 19 CKEDITOR.env.ie ? 20 docElement.body.contentEditable = "true" : 21 docElement.designMode = "on"; 22 23 // IE before version 8 will leave cursor blinking inside the document after 24 // editor blurred unless we clean up the selection. (#4716) 25 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) 26 { 27 doc.getWindow().on( 'blur', function() 28 { 29 docElement.selection.empty(); 30 } ); 31 } 32 33 doc.on( "keydown", function( e ) 34 { 35 var domEvent = e.data, 36 key = domEvent.getKeystroke(), 37 processed; 38 39 switch( key ) 40 { 41 case 27 : 42 this.hide(); 43 processed = 1; 44 break; 45 46 case 9 : 47 case CKEDITOR.SHIFT + 9 : 48 this.changeFocus( 1 ); 49 processed = 1; 50 } 51 52 processed && domEvent.preventDefault(); 53 }, this ); 54 55 editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) ); 56 } 57 58 return { 59 title : lang.title, 60 61 minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350, 62 minHeight : CKEDITOR.env.quirks ? 250 : 245, 63 onShow : function() 64 { 65 // FIREFOX BUG: Force the browser to render the dialog to make the to-be- 66 // inserted iframe editable. (#3366) 67 this.parts.dialog.$.offsetHeight; 68 69 this.setupContent(); 70 }, 71 72 onHide : function() 73 { 74 if ( CKEDITOR.env.ie ) 75 this.getParentEditor().document.getBody().$.contentEditable = 'true'; 76 }, 77 78 onLoad : function() 79 { 80 if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' ) 81 this.parts.contents.setStyle( 'overflow', 'hidden' ); 82 }, 83 84 onOk : function() 85 { 86 this.commitContent(); 87 }, 88 89 contents : [ 90 { 91 id : 'general', 92 label : editor.lang.common.generalTab, 93 elements : [ 94 { 95 type : 'html', 96 id : 'securityMsg', 97 html : '<div style="white-space:normal;width:340px;">' + lang.securityMsg + '</div>' 98 }, 99 { 100 type : 'html', 101 id : 'pasteMsg', 102 html : '<div style="white-space:normal;width:340px;">'+lang.pasteMsg +'</div>' 103 }, 104 { 105 type : 'html', 106 id : 'editing_area', 107 style : 'width: 100%; height: 100%;', 108 html : '', 109 focus : function() 110 { 111 var win = this.getInputElement().$.contentWindow; 112 113 // #3291 : JAWS needs the 500ms delay to detect that the editor iframe 114 // iframe is no longer editable. So that it will put the focus into the 115 // Paste from Word dialog's editable area instead. 116 setTimeout( function() 117 { 118 win.focus(); 119 }, 500 ); 120 }, 121 setup : function() 122 { 123 var dialog = this.getDialog(); 124 var htmlToLoad = 125 '<html dir="' + editor.config.contentsLangDirection + '"' + 126 ' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' + 127 '<head><style>body { margin: 3px; height: 95%; } </style></head><body>' + 128 '<script id="cke_actscrpt" type="text/javascript">' + 129 'window.parent.CKEDITOR.tools.callFunction( ' + CKEDITOR.tools.addFunction( onPasteFrameLoad, dialog ) + ', this );' + 130 '</script></body>' + 131 '</html>'; 132 133 var src = 134 CKEDITOR.env.air ? 135 'javascript:void(0)' : 136 isCustomDomain ? 137 'javascript:void((function(){' + 138 'document.open();' + 139 'document.domain=\'' + document.domain + '\';' + 140 'document.close();' + 141 '})())"' 142 : 143 ''; 144 145 var iframe = CKEDITOR.dom.element.createFromHtml( 146 '<iframe' + 147 ' class="cke_pasteframe"' + 148 ' frameborder="0" ' + 149 ' allowTransparency="true"' + 150 ' src="' + src + '"' + 151 ' role="region"' + 152 ' aria-label="' + lang.pasteArea + '"' + 153 ' aria-describedby="' + dialog.getContentElement( 'general', 'pasteMsg' ).domId + '"' + 154 ' aria-multiple="true"' + 155 '></iframe>' ); 156 157 iframe.on( 'load', function( e ) 158 { 159 e.removeListener(); 160 161 var doc = iframe.getFrameDocument(); 162 doc.write( htmlToLoad ); 163 164 if ( CKEDITOR.env.air ) 165 onPasteFrameLoad.call( this, doc.getWindow().$ ); 166 }, dialog ); 167 168 iframe.setCustomData( 'dialog', dialog ); 169 170 var container = this.getElement(); 171 container.setHtml( '' ); 172 container.append( iframe ); 173 174 // IE need a redirect on focus to make 175 // the cursor blinking inside iframe. (#5461) 176 if ( CKEDITOR.env.ie ) 177 { 178 var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute;" role="presentation"></span>' ); 179 focusGrabber.on( 'focus', function() 180 { 181 iframe.$.contentWindow.focus(); 182 }); 183 container.append( focusGrabber ); 184 185 // Override focus handler on field. 186 this.focus = function() 187 { 188 focusGrabber.focus(); 189 this.fire( 'focus' ); 190 }; 191 } 192 193 this.getInputElement = function(){ return iframe; }; 194 195 // Force container to scale in IE. 196 if ( CKEDITOR.env.ie ) 197 { 198 container.setStyle( 'display', 'block' ); 199 container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' ); 200 } 201 }, 202 commit : function( data ) 203 { 204 var container = this.getElement(), 205 editor = this.getDialog().getParentEditor(), 206 body = this.getInputElement().getFrameDocument().getBody(), 207 bogus = body.getBogus(), 208 html; 209 bogus && bogus.remove(); 210 211 // Saving the contents so changes until paste is complete will not take place (#7500) 212 html = body.getHtml(); 213 214 setTimeout( function(){ 215 editor.fire( 'paste', { 'html' : html } ); 216 }, 0 ); 217 } 218 } 219 ] 220 } 221 ] 222 }; 223 }); 224