summaryrefslogtreecommitdiffstats
path: root/layout/base/tests/chrome/test_css_visibility_propagation.xhtml
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base/tests/chrome/test_css_visibility_propagation.xhtml')
-rw-r--r--layout/base/tests/chrome/test_css_visibility_propagation.xhtml209
1 files changed, 209 insertions, 0 deletions
diff --git a/layout/base/tests/chrome/test_css_visibility_propagation.xhtml b/layout/base/tests/chrome/test_css_visibility_propagation.xhtml
new file mode 100644
index 0000000000..7b1b082064
--- /dev/null
+++ b/layout/base/tests/chrome/test_css_visibility_propagation.xhtml
@@ -0,0 +1,209 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+<body xmlns="http://www.w3.org/1999/xhtml"></body>
+<script>
+<![CDATA[
+const baseURL = "chrome://mochitests/content/chrome/layout/base/tests/chrome/";
+
+function checkHiddenEmbeddederState(window1, window2, expected1, expected2)
+{
+ ok(!window1.browsingContext.isUnderHiddenEmbedderElement, "window1 visible state");
+ ok(!window2.browsingContext.isUnderHiddenEmbedderElement, "window2 visible state");
+ is(window1.document.querySelector("browser").contentWindow.browsingContext.isUnderHiddenEmbedderElement, !expected1,
+ "window1 child visible state");
+ is(window2.document.querySelector("browser").contentWindow.browsingContext.isUnderHiddenEmbedderElement, !expected2,
+ "window2 child visible state");
+}
+
+// Tests that browser visibility is updated when it's swapped.
+add_task(async () => {
+ // Open two new windows to swap iframes.
+ const window1 = window.browsingContext.topChromeWindow.open(
+ baseURL + "window_css_visibility_propagation-1.xhtml",
+ "_blank", "chrome");
+ const window2 = window.browsingContext.topChromeWindow.open(
+ baseURL + "window_css_visibility_propagation-2.xhtml",
+ "_blank", "chrome");
+
+ const loadWindow1 =
+ new Promise(resolve => window1.addEventListener("load", resolve));
+ const loadWindow2 =
+ new Promise(resolve => window2.addEventListener("load", resolve));
+
+ await Promise.all([ loadWindow1, loadWindow2 ]);
+
+ checkHiddenEmbeddederState(window1, window2, true, true);
+
+ // Hide the parent of browser2.
+ let parent = window2.document.getElementById("parent");
+ parent.style.visibility = "hidden";
+ parent.getBoundingClientRect();
+
+ checkHiddenEmbeddederState(window1, window2, true, false);
+
+ const browser2 = window2.document.querySelector("browser");
+ let target = browser2.contentDocument.getElementById("button");
+ target.focus();
+
+ // browser2 is now in a visibility:hidden element in window2,
+ // so that Element.focus() shouldn't work.
+ isnot(browser2.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible browser");
+
+ // Make the parent visible.
+ parent.style.visibility = "";
+ parent.getBoundingClientRect();
+
+ checkHiddenEmbeddederState(window1, window2, true, true);
+
+ target.focus();
+
+ // browser2 is visible now, so focus() should work.
+ is(browser2.contentDocument.activeElement, target,
+ "Element.focus() should work in visible browser");
+
+ target.blur();
+ isnot(browser2.contentDocument.activeElement, target,
+ "The target element shouldn't be activeElement");
+
+ // Swap the content in browser1 for the content in browser2.
+ const browser1 = window1.document.querySelector("browser");
+ browser1.swapFrameLoaders(browser2);
+ await new Promise(resolve => setTimeout(resolve, 0));
+
+ target = browser1.contentDocument.getElementById("button");
+ target.focus();
+
+ // browser1 is in a visibility:hidden element in window1,
+ // so that Element.focus() shouldn't work.
+ isnot(browser1.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible browser");
+
+ checkHiddenEmbeddederState(window1, window2, false, true);
+
+ parent = window1.document.getElementById("parent");
+ parent.style.visibility = "visible";
+ parent.getBoundingClientRect();
+
+ checkHiddenEmbeddederState(window1, window2, true, true);
+
+ target.focus();
+
+ // Now browser1 is in a visibility:visible element, so that
+ // Element.focus() should just work.
+ is(browser1.contentDocument.activeElement, target,
+ "Element.focus() should work in visible browser");
+
+ window1.close();
+ window2.close();
+});
+
+// Tests that ancestor's visibility change doesn't clobber child
+// iframe's visibility if the child iframe is hidden by an
+// element in the ancestor document.
+add_task(async () => {
+ const tabReady = new Promise(resolve => {
+ window.addEventListener("message", event => {
+ if (event.data == "ready") {
+ resolve();
+ }
+ }, { once: true });
+ });
+ const tabWindow =
+ window.open(baseURL + "window_css_visibility_propagation-3.html");
+ await tabReady;
+
+ const childIFrame = tabWindow.document.querySelector("iframe");
+
+ const grandChildBrowser =
+ childIFrame.contentDocument.querySelector("browser");
+ let target = grandChildBrowser.contentDocument.getElementById("button");
+ target.focus();
+
+ ok(!tabWindow.browsingContext.isUnderHiddenEmbedderElement, "tab window is visible");
+ ok(!childIFrame.browsingContext.isUnderHiddenEmbedderElement, "iframe is visible");
+ ok(!grandChildBrowser.browsingContext.isUnderHiddenEmbedderElement, "grandchild is visible");
+
+ is(grandChildBrowser.contentDocument.activeElement, target,
+ "Element.focus() should work in visible browser");
+ target.blur();
+
+ // Hide the parent element of the grand child browser.
+ let parent = childIFrame.contentDocument.getElementById("parent");
+ parent.style.visibility = "hidden";
+ parent.getBoundingClientRect();
+
+ ok(!tabWindow.browsingContext.isUnderHiddenEmbedderElement, "tab window is visible");
+ ok(!childIFrame.browsingContext.isUnderHiddenEmbedderElement, "iframe is visible");
+ ok(grandChildBrowser.browsingContext.isUnderHiddenEmbedderElement, "grandchild is not visible");
+
+ target.focus();
+
+ isnot(grandChildBrowser.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible browser");
+
+ // Hide the parent element of the child iframe.
+ parent = tabWindow.document.getElementById("parent");
+ parent.style.visibility = "hidden";
+ parent.getBoundingClientRect();
+
+ target.focus();
+
+ ok(!tabWindow.browsingContext.isUnderHiddenEmbedderElement, "tab window is visible");
+ ok(childIFrame.browsingContext.isUnderHiddenEmbedderElement, "iframe is not visible");
+ ok(grandChildBrowser.browsingContext.isUnderHiddenEmbedderElement, "grandchild is not visible");
+
+ isnot(grandChildBrowser.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible iframe");
+
+ // Make the parent element of the child iframe visible.
+ parent.style.visibility = "visible";
+ parent.getBoundingClientRect();
+
+ ok(!tabWindow.browsingContext.isUnderHiddenEmbedderElement, "tab window is visible");
+ ok(!childIFrame.browsingContext.isUnderHiddenEmbedderElement, "iframe is visible");
+ ok(grandChildBrowser.browsingContext.isUnderHiddenEmbedderElement, "grandchild is not visible");
+
+ target.focus();
+
+ // Even if the child iframe is visible, but still the grand child is
+ // hidden by the parent element of the grand child browser so that
+ // we can't focus to the element in the grand child browser.
+ isnot(grandChildBrowser.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible browser");
+
+ tabWindow.close();
+});
+
+// Tests that an iframe is initially hidden by a visibility:hidden element in
+// the parent document.
+add_task(async () => {
+ const tabReady = new Promise(resolve => {
+ window.addEventListener("message", event => {
+ if (event.data == "ready") {
+ resolve();
+ }
+ }, { once: true });
+ });
+ const tabWindow =
+ window.open(baseURL + "window_css_visibility_propagation-4.html");
+ await tabReady;
+
+ const iframe = tabWindow.document.querySelector("iframe");
+ let target = iframe.contentDocument.getElementById("button");
+ target.focus();
+
+ ok(!tabWindow.browsingContext.isUnderHiddenEmbedderElement, "tab window is visible");
+ ok(iframe.browsingContext.isUnderHiddenEmbedderElement, "iframe is not visible");
+
+ isnot(iframe.contentDocument.activeElement, target,
+ "Element.focus() shouldn't work in invisible iframe");
+
+ tabWindow.close();
+});
+]]>
+</script>
+</window>