Bug 1424635 - Consider DOCUMENT_NODE a valid web element. r?automatedtester
When looking up the parent of <html> using an XPath parent expression
such as "..", the nodeType of the returned HTMLDocument will be 9
(DOCUMENT_NODE). <html> is a valid web element and we should be
able to serialise and return it to the user.
It is worth noting that other WebDriver implementations fail this
test because they fail on the nodeType check.
MozReview-Commit-ID: 4FMJEd8B4PZ
--- a/testing/marionette/element.js
+++ b/testing/marionette/element.js
@@ -26,16 +26,18 @@ this.EXPORTED_SYMBOLS = [
"element",
"WebElement",
];
const {
FIRST_ORDERED_NODE_TYPE,
ORDERED_NODE_ITERATOR_TYPE,
} = Ci.nsIDOMXPathResult;
+const ELEMENT_NODE = 1;
+const DOCUMENT_NODE = 9;
const XBLNS = "http://www.mozilla.org/xbl";
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
/** XUL elements that support checked property. */
const XUL_CHECKED_ELS = new Set([
"button",
"checkbox",
@@ -1085,17 +1087,17 @@ element.isElement = function(node) {
*
* @return {boolean}
* True if <var>node</var> is a DOM element, false otherwise.
*/
element.isDOMElement = function(node) {
return typeof node == "object" &&
node !== null &&
"nodeType" in node &&
- node.nodeType === node.ELEMENT_NODE &&
+ [ELEMENT_NODE, DOCUMENT_NODE].includes(node.nodeType) &&
!element.isXULElement(node);
};
/**
* Ascertains whether <var>el</var> is a XUL- or XBL element.
*
* @param {*} node
* Element thought to be a XUL- or XBL element.
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -524224,17 +524224,17 @@
"a01aa825e0905a0efc3afe9bc3015d448e9618f1",
"testharness"
],
"dom/events/Event-propagation.html": [
"43ec5c9e681c20864a932635889e05969fd7b8f1",
"testharness"
],
"dom/events/Event-subclasses-constructors.html": [
- "5da96a9be09ad5dc69438ba9bd6b2ab58cf77ca1",
+ "52382c89b67be3c3fbb8bccccb6f75a4aaa7975b",
"testharness"
],
"dom/events/Event-timestamp-high-resolution.html": [
"b850d06415afbd533b822efaa59efaee2375065d",
"testharness"
],
"dom/events/Event-timestamp-safe-resolution.html": [
"dd22e8532f7ae8424d0a8ec898841a1c7545d020",
@@ -568224,17 +568224,17 @@
"72e4fc91dac6bdd42437b5034d1692a208a90de9",
"testharness"
],
"service-workers/service-worker/navigation-redirect-to-http.https.html": [
"12f109101a7d6fcb52ab070077297443fa7ab3eb",
"testharness"
],
"service-workers/service-worker/navigation-redirect.https.html": [
- "f8e79356467abba33e8008054c32baabc770fe65",
+ "109f463deeaad2d60d4dab644c782ad633e97a7d",
"testharness"
],
"service-workers/service-worker/onactivate-script-error.https.html": [
"bfef14af67c3a21523b5a7283d7cf86ac288f081",
"testharness"
],
"service-workers/service-worker/oninstall-script-error.https.html": [
"0497bf37f0e3b55a6a4745cae2ec700b6f963fd3",
@@ -576120,17 +576120,17 @@
"84bd0be22d6e250cfefd118d306b2790f67471cc",
"testharness"
],
"web-animations/timing-model/timelines/document-timelines.html": [
"bbe8a5565d88c5697170eba02be6858589383fdf",
"testharness"
],
"web-animations/timing-model/timelines/timelines.html": [
- "8f16dc524470d88f65dbae8c2e98a8a5dbba5465",
+ "50ff28dcf913c66c58818ce92f06f19d00c1e84b",
"testharness"
],
"web-nfc/OWNERS": [
"d42f3f15d00686bf5a5c7c69169ef5cf2554bd7b",
"support"
],
"web-nfc/idlharness.https.html": [
"83c52be8280bba314116ff1337028ea7835ddf43",
@@ -576676,29 +576676,29 @@
"37af63203540dfe11d36fe05d74694f05c6505f2",
"wdspec"
],
"webdriver/tests/element_retrieval/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
"webdriver/tests/element_retrieval/find_element.py": [
- "2a4cdf4c703493f7c90fc3473daa27660ac61e11",
+ "699b97bd31eed625e2f0bed145aaf94c3e646853",
"wdspec"
],
"webdriver/tests/element_retrieval/find_element_from_element.py": [
- "f036ef93adff21a7c83eeb8b131c96b6553b9fcb",
+ "34f356f2579391289edb31adf5b4d4eb88ffc643",
"wdspec"
],
"webdriver/tests/element_retrieval/find_elements.py": [
- "2d5c3c98b00e21a36f91e5797bb97835a8b63f2e",
+ "284ae53c5c94d02fb46b26dcd70af02d7917e7b4",
"wdspec"
],
"webdriver/tests/element_retrieval/find_elements_from_element.py": [
- "131c25ffbde611f98e29b778d7c861ae9619b2f6",
+ "b062b9f044268f0d9e092def81afae1277a91cd8",
"wdspec"
],
"webdriver/tests/element_retrieval/get_active_element.py": [
"918c6e48047f31a088ec44e9b0d070b0ae3d6077",
"wdspec"
],
"webdriver/tests/element_send_keys/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -576744,17 +576744,17 @@
"d783d0dd370f58b264ef238d8da5cd8601dc3c7f",
"testharness"
],
"webdriver/tests/minimize_window.py": [
"ac1df5462702ac368ffa92cc12cfb5e34df226ac",
"wdspec"
],
"webdriver/tests/navigation/current_url.py": [
- "cec2987258d9c807a247da9e0216b3af1f171484",
+ "828e40301838c99aa2978733bbce3db3acc185a0",
"wdspec"
],
"webdriver/tests/navigation/get_title.py": [
"2ee18932a8ae3c4190b37e2b28141a6af49cc507",
"wdspec"
],
"webdriver/tests/sessions/get_timeouts.py": [
"eaee354d16aa8c3a0fc960198fa4c5d9365bdee5",
@@ -581868,17 +581868,17 @@
"b32446a62602baf1a316520ee8e2e5d9e60cada3",
"support"
],
"workers/SharedWorker_blobUrl.html": [
"d74620a63e7d911ef60b995cabf6b360c2c46a4f",
"testharness"
],
"workers/SharedWorker_dataUrl.html": [
- "f65d3caef416775c970a554448cebdf02580428f",
+ "285538767c2c79223f12b58da4e347eee8101ccc",
"testharness"
],
"workers/WorkerGlobalScope_ErrorEvent_colno.htm": [
"8ceb41543f928c918010000d638099faeb674980",
"testharness"
],
"workers/WorkerGlobalScope_ErrorEvent_filename.htm": [
"214fa60fcfeaf0226bfcbaca01b7f5c0fb589e98",
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element.py
@@ -66,8 +66,18 @@ def test_no_element(session, using, valu
("xpath", "//*[name()='a']")])
def test_xhtml_namespace(session, using, value):
session.url = inline("""<a href="#" id="linkText">full link text</a>""", doctype="xhtml")
expected = session.execute_script("return document.links[0]")
response = find_element(session, using, value)
value = assert_success(response)
assert_same_element(session, value, expected)
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", ":root"),
+ ("tag name", "html"),
+ ("xpath", "/html")])
+def test_htmldocument(session, using, value):
+ session.url = inline("")
+ response = find_element(session, using, value)
+ assert_success(response)
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element_from_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element_from_element.py
@@ -67,8 +67,16 @@ def test_no_element(session, using, valu
def test_xhtml_namespace(session, using, value):
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
from_element = session.execute_script("""return document.querySelector("p")""")
expected = session.execute_script("return document.links[0]")
response = find_element(session, from_element.id, using, value)
value = assert_success(response)
assert_same_element(session, value, expected)
+
+
+def test_parent_htmldocument(session):
+ session.url = inline("")
+ from_element = session.execute_script("return document.documentElement")
+
+ response = find_element(session, from_element.id, "xpath", "..")
+ assert_success(response)
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements.py
@@ -72,8 +72,20 @@ def test_xhtml_namespace(session, using,
response = find_elements(session, using, value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", ":root"),
+ ("tag name", "html"),
+ ("xpath", "/html")])
+def test_htmldocument(session, using, value):
+ session.url = inline("")
+ response = find_elements(session, using, value)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 1
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements_from_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements_from_element.py
@@ -70,8 +70,18 @@ def test_xhtml_namespace(session, using,
response = find_elements(session, from_element.id, using, value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
+
+
+def test_parent_htmldocument(session):
+ session.url = inline("")
+ from_element = session.execute_script("return document.documentElement")
+
+ response = find_elements(session, from_element.id, "xpath", "..")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 1