summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js')
-rw-r--r--testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js b/testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js
new file mode 100644
index 0000000000..0d4e4b82d9
--- /dev/null
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/dir-assorted.window.js
@@ -0,0 +1,115 @@
+test(() => {
+ assert_true(document.documentElement.matches(":dir(ltr)"));
+}, "Root element has a direction");
+
+test(() => {
+ const ele = document.createElement("foobar");
+ assert_true(ele.matches(":dir(ltr)"));
+}, "Element outside the document tree has a direction");
+
+test(() => {
+ const ele = document.createElementNS("foobar", "foobar");
+ assert_true(ele.matches(":dir(ltr)"));
+}, "Non-HTML element outside the document tree has a direction");
+
+test(() => {
+ const ele = document.createElement("foobar");
+ ele.dir = "rtl";
+ const ele2 = document.createElement("foobar");
+ ele.append(ele2);
+ assert_true(ele2.matches(":dir(rtl)"));
+ ele.dir = "ltr";
+ assert_true(ele2.matches(":dir(ltr)"), "direction after dynamic change");
+}, "Element without direction has parent element direction");
+
+test(() => {
+ const ele = document.createElement("foobar");
+ ele.dir = "rtl";
+ const ele2 = document.createElementNS("foobar", "foobar");
+ ele.append(ele2);
+ assert_true(ele2.matches(":dir(rtl)"));
+ ele.dir = "ltr";
+ assert_true(ele2.matches(":dir(ltr)"), "direction after dynamic change");
+}, "Non-HTML element without direction has parent element direction");
+
+test(() => {
+ let container1 = document.createElement("div");
+ document.body.appendChild(container1);
+ let container2 = document.createElement("div");
+
+ for (let container of [container1, container2]) {
+ container.dir = "rtl";
+ let e = document.createElement("div");
+ assert_true(e.matches(":dir(ltr)"));
+ container.appendChild(e);
+ assert_false(e.matches(":dir(ltr)"));
+ e.remove();
+ assert_true(e.matches(":dir(ltr)"));
+ }
+
+ container1.remove();
+}, "dir inheritance is correct after insertion and removal from document");
+
+test(() => {
+ const ele = document.createElement("foobar");
+ ele.dir = "auto";
+ const ele2 = document.createElementNS("foobar", "foobar");
+ ele.append(ele2);
+ const text = document.createTextNode("\u05D0\u05D1\u05D2");
+ ele2.append(text);
+ assert_true(ele.matches(":dir(rtl)"), "is RTL before change");
+ assert_true(ele2.matches(":dir(rtl)"), "child is RTL before change");
+ text.data = "ABC";
+ assert_true(ele.matches(":dir(ltr)"), "is LTR after change");
+ assert_true(ele2.matches(":dir(ltr)"), "child is LTR after change");
+}, "Non-HTML element text contents influence dir=auto");
+
+test(() => {
+ const e1 = document.createElement("div");
+ e1.dir = "auto";
+ const e2 = document.createElement("div");
+ e2.dir = "auto";
+ e2.innerText = "A";
+ e1.append(e2);
+ assert_true(e1.matches(":dir(ltr)"), "parent is LTR before changes");
+ assert_true(e2.matches(":dir(ltr)"), "child is LTR before changes");
+ e2.removeAttribute("dir");
+ assert_true(e1.matches(":dir(ltr)"), "parent is LTR after removing dir attribute on child");
+ assert_true(e2.matches(":dir(ltr)"), "child is LTR after removing dir attribute on child");
+ e2.firstChild.data = "\u05D0";
+ assert_false(e1.matches(":dir(ltr)"), "parent is RTL after changing text in child");
+ assert_false(e2.matches(":dir(ltr)"), "child is RTL after changing text in child");
+}, "text changes apply to dir=auto on further ancestor after removing dir=auto from closer ancestor");
+
+for (const bdi_test of [
+ { markup: "<bdi dir=ltr>A</bdi>", expected: "ltr", desc: "dir=ltr with LTR contents" },
+ { markup: "<bdi dir=ltr>\u05d0</bdi>", expected: "ltr", desc: "dir=ltr with RTL contents" },
+ { markup: "<bdi dir=ltr></bdi>", expected: "ltr", desc: "dir=ltr empty" },
+ { markup: "<bdi dir=rtl>A</bdi>", expected: "rtl", desc: "dir=rtl with LTR contents" },
+ { markup: "<bdi dir=rtl>\u05d0</bdi>", expected: "rtl", desc: "dir=rtl with RTL contents" },
+ { markup: "<bdi dir=rtl></bdi>", expected: "rtl", desc: "dir=rtl empty" },
+ { markup: "<bdi dir=auto>A</bdi>", expected: "ltr", desc: "dir=auto with LTR contents" },
+ { markup: "<bdi dir=auto>\u05d0</bdi>", expected: "rtl", desc: "dir=auto with RTL contents" },
+ { markup: "<bdi dir=auto></bdi>", expected: "parent", desc: "dir=auto empty" },
+ { markup: "<bdi>A</bdi>", expected: "ltr", desc: "no dir attribute with LTR contents" },
+ { markup: "<bdi>\u05d0</bdi>", expected: "rtl", desc: "no dir attribute with RTL contents" },
+ { markup: "<bdi></bdi>", expected: "parent", desc: "no dir attribute empty" },
+]) {
+ for (const parent_dir of [ "ltr", "rtl" ]) {
+ test(() => {
+ const parent_element = document.createElement("div");
+ parent_element.dir = parent_dir;
+ document.body.appendChild(parent_element);
+ parent_element.innerHTML = bdi_test.markup;
+ const bdi_element = parent_element.querySelector("bdi");
+ let expected = bdi_test.expected;
+ if (expected == "parent") {
+ expected = parent_dir;
+ }
+ const not_expected = (expected == "ltr") ? "rtl" : "ltr";
+ assert_true(bdi_element.matches(`:dir(${expected})`));
+ assert_false(bdi_element.matches(`:dir(${not_expected})`));
+ parent_element.remove();
+ }, `directionality of bdi elements: ${bdi_test.desc} in ${parent_dir} parent`);
+ }
+}