summaryrefslogtreecommitdiffstats
path: root/dom/base/test/test_find.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/test/test_find.html')
-rw-r--r--dom/base/test/test_find.html210
1 files changed, 210 insertions, 0 deletions
diff --git a/dom/base/test/test_find.html b/dom/base/test/test_find.html
new file mode 100644
index 0000000000..f87885b246
--- /dev/null
+++ b/dom/base/test/test_find.html
@@ -0,0 +1,210 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+const t = async_test("Test window.find / nsFind");
+
+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);
+ }
+}
+
+const INLINE_LIKE_DISPLAY_VALUES = [
+ "inline",
+ "inline-grid",
+ "inline-block",
+ "inline-flex",
+];
+
+const BLOCK_LIKE_DISPLAY_VALUES = [
+ "block",
+ "flex",
+ "grid",
+ "list-item",
+ "table-column-group",
+ "table-column",
+ "table-footer-group",
+ "table-header-group",
+ "table-row-group",
+ "table-row",
+ "table",
+];
+
+let runTests = t.step_func_done(function() {
+ testFindable(true, "me and me", `
+ me <div style="display: contents">and</div> me
+ `, "display: contents");
+
+ testFindable(true, "me me", `
+ me <div style="display: none">and</div> me
+ `, "display: none");
+
+ testFindable(false, "me and me", `
+ me <div style="display: none">and</div> me
+ `, "display: none");
+
+ for (const display of INLINE_LIKE_DISPLAY_VALUES) {
+ testFindable(true, "me and me", `
+ me <div style="display: ${display}">and</div> me
+ `, "div display: " + display);
+ testFindable(true, "me and me", `
+ me <span style="display: ${display}">and</span> me
+ `, "span display: " + display);
+ }
+
+ for (const display of BLOCK_LIKE_DISPLAY_VALUES) {
+ testFindable(false, "me and me", `
+ me <div style="display: ${display}">and</div> me
+ `, "div display: " + display);
+ testFindable(false, "me and me", `
+ me <span style="display: ${display}">and</span> me
+ `, "span display: " + display);
+ }
+
+ testFindable(false, "me and me", `
+ me <fieldset>and</fieldset> me
+ `);
+
+ testFindable(true, "This text should be visible", `
+ <div style="visibility: hidden">
+ <div style="visibility: visible">
+ This text should be visible
+ </div>
+ </div>
+ `);
+
+ testFindable(true, "This text should be visible", `
+ <style>:root { overflow: hidden }</style>
+ <div style="overflow: auto;">
+ <div style="height: 300vh"></div>
+ This text should be visible
+ </div>
+ `);
+
+ testFindable(true, "foobar", `
+ <body><script style="display: block;">foobar</` + `script></body>
+ `);
+
+
+ testFindable(true, "Shadow text", function(document) {
+ let div = document.createElement("div");
+ div.attachShadow({ mode: "open" }).innerHTML = `
+ Wohoo, this is Shadow text, yay!
+ `;
+ document.documentElement.appendChild(div);
+ }, "In Shadow DOM");
+
+ testFindable(true, "Shadow text", function(document) {
+ let div = document.createElement("div");
+ div.appendChild(document.createTextNode(
+ "Wohoo, this is Shadow text, yay!"
+ ));
+ div.attachShadow({ mode: "open" }).innerHTML = `<slot></slot>`;
+ document.documentElement.appendChild(div);
+ }, "Slotted content in Shadow DOM");
+
+ // TODO(emilio): This should work in an ideal world.
+ testFindable(false, "Shadow text", function(document) {
+ let div = document.createElement("div");
+ div.appendChild(document.createTextNode("text, yay!"));
+ div.attachShadow({ mode: "open" }).innerHTML = `This is Shadow <slot></slot>`;
+ document.documentElement.appendChild(div);
+ }, "Mixed shadow and non-shadow text");
+
+ testFindable(true, "Shadow", function(document) {
+ document.documentElement.innerHTML = `
+ Sources<span id="host"></span>
+ <div>whatever</div>
+ `;
+ document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = "Shadow text";
+ }, "Test inside a shadow-root mid-match");
+
+ testFindable(false, "Outside shadow", function(document) {
+ document.documentElement.innerHTML = `
+ Outside <div id="host"></div> shadow
+ `;
+ document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = "inside shadow";
+ }, "Block in different subtree");
+
+ // NOTE(emilio): It is probably doable / worth changing this to return true,
+ // maybe, by relaxing the security checks in the ranges nsFind returns or
+ // such.
+ //
+ // See bug 1442466 / bug 1510485 / bug 1505887.
+ testFindable(false, "foo", function(document) {
+ let input = document.createElement("input");
+ input.value = "foo";
+ document.documentElement.appendChild(input);
+ }, "Native anonymous content isn't exposed in window.find");
+
+ // Same as above, but in this case the check is warranted, we shouldn't
+ // expose this range.
+ testFindable(false, "find me", `
+ <style>div::before { content: "Do find me" }</style>
+ <div></div>
+ `, "Pseudo-element");
+
+ // Same as above.
+ testFindable(false, "find me", `
+ <img alt="Do find me">
+ `, "Image alt content");
+
+ // Same as above.
+ testFindable(false, "find me", `
+ <input type="submit" value="Do find me">
+ `, "Submit input value");
+
+ testFindable(false, "\0", `
+ &#0;
+ `);
+
+ testFindable(true, "\0", function(document) {
+ document.documentElement.appendChild(document.createTextNode("\0"));
+ }, "Inserted null characters are findable");
+
+ testFindable(false, "ab", `a<br>b`, "<br> forces a break even if there's no whitespace in between");
+
+ testFindable(true, "history.kafka", `
+ <code>database.history&#8203;.kafka.bootstrap.servers</code>
+ `, "ZWSP should be ignored");
+
+ testFindable(2, " ", "a b c", "Collapsed whitespace");
+
+ // TODO(emilio): This might be worth discussing in the spec. For now
+ // hard-coding our implementation.
+ testFindable(false, "find me", `
+ Do you find <span inert>not findable</span> me?
+ `, "boundary-crossing inert");
+});
+
+window.onload = function() {
+ let iframe = document.createElement("iframe");
+ iframe.onload = runTests;
+ iframe.srcdoc = "<!doctype html><html></html>";
+ document.body.appendChild(iframe);
+};
+</script>
+</body>