Bug 1424635 - Consider DOCUMENT_NODE a valid web element. r?automatedtester draft
authorAndreas Tolfsen <ato@sny.no>
Thu, 14 Dec 2017 12:14:56 -0600
changeset 711819 2ae98e1c5a8793bfe340688810ac1c85df436b67
parent 711809 2386800ec051598ff4dd42da1118abcf05299fc1
child 743889 215caf56baee70c914b92d2e3ffbe92d3d64cd30
push id93160
push userbmo:ato@sny.no
push dateThu, 14 Dec 2017 20:04:55 +0000
reviewersautomatedtester
bugs1424635
milestone59.0a1
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
testing/marionette/element.js
testing/web-platform/meta/MANIFEST.json
testing/web-platform/tests/webdriver/tests/element_retrieval/find_element.py
testing/web-platform/tests/webdriver/tests/element_retrieval/find_element_from_element.py
testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements.py
testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements_from_element.py
--- 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