Skip to content

Commit 2ab5c72

Browse files
committed
Merge branch 't/12172' into major
2 parents c496a26 + ad8ba32 commit 2ab5c72

File tree

9 files changed

+196
-213
lines changed

9 files changed

+196
-213
lines changed

core/selection.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,10 @@
16451645
getSelectedHtml: function() {
16461646
var nativeSel = this.getNative();
16471647

1648+
if ( this.isFake ) {
1649+
return this.getSelectedElement().getHtml();
1650+
}
1651+
16481652
if ( nativeSel && nativeSel.createRange )
16491653
return nativeSel.createRange().htmlText;
16501654

plugins/clipboard/plugin.js

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,10 +1779,7 @@
17791779

17801780
// Data type used to link drag and drop events.
17811781
var clipboardIdDataType =
1782-
// IE does not support different data types that Text and URL.
1783-
// In IE 9- we can use URL data type to mark that drag comes from the editor.
1784-
( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) ? 'URL':
1785-
// In IE 10+ URL data type is buggie and there is no way to mark drag & drop without
1782+
// In IE URL data type is buggie and there is no way to mark drag & drop without
17861783
// modifying text data (which would be displayed if user drop content to the textarea)
17871784
// so we just read dragged text.
17881785
CKEDITOR.env.ie ? 'Text' :
@@ -1829,10 +1826,7 @@
18291826

18301827
// If there is no ID we need to create it. Different browsers needs different ID.
18311828
if ( !this.id ) {
1832-
if ( clipboardIdDataType == 'URL' ) {
1833-
// For IEs URL type ID have to look like an URL.
1834-
this.id = 'http://cke.' + CKEDITOR.tools.getUniqueId() + '/';
1835-
} else if ( clipboardIdDataType == 'Text' ) {
1829+
if ( clipboardIdDataType == 'Text' ) {
18361830
// For IE10+ only Text data type is supported and we have to compare dragged
18371831
// and dropped text. If the ID is not set it means that empty string was dragged
18381832
// (ex. image with no alt). We change null to empty string.
@@ -1938,19 +1932,22 @@
19381932
* @returns {String} type Stored data for the given type or an empty string if data for that type does not exist.
19391933
*/
19401934
getData: function( type ) {
1941-
var data, result;
1935+
function isEmpty( data ) {
1936+
return data === undefined || data === null || data === '';
1937+
}
19421938

19431939
type = this._.normalizeType( type );
19441940

1945-
try {
1946-
data = this.$.getData( type );
1947-
} catch ( e ) {}
1941+
var data = this._.data[ type ],
1942+
result;
19481943

1949-
if ( !data ) {
1950-
data = this._.data[ type ];
1944+
if ( isEmpty( data ) ) {
1945+
try {
1946+
data = this.$.getData( type );
1947+
} catch ( e ) {}
19511948
}
19521949

1953-
if ( !data ) {
1950+
if ( isEmpty( data ) ) {
19541951
data = '';
19551952
}
19561953

@@ -1986,9 +1983,9 @@
19861983
return;
19871984
}
19881985

1989-
if ( this.$ ) {
1986+
try {
19901987
this.$.setData( type, value );
1991-
}
1988+
} catch ( e ) {}
19921989
},
19931990

19941991
/**
@@ -2071,8 +2068,9 @@
20712068
}
20722069

20732070
for ( type in typesToCheck ) {
2074-
if ( typesToCheck[ type ] && this.getData( type ) )
2071+
if ( typesToCheck[ type ] && this.getData( type ) !== '' ) {
20752072
return false;
2073+
}
20762074
}
20772075

20782076
return true;

plugins/widget/plugin.js

Lines changed: 36 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2086,25 +2086,6 @@
20862086
return element.type == CKEDITOR.NODE_ELEMENT && element.hasClass( 'cke_widget_drag_handler_container' );
20872087
}
20882088

2089-
function finalizeNativeDrop( editor, sourceWidget, range ) {
2090-
// Save the snapshot with the state before moving widget.
2091-
// Focus widget, so when we'll undo the DnD, widget will be focused.
2092-
sourceWidget.focus();
2093-
editor.fire( 'saveSnapshot' );
2094-
2095-
// Lock snapshot to group all steps of moving widget from the original place to the new one.
2096-
editor.fire( 'lockSnapshot', { dontUpdate: true } );
2097-
2098-
range.select();
2099-
2100-
var widgetHtml = sourceWidget.wrapper.getOuterHtml();
2101-
sourceWidget.wrapper.remove();
2102-
editor.widgets.destroy( sourceWidget, true );
2103-
editor.execCommand( 'paste', widgetHtml );
2104-
2105-
editor.fire( 'unlockSnapshot' );
2106-
}
2107-
21082089
function onEditableKey( widget, keyCode ) {
21092090
var focusedEditable = widget.focusedEditable,
21102091
range;
@@ -2201,51 +2182,47 @@
22012182
var editor = widgetsRepo.editor,
22022183
lineutils = CKEDITOR.plugins.lineutils;
22032184

2204-
editor.on( 'contentDom', function() {
2205-
var editable = editor.editable(),
2206-
// #11123 Firefox needs to listen on document, because otherwise event won't be fired.
2207-
// #11086 IE8 cannot listen on document.
2208-
dropTarget = ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) || editable.isInline() ? editable : editor.document;
2185+
editor.on( 'dragstart', function( evt ) {
2186+
var target = evt.data.target;
22092187

2210-
editable.attachListener( dropTarget, 'drop', function( evt ) {
2211-
var dataStr = evt.data.$.dataTransfer.getData( 'text' ),
2212-
dataObj,
2213-
sourceWidget,
2214-
range;
2188+
if ( isDomDragHandler( target ) ) {
2189+
var widget = widgetsRepo.getByElement( target );
22152190

2216-
if ( !dataStr )
2217-
return;
2191+
evt.data.dataTransfer.setData( 'cke/widget-id', widget.id );
22182192

2219-
try {
2220-
dataObj = JSON.parse( dataStr );
2221-
} catch ( e ) {
2222-
// Do nothing - data couldn't be parsed so it's not a CKEditor's data.
2223-
return;
2224-
}
2193+
// IE needs focus.
2194+
editor.focus();
22252195

2226-
if ( dataObj.type != 'cke-widget' )
2227-
return;
2196+
// and widget need to be focused on drag start (#12172#comment:10).
2197+
widget.focus();
2198+
}
2199+
} );
22282200

2229-
evt.data.preventDefault();
2201+
editor.on( 'drop', function( evt ) {
2202+
var dataTransfer = evt.data.dataTransfer,
2203+
id = dataTransfer.getData( 'cke/widget-id' ),
2204+
dragRange = editor.createRange(),
2205+
sourceWidget;
22302206

2231-
// Something went wrong... maybe someone is dragging widgets between editors/windows/tabs/browsers/frames.
2232-
if ( dataObj.editor != editor.name || !( sourceWidget = widgetsRepo.instances[ dataObj.id ] ) )
2233-
return;
2207+
if ( id === '' || dataTransfer.getTransferType( editor ) != CKEDITOR.DATA_TRANSFER_INTERNAL ) {
2208+
return;
2209+
}
22342210

2235-
// Try to determine a DOM position at which drop happened. If none of methods
2236-
// which we support succeeded abort.
2237-
range = CKEDITOR.plugins.clipboard.getRangeAtDropPosition( evt, editor );
2238-
if ( !range )
2239-
return;
2211+
sourceWidget = widgetsRepo.instances[ id ];
2212+
if ( !sourceWidget ) {
2213+
return;
2214+
}
22402215

2241-
// #11132 Hack to prevent cursor loss on Firefox. Without timeout widget is
2242-
// correctly pasted but then cursor is invisible (although it works) and can be restored
2243-
// only by blurring editable.
2244-
if ( CKEDITOR.env.gecko )
2245-
setTimeout( finalizeNativeDrop, 0, editor, sourceWidget, range );
2246-
else
2247-
finalizeNativeDrop( editor, sourceWidget, range );
2248-
} );
2216+
dragRange.setStartBefore( sourceWidget.wrapper );
2217+
dragRange.setEndAfter( sourceWidget.wrapper );
2218+
evt.data.dragRange = dragRange;
2219+
2220+
evt.data.dataTransfer.setData( 'text/html', sourceWidget.wrapper.getOuterHtml() );
2221+
editor.widgets.destroy( sourceWidget, true );
2222+
} );
2223+
2224+
editor.on( 'contentDom', function() {
2225+
var editable = editor.editable();
22492226

22502227
// Register Lineutils's utilities as properties of repo.
22512228
CKEDITOR.tools.extend( widgetsRepo, {
@@ -2943,12 +2920,9 @@
29432920
widget.on( 'data', widget.updateDragHandlerPosition, widget );
29442921
}, 50 );
29452922

2946-
if ( widget.inline ) {
2947-
img.on( 'dragstart', function( evt ) {
2948-
evt.data.$.dataTransfer.setData( 'text', JSON.stringify( { type: 'cke-widget', editor: editor.name, id: widget.id } ) );
2949-
} );
2950-
} else
2923+
if ( !widget.inline ) {
29512924
img.on( 'mousedown', onBlockWidgetDrag, widget );
2925+
}
29522926

29532927
widget.dragHandlerContainer = container;
29542928
}
@@ -3759,4 +3733,4 @@
37593733
* Nested editable name displayed in elements path.
37603734
*
37613735
* @property {String} pathName
3762-
*/
3736+
*/

tests/_benderjs/ckeditor/static/tools.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@
793793
if ( CKEDITOR.env.ie && type != 'Text' && type != 'URL' )
794794
throw "Invalid argument.";
795795

796-
if ( !this._data[ type ] )
796+
if ( typeof this._data[ type ] === 'undefined' || this._data[ type ] === null )
797797
return '';
798798

799799
return this._data[ type ];
@@ -806,7 +806,9 @@
806806
* `getTarget` methods. To mock target new text mode is created with 'targetMock' string.
807807
*/
808808
mockDropEvent: function() {
809-
var dataTransfer = this.mockNativeDataTransfer();
809+
var dataTransfer = this.mockNativeDataTransfer(),
810+
target = new CKEDITOR.dom.node( 'targetMock' );
811+
810812
return {
811813
$: {
812814
dataTransfer: dataTransfer
@@ -815,7 +817,10 @@
815817
// noop
816818
},
817819
getTarget: function() {
818-
return new CKEDITOR.dom.node( 'targetMock' );
820+
return target;
821+
},
822+
setTarget: function( t ) {
823+
target = t;
819824
}
820825
};
821826
},
@@ -825,7 +830,9 @@
825830
* `getTarget` methods. To mock target new text mode is created with 'targetMock' string.
826831
*/
827832
mockPasteEvent: function() {
828-
var dataTransfer = this.mockNativeDataTransfer();
833+
var dataTransfer = this.mockNativeDataTransfer(),
834+
target = new CKEDITOR.dom.node( 'targetMock' );
835+
829836
return {
830837
$: {
831838
ctrlKey: true,
@@ -835,7 +842,10 @@
835842
// noop
836843
},
837844
getTarget: function() {
838-
return new CKEDITOR.dom.node( 'targetMock' );
845+
return target;
846+
},
847+
setTarget: function( t ) {
848+
target = t;
839849
}
840850
};
841851
},

tests/plugins/clipboard/datatransfer.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ bender.test( {
5050

5151
assert.areSame( dataTransfer1a.id, dataTransfer1b.id, 'Ids for object based on the same event should be the same.' );
5252

53-
// In IE10+ we can not use any data type besides text, so id is fixed.
54-
if ( !CKEDITOR.env.ie || CKEDITOR.env.version < 10 )
53+
// In IE we can not use any data type besides text, so id is fixed.
54+
if ( !CKEDITOR.env.ie )
5555
assert.areNotSame( dataTransfer1a.id, dataTransfer2.id, 'Ids for object based on different events should be different.' );
5656
},
5757

@@ -89,7 +89,7 @@ bender.test( {
8989
transferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
9090
sourceEditor: editor,
9191
targetEditor: editor,
92-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
92+
text: CKEDITOR.env.ie ? '' : 'xfoox',
9393
html: 'x<b>foo</b>x' },
9494
dataTransfer );
9595
},
@@ -168,7 +168,7 @@ bender.test( {
168168
transferType: CKEDITOR.DATA_TRANSFER_CROSS_EDITORS,
169169
sourceEditor: editor1,
170170
targetEditor: editor2,
171-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
171+
text: CKEDITOR.env.ie ? '' : 'xfoox',
172172
html: 'x<b>foo</b>x' },
173173
dataTransfer );
174174
},
@@ -468,7 +468,7 @@ bender.test( {
468468
transferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
469469
sourceEditor: editor,
470470
targetEditor: editor,
471-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
471+
text: CKEDITOR.env.ie ? '' : 'xfoox',
472472
html: 'x<b>foo</b>x' },
473473
dataTransfer );
474474
},
@@ -485,7 +485,7 @@ bender.test( {
485485
transferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
486486
sourceEditor: editor,
487487
targetEditor: editor,
488-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
488+
text: CKEDITOR.env.ie ? '' : 'xfoox',
489489
html: 'x<b>foo</b>x' },
490490
dataTransfer );
491491
},
@@ -532,7 +532,7 @@ bender.test( {
532532
transferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
533533
sourceEditor: editor,
534534
targetEditor: editor,
535-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
535+
text: CKEDITOR.env.ie ? '' : 'xfoox',
536536
html: 'x<b>foo</b>x' },
537537
dataTransfer );
538538
},
@@ -549,7 +549,7 @@ bender.test( {
549549
transferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
550550
sourceEditor: editor,
551551
targetEditor: editor,
552-
text: ( CKEDITOR.env.ie && CKEDITOR.env.version > 9 ) ? '' : 'xfoox',
552+
text: CKEDITOR.env.ie ? '' : 'xfoox',
553553
html: 'x<b>foo</b>x' },
554554
dataTransfer );
555555
}

tests/plugins/clipboard/drop.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ function drop( editor, evt, config, onDrop, onFinish ) {
9494
// Drop event asserts
9595
assert.areSame( 1, values.dropEventCounter, 'There should be always one drop.' );
9696
assert.isTrue( values.dropInstanceOfDataTransfer, 'On drop: dropEvt.data.dataTransfer should be instance of dataTransfer.' );
97-
if ( config.expectedText && ( !CKEDITOR.env.ie || CKEDITOR.env.version < 10 ) ) {
97+
if ( config.expectedText && !CKEDITOR.env.ie ) {
9898
assert.areSame( config.expectedText, values.dropDataText, 'On drop: text data should match.' );
9999
}
100100
if ( config.expectedHtml ) {
@@ -113,8 +113,8 @@ function drop( editor, evt, config, onDrop, onFinish ) {
113113

114114
if ( expectedPasteEventCount > 0 ) {
115115
assert.areSame( config.expectedTransferType, values.pasteTransferType, 'On paste: transferType should match.' );
116-
// Do not check Text data on IE10+.
117-
if ( !CKEDITOR.env.ie || CKEDITOR.env.version < 10 ) {
116+
// Do not check Text data on IE.
117+
if ( !CKEDITOR.env.ie ) {
118118
assert.areSame( config.expectedText, values.pasteDataText, 'On paste: text data should match.' );
119119
}
120120
// isInnerHtmlMatching remove space from the end of strings we compare, adding 'x' fix this problem.

0 commit comments

Comments
 (0)