Import Cobalt 19.master.0.203780

Includes the following patches:
  https://cobalt-review.googlesource.com/c/cobalt/+/5210
    by errong.leng@samsung.com
  https://cobalt-review.googlesource.com/c/cobalt/+/5270
    by linus.wang@samsung.com
diff --git a/src/third_party/web_platform_tests/selection/dir-manual.html b/src/third_party/web_platform_tests/selection/dir-manual.html
new file mode 100644
index 0000000..39cf655
--- /dev/null
+++ b/src/third_party/web_platform_tests/selection/dir-manual.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<title>Selection direction tests</title>
+<meta charset=utf-8>
+<div id=test>
+    <p>This is a manual test, since there's no way to synthesize keyboard or
+    mouse input.  Click after the letter "c" in the following paragraph and
+    drag backwards so that both the "b" and the "c" are highlighted, then click
+    the "Test" button:
+
+    <p>abcd <button onclick=testDirection()>Test</button>
+
+    <p>efghi
+</div>
+<div id=log></div>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+setup({explicit_done: true});
+
+function testDirection() {
+    var testDiv = document.getElementById("test");
+    var p = testDiv.getElementsByTagName("p")[1].firstChild;
+    var selection = getSelection();
+    var range = selection.getRangeAt(0);
+    test(function() {
+        assert_equals(range.toString(), "bc");
+    }, "The expected range is selected");
+    test(function() {
+        assert_equals(selection.anchorNode, p);
+        assert_equals(selection.focusNode, p);
+    }, "Expected node is initially selected");
+    test(function() {
+        assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [1, 3]);
+    }, "Expected offsets are initially selected (maybe not in order)");
+    test(function() {
+        assert_equals(selection.anchorOffset, 3);
+        assert_equals(selection.focusOffset, 1);
+    }, "Offsets are backwards for initial selection"),
+    test(function() {
+        assert_equals(selection.anchorNode, range.endContainer);
+        assert_equals(selection.anchorOffset, range.endOffset);
+        assert_equals(selection.focusNode, range.startContainer);
+        assert_equals(selection.focusOffset, range.startOffset);
+    }, "Offsets match the range for initial selection");
+
+    // Per spec, the direction of the selection remains even if you zap a range
+    // and add a new one.
+    test(function() {
+        selection.removeRange(range);
+        range = document.createRange();
+        p = testDiv.getElementsByTagName("p")[0].firstChild;
+        range.setStart(p, 0);
+        range.setEnd(p, 4);
+        assert_equals(range.toString(), "This");
+        selection.addRange(range);
+    }, "removeRange()/addRange() successful");
+    test(function() {
+        assert_equals(selection.anchorNode, p);
+        assert_equals(selection.focusNode, p);
+    }, "Expected node is selected after remove/addRange()");
+    test(function() {
+        assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [0, 4]);
+    }, "Expected offsets are selected after remove/addRange() (maybe not in order)");
+    test(function() {
+        assert_equals(selection.anchorOffset, 4);
+        assert_equals(selection.focusOffset, 0);
+    }, "Offsets are backwards after remove/addRange()"),
+    test(function() {
+        assert_equals(selection.anchorNode, range.endContainer);
+        assert_equals(selection.anchorOffset, range.endOffset);
+        assert_equals(selection.focusNode, range.startContainer);
+        assert_equals(selection.focusOffset, range.startOffset);
+    }, "Offsets match the range after remove/addRange()");
+
+    // But if you call removeAllRanges(), the direction should reset to
+    // forwards.
+    test(function() {
+        selection.removeAllRanges();
+        range = document.createRange();
+        p = testDiv.getElementsByTagName("p")[2].firstChild;
+        range.setStart(p, 2);
+        range.setEnd(p, 5);
+        assert_equals(range.toString(), "ghi");
+        selection.addRange(range);
+    }, "removeAllRanges() successful");
+    test(function() {
+        assert_equals(selection.anchorNode, p);
+        assert_equals(selection.focusNode, p);
+    }, "Expected node is selected after removeAllRanges()");
+    test(function() {
+        assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [2, 5]);
+    }, "Expected offsets are selected after removeAllRanges() (maybe not in order)");
+    test(function() {
+        assert_equals(selection.anchorOffset, 2);
+        assert_equals(selection.focusOffset, 5);
+    }, "Offsets are forwards after removeAllRanges()");
+    test(function() {
+        assert_equals(selection.anchorNode, range.startContainer);
+        assert_equals(selection.anchorOffset, range.startOffset);
+        assert_equals(selection.focusNode, range.endContainer);
+        assert_equals(selection.focusOffset, range.endOffset);
+    }, "Offsets match the range after removeAllRanges()");
+
+    done();
+}
+</script>