Bug 1453009 - Test serialisation of collections in wdspec. r?whimboo
Ports tests added to Marionette in
bug 1284232 to WPT. These test that
the Arguments, Array, FileList, HTMLAllCollection, HTMLCollection,
HTMLFormControlsCollection, HTMLOptionsCollection, and NodeList
collections are properly serialised when returned from an injected script.
There is one failing test that needs more investigation. My current
suspicion is that it is a JavaScript bug.
MozReview-Commit-ID: 8RagcdSRduV
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -390350,22 +390350,34 @@
]
],
"webdriver/tests/element_send_keys/scroll_into_view.py": [
[
"/webdriver/tests/element_send_keys/scroll_into_view.py",
{}
]
],
+ "webdriver/tests/execute_async_script/collections.py": [
+ [
+ "/webdriver/tests/execute_async_script/collections.py",
+ {}
+ ]
+ ],
"webdriver/tests/execute_async_script/user_prompts.py": [
[
"/webdriver/tests/execute_async_script/user_prompts.py",
{}
]
],
+ "webdriver/tests/execute_script/collections.py": [
+ [
+ "/webdriver/tests/execute_script/collections.py",
+ {}
+ ]
+ ],
"webdriver/tests/execute_script/cyclic.py": [
[
"/webdriver/tests/execute_script/cyclic.py",
{}
]
],
"webdriver/tests/execute_script/user_prompts.py": [
[
@@ -549590,17 +549602,17 @@
"3099fb27913f11a983f955cb2a883a882911bfe4",
"support"
],
"fetch/api/request/destination/fetch-destination-iframe.https.html": [
"8b9f5f87086914fa8964702042a21bb833ff2d54",
"testharness"
],
"fetch/api/request/destination/fetch-destination-no-load-event.https.html": [
- "df03c7ad35e9fcae0287c57d9fd18f741a35833c",
+ "343618faf06d5809b0f782191566b36037277c31",
"testharness"
],
"fetch/api/request/destination/fetch-destination-worker.https.html": [
"65fc76503d95a359bf2fafebe603aa19bd0a2bfb",
"testharness"
],
"fetch/api/request/destination/fetch-destination.https.html": [
"5b7276e8a10bf91ee7d2a92917176b8e62c3255d",
@@ -549650,17 +549662,17 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
"fetch/api/request/destination/resources/fetch-destination-worker-iframe.js": [
"e3629357f9d0e3f93659aff23ab3138cc7978823",
"support"
],
"fetch/api/request/destination/resources/fetch-destination-worker-no-load-event.js": [
- "26aedd2a95b90728af7aaa3dc9c5d11153343a7e",
+ "894f421753d61685faec672219964b599c7016f8",
"support"
],
"fetch/api/request/destination/resources/fetch-destination-worker.js": [
"e10bc6423b2ee29387b1153546ae765449aa1ae4",
"support"
],
"fetch/api/request/destination/resources/importer.js": [
"cebbf26e5c2237b62a1b5b01eb434dbfa405d28c",
@@ -600829,24 +600841,32 @@
"webdriver/tests/element_send_keys/scroll_into_view.py": [
"fb192d5d1d93aa729b07cadcadfa630587bd0b39",
"wdspec"
],
"webdriver/tests/execute_async_script/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "webdriver/tests/execute_async_script/collections.py": [
+ "b10e02dff5437ae2b6ed6cc17141e5643dc1b75d",
+ "wdspec"
+ ],
"webdriver/tests/execute_async_script/user_prompts.py": [
"e31edd4537f9b7479a348465154381f5b18f938c",
"wdspec"
],
"webdriver/tests/execute_script/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "webdriver/tests/execute_script/collections.py": [
+ "7162405055534f77fd7e57419b3cc2a210ddd4e0",
+ "wdspec"
+ ],
"webdriver/tests/execute_script/cyclic.py": [
"9d8a28b94b8cdac88650b675cb00bf21261444e8",
"wdspec"
],
"webdriver/tests/execute_script/user_prompts.py": [
"901487f8270dcce693867ca090393e093d26f22b",
"wdspec"
],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webdriver/tests/execute_async_script/collections.py.ini
@@ -0,0 +1,3 @@
+[collections.py]
+ [test_arguments] # bug 1453057
+ expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/tests/execute_async_script/collections.py
@@ -0,0 +1,158 @@
+import os
+
+from tests.support.asserts import assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def execute_async_script(session, script, args=None):
+ if args is None:
+ args = []
+ body = {"script": script, "args": args}
+ return session.transport.send(
+ "POST",
+ "/session/{session_id}/execute/async".format(**vars(session)),
+ body)
+
+
+def test_arguments(session):
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ function func() {
+ return arguments;
+ }
+ resolve(func("foo", "bar"));
+ """)
+ assert_success(response, [u"foo", u"bar"])
+
+
+def test_array(session):
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve([1, 2]);
+ """)
+ assert_success(response, [1, 2])
+
+
+def test_file_list(session, tmpdir):
+ files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")]
+
+ session.url = inline("<input type=file multiple>")
+ upload = session.find.css("input", all=False)
+ for file in files:
+ file.write("morn morn")
+ upload.send_keys(str(file))
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.querySelector('input').files);
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == len(files)
+ for expected, actual in zip(files, value):
+ assert isinstance(actual, dict)
+ assert "name" in actual
+ assert isinstance(actual["name"], basestring)
+ assert os.path.basename(str(expected)) == actual["name"]
+
+
+def test_html_all_collection(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ html = session.find.css("html", all=False)
+ head = session.find.css("head", all=False)
+ body = session.find.css("body", all=False)
+ ps = session.find.css("p")
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.all);
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ # <html>, <head>, <body>, <p>, <p>
+ assert len(value) == 5
+
+ assert_same_element(session, html, value[0])
+ assert_same_element(session, head, value[1])
+ assert_same_element(session, body, value[2])
+ assert_same_element(session, ps[0], value[3])
+ assert_same_element(session, ps[1], value[4])
+
+
+def test_html_collection(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ ps = session.find.css("p")
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.getElementsByTagName('p'));
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(ps, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_html_form_controls_collection(session):
+ session.url = inline("""
+ <form>
+ <input>
+ <input>
+ </form>
+ """)
+ inputs = session.find.css("input")
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.forms[0].elements);
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(inputs, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_html_options_collection(session):
+ session.url = inline("""
+ <select>
+ <option>
+ <option>
+ </select>
+ """)
+ options = session.find.css("option")
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.querySelector('select').options);
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(options, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_node_list(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ ps = session.find.css("p")
+
+ response = execute_async_script(session, """
+ let [resolve] = arguments;
+ resolve(document.querySelectorAll('p'));
+ """)
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(ps, value):
+ assert_same_element(session, expected, actual)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/tests/execute_script/collections.py
@@ -0,0 +1,136 @@
+import os
+
+from tests.support.asserts import assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def execute_script(session, script, args=None):
+ if args is None:
+ args = []
+ body = {"script": script, "args": args}
+ return session.transport.send(
+ "POST",
+ "/session/{session_id}/execute/sync".format(**vars(session)),
+ body)
+
+
+def test_arguments(session):
+ response = execute_script(session, """
+ function func() {
+ return arguments;
+ }
+ return func("foo", "bar");
+ """)
+ assert_success(response, [u"foo", u"bar"])
+
+
+def test_array(session):
+ response = execute_script(session, "return [1, 2]")
+ assert_success(response, [1, 2])
+
+
+def test_file_list(session, tmpdir):
+ files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")]
+
+ session.url = inline("<input type=file multiple>")
+ upload = session.find.css("input", all=False)
+ for file in files:
+ file.write("morn morn")
+ upload.send_keys(str(file))
+
+ response = execute_script(session, "return document.querySelector('input').files")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == len(files)
+ for expected, actual in zip(files, value):
+ assert isinstance(actual, dict)
+ assert "name" in actual
+ assert isinstance(actual["name"], basestring)
+ assert os.path.basename(str(expected)) == actual["name"]
+
+
+def test_html_all_collection(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ html = session.find.css("html", all=False)
+ head = session.find.css("head", all=False)
+ body = session.find.css("body", all=False)
+ ps = session.find.css("p")
+
+ response = execute_script(session, "return document.all")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ # <html>, <head>, <body>, <p>, <p>
+ assert len(value) == 5
+
+ assert_same_element(session, html, value[0])
+ assert_same_element(session, head, value[1])
+ assert_same_element(session, body, value[2])
+ assert_same_element(session, ps[0], value[3])
+ assert_same_element(session, ps[1], value[4])
+
+
+def test_html_collection(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ ps = session.find.css("p")
+
+ response = execute_script(session, "return document.getElementsByTagName('p')")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(ps, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_html_form_controls_collection(session):
+ session.url = inline("""
+ <form>
+ <input>
+ <input>
+ </form>
+ """)
+ inputs = session.find.css("input")
+
+ response = execute_script(session, "return document.forms[0].elements")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(inputs, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_html_options_collection(session):
+ session.url = inline("""
+ <select>
+ <option>
+ <option>
+ </select>
+ """)
+ options = session.find.css("option")
+
+ response = execute_script(session, "return document.querySelector('select').options")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(options, value):
+ assert_same_element(session, expected, actual)
+
+
+def test_node_list(session):
+ session.url = inline("""
+ <p>foo
+ <p>bar
+ """)
+ ps = session.find.css("p")
+
+ response = execute_script(session, "return document.querySelectorAll('p')")
+ value = assert_success(response)
+ assert isinstance(value, list)
+ assert len(value) == 2
+ for expected, actual in zip(ps, value):
+ assert_same_element(session, expected, actual)