[wdspec] Improve stale element and detached shadow root tests.

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

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1822466
gecko-commit: 06767279ae13e109db05bab71f079e0485cfeec5
gecko-reviewers: webdriver-reviewers, jdescottes
diff --git a/webdriver/tests/classic/back/back.py b/webdriver/tests/classic/back/back.py
index 6243432..bc97a9e 100644
--- a/webdriver/tests/classic/back/back.py
+++ b/webdriver/tests/classic/back/back.py
@@ -33,21 +33,35 @@
     assert_success(response)
 
 
-def test_basic(session, inline):
-    url = inline("<div id=foo>")
+# Capability needed as long as no valid certificate is available:
+#   https://github.com/web-platform-tests/wpt/issues/28847
+@pytest.mark.capabilities({"acceptInsecureCerts": True})
+@pytest.mark.parametrize("protocol,parameters", [
+    ("http", ""),
+    ("https", ""),
+    ("https", {"pipe": "header(Cross-Origin-Opener-Policy,same-origin)"})
+], ids=["http", "https", "https coop"])
+def test_seen_nodes(session, get_test_page, protocol, parameters):
+    first_page = get_test_page(parameters=parameters, protocol=protocol)
+    second_page = get_test_page(parameters=parameters, protocol=protocol, domain="alt")
 
-    session.url = url
-    session.url = inline("<div id=bar>")
-    element = session.find.css("#bar", all=False)
+    session.url = first_page
+    session.url = second_page
+
+    element = session.find.css("#custom-element", all=False)
+    shadow_root = element.shadow_root
 
     response = back(session)
     assert_success(response)
 
-    with pytest.raises(error.StaleElementReferenceException):
-        element.property("id")
+    assert session.url == first_page
 
-    assert session.url == url
-    assert session.find.css("#foo", all=False)
+    with pytest.raises(error.StaleElementReferenceException):
+        element.name
+    with pytest.raises(error.DetachedShadowRootException):
+        shadow_root.find_element("css selector", "in-shadow-dom")
+
+    session.find.css("#custom-element", all=False)
 
 
 def test_data_urls(session, inline):
@@ -143,27 +157,3 @@
     assert_success(response)
 
     assert session.url == page
-
-
-# Capability needed as long as no valid certificate is available:
-#   https://github.com/web-platform-tests/wpt/issues/28847
-@pytest.mark.capabilities({"acceptInsecureCerts": True})
-def test_cross_origin(session, url):
-    base_path = ("/webdriver/tests/support/html/subframe.html" +
-                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin")
-    first_page = url(base_path, protocol="https")
-    second_page = url(base_path, protocol="https", domain="alt")
-
-    session.url = first_page
-    session.url = second_page
-
-    elem = session.find.css("#delete", all=False)
-
-    response = back(session)
-    assert_success(response)
-
-    assert session.url == first_page
-
-    with pytest.raises(error.NoSuchElementException):
-        elem.click()
-    elem = session.find.css("#delete", all=False)
diff --git a/webdriver/tests/classic/element_click/navigate.py b/webdriver/tests/classic/element_click/navigate.py
index 4d1c482..96883ad 100644
--- a/webdriver/tests/classic/element_click/navigate.py
+++ b/webdriver/tests/classic/element_click/navigate.py
@@ -170,7 +170,7 @@
 @pytest.mark.capabilities({"acceptInsecureCerts": True})
 def test_link_cross_origin(session, inline, url):
     base_path = ("/webdriver/tests/support/html/subframe.html" +
-                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin")
+                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin)")
     target_page = url(base_path, protocol="https", domain="alt")
 
     session.url = inline("<a href='{}'>click me</a>".format(target_page), protocol="https")
diff --git a/webdriver/tests/classic/forward/forward.py b/webdriver/tests/classic/forward/forward.py
index f27be40..7945f18 100644
--- a/webdriver/tests/classic/forward/forward.py
+++ b/webdriver/tests/classic/forward/forward.py
@@ -61,6 +61,38 @@
     assert element.property("id") == "foo"
 
 
+# Capability needed as long as no valid certificate is available:
+#   https://github.com/web-platform-tests/wpt/issues/28847
+@pytest.mark.capabilities({"acceptInsecureCerts": True})
+@pytest.mark.parametrize("protocol,parameters", [
+    ("http", ""),
+    ("https", ""),
+    ("https", {"pipe": "header(Cross-Origin-Opener-Policy,same-origin)"})
+], ids=["http", "https", "https coop"])
+def test_seen_nodes(session, get_test_page, protocol, parameters):
+    first_page = get_test_page(parameters=parameters, protocol=protocol)
+    second_page = get_test_page(parameters=parameters, protocol=protocol, domain="alt")
+
+    session.url = first_page
+    session.url = second_page
+    session.back()
+
+    element = session.find.css("#custom-element", all=False)
+    shadow_root = element.shadow_root
+
+    response = forward(session)
+    assert_success(response)
+
+    assert session.url == second_page
+
+    with pytest.raises(error.StaleElementReferenceException):
+        element.name
+    with pytest.raises(error.DetachedShadowRootException):
+        shadow_root.find_element("css selector", "in-shadow-dom")
+
+    session.find.css("#custom-element", all=False)
+
+
 def test_data_urls(session, inline):
     test_pages = [
         inline("<p id=1>"),
@@ -168,28 +200,3 @@
     assert_success(response)
 
     assert session.url == page
-
-
-# Capability needed as long as no valid certificate is available:
-#   https://github.com/web-platform-tests/wpt/issues/28847
-@pytest.mark.capabilities({"acceptInsecureCerts": True})
-def test_cross_origin(session, url):
-    base_path = ("/webdriver/tests/support/html/subframe.html" +
-                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin")
-    first_page = url(base_path, protocol="https")
-    second_page = url(base_path, protocol="https", domain="alt")
-
-    session.url = first_page
-    session.url = second_page
-    session.back()
-
-    elem = session.find.css("#delete", all=False)
-
-    response = forward(session)
-    assert_success(response)
-
-    assert session.url == second_page
-
-    with pytest.raises(error.NoSuchElementException):
-        elem.click()
-    elem = session.find.css("#delete", all=False)
diff --git a/webdriver/tests/classic/get_window_handle/get.py b/webdriver/tests/classic/get_window_handle/get.py
index 68441da..50ff0d3 100644
--- a/webdriver/tests/classic/get_window_handle/get.py
+++ b/webdriver/tests/classic/get_window_handle/get.py
@@ -28,7 +28,7 @@
 @pytest.mark.capabilities({"acceptInsecureCerts": True})
 def test_navigation_with_coop_headers(session, url):
     base_path = ("/webdriver/tests/support/html/subframe.html" +
-                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin")
+                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin)")
 
     session.url = url(base_path, protocol="https")
     response = get_window_handle(session)
diff --git a/webdriver/tests/classic/navigate_to/navigate.py b/webdriver/tests/classic/navigate_to/navigate.py
index d61377a..a9ff3f6 100644
--- a/webdriver/tests/classic/navigate_to/navigate.py
+++ b/webdriver/tests/classic/navigate_to/navigate.py
@@ -39,45 +39,38 @@
     assert session.url == doc
 
 
-def test_basic(session, inline):
-    url = inline("<div id=foo>")
-
-    session.url = inline("<div id=bar>")
-    element = session.find.css("#bar", all=False)
-
-    response = navigate_to(session, url)
-    assert_success(response)
-
-    with pytest.raises(error.StaleElementReferenceException):
-        element.property("id")
-
-    assert session.url == url
-    assert session.find.css("#foo", all=False)
-
-
-# Capability needed as long as no valid certificate is available:
-#   https://github.com/web-platform-tests/wpt/issues/28847
-@pytest.mark.capabilities({"acceptInsecureCerts": True})
-def test_cross_origin(session, inline, url):
-    base_path = ("/webdriver/tests/support/html/subframe.html" +
-                 "?pipe=header(Cross-Origin-Opener-Policy,same-origin")
-    first_page = url(base_path, protocol="https")
-    second_page = url(base_path, protocol="https", domain="alt")
+@pytest.mark.parametrize("protocol,parameters", [
+    ("http", ""),
+    ("https", ""),
+    ("https", {"pipe": "header(Cross-Origin-Opener-Policy,same-origin)"})
+], ids=[
+    "http",
+    "https",
+    "https coop"
+])
+def test_seen_nodes(session, get_test_page, protocol, parameters):
+    first_page = get_test_page(parameters=parameters, protocol=protocol)
+    second_page = get_test_page(parameters=parameters, protocol=protocol, domain="alt")
 
     response = navigate_to(session, first_page)
     assert_success(response)
 
     assert session.url == first_page
-    elem = session.find.css("#delete", all=False)
+
+    element = session.find.css("#custom-element", all=False)
+    shadow_root = element.shadow_root
 
     response = navigate_to(session, second_page)
     assert_success(response)
 
     assert session.url == second_page
-    with pytest.raises(error.NoSuchElementException):
-        elem.click()
 
-    session.find.css("#delete", all=False)
+    with pytest.raises(error.StaleElementReferenceException):
+        element.name
+    with pytest.raises(error.DetachedShadowRootException):
+        shadow_root.find_element("css selector", "in-shadow-dom")
+
+    session.find.css("#custom-element", all=False)
 
 
 @pytest.mark.capabilities({"pageLoadStrategy": "eager"})
diff --git a/webdriver/tests/classic/refresh/refresh.py b/webdriver/tests/classic/refresh/refresh.py
index b364713..93a71bb 100644
--- a/webdriver/tests/classic/refresh/refresh.py
+++ b/webdriver/tests/classic/refresh/refresh.py
@@ -39,20 +39,31 @@
     assert session.find.css("#foo", all=False)
 
 
-def test_basic(session, inline):
-    url = inline("<div id=foo>")
+# Capability needed as long as no valid certificate is available:
+#   https://github.com/web-platform-tests/wpt/issues/28847
+@pytest.mark.capabilities({"acceptInsecureCerts": True})
+@pytest.mark.parametrize("protocol,parameters", [
+    ("http", ""),
+    ("https", ""),
+    ("https", {"pipe": "header(Cross-Origin-Opener-Policy,same-origin)"})
+], ids=["http", "https", "https coop"])
+def test_seen_nodes(session, get_test_page, protocol, parameters):
+    page = get_test_page(parameters=parameters, protocol=protocol)
 
-    session.url = url
-    element = session.find.css("#foo", all=False)
+    session.url = page
+
+    element = session.find.css("#custom-element", all=False)
+    shadow_root = element.shadow_root
 
     response = refresh(session)
     assert_success(response)
 
     with pytest.raises(error.StaleElementReferenceException):
-        element.property("id")
+        element.name
+    with pytest.raises(error.DetachedShadowRootException):
+        shadow_root.find_element("css selector", "in-shadow-dom")
 
-    assert session.url == url
-    assert session.find.css("#foo", all=False)
+    session.find.css("#custom-element", all=False)
 
 
 def test_dismissed_beforeunload(session, inline):
diff --git a/webdriver/tests/support/fixtures.py b/webdriver/tests/support/fixtures.py
index eca9fda..ba166ae 100644
--- a/webdriver/tests/support/fixtures.py
+++ b/webdriver/tests/support/fixtures.py
@@ -280,7 +280,8 @@
         frame_doc=None,
         shadow_doc=None,
         nested_shadow_dom=False,
-        shadow_root_mode="open"
+        shadow_root_mode="open",
+        **kwargs
     ):
         if frame_doc is None:
             frame_doc = """<div id="in-frame"><input type="checkbox"/></div>"""
@@ -355,9 +356,10 @@
             </script>"""
 
         if as_frame:
-            return inline(iframe(page_data))
+            iframe_data = iframe(page_data, **kwargs)
+            return inline(iframe_data, **kwargs)
         else:
-            return inline(page_data)
+            return inline(page_data, **kwargs)
 
     return get_test_page
 
diff --git a/webdriver/tests/support/inline.py b/webdriver/tests/support/inline.py
index 494ca74..6f08a7c 100644
--- a/webdriver/tests/support/inline.py
+++ b/webdriver/tests/support/inline.py
@@ -25,14 +25,21 @@
 }
 
 
-def build_inline(build_url, src, doctype="html", mime=None, charset=None, **kwargs):
+def build_inline(
+    build_url, src, doctype="html", mime=None, charset=None, parameters=None, **kwargs
+):
     if mime is None:
         mime = MIME_TYPES[doctype]
     if charset is None:
         charset = "UTF-8"
+    if parameters is None:
+        parameters = {}
+
     doc = BOILERPLATES[doctype].format(charset=charset, src=src)
 
     query = {"doc": doc, "mime": mime, "charset": charset}
+    query.update(parameters)
+
     return build_url(
         "/webdriver/tests/support/inline.py",
         query=urlencode(query),