diff --git a/packages/slate/src/changes/at-range.js b/packages/slate/src/changes/at-range.js
index 28f7c85e1..7c549eb76 100644
--- a/packages/slate/src/changes/at-range.js
+++ b/packages/slate/src/changes/at-range.js
@@ -671,7 +671,11 @@ Changes.insertFragmentAtRange = (change, range, fragment, options = {}) => {
// If the range is expanded, delete it first.
if (range.isExpanded) {
change.deleteAtRange(range, { normalize: false })
- range = range.collapseToStart()
+ if (change.value.document.getDescendant(range.startKey)) {
+ range = range.collapseToStart()
+ } else {
+ range = range.collapseTo(range.endKey, 0)
+ }
}
// If the fragment is empty, there's nothing to do after deleting.
diff --git a/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js b/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js
new file mode 100644
index 000000000..e75eae19e
--- /dev/null
+++ b/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js
@@ -0,0 +1,44 @@
+/** @jsx h */
+
+import h from '../../../helpers/h'
+
+const fragment = (
+
+ fragment zero
+ fragment one
+ fragment two
+
+)
+export default function(change) {
+ change.insertFragment(fragment)
+}
+
+export const input = (
+
+
+ zero
+
+ one
+
+
+ two
+
+
+
+)
+
+// The cursor position of insertFragment has some problems;
+// If you submit PR to fixed cursor position restore in insertFragment;
+// Please change this test as well
+export const output = (
+
+
+ zero
+ fragment zero
+ fragment one
+
+ fragment twotwo
+
+
+
+)