Title: [269253] trunk
Revision
269253
Author
[email protected]
Date
2020-11-02 10:53:36 -0800 (Mon, 02 Nov 2020)

Log Message

Start removing functions that implicitly use composed tree
https://bugs.webkit.org/show_bug.cgi?id=218424

Reviewed by Ryosuke Niwa.

Source/WebCore:

Tests: fast/dom/rangeContainsNode.html
       fast/dom/rangeContainsRange.html
       fast/dom/treeOrder.html

Ryosuke pointed out that most clients should not be using the composed tree, so this
is a step in work to make the use of the composed tree explicit. After that we can
more easily find and correct call sites where use of the composed tree is incorrect.

Likely that most or all cases of treeOrder<ComposedTree> can be changed to just
treeOrder and contains<ComposedTree> to just contains; will do those in follow-ups.

* Modules/highlight/Highlight.cpp:
(WebCore::repaintRange): Simplified code to use boundary points, and changed to use
treeOrder<ComposedTree>.

* dom/AbstractRange.h: Export makeSimpleRange so it can be used in Internals.
* dom/AbstractRange.idl: Export the class so it can be used in Internals.

* dom/Node.cpp:
(WebCore::parent<ShadowIncludingTree>): Added.
(WebCore::treeOrderForTesting): Added.
(WebCore::documentOrder): Deleted.
* dom/Node.h: Updated for the above.

* dom/RadioButtonGroups.cpp:
(WebCore::RadioButtonGroup::members const): Use treeOrder<ComposedTree>.

* dom/SimpleRange.cpp:
(WebCore::contains): Removed a couple contains functions that implicitly use
composed tree.
(WebCore::containsForTesting): Added.
* dom/SimpleRange.h: Updated for the above. Should also make contains<Tree> the
default and remove the <Tree> at all call sites, but it's safer to do that in a
separate patch after this is landed and builds on all platforms.

* editing/Editing.cpp:
(WebCore::isNodeVisiblyContainedWithin): Use contains<ComposedTree>.
* page/DragController.cpp:
(WebCore::DragController::draggableElement const): Ditto.
* page/EventHandler.cpp:
(WebCore::EventHandler::dispatchMouseEvent): Ditto. Note that this has a call to
isDescendantOf right next to it, which does not use the composed tree.

* page/Page.cpp:
(WebCore::Page::findTextMatches): Use treeOrder<ComposedTree>.
(WebCore::replaceRanges): Ditto.

* page/mac/ServicesOverlayController.mm:
(WebCore::ServicesOverlayController::findTelephoneNumberHighlightContainingSelectionHighlight):
Use contains<ComposedTree>.

* testing/Internals.cpp:
(WebCore::string): Added.
(WebCore::convertType): Added.
(WebCore::Internals::treeOrder): Added.
(WebCore::Internals::rangeContainsNode): Added.
(WebCore::Internals::rangeContainsRange): Added.
* testing/Internals.h: Updated for added functions above.
* testing/Internals.idl: Ditto. These functions were tested in a
TestWebKitAPI test, but we plan to move those types of tests to
internals-based tests instead.

Source/WebKit:

* WebProcess/WebPage/glib/WebPageGLib.cpp:
(WebKit::WebPage::getPlatformEditorState const): Use contains<ComposedTree>.

Tools:

* TestWebKitAPI/Tests/WebCore/DocumentOrder.cpp: Moved the tests of documentOrder
for two nodes and contains for range/range or range/node into internals-based tests
in the LayoutTests directory. Eventually we'll move the rest of these tests, too.

LayoutTests:

* fast/dom/rangeContainsNode-expected.txt: Added.
* fast/dom/rangeContainsNode.html: Added.
* fast/dom/rangeContainsRange-expected.txt: Added.
* fast/dom/rangeContainsRange.html: Added.
* fast/dom/treeOrder-expected.txt: Added.
* fast/dom/treeOrder.html: Added.
These tests were formerly part of TestWebKitAPI, although treeOrder was named documentOrder.
Moving to internals-style tests at Ryosuke's suggestion since these are not something exposed
as API or even SPI.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (269252 => 269253)


--- trunk/LayoutTests/ChangeLog	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/LayoutTests/ChangeLog	2020-11-02 18:53:36 UTC (rev 269253)
@@ -1,3 +1,20 @@
+2020-11-01  Darin Adler  <[email protected]>
+
+        Start removing functions that implicitly use composed tree
+        https://bugs.webkit.org/show_bug.cgi?id=218424
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/dom/rangeContainsNode-expected.txt: Added.
+        * fast/dom/rangeContainsNode.html: Added.
+        * fast/dom/rangeContainsRange-expected.txt: Added.
+        * fast/dom/rangeContainsRange.html: Added.
+        * fast/dom/treeOrder-expected.txt: Added.
+        * fast/dom/treeOrder.html: Added.
+        These tests were formerly part of TestWebKitAPI, although treeOrder was named documentOrder.
+        Moving to internals-style tests at Ryosuke's suggestion since these are not something exposed
+        as API or even SPI.
+
 2020-11-02  Martin Robinson  <[email protected]>
 
         [GLIB] REGRESSION(r269144) imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html is failing

Added: trunk/LayoutTests/fast/dom/rangeContainsNode-expected.txt (0 => 269253)


--- trunk/LayoutTests/fast/dom/rangeContainsNode-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/rangeContainsNode-expected.txt	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,22 @@
+Test the contains function that checks if a range contains a node.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS internals.rangeContainsNode(contentsRange(document), documentElement, 'ComposedTree') is true
+PASS internals.rangeContainsNode(contentsRange(document), body, 'ComposedTree') is true
+PASS internals.rangeContainsNode(contentsRange(documentElement), body, 'ComposedTree') is true
+PASS internals.rangeContainsNode(contentsRange(document), document, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, document, 2), document, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, documentElement, 0), body, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, documentElement, 1), body, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, body, 0), body, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, body, 1), body, 'ComposedTree') is false
+PASS internals.rangeContainsNode(range(document, 0, documentElement, 2), body, 'ComposedTree') is true
+PASS internals.rangeContainsNode(contentsRange(document), a, 'ComposedTree') is false
+PASS internals.rangeContainsNode(contentsRange(body), f, 'ComposedTree') is false
+PASS internals.rangeContainsNode(contentsRange(body), h, 'ComposedTree') is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/dom/rangeContainsNode.html (0 => 269253)


--- trunk/LayoutTests/fast/dom/rangeContainsNode.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/rangeContainsNode.html	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,57 @@
+<html><head></head><body>
+<script src=""
+<script>
+
+description("Test the contains function that checks if a range contains a node.")
+
+function range(startContainer, startOffset, endContainer, endOffset)
+{
+    return new StaticRange({ startContainer: startContainer, startOffset: startOffset, endContainer: endContainer, endOffset: endOffset })
+}
+
+function contentsRange(node)
+{
+    return range(node, 0, node, node.childNodes.length)
+}
+
+let documentElement = document.documentElement;
+let body = document.body;
+
+shouldBeTrue("internals.rangeContainsNode(contentsRange(document), documentElement, 'ComposedTree')")
+shouldBeTrue("internals.rangeContainsNode(contentsRange(document), body, 'ComposedTree')");
+shouldBeTrue("internals.rangeContainsNode(contentsRange(documentElement), body, 'ComposedTree')");
+
+shouldBeFalse("internals.rangeContainsNode(contentsRange(document), document, 'ComposedTree')");
+shouldBeFalse("internals.rangeContainsNode(range(document, 0, document, 2), document, 'ComposedTree')");
+shouldBeFalse("internals.rangeContainsNode(range(document, 0, documentElement, 0), body, 'ComposedTree')");
+shouldBeFalse("internals.rangeContainsNode(range(document, 0, documentElement, 1), body, 'ComposedTree')");
+shouldBeFalse("internals.rangeContainsNode(range(document, 0, body, 0), body, 'ComposedTree')");
+shouldBeFalse("internals.rangeContainsNode(range(document, 0, body, 1), body, 'ComposedTree')");
+shouldBeTrue("internals.rangeContainsNode(range(document, 0, documentElement, 2), body, 'ComposedTree')");
+
+let a = document.createElement("div")
+shouldBeFalse("internals.rangeContainsNode(contentsRange(document), a, 'ComposedTree')")
+
+body.appendChild(a)
+
+let b = document.createElement("div")
+body.appendChild(b)
+
+let c = document.createElement("div")
+b.appendChild(c)
+
+let d = document.createElement("div")
+a.appendChild(d)
+
+let e = document.createElement("div")
+let f = document.createElement("div")
+e.appendChild(f)
+shouldBeFalse("internals.rangeContainsNode(contentsRange(body), f, 'ComposedTree')")
+
+let g = document.createElement("textarea");
+c.appendChild(g)
+let h = internals.ensureUserAgentShadowRoot(g).firstChild
+shouldBeTrue("internals.rangeContainsNode(contentsRange(body), h, 'ComposedTree')")
+
+</script>
+</body></html>

Added: trunk/LayoutTests/fast/dom/rangeContainsRange-expected.txt (0 => 269253)


--- trunk/LayoutTests/fast/dom/rangeContainsRange-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/rangeContainsRange-expected.txt	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,42 @@
+Test the contains function that checks if a range contains another range.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS internals.rangeContainsRange(contentsRange(document), contentsRange(document), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(documentElement), contentsRange(documentElement), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(body), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(document), contentsRange(documentElement), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(documentElement), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), contentsRange(body), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(documentElement), contentsRange(body), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(documentElement), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), contentsRange(documentElement), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(documentElement), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(documentElement), contentsRange(body), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(documentElement), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), collapsedRange(document, 0), 'ComposedTree') is true
+PASS internals.rangeContainsRange(collapsedRange(document, 0), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), collapsedRange(document, 1), 'ComposedTree') is true
+PASS internals.rangeContainsRange(collapsedRange(document, 1), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), collapsedRange(document, 2), 'ComposedTree') is false
+PASS internals.rangeContainsRange(collapsedRange(document, 2), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(range(document, 0, document, 2), contentsRange(document), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(document), range(document, 0, document, 2), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), range(document, 1, document, 2), 'ComposedTree') is false
+PASS internals.rangeContainsRange(range(document, 1, document, 2), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(range(document, 0, documentElement, 0), contentsRange(body), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(body), range(document, 0, documentElement, 0), 'ComposedTree') is false
+PASS internals.rangeContainsRange(range(document, 0, body, 0), collapsedRange(body, 0), 'ComposedTree') is true
+PASS internals.rangeContainsRange(collapsedRange(body, 0), range(document, 0, body, 0), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(document), contentsRange(a), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(a), contentsRange(document), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(f), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(f), contentsRange(body), 'ComposedTree') is false
+PASS internals.rangeContainsRange(contentsRange(body), contentsRange(h), 'ComposedTree') is true
+PASS internals.rangeContainsRange(contentsRange(h), contentsRange(body), 'ComposedTree') is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/dom/rangeContainsRange.html (0 => 269253)


--- trunk/LayoutTests/fast/dom/rangeContainsRange.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/rangeContainsRange.html	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,89 @@
+<html><head></head><body>
+<script src=""
+<script>
+
+description("Test the contains function that checks if a range contains another range.")
+
+function range(startContainer, startOffset, endContainer, endOffset)
+{
+    return new StaticRange({ startContainer: startContainer, startOffset: startOffset, endContainer: endContainer, endOffset: endOffset })
+}
+
+function collapsedRange(container, offset)
+{
+    return range(container, offset, container, offset)
+}
+
+function contentsRange(node)
+{
+    return range(node, 0, node, node.childNodes.length)
+}
+
+function shouldContainSelf(a)
+{
+    shouldBeTrue("internals.rangeContainsRange(" + a + ", " + a + ", 'ComposedTree')")
+}
+
+function shouldBeNested(a, b)
+{
+    shouldBeTrue("internals.rangeContainsRange(" + a + ", " + b + ", 'ComposedTree')")
+    shouldBeFalse("internals.rangeContainsRange(" + b + ", " + a + ", 'ComposedTree')")
+}
+
+function shouldNotContain(a, b)
+{
+    shouldBeFalse("internals.rangeContainsRange(" + a + ", " + b + ", 'ComposedTree')")
+    shouldBeFalse("internals.rangeContainsRange(" + b + ", " + a + ", 'ComposedTree')")
+}
+
+let documentElement = document.documentElement;
+let body = document.body;
+
+shouldContainSelf("contentsRange(document)")
+shouldContainSelf("contentsRange(documentElement)")
+shouldContainSelf("contentsRange(body)")
+
+shouldBeNested("contentsRange(document)", "contentsRange(documentElement)")
+shouldBeNested("contentsRange(document)", "contentsRange(body)")
+shouldBeNested("contentsRange(documentElement)", "contentsRange(body)")
+
+shouldBeNested("contentsRange(document)", "contentsRange(documentElement)")
+
+shouldBeNested("contentsRange(documentElement)", "contentsRange(body)")
+
+shouldBeNested("contentsRange(document)", "collapsedRange(document, 0)")
+shouldBeNested("contentsRange(document)", "collapsedRange(document, 1)")
+shouldNotContain("contentsRange(document)", "collapsedRange(document, 2)")
+
+shouldBeNested("range(document, 0, document, 2)", "contentsRange(document)")
+shouldNotContain("contentsRange(document)", "range(document, 1, document, 2)")
+
+shouldNotContain("range(document, 0, documentElement, 0)", "contentsRange(body)")
+shouldBeNested("range(document, 0, body, 0)", "collapsedRange(body, 0)")
+
+let a = document.createElement("div")
+shouldNotContain("contentsRange(document)", "contentsRange(a)")
+
+body.appendChild(a)
+
+let b = document.createElement("div")
+body.appendChild(b)
+
+let c = document.createElement("div")
+b.appendChild(c)
+
+let d = document.createElement("div")
+a.appendChild(d)
+
+let e = document.createElement("div")
+let f = document.createElement("div")
+e.appendChild(f)
+shouldNotContain("contentsRange(body)", "contentsRange(f)")
+
+let g = document.createElement("textarea");
+c.appendChild(g)
+let h = internals.ensureUserAgentShadowRoot(g).firstChild
+shouldBeNested("contentsRange(body)", "contentsRange(h)")
+
+</script>
+</body></html>

Added: trunk/LayoutTests/fast/dom/treeOrder-expected.txt (0 => 269253)


--- trunk/LayoutTests/fast/dom/treeOrder-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/treeOrder-expected.txt	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,59 @@
+Test the tree ordering.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS internals.treeOrder(document, document, 'ComposedTree') is "equivalent"
+PASS internals.treeOrder(body, body, 'ComposedTree') is "equivalent"
+PASS internals.treeOrder(document, body, 'ComposedTree') is "less"
+PASS internals.treeOrder(body, document, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, a, 'ComposedTree') is "equivalent"
+PASS internals.treeOrder(body, a, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(a, body, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(body, a, 'ComposedTree') is "less"
+PASS internals.treeOrder(a, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, a, 'ComposedTree') is "equivalent"
+PASS internals.treeOrder(body, b, 'ComposedTree') is "less"
+PASS internals.treeOrder(b, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, b, 'ComposedTree') is "less"
+PASS internals.treeOrder(b, a, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, c, 'ComposedTree') is "less"
+PASS internals.treeOrder(c, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, c, 'ComposedTree') is "less"
+PASS internals.treeOrder(c, a, 'ComposedTree') is "greater"
+PASS internals.treeOrder(b, c, 'ComposedTree') is "less"
+PASS internals.treeOrder(c, b, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, d, 'ComposedTree') is "less"
+PASS internals.treeOrder(d, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, d, 'ComposedTree') is "less"
+PASS internals.treeOrder(d, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, d, 'ComposedTree') is "less"
+PASS internals.treeOrder(d, a, 'ComposedTree') is "greater"
+PASS internals.treeOrder(d, b, 'ComposedTree') is "less"
+PASS internals.treeOrder(b, d, 'ComposedTree') is "greater"
+PASS internals.treeOrder(d, c, 'ComposedTree') is "less"
+PASS internals.treeOrder(c, d, 'ComposedTree') is "greater"
+PASS internals.treeOrder(a, d, 'ComposedTree') is "less"
+PASS internals.treeOrder(d, a, 'ComposedTree') is "greater"
+PASS internals.treeOrder(d, b, 'ComposedTree') is "less"
+PASS internals.treeOrder(b, d, 'ComposedTree') is "greater"
+PASS internals.treeOrder(d, c, 'ComposedTree') is "less"
+PASS internals.treeOrder(c, d, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, f, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(f, body, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(f, body, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(body, f, 'ComposedTree') is "unordered"
+PASS internals.treeOrder(body, g, 'ComposedTree') is "less"
+PASS internals.treeOrder(g, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, h, 'ComposedTree') is "less"
+PASS internals.treeOrder(h, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(body, i, 'ComposedTree') is "less"
+PASS internals.treeOrder(i, body, 'ComposedTree') is "greater"
+PASS internals.treeOrder(i, d, 'ComposedTree') is "less"
+PASS internals.treeOrder(d, i, 'ComposedTree') is "greater"
+PASS internals.treeOrder(i, b, 'ComposedTree') is "less"
+PASS internals.treeOrder(b, i, 'ComposedTree') is "greater"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/dom/treeOrder.html (0 => 269253)


--- trunk/LayoutTests/fast/dom/treeOrder.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/treeOrder.html	2020-11-02 18:53:36 UTC (rev 269253)
@@ -0,0 +1,85 @@
+<html><body>
+<script src=""
+<script>
+
+description("Test the tree ordering.")
+
+function shouldBeBoth(a, b, forward, reversed)
+{
+    shouldBeEqualToString("internals.treeOrder(" + a + ", " + (b ? b : a) + ", 'ComposedTree')", forward)
+    if (a != b)
+        shouldBeEqualToString("internals.treeOrder(" + b + ", " + a + ", 'ComposedTree')", reversed)
+}
+
+function shouldBeEquivalent(a, b)
+{
+    shouldBeBoth(a, b, "equivalent", "equivalent")
+}
+
+function shouldBeLess(a, b)
+{
+    shouldBeBoth(a, b, "less", "greater")
+}
+
+function shouldBeUnordered(a, b)
+{
+    shouldBeBoth(a, b, "unordered", "unordered")
+}
+
+shouldBeEquivalent("document", "document")
+
+let body = document.body;
+
+shouldBeEquivalent("body", "body")
+shouldBeLess("document", "body")
+
+let a = document.createElement("div")
+shouldBeEquivalent("a", "a")
+shouldBeUnordered("body", "a")
+
+body.appendChild(a)
+shouldBeLess("body", "a")
+shouldBeEquivalent("a", "a")
+
+let b = document.createElement("div")
+body.appendChild(b)
+shouldBeLess("body", "b")
+shouldBeLess("a", "b")
+
+let c = document.createElement("div")
+b.appendChild(c)
+shouldBeLess("body", "c")
+shouldBeLess("a", "c")
+shouldBeLess("b", "c")
+
+let d = document.createElement("div")
+a.appendChild(d)
+shouldBeLess("body", "d")
+shouldBeLess("body", "d")
+shouldBeLess("a", "d")
+shouldBeLess("d", "b")
+shouldBeLess("d", "c")
+shouldBeLess("a", "d")
+shouldBeLess("d", "b")
+shouldBeLess("d", "c")
+
+let e = document.createElement("div")
+let f = document.createElement("div")
+e.appendChild(f)
+shouldBeUnordered("body", "f")
+shouldBeUnordered("f", "body")
+
+let g = document.createElement("textarea")
+c.appendChild(g)
+shouldBeLess("body", "g")
+
+let h = internals.ensureUserAgentShadowRoot(g).firstChild
+shouldBeLess("body", "h")
+
+let i = a.attachShadow({ mode: "closed" })
+shouldBeLess("body", "i")
+shouldBeLess("i", "d")
+shouldBeLess("i", "b")
+
+</script>
+</body></html>

Modified: trunk/Source/WebCore/ChangeLog (269252 => 269253)


--- trunk/Source/WebCore/ChangeLog	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/ChangeLog	2020-11-02 18:53:36 UTC (rev 269253)
@@ -1,3 +1,72 @@
+2020-11-01  Darin Adler  <[email protected]>
+
+        Start removing functions that implicitly use composed tree
+        https://bugs.webkit.org/show_bug.cgi?id=218424
+
+        Reviewed by Ryosuke Niwa.
+
+        Tests: fast/dom/rangeContainsNode.html
+               fast/dom/rangeContainsRange.html
+               fast/dom/treeOrder.html
+
+        Ryosuke pointed out that most clients should not be using the composed tree, so this
+        is a step in work to make the use of the composed tree explicit. After that we can
+        more easily find and correct call sites where use of the composed tree is incorrect.
+
+        Likely that most or all cases of treeOrder<ComposedTree> can be changed to just
+        treeOrder and contains<ComposedTree> to just contains; will do those in follow-ups.
+
+        * Modules/highlight/Highlight.cpp:
+        (WebCore::repaintRange): Simplified code to use boundary points, and changed to use
+        treeOrder<ComposedTree>.
+
+        * dom/AbstractRange.h: Export makeSimpleRange so it can be used in Internals.
+        * dom/AbstractRange.idl: Export the class so it can be used in Internals.
+
+        * dom/Node.cpp:
+        (WebCore::parent<ShadowIncludingTree>): Added.
+        (WebCore::treeOrderForTesting): Added.
+        (WebCore::documentOrder): Deleted.
+        * dom/Node.h: Updated for the above.
+
+        * dom/RadioButtonGroups.cpp:
+        (WebCore::RadioButtonGroup::members const): Use treeOrder<ComposedTree>.
+
+        * dom/SimpleRange.cpp:
+        (WebCore::contains): Removed a couple contains functions that implicitly use
+        composed tree.
+        (WebCore::containsForTesting): Added.
+        * dom/SimpleRange.h: Updated for the above. Should also make contains<Tree> the
+        default and remove the <Tree> at all call sites, but it's safer to do that in a
+        separate patch after this is landed and builds on all platforms.
+
+        * editing/Editing.cpp:
+        (WebCore::isNodeVisiblyContainedWithin): Use contains<ComposedTree>.
+        * page/DragController.cpp:
+        (WebCore::DragController::draggableElement const): Ditto.
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::dispatchMouseEvent): Ditto. Note that this has a call to
+        isDescendantOf right next to it, which does not use the composed tree.
+
+        * page/Page.cpp:
+        (WebCore::Page::findTextMatches): Use treeOrder<ComposedTree>.
+        (WebCore::replaceRanges): Ditto.
+
+        * page/mac/ServicesOverlayController.mm:
+        (WebCore::ServicesOverlayController::findTelephoneNumberHighlightContainingSelectionHighlight):
+        Use contains<ComposedTree>.
+
+        * testing/Internals.cpp:
+        (WebCore::string): Added.
+        (WebCore::convertType): Added.
+        (WebCore::Internals::treeOrder): Added.
+        (WebCore::Internals::rangeContainsNode): Added.
+        (WebCore::Internals::rangeContainsRange): Added.
+        * testing/Internals.h: Updated for added functions above.
+        * testing/Internals.idl: Ditto. These functions were tested in a
+        TestWebKitAPI test, but we plan to move those types of tests to
+        internals-based tests instead.
+
 2020-11-02  Martin Robinson  <[email protected]>
 
         [GLIB] REGRESSION(r269144) imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html is failing

Modified: trunk/Source/WebCore/Modules/highlight/Highlight.cpp (269252 => 269253)


--- trunk/Source/WebCore/Modules/highlight/Highlight.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/Modules/highlight/Highlight.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -55,27 +55,16 @@
         set.add<IDLInterface<StaticRange>>(rangeData->range);
 }
 
-static void repaintRange(const StaticRange& range)
+static void repaintRange(const SimpleRange& range)
 {
-    auto startNode = makeRefPtr(&range.startContainer());
-    auto endNode = makeRefPtr(&range.endContainer());
-    auto ordering = documentOrder(*startNode.get(), *endNode.get());
-    if (is_eq(ordering)) {
-        if (auto renderer = startNode->renderer())
+    // FIXME: Unclear precisely why we need to handle out of order cases here, but not unordered cases.
+    auto sortedRange = range;
+    if (is_gt(treeOrder<ComposedTree>(range.start, range.end)))
+        std::swap(sortedRange.start, sortedRange.end);
+    for (auto& node : intersectingNodes(sortedRange)) {
+        if (auto renderer = node.renderer())
             renderer->repaint();
-        return;
     }
-    if (is_gt(ordering)) {
-        startNode = &range.endContainer();
-        endNode = &range.startContainer();
-    }
-    auto simpleRange = makeSimpleRange(makeBoundaryPointBeforeNode(*startNode.get()), makeBoundaryPointAfterNode(*endNode.get()));
-    if (simpleRange) {
-        for (auto& node : intersectingNodes(simpleRange.value())) {
-            if (auto renderer = node.renderer())
-                renderer->repaint();
-        }
-    }
 }
 
 bool Highlight::removeFromSetLike(const StaticRange& range)
@@ -90,7 +79,6 @@
 {
     for (auto& data : m_rangesData)
         repaintRange(data->range);
-
     m_rangesData.clear();
 }
 
@@ -100,7 +88,6 @@
         return false;
     repaintRange(range);
     m_rangesData.append(HighlightRangeData::create(range));
-    
     return true;
 }
 

Modified: trunk/Source/WebCore/dom/AbstractRange.h (269252 => 269253)


--- trunk/Source/WebCore/dom/AbstractRange.h	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/AbstractRange.h	2020-11-02 18:53:36 UTC (rev 269253)
@@ -47,7 +47,7 @@
     virtual bool isLiveRange() const = 0;
 };
 
-SimpleRange makeSimpleRange(const AbstractRange&);
+WEBCORE_EXPORT SimpleRange makeSimpleRange(const AbstractRange&);
 SimpleRange makeSimpleRange(const Ref<AbstractRange>&);
 Optional<SimpleRange> makeSimpleRange(const AbstractRange*);
 Optional<SimpleRange> makeSimpleRange(const RefPtr<AbstractRange>&);

Modified: trunk/Source/WebCore/dom/AbstractRange.idl (269252 => 269253)


--- trunk/Source/WebCore/dom/AbstractRange.idl	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/AbstractRange.idl	2020-11-02 18:53:36 UTC (rev 269253)
@@ -29,6 +29,7 @@
 
 [
     CustomToJSObject,
+    ExportMacro=WEBCORE_EXPORT,
     Exposed=Window,
 ] interface AbstractRange {
     readonly attribute Node startContainer;

Modified: trunk/Source/WebCore/dom/Node.cpp (269252 => 269253)


--- trunk/Source/WebCore/dom/Node.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/Node.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -2627,6 +2627,11 @@
     return node.parentNode();
 }
 
+template<> ContainerNode* parent<ShadowIncludingTree>(const Node& node)
+{
+    return node.parentOrShadowHostNode();
+}
+
 template<> ContainerNode* parent<ComposedTree>(const Node& node)
 {
     return node.parentInComposedTree();
@@ -2720,11 +2725,21 @@
 }
 
 template PartialOrdering treeOrder<Tree>(const Node&, const Node&);
+template PartialOrdering treeOrder<ShadowIncludingTree>(const Node&, const Node&);
 template PartialOrdering treeOrder<ComposedTree>(const Node&, const Node&);
 
-PartialOrdering documentOrder(const Node& a, const Node& b)
+PartialOrdering treeOrderForTesting(TreeType type, const Node& a, const Node& b)
 {
-    return treeOrder<ComposedTree>(a, b);
+    switch (type) {
+    case Tree:
+        return treeOrder<Tree>(a, b);
+    case ShadowIncludingTree:
+        return treeOrder<ShadowIncludingTree>(a, b);
+    case ComposedTree:
+        return treeOrder<ComposedTree>(a, b);
+    }
+    ASSERT_NOT_REACHED();
+    return PartialOrdering::unordered;
 }
 
 TextStream& operator<<(TextStream& ts, const Node& node)

Modified: trunk/Source/WebCore/dom/Node.h (269252 => 269253)


--- trunk/Source/WebCore/dom/Node.h	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/Node.h	2020-11-02 18:53:36 UTC (rev 269253)
@@ -759,8 +759,7 @@
 template<TreeType = Tree> ContainerNode* parent(const Node&);
 template<TreeType = Tree> PartialOrdering treeOrder(const Node&, const Node&);
 
-// FIXME: Dprecated because this silently defaults to ComposedTree. Use treeOrder instead.
-WEBCORE_EXPORT PartialOrdering documentOrder(const Node&, const Node&);
+WEBCORE_EXPORT PartialOrdering treeOrderForTesting(TreeType, const Node&, const Node&);
 
 #if ASSERT_ENABLED
 

Modified: trunk/Source/WebCore/dom/RadioButtonGroups.cpp (269252 => 269253)


--- trunk/Source/WebCore/dom/RadioButtonGroups.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/RadioButtonGroups.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -63,7 +63,7 @@
     for (auto& member : m_members)
         sortedMembers.append(member);
     std::sort(sortedMembers.begin(), sortedMembers.end(), [](auto& a, auto& b) {
-        return is_lt(documentOrder(a, b));
+        return is_lt(treeOrder<ComposedTree>(a, b));
     });
     return sortedMembers;
 }

Modified: trunk/Source/WebCore/dom/SimpleRange.cpp (269252 => 269253)


--- trunk/Source/WebCore/dom/SimpleRange.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/SimpleRange.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -263,10 +263,20 @@
 }
 
 template bool contains<Tree>(const SimpleRange&, const SimpleRange&);
+template bool contains<ComposedTree>(const SimpleRange&, const SimpleRange&);
 
-bool contains(const SimpleRange& outerRange, const SimpleRange& innerRange)
+bool containsForTesting(TreeType type, const SimpleRange& outerRange, const SimpleRange& innerRange)
 {
-    return contains<ComposedTree>(outerRange, innerRange);
+    switch (type) {
+    case Tree:
+        return contains<Tree>(outerRange, innerRange);
+    case ShadowIncludingTree:
+        return contains<ShadowIncludingTree>(outerRange, innerRange);
+    case ComposedTree:
+        return contains<ComposedTree>(outerRange, innerRange);
+    }
+    ASSERT_NOT_REACHED();
+    return false;
 }
 
 template<TreeType treeType> bool intersects(const SimpleRange& a, const SimpleRange& b)
@@ -308,10 +318,20 @@
 }
 
 template bool contains<Tree>(const SimpleRange&, const Node&);
+template bool contains<ComposedTree>(const SimpleRange&, const Node&);
 
-bool contains(const SimpleRange& range, const Node& node)
+bool containsForTesting(TreeType type, const SimpleRange& range, const Node& node)
 {
-    return contains<ComposedTree>(range, node);
+    switch (type) {
+    case Tree:
+        return contains<Tree>(range, node);
+    case ShadowIncludingTree:
+        return contains<ShadowIncludingTree>(range, node);
+    case ComposedTree:
+        return contains<ComposedTree>(range, node);
+    }
+    ASSERT_NOT_REACHED();
+    return false;
 }
 
 template<TreeType treeType> bool contains(const Node& outer, const Node& inner);

Modified: trunk/Source/WebCore/dom/SimpleRange.h (269252 => 269253)


--- trunk/Source/WebCore/dom/SimpleRange.h	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/dom/SimpleRange.h	2020-11-02 18:53:36 UTC (rev 269253)
@@ -68,6 +68,9 @@
 template<TreeType> bool contains(const SimpleRange& outerRange, const SimpleRange& innerRange);
 template<TreeType> bool contains(const SimpleRange&, const Node&);
 
+WEBCORE_EXPORT bool containsForTesting(TreeType, const SimpleRange& outerRange, const SimpleRange& innerRange);
+WEBCORE_EXPORT bool containsForTesting(TreeType, const SimpleRange&, const Node&);
+
 template<TreeType> bool intersects(const SimpleRange&, const SimpleRange&);
 template<TreeType> bool intersects(const SimpleRange&, const Node&);
 
@@ -84,7 +87,6 @@
 // FIXME: Start of functions that are deprecated since they silently default to ComposedTree.
 
 WEBCORE_EXPORT RefPtr<Node> commonInclusiveAncestor(const SimpleRange&);
-WEBCORE_EXPORT bool contains(const SimpleRange& outerRange, const SimpleRange& innerRange);
 template<typename TreeType> bool intersects(const SimpleRange&, const SimpleRange&);
 WEBCORE_EXPORT bool intersects(const SimpleRange&, const SimpleRange&);
 WEBCORE_EXPORT bool intersects(const SimpleRange&, const Node&);
@@ -91,7 +93,6 @@
 WEBCORE_EXPORT SimpleRange unionRange(const SimpleRange&, const SimpleRange&);
 WEBCORE_EXPORT Optional<SimpleRange> intersection(const Optional<SimpleRange>&, const Optional<SimpleRange>&);
 
-WEBCORE_EXPORT bool contains(const SimpleRange&, const Node&);
 template<typename TreeType> bool intersects(const SimpleRange&, const Node&);
 WEBCORE_EXPORT bool intersects(const SimpleRange&, const Node&);
 

Modified: trunk/Source/WebCore/editing/Editing.cpp (269252 => 269253)


--- trunk/Source/WebCore/editing/Editing.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/editing/Editing.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -1124,7 +1124,7 @@
 // Call this function to determine whether a node is visibly fit inside selectedRange
 bool isNodeVisiblyContainedWithin(Node& node, const SimpleRange& range)
 {
-    if (contains(range, node))
+    if (contains<ComposedTree>(range, node))
         return true;
 
     auto startPosition = makeDeprecatedLegacyPosition(range.start);

Modified: trunk/Source/WebCore/page/DragController.cpp (269252 => 269253)


--- trunk/Source/WebCore/page/DragController.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/page/DragController.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -781,7 +781,7 @@
         auto& selection = sourceFrame->selection().selection();
         bool isSingleAttachmentSelection = selection.start() == Position(attachment.get(), Position::PositionIsBeforeAnchor) && selection.end() == Position(attachment.get(), Position::PositionIsAfterAnchor);
         auto selectedRange = selection.firstRange();
-        if (isSingleAttachmentSelection || !selectedRange || !contains(*selectedRange, *attachment)) {
+        if (isSingleAttachmentSelection || !selectedRange || !contains<ComposedTree>(*selectedRange, *attachment)) {
             state.type = DragSourceAction::Attachment;
             return attachment.get();
         }

Modified: trunk/Source/WebCore/page/EventHandler.cpp (269252 => 269253)


--- trunk/Source/WebCore/page/EventHandler.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -2738,7 +2738,7 @@
     // will set a selection inside it, which will also set the focused element.
     if (element && m_frame.selection().isRange()) {
         if (auto range = m_frame.selection().selection().toNormalizedRange()) {
-            if (contains(*range, *element) && element->isDescendantOf(m_frame.document()->focusedElement()))
+            if (contains<ComposedTree>(*range, *element) && element->isDescendantOf(m_frame.document()->focusedElement()))
                 return true;
         }
     }

Modified: trunk/Source/WebCore/page/Page.cpp (269252 => 269253)


--- trunk/Source/WebCore/page/Page.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/page/Page.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -736,7 +736,7 @@
         if (options.contains(Backwards)) {
             for (size_t i = result.ranges.size(); i > 0; --i) {
                 // FIXME: Seems like this should be is_gteq to correctly handle the same string found twice in a row.
-                if (is_gt(documentOrder(selectedRange.start, result.ranges[i - 1].end))) {
+                if (is_gt(treeOrder<ComposedTree>(selectedRange.start, result.ranges[i - 1].end))) {
                     result.indexForSelection = i - 1;
                     break;
                 }
@@ -744,7 +744,7 @@
         } else {
             for (size_t i = 0, size = result.ranges.size(); i < size; ++i) {
                 // FIXME: Seems like this should be is_lteq to correctly handle the same string found twice in a row.
-                if (is_lt(documentOrder(selectedRange.end, result.ranges[i].start))) {
+                if (is_lt(treeOrder<ComposedTree>(selectedRange.end, result.ranges[i].start))) {
                     result.indexForSelection = i;
                     break;
                 }
@@ -861,8 +861,8 @@
             return false;
 
         if (firstFrame == secondFrame) {
-            // Use documentOrder instead of Node::compareDocumentPosition because some editing roots are inside shadow roots.
-            return is_gt(documentOrder(*firstNode, *secondNode));
+            // Must not use Node::compareDocumentPosition here because some editing roots are inside shadow roots.
+            return is_gt(treeOrder<ComposedTree>(*firstNode, *secondNode));
         }
 
         return frameToTraversalIndexMap.get(firstFrame) > frameToTraversalIndexMap.get(secondFrame);

Modified: trunk/Source/WebCore/page/mac/ServicesOverlayController.mm (269252 => 269253)


--- trunk/Source/WebCore/page/mac/ServicesOverlayController.mm	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/page/mac/ServicesOverlayController.mm	2020-11-02 18:53:36 UTC (rev 269253)
@@ -630,7 +630,7 @@
         return nullptr;
 
     for (auto& highlight : m_potentialHighlights) {
-        if (highlight->type() == Highlight::TelephoneNumberType && contains(highlight->range(), *selectionRange))
+        if (highlight->type() == Highlight::TelephoneNumberType && contains<ComposedTree>(highlight->range(), *selectionRange))
             return highlight.get();
     }
 

Modified: trunk/Source/WebCore/testing/Internals.cpp (269252 => 269253)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -6001,5 +6001,44 @@
 }
 #endif
 
+constexpr ASCIILiteral string(PartialOrdering ordering)
+{
+    if (is_lt(ordering))
+        return "less"_s;
+    if (is_gt(ordering))
+        return "greater"_s;
+    if (is_eq(ordering))
+        return "equivalent"_s;
+    return "unordered"_s;
+}
 
+constexpr TreeType convertType(Internals::TreeType type)
+{
+    switch (type) {
+    case Internals::Tree:
+        return Tree;
+    case Internals::ShadowIncludingTree:
+        return ShadowIncludingTree;
+    case Internals::ComposedTree:
+        return ComposedTree;
+    }
+    ASSERT_NOT_REACHED();
+    return Tree;
+}
+
+String Internals::treeOrder(Node& a, Node& b, TreeType type)
+{
+    return string(treeOrderForTesting(convertType(type), a, b));
+}
+
+bool Internals::rangeContainsNode(const AbstractRange& range, Node& node, TreeType type)
+{
+    return containsForTesting(convertType(type), makeSimpleRange(range), node);
+}
+
+bool Internals::rangeContainsRange(const AbstractRange& outerRange, const AbstractRange& innerRange, TreeType type)
+{
+    return containsForTesting(convertType(type), makeSimpleRange(outerRange), makeSimpleRange(innerRange));
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/testing/Internals.h (269252 => 269253)


--- trunk/Source/WebCore/testing/Internals.h	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/testing/Internals.h	2020-11-02 18:53:36 UTC (rev 269253)
@@ -47,6 +47,7 @@
 
 namespace WebCore {
 
+class AbstractRange;
 class AnimationTimeline;
 class AudioContext;
 class AudioTrack;
@@ -1063,6 +1064,11 @@
     ExceptionOr<void> sendMediaSessionAction(MediaSession&, const MediaSessionActionDetails&);
 #endif
 
+    enum TreeType : uint8_t { Tree, ShadowIncludingTree, ComposedTree };
+    String treeOrder(Node&, Node&, TreeType);
+    bool rangeContainsNode(const AbstractRange&, Node&, TreeType);
+    bool rangeContainsRange(const AbstractRange&, const AbstractRange&, TreeType);
+
 private:
     explicit Internals(Document&);
     Document* contextDocument() const;

Modified: trunk/Source/WebCore/testing/Internals.idl (269252 => 269253)


--- trunk/Source/WebCore/testing/Internals.idl	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebCore/testing/Internals.idl	2020-11-02 18:53:36 UTC (rev 269253)
@@ -93,6 +93,12 @@
     "XXXL"
 };
 
+enum TreeType {
+    "Tree",
+    "ShadowIncludingTree",
+    "ComposedTree"
+};
+
 [
     ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
     Conditional=VIDEO,
@@ -958,4 +964,8 @@
 
     [Conditional=MEDIA_SESSION, MayThrowException] double currentMediaSessionPosition(MediaSession session);
     [Conditional=MEDIA_SESSION, MayThrowException] undefined sendMediaSessionAction(MediaSession session, MediaSessionActionDetails actionDetails);
+
+    DOMString treeOrder(Node a, Node b, optional TreeType tree = "Tree");
+    boolean rangeContainsNode(AbstractRange range, Node node, optional TreeType tree = "Tree");
+    boolean rangeContainsRange(AbstractRange outerRange, AbstractRange innerRange, optional TreeType tree = "Tree");
 };

Modified: trunk/Source/WebKit/ChangeLog (269252 => 269253)


--- trunk/Source/WebKit/ChangeLog	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebKit/ChangeLog	2020-11-02 18:53:36 UTC (rev 269253)
@@ -1,3 +1,13 @@
+2020-11-01  Darin Adler  <[email protected]>
+
+        Start removing functions that implicitly use composed tree
+        https://bugs.webkit.org/show_bug.cgi?id=218424
+
+        Reviewed by Ryosuke Niwa.
+
+        * WebProcess/WebPage/glib/WebPageGLib.cpp:
+        (WebKit::WebPage::getPlatformEditorState const): Use contains<ComposedTree>.
+
 2020-11-02  David Kilzer  <[email protected]>
 
         Fix link error with WebKit.framework

Modified: trunk/Source/WebKit/WebProcess/WebPage/glib/WebPageGLib.cpp (269252 => 269253)


--- trunk/Source/WebKit/WebProcess/WebPage/glib/WebPageGLib.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Source/WebKit/WebProcess/WebPage/glib/WebPageGLib.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -109,7 +109,7 @@
         auto surroundingStart = startOfEditableContent(selectionStart);
         auto surroundingRange = makeSimpleRange(surroundingStart, endOfEditableContent(selectionStart));
         auto compositionRange = frame.editor().compositionRange();
-        if (surroundingRange && compositionRange && contains(*surroundingRange, *compositionRange)) {
+        if (surroundingRange && compositionRange && contains<ComposedTree>(*surroundingRange, *compositionRange)) {
             auto beforeText = plainText({ surroundingRange->start, compositionRange->start });
             postLayoutData.surroundingContext = beforeText + plainText({ compositionRange->end, surroundingRange->end });
             postLayoutData.surroundingContextCursorPosition = beforeText.length();

Modified: trunk/Tools/ChangeLog (269252 => 269253)


--- trunk/Tools/ChangeLog	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Tools/ChangeLog	2020-11-02 18:53:36 UTC (rev 269253)
@@ -1,3 +1,14 @@
+2020-11-01  Darin Adler  <[email protected]>
+
+        Start removing functions that implicitly use composed tree
+        https://bugs.webkit.org/show_bug.cgi?id=218424
+
+        Reviewed by Ryosuke Niwa.
+
+        * TestWebKitAPI/Tests/WebCore/DocumentOrder.cpp: Moved the tests of documentOrder
+        for two nodes and contains for range/range or range/node into internals-based tests
+        in the LayoutTests directory. Eventually we'll move the rest of these tests, too.
+
 2020-11-02  Angelos Oikonomopoulos  <[email protected]>
 
         Don't fail the build on S3 upload failure

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/DocumentOrder.cpp (269252 => 269253)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/DocumentOrder.cpp	2020-11-02 18:35:19 UTC (rev 269252)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/DocumentOrder.cpp	2020-11-02 18:53:36 UTC (rev 269253)
@@ -44,10 +44,6 @@
 #define EXPECT_LESS(a, b) EXPECT_BOTH(a, b, "less", "greater")
 #define EXPECT_UNORDERED(a, b) EXPECT_BOTH(a, b, "unordered", "unordered")
 
-#define EXPECT_CONTAINS_SELF(a) EXPECT_TRUE(contains(a, a))
-#define EXPECT_NESTED(a, b) do { EXPECT_TRUE(contains(a, b)); EXPECT_FALSE(contains(b, a)); } while (0)
-#define EXPECT_NOT_CONTAINED(a, b) do { EXPECT_FALSE(contains(a, b)); EXPECT_FALSE(contains(b, a)); } while (0)
-
 #define EXPECT_INTERSECTS_SELF(a) EXPECT_TRUE(intersects(a, a))
 #define EXPECT_INTERSECTS_BOTH_WAYS(a, b) do { EXPECT_TRUE(intersects(a, b)); EXPECT_TRUE(intersects(b, a)); } while (0)
 #define EXPECT_NOT_INTERSECTING_BOTH_WAYS(a, b) do { EXPECT_FALSE(intersects(a, b)); EXPECT_FALSE(intersects(b, a)); } while (0)
@@ -93,77 +89,6 @@
     return ordering;
 }
 
-TEST(DocumentOrder, Node)
-{
-    HTMLNames::init();
-
-    auto document = createDocument();
-    auto& body = *document->body();
-
-    EXPECT_EQUIVALENT(document, document);
-
-    EXPECT_EQUIVALENT(body, body);
-    EXPECT_LESS(document, body);
-    EXPECT_LESS(document, body);
-
-    auto a = HTMLDivElement::create(document);
-    EXPECT_EQUIVALENT(a, a);
-    EXPECT_UNORDERED(body, a);
-    EXPECT_UNORDERED(a, body);
-
-    body.appendChild(a);
-    EXPECT_LESS(body, a);
-    EXPECT_LESS(body, a);
-    EXPECT_EQUIVALENT(a, a);
-
-    auto b = HTMLDivElement::create(document);
-    body.appendChild(b);
-    EXPECT_LESS(body, b);
-    EXPECT_LESS(body, b);
-    EXPECT_LESS(a, b);
-    EXPECT_LESS(a, b);
-
-    auto c = HTMLDivElement::create(document);
-    b->appendChild(c);
-    EXPECT_LESS(body, c);
-    EXPECT_LESS(body, c);
-    EXPECT_LESS(a, c);
-    EXPECT_LESS(b, c);
-    EXPECT_LESS(a, c);
-    EXPECT_LESS(b, c);
-
-    auto d = HTMLDivElement::create(document);
-    a->appendChild(d);
-    EXPECT_LESS(body, d);
-    EXPECT_LESS(body, d);
-    EXPECT_LESS(a, d);
-    EXPECT_LESS(d, b);
-    EXPECT_LESS(d, c);
-    EXPECT_LESS(a, d);
-    EXPECT_LESS(d, b);
-    EXPECT_LESS(d, c);
-
-    auto e = HTMLDivElement::create(document);
-    auto f = HTMLDivElement::create(document);
-    e->appendChild(f);
-    EXPECT_UNORDERED(body, f);
-    EXPECT_UNORDERED(f, body);
-
-    auto g = HTMLTextAreaElement::create(document);
-    c->appendChild(g);
-    EXPECT_LESS(body, g);
-
-    auto& h = *g->innerTextElement();
-    EXPECT_LESS(body, h);
-
-    auto& i = a->attachShadow({ ShadowRootMode::Closed }).releaseReturnValue();
-    EXPECT_LESS(body, i);
-    EXPECT_LESS(i, d);
-    EXPECT_LESS(i, b);
-
-    // FIXME: Add tests that cover slots and assignment.
-}
-
 TEST(DocumentOrder, BoundaryPointOffsetZero)
 {
     auto document = createDocument();
@@ -535,61 +460,6 @@
 
 #endif
 
-TEST(DocumentOrder, RangeContainsRange)
-{
-    auto document = createDocument();
-    auto& documentElement = *document->documentElement();
-    auto& body = *document->body();
-
-    EXPECT_CONTAINS_SELF(makeRangeSelectingNodeContents(document));
-    EXPECT_CONTAINS_SELF(makeRangeSelectingNodeContents(documentElement));
-    EXPECT_CONTAINS_SELF(makeRangeSelectingNodeContents(body));
-
-    EXPECT_NESTED(makeRangeSelectingNodeContents(document), makeRangeSelectingNodeContents(documentElement));
-    EXPECT_NESTED(makeRangeSelectingNodeContents(document), makeRangeSelectingNodeContents(body));
-    EXPECT_NESTED(makeRangeSelectingNodeContents(documentElement), makeRangeSelectingNodeContents(body));
-
-    EXPECT_NESTED(makeRangeSelectingNodeContents(document), makeRangeSelectingNodeContents(documentElement));
-
-    EXPECT_NESTED(makeRangeSelectingNodeContents(documentElement), makeRangeSelectingNodeContents(body));
-
-    EXPECT_NESTED(makeRangeSelectingNodeContents(document), makeSimpleRange(makeBoundaryPoint(document, 0)));
-    EXPECT_NESTED(makeRangeSelectingNodeContents(document), makeSimpleRange(makeBoundaryPoint(document, 1)));
-    EXPECT_NOT_CONTAINED(makeRangeSelectingNodeContents(document), makeSimpleRange(makeBoundaryPoint(document, 2)));
-
-    EXPECT_NESTED(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(document, 2)), makeRangeSelectingNodeContents(document));
-    EXPECT_NOT_CONTAINED(makeRangeSelectingNodeContents(document), makeSimpleRange(makeBoundaryPoint(document, 1), makeBoundaryPoint(document, 2)));
-
-    EXPECT_NOT_CONTAINED(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(documentElement, 0)), makeRangeSelectingNodeContents(body));
-    EXPECT_NESTED(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(body, 0)), makeSimpleRange(makeBoundaryPoint(body, 0)));
-
-    auto a = HTMLDivElement::create(document);
-    EXPECT_NOT_CONTAINED(makeRangeSelectingNodeContents(document), makeRangeSelectingNodeContents(a));
-
-    body.appendChild(a);
-
-    auto b = HTMLDivElement::create(document);
-    body.appendChild(b);
-
-    auto c = HTMLDivElement::create(document);
-    b->appendChild(c);
-
-    auto d = HTMLDivElement::create(document);
-    a->appendChild(d);
-
-    auto e = HTMLDivElement::create(document);
-    auto f = HTMLDivElement::create(document);
-    e->appendChild(f);
-    EXPECT_NOT_CONTAINED(makeRangeSelectingNodeContents(body), makeRangeSelectingNodeContents(f));
-
-    auto g = HTMLTextAreaElement::create(document);
-    auto& h = *g->innerTextElement();
-    c->appendChild(g);
-    EXPECT_NESTED(makeRangeSelectingNodeContents(body), makeRangeSelectingNodeContents(h));
-
-    // FIXME: Add tests that cover shadow trees.
-}
-
 TEST(DocumentOrder, RangeIntersectsRange)
 {
     auto document = createDocument();
@@ -645,50 +515,6 @@
     // FIXME: Add tests that cover shadow trees.
 }
 
-TEST(DocumentOrder, RangeContainsNode)
-{
-    auto document = createDocument();
-    auto& documentElement = *document->documentElement();
-    auto& body = *document->body();
-
-    EXPECT_TRUE(contains(makeRangeSelectingNodeContents(document), documentElement));
-    EXPECT_TRUE(contains(makeRangeSelectingNodeContents(document), body));
-    EXPECT_TRUE(contains(makeRangeSelectingNodeContents(documentElement), body));
-
-    EXPECT_FALSE(contains(makeRangeSelectingNodeContents(document), document));
-    EXPECT_FALSE(contains(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(document, 2)), document));
-    EXPECT_FALSE(contains(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(documentElement, 0)), body));
-    EXPECT_FALSE(contains(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(body, 0)), body));
-    EXPECT_FALSE(contains(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(body, 1)), body));
-    EXPECT_TRUE(contains(makeSimpleRange(makeBoundaryPoint(document, 0), makeBoundaryPoint(documentElement, 1)), body));
-
-    auto a = HTMLDivElement::create(document);
-    EXPECT_FALSE(contains(makeRangeSelectingNodeContents(document), a));
-
-    body.appendChild(a);
-
-    auto b = HTMLDivElement::create(document);
-    body.appendChild(b);
-
-    auto c = HTMLDivElement::create(document);
-    b->appendChild(c);
-
-    auto d = HTMLDivElement::create(document);
-    a->appendChild(d);
-
-    auto e = HTMLDivElement::create(document);
-    auto f = HTMLDivElement::create(document);
-    e->appendChild(f);
-    EXPECT_FALSE(contains(makeRangeSelectingNodeContents(body), f));
-
-    auto g = HTMLTextAreaElement::create(document);
-    auto& h = *g->innerTextElement();
-    c->appendChild(g);
-    EXPECT_TRUE(contains(makeRangeSelectingNodeContents(body), h));
-
-    // FIXME: Add tests that cover shadow trees.
-}
-
 TEST(DocumentOrder, RangeIntersectsNode)
 {
     auto document = createDocument();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to