Prototype a user-find css property to control findability of text.

Nightly-only for now waiting on CSSWG discussion.

Differential Revision: https://phabricator.services.mozilla.com/D199727

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1868316
gecko-commit: 6fdde7dce00345bc568706b0cf7de521b91ba75a
gecko-reviewers: jfkthame
diff --git a/css/css-ui/inheritance.html b/css/css-ui/inheritance.html
index 9a2efdd..1eaa901 100644
--- a/css/css-ui/inheritance.html
+++ b/css/css-ui/inheritance.html
@@ -37,6 +37,9 @@
 assert_inherited('caret-color', currentColor, 'rgba(42, 53, 64, 0.75)');
 assert_inherited('caret-shape', 'auto', 'bar');
 assert_inherited('cursor', 'auto', 'pointer');
+if (CSS.supports('user-find', 'auto')) {
+  assert_inherited('user-find', 'auto', 'none');
+}
 assert_not_inherited('nav-down', 'auto', '#foo');
 assert_not_inherited('nav-left', 'auto', '#foo');
 assert_not_inherited('nav-right', 'auto', '#foo');
diff --git a/css/css-ui/parsing/user-find-computed.tentative.html b/css/css-ui/parsing/user-find-computed.tentative.html
new file mode 100644
index 0000000..91c0d3f
--- /dev/null
+++ b/css/css-ui/parsing/user-find-computed.tentative.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS UI Level 4: getComputedStyle().userFind</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3460">
+<meta name="assert" content="user-find computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("user-find", "auto");
+test_computed_value("user-find", "none");
+</script>
+</body>
+</html>
diff --git a/css/css-ui/parsing/user-find-invalid.tentative.html b/css/css-ui/parsing/user-find-invalid.tentative.html
new file mode 100644
index 0000000..1d85f28
--- /dev/null
+++ b/css/css-ui/parsing/user-find-invalid.tentative.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS UI Level 4: parsing user-find with invalid values</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3460">
+<meta name="assert" content="user-find supports only the grammar 'auto | none'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("user-find", "visible");
+test_invalid_value("user-find", "never");
+test_invalid_value("user-find", "10px");
+test_invalid_value("user-find", "'none'");
+</script>
+</body>
+</html>
diff --git a/css/css-ui/parsing/user-find-valid.tentative.html b/css/css-ui/parsing/user-find-valid.tentative.html
new file mode 100644
index 0000000..ab963c2
--- /dev/null
+++ b/css/css-ui/parsing/user-find-valid.tentative.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS UI Level 4: parsing user-find with valid values</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3460">
+<meta name="assert" content="user-find supports the grammar 'auto | none'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("user-find", "auto");
+test_valid_value("user-find", "none");
+</script>
+</body>
+</html>
diff --git a/css/css-ui/user-find.tentative.html b/css/css-ui/user-find.tentative.html
new file mode 100644
index 0000000..b15d813
--- /dev/null
+++ b/css/css-ui/user-find.tentative.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3460">
+<title>Basic test for the user-find property</title>
+<body>
+<script>
+const t = async_test("Basic test for the user-find property");
+
+function testFindable(findCount, textToFind, buildDoc, description) {
+  if (typeof findCount == "boolean")
+    findCount = findCount ? 1 : 0;
+  try {
+    const iframe = document.querySelector("iframe")
+    iframe.contentDocument.documentElement.innerHTML =
+      (typeof buildDoc == "string") ? buildDoc : "";
+
+    if (typeof buildDoc == "function")
+      buildDoc(iframe.contentDocument);
+
+    iframe.contentWindow.getSelection().removeAllRanges();
+    for (let i = findCount; i >= 0; --i) {
+      const expectFindable = i != 0;
+      assert_equals(
+        iframe.contentWindow.find(textToFind),
+        expectFindable,
+        "Should be " + (expectFindable ? "" : "not ") + "findable: " + description + ", text: " + textToFind + ", iter: " + (findCount - i + 1)
+      );
+    }
+  } catch (ex) {
+    assert_unreached(ex);
+  }
+}
+
+let runTests = t.step_func_done(function() {
+  testFindable(true, "me", `
+    Find me please
+  `, "sanity test");
+
+  testFindable(false, "me", `
+    <div style="user-find: none">Do not find me please</div>
+  `, "Basic use case");
+
+  testFindable(true, "me", `
+    <div style="user-find: none">Do not find me, but <span style="user-find: auto">find me please</span></div>
+  `, "nested");
+});
+
+window.onload = function() {
+  let iframe = document.createElement("iframe");
+  iframe.onload = runTests;
+  iframe.srcdoc = "<!doctype html><html></html>";
+  document.body.appendChild(iframe);
+};
+</script>
+</body>