Commit 1c4a06ae authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Make Range::intersectsNode() to follow the spec

This patch change |Range::intersectsNode()| to follow the spec[1].

[1] https://dom.spec.whatwg.org/#dom-range-intersectsnode

Bug: 822510
Change-Id: Ifd504443355da12482b759701cddd62e2a90d7a6
Reviewed-on: https://chromium-review.googlesource.com/970044Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#544971}
parent 31caeef4
<!doctype htlml>
<title>Range.intersectsNode</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="div"><span id="s0">s0</span><span id="s1">s1</span><span id="s2">s2</span></div>
<script>
// Taken from Chromium bug: http://crbug.com/822510
test(() => {
const range = new Range();
const div = document.getElementById('div');
const s0 = document.getElementById('s0');
const s1 = document.getElementById('s1');
const s2 = document.getElementById('s2');
// Range encloses s0
range.setStart(div, 0);
range.setEnd(div, 1);
assert_true(range.intersectsNode(s0), '[s0] range.intersectsNode(s0)');
assert_false(range.intersectsNode(s1), '[s0] range.intersectsNode(s1)');
assert_false(range.intersectsNode(s2), '[s0] range.intersectsNode(s2)');
// Range encloses s1
range.setStart(div, 1);
range.setEnd(div, 2);
assert_false(range.intersectsNode(s0), '[s1] range.intersectsNode(s0)');
assert_true(range.intersectsNode(s1), '[s1] range.intersectsNode(s1)');
assert_false(range.intersectsNode(s2), '[s1] range.intersectsNode(s2)');
// Range encloses s2
range.setStart(div, 2);
range.setEnd(div, 3);
assert_false(range.intersectsNode(s0), '[s2] range.intersectsNode(s0)');
assert_false(range.intersectsNode(s1), '[s2] range.intersectsNode(s1)');
assert_true(range.intersectsNode(s2), '[s2] range.intersectsNode(s2)');
}, 'Range.intersectsNode() simple cases');
</script>
...@@ -461,22 +461,8 @@ bool Range::intersectsNode(Node* ref_node, ExceptionState& exception_state) { ...@@ -461,22 +461,8 @@ bool Range::intersectsNode(Node* ref_node, ExceptionState& exception_state) {
return true; return true;
int node_index = ref_node->NodeIndex(); int node_index = ref_node->NodeIndex();
return Position(parent_node, node_index) < end_.ToPosition() &&
if (comparePoint(parent_node, node_index, exception_state) < Position(parent_node, node_index + 1) > start_.ToPosition();
0 // starts before start
&& comparePoint(parent_node, node_index + 1, exception_state) <
0) { // ends before start
return false;
}
if (comparePoint(parent_node, node_index, exception_state) >
0 // starts after end
&& comparePoint(parent_node, node_index + 1, exception_state) >
0) { // ends after end
return false;
}
return true; // all other cases
} }
static inline Node* HighestAncestorUnderCommonRoot(Node* node, static inline Node* HighestAncestorUnderCommonRoot(Node* node,
......
...@@ -62,6 +62,42 @@ TEST_F(RangeTest, extractContentsWithDOMMutationEvent) { ...@@ -62,6 +62,42 @@ TEST_F(RangeTest, extractContentsWithDOMMutationEvent) {
<< "DOM mutation event handler should be executed."; << "DOM mutation event handler should be executed.";
} }
// http://crbug.com/822510
TEST_F(RangeTest, IntersectsNode) {
SetBodyContent(
"<div>"
"<span id='s0'>s0</span>"
"<span id='s1'>s1</span>"
"<span id='s2'>s2</span>"
"</div>");
Element* const div = GetDocument().QuerySelector("div");
Element* const s0 = GetDocument().getElementById("s0");
Element* const s1 = GetDocument().getElementById("s1");
Element* const s2 = GetDocument().getElementById("s2");
Range& range = *Range::Create(GetDocument());
// Range encloses s0
range.setStart(div, 0);
range.setEnd(div, 1);
EXPECT_TRUE(range.intersectsNode(s0, ASSERT_NO_EXCEPTION));
EXPECT_FALSE(range.intersectsNode(s1, ASSERT_NO_EXCEPTION));
EXPECT_FALSE(range.intersectsNode(s2, ASSERT_NO_EXCEPTION));
// Range encloses s1
range.setStart(div, 1);
range.setEnd(div, 2);
EXPECT_FALSE(range.intersectsNode(s0, ASSERT_NO_EXCEPTION));
EXPECT_TRUE(range.intersectsNode(s1, ASSERT_NO_EXCEPTION));
EXPECT_FALSE(range.intersectsNode(s2, ASSERT_NO_EXCEPTION));
// Range encloses s2
range.setStart(div, 2);
range.setEnd(div, 3);
EXPECT_FALSE(range.intersectsNode(s0, ASSERT_NO_EXCEPTION));
EXPECT_FALSE(range.intersectsNode(s1, ASSERT_NO_EXCEPTION));
EXPECT_TRUE(range.intersectsNode(s2, ASSERT_NO_EXCEPTION));
}
TEST_F(RangeTest, SplitTextNodeRangeWithinText) { TEST_F(RangeTest, SplitTextNodeRangeWithinText) {
V8TestingScope scope; V8TestingScope scope;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment