diff --git a/Sources/HTMLRange.m b/Sources/HTMLRange.m
index 57c2ade..e2b9454 100644
--- a/Sources/HTMLRange.m
+++ b/Sources/HTMLRange.m
@@ -406,7 +406,7 @@ NS_INLINE HTMLNode * GetHighestPartiallyContainedChild(HTMLNode *node, HTMLNode
NS_INLINE HTMLCharacterData * CloneCharachterData(HTMLNode *node, NSUInteger start, NSUInteger length, BOOL delete)
{
- HTMLCharacterData *clone = (HTMLCharacterData *)[node cloneNodeDeep:NO];
+ HTMLCharacterData *clone = (HTMLCharacterData *)[node copy];
NSRange range = NSMakeRange(start, length);
[clone setData:[clone.data substringWithRange:range]];
diff --git a/Tests/HTMLRangeTests.m b/Tests/HTMLRangeTests.m
index 7c657fc..bf70ca5 100644
--- a/Tests/HTMLRangeTests.m
+++ b/Tests/HTMLRangeTests.m
@@ -1091,6 +1091,111 @@
XCTAssertEqual(range.endOffset, 9);
}
+- (void)testThatTextSplitUpdateRangeCorrectly_BeforeStartTextNode
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ //
Title
Hello
First textSecond text
<--Second comment-->
+ // |________|
+ [range selectNodeContents:_firstText];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // ^________|
+ HTMLText *split = [_firstText splitTextAtOffset:0];
+
+ XCTAssertEqualObjects(range.startContainer, _firstText);
+ XCTAssertEqual(range.startOffset, 0);
+ XCTAssertEqualObjects(range.endContainer, split);
+ XCTAssertEqual(range.endOffset, 10);
+}
+
+- (void)testThatTextSplitUpdateRangeCorrectly_AfterEndTextNode
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |________|
+ [range selectNodeContents:_firstText];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |________^
+ [_firstText splitTextAtOffset:_firstText.length];
+
+ XCTAssertEqualObjects(range.startContainer, _firstText);
+ XCTAssertEqual(range.startOffset, 0);
+ XCTAssertEqualObjects(range.endContainer, _firstText);
+ XCTAssertEqual(range.endOffset, 10);
+}
+
+- (void)testThatTextSplitUpdateRangeCorrectly_MidleSameTextNode
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |________|
+ [range selectNodeContents:_firstText];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |____^___|
+ HTMLText *split = [_firstText splitTextAtOffset:6];
+
+ XCTAssertEqualObjects(range.startContainer, _firstText);
+ XCTAssertEqual(range.startOffset, 0);
+ XCTAssertEqualObjects(range.endContainer, split);
+ XCTAssertEqual(range.endOffset, 4);
+}
+
+- (void)testThatTextSplitUpdateRangeCorrectly_MidleDifferentTextNodes
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |______________________________|
+ [range setStartNode:_firstText startOffset:2];
+ [range setEndNode:_secondText endOffset:3];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |____^__________________________|
+ [_firstText splitTextAtOffset:6];
+
+ XCTAssertEqualObjects(range.startContainer, _firstText);
+ XCTAssertEqual(range.startOffset, 2);
+ XCTAssertEqualObjects(range.endContainer, _secondText);
+ XCTAssertEqual(range.endOffset, 3);
+}
+
+- (void)testThatTextSplitUpdateRangeCorrectly_BeforeStartDifferentTextNodes
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |______________________________|
+ [range setStartNode:_firstText startOffset:6];
+ [range setEndNode:_secondText endOffset:3];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // ^ |__________________________|
+ HTMLText *split = [_firstText splitTextAtOffset:2];
+
+ XCTAssertEqualObjects(range.startContainer, split);
+ XCTAssertEqual(range.startOffset, 4);
+ XCTAssertEqualObjects(range.endContainer, _secondText);
+ XCTAssertEqual(range.endOffset, 3);
+}
+
+- (void)testThatTextSplitUpdateRangeCorrectly_BeforeEndDifferentTextNodes
+{
+ HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document];
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |_______________________________|
+ [range setStartNode:_firstText startOffset:6];
+ [range setEndNode:_secondText endOffset:4];
+
+ // Title
Hello
First textSecond text
<--Second comment-->
+ // |_____________________________^_|
+ HTMLText *split = [_secondText splitTextAtOffset:2];
+
+ XCTAssertEqualObjects(range.startContainer, _firstText);
+ XCTAssertEqual(range.startOffset, 6);
+ XCTAssertEqualObjects(range.endContainer, split);
+ XCTAssertEqual(range.endOffset, 2);
+}
+
#pragma mark - Editing
- (HTMLDocument *)editingDocument