@@ -1177,11 +1177,19 @@ describe( 'Widget', () => {
1177
1177
1178
1178
model . schema . register ( 'widget' , {
1179
1179
inheritAllFrom : '$block' ,
1180
+ allowIn : 'widget' ,
1180
1181
isObject : true
1181
1182
} ) ;
1182
1183
model . schema . register ( 'paragraph' , {
1183
1184
inheritAllFrom : '$block'
1184
1185
} ) ;
1186
+ model . schema . register ( 'nested' , {
1187
+ allowIn : 'widget' ,
1188
+ isLimit : true
1189
+ } ) ;
1190
+ model . schema . extend ( '$text' , {
1191
+ allowIn : 'nested'
1192
+ } ) ;
1185
1193
1186
1194
editor . conversion . for ( 'downcast' )
1187
1195
. add ( downcastElementToElement ( { model : 'paragraph' , view : 'p' } ) )
@@ -1192,6 +1200,10 @@ describe( 'Widget', () => {
1192
1200
1193
1201
return toWidget ( widget , viewWriter , { hasSelectionHandler : true } ) ;
1194
1202
}
1203
+ } ) )
1204
+ . add ( downcastElementToElement ( {
1205
+ model : 'nested' ,
1206
+ view : ( modelItem , viewWriter ) => viewWriter . createEditableElement ( 'figcaption' , { contenteditable : true } )
1195
1207
} ) ) ;
1196
1208
} ) ;
1197
1209
} ) ;
@@ -1210,5 +1222,132 @@ describe( 'Widget', () => {
1210
1222
1211
1223
expect ( getModelData ( model ) ) . to . equal ( '<paragraph>bar</paragraph>[<widget></widget>]<paragraph>foo</paragraph>' ) ;
1212
1224
} ) ;
1225
+
1226
+ it ( 'should select the most top-outer widget if widgets are nested' , ( ) => {
1227
+ setModelData ( model , '<widget><widget></widget><widget></widget></widget>' ) ;
1228
+
1229
+ // The top-outer widget.
1230
+ const viewWidgetSelectionHandler = viewDocument . getRoot ( ) . getChild ( 0 ) ;
1231
+
1232
+ const domEventDataMock = {
1233
+ target : viewWidgetSelectionHandler ,
1234
+ preventDefault : sinon . spy ( )
1235
+ } ;
1236
+
1237
+ viewDocument . fire ( 'mousedown' , domEventDataMock ) ;
1238
+
1239
+ expect ( getViewData ( view ) ) . to . equal (
1240
+ '[<div class="ck-widget ck-widget_selectable ck-widget_selected" contenteditable="false">' +
1241
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1242
+ '<div class="ck ck-widget__selection-handler"></div>' +
1243
+ '</div>' +
1244
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1245
+ '<div class="ck ck-widget__selection-handler"></div>' +
1246
+ '</div>' +
1247
+ '<div class="ck ck-widget__selection-handler"></div>' +
1248
+ '</div>]'
1249
+ ) ;
1250
+ } ) ;
1251
+
1252
+ it ( 'should select a proper widget if they are nested and multiplied' , ( ) => {
1253
+ setModelData ( model ,
1254
+ '<widget></widget>' +
1255
+ '<widget>' +
1256
+ '<widget></widget>' +
1257
+ '<widget></widget>' +
1258
+ '</widget>' +
1259
+ '<widget></widget>'
1260
+ ) ;
1261
+
1262
+ const viewWidgetSelectionHandler = viewDocument . getRoot ( ) . getChild ( 1 ) ;
1263
+
1264
+ const domEventDataMock = {
1265
+ target : viewWidgetSelectionHandler ,
1266
+ preventDefault : sinon . spy ( )
1267
+ } ;
1268
+
1269
+ viewDocument . fire ( 'mousedown' , domEventDataMock ) ;
1270
+
1271
+ expect ( getViewData ( view ) ) . to . equal (
1272
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1273
+ '<div class="ck ck-widget__selection-handler"></div>' +
1274
+ '</div>' +
1275
+ '[<div class="ck-widget ck-widget_selectable ck-widget_selected" contenteditable="false">' +
1276
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1277
+ '<div class="ck ck-widget__selection-handler"></div>' +
1278
+ '</div>' +
1279
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1280
+ '<div class="ck ck-widget__selection-handler"></div>' +
1281
+ '</div>' +
1282
+ '<div class="ck ck-widget__selection-handler"></div>' +
1283
+ '</div>]' +
1284
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1285
+ '<div class="ck ck-widget__selection-handler"></div>' +
1286
+ '</div>'
1287
+ ) ;
1288
+ } ) ;
1289
+
1290
+ it ( 'works fine with a widget that contains more children' , ( ) => {
1291
+ setModelData ( model ,
1292
+ '<widget>' +
1293
+ '<nested>foo bar</nested>' +
1294
+ '<widget></widget>' +
1295
+ '</widget>'
1296
+ ) ;
1297
+
1298
+ const viewWidgetSelectionHandler = viewDocument . getRoot ( ) . getChild ( 0 ) ;
1299
+
1300
+ const domEventDataMock = {
1301
+ target : viewWidgetSelectionHandler ,
1302
+ preventDefault : sinon . spy ( )
1303
+ } ;
1304
+
1305
+ viewDocument . fire ( 'mousedown' , domEventDataMock ) ;
1306
+
1307
+ expect ( getViewData ( view ) ) . to . equal (
1308
+ '[<div class="ck-widget ck-widget_selectable ck-widget_selected" contenteditable="false">' +
1309
+ '<figcaption contenteditable="true">foo bar</figcaption>' +
1310
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1311
+ '<div class="ck ck-widget__selection-handler"></div>' +
1312
+ '</div>' +
1313
+ '<div class="ck ck-widget__selection-handler"></div>' +
1314
+ '</div>]'
1315
+ ) ;
1316
+ } ) ;
1317
+
1318
+ it ( 'should select a proper widget for more complex structures' , ( ) => {
1319
+ setModelData ( model ,
1320
+ '<widget>' +
1321
+ '<widget></widget>' +
1322
+ '<widget>' +
1323
+ '<widget></widget>' +
1324
+ '</widget>' +
1325
+ '</widget>'
1326
+ ) ;
1327
+
1328
+ const viewWidgetSelectionHandler = viewDocument . getRoot ( ) . getChild ( 0 ) . getChild ( 1 ) ;
1329
+
1330
+ const domEventDataMock = {
1331
+ target : viewWidgetSelectionHandler ,
1332
+ preventDefault : sinon . spy ( )
1333
+ } ;
1334
+
1335
+ viewDocument . fire ( 'mousedown' , domEventDataMock ) ;
1336
+
1337
+ expect ( getViewData ( view ) ) . to . equal (
1338
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1339
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1340
+ '<div class="ck ck-widget__selection-handler"></div>' +
1341
+ '</div>' +
1342
+ '[<div class="ck-widget ck-widget_selectable ck-widget_selected" contenteditable="false">' +
1343
+ '<div class="ck-widget ck-widget_selectable" contenteditable="false">' +
1344
+ '<div class="ck ck-widget__selection-handler"></div>' +
1345
+ '</div>' +
1346
+ '<div class="ck ck-widget__selection-handler"></div>' +
1347
+ '</div>]' +
1348
+ '<div class="ck ck-widget__selection-handler"></div>' +
1349
+ '</div>'
1350
+ ) ;
1351
+ } ) ;
1213
1352
} ) ;
1214
1353
} ) ;
0 commit comments