Skip to content

Commit 8a5dc9c

Browse files
authored
Merge pull request AngleSharp#1148 from zukarusan/devel
Fix Range bug Issue
2 parents 4c8741d + 07cbdff commit 8a5dc9c

File tree

3 files changed

+245
-36
lines changed

3 files changed

+245
-36
lines changed

src/AngleSharp.Core.Tests/Library/Range.cs

Lines changed: 141 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace AngleSharp.Core.Tests.Library
22
{
33
using NUnit.Framework;
4-
using static System.Net.Mime.MediaTypeNames;
54

65
[TestFixture]
76
public class RangeTests
@@ -45,7 +44,7 @@ public void CanSelectSomeRange_Issue1119()
4544
var text2 = common.LastChild;
4645
var range = document.CreateRange();
4746
range.StartBefore(text1);
48-
range.EndAfter(text2);
47+
range.EndBefore(text2);
4948

5049
Assert.AreEqual(0, range.Start);
5150
Assert.AreEqual(text1.Parent, range.Head);
@@ -54,5 +53,145 @@ public void CanSelectSomeRange_Issue1119()
5453
Assert.AreEqual(common, range.CommonAncestor);
5554
Assert.IsFalse(range.IsCollapsed);
5655
}
56+
57+
[Test]
58+
public void CanSelectSomeRange_Issue1147()
59+
{
60+
var document = "<body></body>".ToHtmlDocument();
61+
var text1 = document.Body.AppendChild(document.CreateTextNode("Text1"));
62+
var text2 = document.Body.AppendChild(document.CreateTextNode("TextLonger2"));
63+
var range1 = document.CreateRange();
64+
var range2 = document.CreateRange();
65+
range1.StartWith(text1, "Text".Length);
66+
range1.EndWith(text2, "TextLonger".Length);
67+
range2.StartWith(text1, "Text".Length);
68+
range2.EndWith(text2, "TextLonger".Length);
69+
range2.StartWith(text2, "TextLonger2".Length);
70+
71+
Assert.AreEqual("Text".Length, range1.Start);
72+
Assert.AreEqual(text1, range1.Head);
73+
Assert.AreEqual("TextLonger".Length, range1.End);
74+
Assert.AreEqual(text2, range1.Tail);
75+
Assert.AreEqual(document.Body, range1.CommonAncestor);
76+
Assert.IsFalse(range1.IsCollapsed);
77+
Assert.AreEqual("TextLonger2".Length, range2.Start);
78+
Assert.AreEqual("TextLonger2".Length, range2.End);
79+
Assert.IsTrue(range2.IsCollapsed);
80+
}
81+
82+
[Test]
83+
public void CheckCommonAncestor()
84+
{
85+
var document = "<body></body>".ToHtmlDocument();
86+
var p1 = document.Body.AppendChild(document.CreateElement("p"));
87+
var p2 = document.Body.AppendChild(document.CreateElement("p"));
88+
var p11 = p1.AppendChild(document.CreateElement("p"));
89+
var p12 = p1.AppendChild(document.CreateElement("p"));
90+
var p21 = p2.AppendChild(document.CreateElement("p"));
91+
92+
var range1 = document.CreateRange();
93+
var range2 = document.CreateRange();
94+
95+
range1.StartAfter(p11);
96+
range1.EndBefore(p12);
97+
range2.StartAfter(p11);
98+
range2.EndBefore(p21);
99+
100+
Assert.AreEqual(p1, range1.CommonAncestor);
101+
Assert.AreEqual(document.Body, range2.CommonAncestor);
102+
}
103+
104+
[Test]
105+
public void CanIntersects()
106+
{
107+
var document = "<body></body>".ToHtmlDocument();
108+
var p1 = document.Body.AppendChild(document.CreateElement("p"));
109+
var p2 = document.Body.AppendChild(document.CreateElement("p"));
110+
var p3 = document.Body.AppendChild(document.CreateElement("p"));
111+
112+
var range1 = document.CreateRange();
113+
var range2 = document.CreateRange();
114+
115+
range1.StartAfter(p1);
116+
range1.EndBefore(p3);
117+
range2.StartWith(p1, 0);
118+
range2.EndWith(p3, 0);
119+
120+
Assert.IsFalse(range1.Intersects(p1));
121+
Assert.IsTrue(range1.Intersects(p2));
122+
Assert.IsFalse(range1.Intersects(p3));
123+
Assert.IsTrue(range1.Intersects(document.Body));
124+
125+
Assert.IsTrue(range2.Intersects(p1));
126+
Assert.IsTrue(range2.Intersects(p2));
127+
Assert.IsTrue(range2.Intersects(p3));
128+
Assert.IsTrue(range2.Intersects(document.Body));
129+
}
130+
131+
[Test]
132+
public void CanContains()
133+
{
134+
var document = "<body></body>".ToHtmlDocument();
135+
var p1 = document.Body.AppendChild(document.CreateElement("p"));
136+
var p2 = document.Body.AppendChild(document.CreateElement("p"));
137+
var p3 = document.Body.AppendChild(document.CreateElement("p"));
138+
139+
var range1 = document.CreateRange();
140+
var range2 = document.CreateRange();
141+
var range3 = document.CreateRange();
142+
143+
range1.StartAfter(p1);
144+
range1.EndBefore(p3);
145+
range2.StartWith(p1, 0);
146+
range2.EndWith(p3, 0);
147+
range3.Select(document.Body);
148+
149+
Assert.IsFalse(range1.Contains(p1, 0));
150+
Assert.IsTrue(range1.Contains(p2, 0));
151+
Assert.IsFalse(range1.Contains(p3, 0));
152+
Assert.IsFalse(range1.Contains(document.Body, 0));
153+
154+
Assert.IsFalse(range2.Contains(p1, 0));
155+
Assert.IsTrue(range2.Contains(p2, 0));
156+
Assert.IsFalse(range2.Contains(p3, 0));
157+
Assert.IsFalse(range2.Contains(document.Body, 0));
158+
159+
Assert.IsTrue(range3.Contains(p1, 0));
160+
Assert.IsTrue(range3.Contains(p2, 0));
161+
Assert.IsTrue(range3.Contains(p3, 0));
162+
Assert.IsTrue(range3.Contains(document.Body, 0));
163+
}
164+
165+
[Test]
166+
public void CanClearContent()
167+
{
168+
var document = @"
169+
<html>
170+
<head></head>
171+
<body>
172+
<p> No deletion before start <span id=""start""></span> This should be cleared </p>
173+
<p> <span id=""toDelete""></span>This should be deleted too <span id=""end""></span> This is not to be deleted</p>
174+
<p> This should not be deleted either</p>
175+
</body>
176+
</html>".ToHtmlDocument();
177+
var start = document.QuerySelector("#start");
178+
var end = document.QuerySelector("#end");
179+
var toDelete = document.QuerySelector("#toDelete");
180+
181+
var range = document.CreateRange();
182+
183+
range.StartWith(start, 0);
184+
range.EndWith(end, 0);
185+
186+
range.ClearContent();
187+
188+
var htmlRaw = document.DocumentElement.OuterHtml;
189+
Assert.IsTrue(htmlRaw.Contains("No deletion before start"));
190+
Assert.IsTrue(htmlRaw.Contains("This is not to be deleted"));
191+
Assert.IsTrue(htmlRaw.Contains("This should not be deleted either"));
192+
Assert.IsFalse(htmlRaw.Contains("This should be cleared"));
193+
Assert.IsFalse(htmlRaw.Contains("This should be deleted too"));
194+
Assert.IsFalse(document.Contains(toDelete));
195+
}
57196
}
58197
}

src/AngleSharp/Dom/IRange.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AngleSharp.Dom
1+
namespace AngleSharp.Dom
22
{
33
using AngleSharp.Attributes;
44
using System;
@@ -206,7 +206,7 @@ public interface IRange
206206
RangePosition CompareTo(INode node, Int32 offset);
207207

208208
/// <summary>
209-
/// Checks if the given node is contained in this range.
209+
/// Checks if the given node is intersected by this range.
210210
/// </summary>
211211
/// <param name="node">The node to check for.</param>
212212
/// <returns>

0 commit comments

Comments
 (0)