This repository was archived by the owner on Jun 26, 2020. It is now read-only.
File tree 2 files changed +34
-4
lines changed
2 files changed +34
-4
lines changed Original file line number Diff line number Diff line change 7
7
* @module utils/dom/rect
8
8
*/
9
9
10
+ /* global Node */
11
+
10
12
import isRange from './isrange' ;
11
13
import isWindow from './iswindow' ;
12
14
import isElement from '../lib/lodash/isElement' ;
@@ -361,12 +363,19 @@ export default class Rect {
361
363
// If there's no client rects for the Range, use parent container's bounding rect
362
364
// instead and adjust rect's width to simulate the actual geometry of such range.
363
365
// https://github.com/ckeditor/ckeditor5-utils/issues/153
366
+ // https://github.com/ckeditor/ckeditor5-ui/issues/317
364
367
else {
365
- const startContainerRect = new Rect ( range . startContainer . getBoundingClientRect ( ) ) ;
366
- startContainerRect . right = startContainerRect . left ;
367
- startContainerRect . width = 0 ;
368
+ let startContainer = range . startContainer ;
369
+
370
+ if ( startContainer . nodeType === Node . TEXT_NODE ) {
371
+ startContainer = startContainer . parentNode ;
372
+ }
373
+
374
+ const rect = new Rect ( startContainer . getBoundingClientRect ( ) ) ;
375
+ rect . right = rect . left ;
376
+ rect . width = 0 ;
368
377
369
- rects . push ( startContainerRect ) ;
378
+ rects . push ( rect ) ;
370
379
}
371
380
372
381
return rects ;
Original file line number Diff line number Diff line change @@ -965,6 +965,27 @@ describe( 'Rect', () => {
965
965
expect ( rects ) . to . have . length ( 1 ) ;
966
966
assertRect ( rects [ 0 ] , expectedGeometry ) ;
967
967
} ) ;
968
+
969
+ // https://github.com/ckeditor/ckeditor5-ui/issues/317
970
+ it ( 'should return rects for a text node\'s parent (collapsed, no Range rects available)' , ( ) => {
971
+ const range = document . createRange ( ) ;
972
+ const element = document . createElement ( 'div' ) ;
973
+ const textNode = document . createTextNode ( 'abc' ) ;
974
+ element . appendChild ( textNode ) ;
975
+
976
+ range . setStart ( textNode , 3 ) ;
977
+ range . collapse ( ) ;
978
+ testUtils . sinon . stub ( range , 'getClientRects' ) . returns ( [ ] ) ;
979
+ testUtils . sinon . stub ( element , 'getBoundingClientRect' ) . returns ( geometry ) ;
980
+
981
+ const expectedGeometry = Object . assign ( { } , geometry ) ;
982
+ expectedGeometry . right = expectedGeometry . left ;
983
+ expectedGeometry . width = 0 ;
984
+
985
+ const rects = Rect . getDomRangeRects ( range ) ;
986
+ expect ( rects ) . to . have . length ( 1 ) ;
987
+ assertRect ( rects [ 0 ] , expectedGeometry ) ;
988
+ } ) ;
968
989
} ) ;
969
990
} ) ;
970
991
You can’t perform that action at this time.
0 commit comments