Diff
Modified: trunk/Tools/ChangeLog (268856 => 268857)
--- trunk/Tools/ChangeLog 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/Tools/ChangeLog 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1,3 +1,13 @@
+2020-10-22 Carlos Garcia Campos <[email protected]>
+
+ Unreviewed. Update W3C WebDriver imported tests.
+
+ Always connect to WebKitWebView::close even if the view is never made active.
+
+ * MiniBrowser/gtk/BrowserWindow.c:
+ (browserWindowSwitchTab):
+ (browser_window_append_view):
+
2020-10-21 Carlos Alberto Lopez Perez <[email protected]>
[JHbuild] Add patch to wpebackend-fdo to fix the build on Ubuntu-18.04
Modified: trunk/Tools/MiniBrowser/gtk/BrowserWindow.c (268856 => 268857)
--- trunk/Tools/MiniBrowser/gtk/BrowserWindow.c 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/Tools/MiniBrowser/gtk/BrowserWindow.c 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1131,7 +1131,6 @@
g_signal_connect(webView, "notify::title", G_CALLBACK(webViewTitleChanged), window);
g_signal_connect(webView, "notify::is-loading", G_CALLBACK(webViewIsLoadingChanged), window);
g_signal_connect(webView, "create", G_CALLBACK(webViewCreate), window);
- g_signal_connect(webView, "close", G_CALLBACK(webViewClose), window);
g_signal_connect(webView, "load-failed", G_CALLBACK(webViewLoadFailed), window);
g_signal_connect(webView, "decide-policy", G_CALLBACK(webViewDecidePolicy), window);
g_signal_connect(webView, "mouse-target-changed", G_CALLBACK(webViewMouseTargetChanged), window);
@@ -1388,6 +1387,9 @@
return;
}
+ /* We always want close to be connected even for not active tabs */
+ g_signal_connect(webView, "close", G_CALLBACK(webViewClose), window);
+
GtkWidget *tab = browser_tab_new(webView);
#if !GTK_CHECK_VERSION(3, 98, 0)
if (gtk_widget_get_app_paintable(GTK_WIDGET(window)))
Modified: trunk/WebDriverTests/ChangeLog (268856 => 268857)
--- trunk/WebDriverTests/ChangeLog 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/ChangeLog 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1,3 +1,30 @@
+2020-10-22 Carlos Garcia Campos <[email protected]>
+
+ Unreviewed. Update W3C WebDriver imported tests.
+
+ * TestExpectations.json:
+ * imported/w3c/importer.json:
+ * imported/w3c/tools/webdriver/webdriver/client.py:
+ * imported/w3c/tools/wptrunner/wptrunner/browsers/android_weblayer.py:
+ * imported/w3c/tools/wptrunner/wptrunner/browsers/chrome.py:
+ * imported/w3c/tools/wptrunner/wptrunner/browsers/chrome_android.py:
+ * imported/w3c/tools/wptrunner/wptrunner/environment.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/base.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/executorselenium.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/executorservodriver.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/executorwebdriver.py:
+ * imported/w3c/tools/wptrunner/wptrunner/executors/protocol.py:
+ * imported/w3c/tools/wptrunner/wptrunner/testdriver-extra.js:
+ * imported/w3c/tools/wptrunner/wptrunner/testharnessreport.js:¡
+ * imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py:
+ * imported/w3c/tools/wptrunner/wptrunner/wptcommandline.py:
+ * imported/w3c/tools/wptrunner/wptrunner/wptrunner.py:
+ * imported/w3c/webdriver/tests/element_click/shadow_dom.py: Added.
+ * imported/w3c/webdriver/tests/perform_actions/support/refine.py:
+ * imported/w3c/webdriver/tests/print/printcmd.py:
+ * imported/w3c/webdriver/tests/print/user_prompts.py:
+
2020-10-21 Lauro Moura <[email protected]>
webkitpy: Check for duplicated keys in json expectation files
Modified: trunk/WebDriverTests/TestExpectations.json (268856 => 268857)
--- trunk/WebDriverTests/TestExpectations.json 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/TestExpectations.json 2020-10-22 09:36:08 UTC (rev 268857)
@@ -377,9 +377,6 @@
"test_special_key_sends_keydown[META-expected30]": {
"expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
},
- "test_special_key_sends_keydown[NULL-expected32]": {
- "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
- },
"test_special_key_sends_keydown[R_META-expected58]": {
"expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
},
@@ -389,9 +386,6 @@
"test_special_key_sends_keydown[PAUSE-expected45]": {
"expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
},
- "test_special_key_sends_keydown[CLEAR-expected4]": {
- "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
- },
"test_special_key_sends_keydown[EQUALS-expected12]": {
"expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184967"}}
},
Modified: trunk/WebDriverTests/imported/w3c/importer.json (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/importer.json 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/importer.json 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1,6 +1,6 @@
{
"repository": "https://github.com/w3c/web-platform-tests.git",
- "revision": "9da95c4ddd67ffc5010c1048250a7c67c0bee897",
+ "revision": "b57da97fc05e5440ae675027dd45a26be48e2dbd",
"paths_to_import": [
"tools/webdriver",
"tools/wptrunner",
Modified: trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -581,7 +581,7 @@
return self.send_session_command("GET", "source")
@command
- def new_window(self, type_hint=None):
+ def new_window(self, type_hint="tab"):
body = {"type": type_hint}
value = self.send_session_command("POST", "window/new", body)
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/android_weblayer.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/android_weblayer.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/android_weblayer.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -47,7 +47,6 @@
cache_manager, run_info_data,
**kwargs)
del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"]
- del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"]
capabilities = executor_kwargs["capabilities"]
# Note that for WebLayer, we launch a test shell and have the test shell use
# WebLayer.
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -51,7 +51,6 @@
}
}
},
- "useAutomationExtension": False,
"excludeSwitches": ["enable-automation"],
"w3c": True
}
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome_android.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome_android.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/chrome_android.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -49,7 +49,6 @@
**kwargs)
# Remove unsupported options on mobile.
del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"]
- del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"]
assert kwargs["package_name"], "missing --package-name"
executor_kwargs["capabilities"]["goog:chromeOptions"]["androidPackage"] = \
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -55,7 +55,7 @@
websockets servers"""
def __init__(self, test_paths, testharness_timeout_multipler,
pause_after_test, debug_info, options, ssl_config, env_extras,
- enable_quic=False, serve_mojojs=False):
+ enable_quic=False, mojojs_path=None):
self.test_paths = test_paths
self.server = None
self.config_ctx = None
@@ -72,7 +72,7 @@
self.env_extras_cms = None
self.ssl_config = ssl_config
self.enable_quic = enable_quic
- self.serve_mojojs = serve_mojojs
+ self.mojojs_path = mojojs_path
def __enter__(self):
self.config_ctx = self.build_config()
@@ -217,9 +217,8 @@
if "/" not in self.test_paths:
del route_builder.mountpoint_routes["/"]
- if self.serve_mojojs:
- # TODO(Hexcles): Properly pass venv.path in.
- route_builder.add_mount_point("/gen/", "_venv2/mojojs/gen")
+ if self.mojojs_path:
+ route_builder.add_mount_point("/gen/", self.mojojs_path)
return route_builder.get_routes()
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -691,7 +691,10 @@
def set_window(self, handle):
pass
+ def window_handles(self):
+ return []
+
class ConnectionlessProtocol(Protocol):
implements = [ConnectionlessBaseProtocolPart]
@@ -787,6 +790,7 @@
def process_action(self, url, payload):
action = ""
+ cmd_id = payload["id"]
self.logger.debug("Got action: %s" % action)
try:
action_handler = self.actions[action]
@@ -797,21 +801,21 @@
result = action_handler(payload)
except self.unimplemented_exc:
self.logger.warning("Action %s not implemented" % action)
- self._send_message("complete", "error", "Action %s not implemented" % action)
+ self._send_message(cmd_id, "complete", "error", "Action %s not implemented" % action)
except Exception:
self.logger.warning("Action %s failed" % action)
self.logger.warning(traceback.format_exc())
- self._send_message("complete", "error")
+ self._send_message(cmd_id, "complete", "error")
raise
else:
self.logger.debug("Action %s completed with result %s" % (action, result))
return_message = {"result": result}
- self._send_message("complete", "success", json.dumps(return_message))
+ self._send_message(cmd_id, "complete", "success", json.dumps(return_message))
return False, None
- def _send_message(self, message_type, status, message=None):
- self.protocol.testdriver.send_message(message_type, status, message=message)
+ def _send_message(self, cmd_id, message_type, status, message=None):
+ self.protocol.testdriver.send_message(cmd_id, message_type, status, message=message)
class ActionContext(object):
@@ -820,28 +824,20 @@
self.protocol = protocol
self.context = context
self.initial_window = None
- self.switched_frame = False
def __enter__(self):
if self.context is None:
return
- window_id = self.context[0]
- if window_id:
- self.initial_window = self.protocol.base.current_window
- self.logger.debug("Switching to window %s" % window_id)
- self.protocol.testdriver.switch_to_window(window_id)
+ self.initial_window = self.protocol.base.current_window
+ self.logger.debug("Switching to window %s" % self.context)
+ self.protocol.testdriver.switch_to_window(self.context)
- for frame_id in self.context[1:]:
- self.switched_frame = True
- self.logger.debug("Switching to frame %s" % frame_id)
- self.protocol.testdriver.switch_to_frame(frame_id)
+ def __exit__(self, *args):
+ if self.context is None:
+ return
- def __exit__(self, *args):
- if self.initial_window is not None:
- self.logger.debug("Switching back to initial window")
- self.protocol.base.set_window(self.initial_window)
- self.initial_window = None
- elif self.switched_frame:
- self.protocol.testdriver.switch_to_frame(None)
- self.switched_frame = False
+ self.logger.debug("Switching back to initial window")
+ self.protocol.base.set_window(self.initial_window)
+ self.protocol.testdriver._switch_to_frame(None)
+ self.initial_window = None
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -103,6 +103,9 @@
def set_window(self, handle):
_switch_to_window(self.marionette, handle)
+ def window_handles(self):
+ return self.marionette.window_handles
+
def load(self, url):
self.marionette.navigate(url)
@@ -460,8 +463,9 @@
def setup(self):
self.marionette = self.parent.marionette
- def send_message(self, message_type, status, message=None):
+ def send_message(self, cmd_id, message_type, status, message=None):
obj = {
+ "cmd_id": cmd_id,
"type": "testdriver-%s" % str(message_type),
"status": str(status)
}
@@ -469,25 +473,13 @@
obj["message"] = str(message)
self.parent.base.execute_script("window.postMessage(%s, '*')" % json.dumps(obj))
- def switch_to_window(self, window_id):
- if window_id is None:
- return
+ def _switch_to_frame(self, frame_number):
+ self.marionette.switch_to_frame(frame_number)
- for window_handle in self.marionette.window_handles:
- _switch_to_window(self.marionette, window_handle)
- try:
- handle_window_id = self.marionette.execute_script("return window.name")
- except errors._javascript_Exception:
- continue
- if str(handle_window_id) == window_id:
- return
+ def _switch_to_parent_frame(self):
+ self.marionette.switch_to_parent_frame()
- raise Exception("Window with id %s not found" % window_id)
- def switch_to_frame(self, frame_number):
- self.marionette.switch_to_frame(frame_number)
-
-
class MarionetteCoverageProtocolPart(CoverageProtocolPart):
def setup(self):
self.marionette = self.parent.marionette
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorselenium.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorselenium.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorselenium.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -61,6 +61,9 @@
def set_window(self, handle):
self.webdriver.switch_to_window(handle)
+ def window_handles(self):
+ return self.webdriver.window_handles
+
def load(self, url):
self.webdriver.get(url)
@@ -200,8 +203,9 @@
def setup(self):
self.webdriver = self.parent.webdriver
- def send_message(self, message_type, status, message=None):
+ def send_message(self, cmd_id, message_type, status, message=None):
obj = {
+ "cmd_id": cmd_id,
"type": "testdriver-%s" % str(message_type),
"status": str(status)
}
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservodriver.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservodriver.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservodriver.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -76,6 +76,9 @@
def set_window(self, handle):
pass
+ def window_handles(self):
+ return []
+
def load(self, url):
pass
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorwebdriver.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorwebdriver.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorwebdriver.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -61,6 +61,9 @@
def set_window(self, handle):
self.webdriver.window_handle = handle
+ def window_handles(self):
+ return self.webdriver.handles
+
def load(self, url):
self.webdriver.url = ""
@@ -214,8 +217,9 @@
def setup(self):
self.webdriver = self.parent.webdriver
- def send_message(self, message_type, status, message=None):
+ def send_message(self, cmd_id, message_type, status, message=None):
obj = {
+ "cmd_id": cmd_id,
"type": "testdriver-%s" % str(message_type),
"status": str(status)
}
@@ -223,25 +227,13 @@
obj["message"] = str(message)
self.webdriver.execute_script("window.postMessage(%s, '*')" % json.dumps(obj))
- def switch_to_window(self, window_id):
- if window_id is None:
- return
+ def _switch_to_frame(self, frame_number):
+ self.webdriver.switch_frame(frame_number)
- for window_handle in self.webdriver.handles:
- self.webdriver.window_handle = window_handle
- try:
- handle_window_id = self.webdriver.execute_script("return window.name")
- except client._javascript_ErrorException:
- continue
- if str(handle_window_id) == window_id:
- return
+ def _switch_to_parent_frame(self):
+ self.webdriver.switch_frame("parent")
- raise Exception("Window with id %s not found" % window_id)
- def switch_to_frame(self, frame_number):
- self.webdriver.switch_frame(frame_number)
-
-
class WebDriverGenerateTestReportProtocolPart(GenerateTestReportProtocolPart):
def setup(self):
self.webdriver = self.parent.webdriver
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/protocol.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/protocol.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/protocol.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -147,6 +147,11 @@
pass
@abstractmethod
+ def window_handles(self):
+ """Get a list of handles to top-level browsing contexts"""
+ pass
+
+ @abstractmethod
def load(self, url):
"""Load a url in the current browsing context
@@ -343,9 +348,10 @@
name = "testdriver"
@abstractmethod
- def send_message(self, message_type, status, message=None):
+ def send_message(self, cmd_id, message_type, status, message=None):
"""Send a testdriver message to the browser.
+ :param int cmd_id: The id of the command to which we're responding
:param str message_type: The kind of the message.
:param str status: Either "failure" or "success" depending on whether the
previous command succeeded.
@@ -356,15 +362,47 @@
"""Switch to a window given a wptrunner window id
:param str wptrunner_id: window id"""
- pass
+ if wptrunner_id is None:
+ return
- def switch_to_frame(self, index):
+ stack = [str(item) for item in self.parent.base.window_handles()]
+ while stack:
+ item = stack.pop()
+ if item is None:
+ self._switch_to_parent_frame()
+ continue
+ elif isinstance(item, str):
+ self.parent.base.set_window(item)
+ else:
+ self._switch_to_frame(item)
+
+ try:
+ handle_window_id = self.parent.base.execute_script("return window.__wptrunner_id")
+ if str(handle_window_id) == wptrunner_id:
+ return
+ except Exception:
+ pass
+ frame_count = self.parent.base.execute_script("return window.length")
+ # None here makes us switch back to the parent after we've processed all the subframes
+ stack.append(None)
+ if frame_count:
+ stack.extend(reversed(range(0, frame_count)))
+
+ raise Exception("Window with id %s not found" % wptrunner_id)
+
+ @abstractmethod
+ def _switch_to_frame(self, index):
"""Switch to a frame in the current window
:param int index: Frame id"""
pass
+ @abstractmethod
+ def _switch_to_parent_frame(self):
+ """Switch to the parent of the current frame"""
+ pass
+
class AssertsProtocolPart(ProtocolPart):
"""ProtocolPart that implements the functionality required to get a count of non-fatal
assertions triggered"""
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testdriver-extra.js (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testdriver-extra.js 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testdriver-extra.js 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1,9 +1,13 @@
"use strict";
-(function(){
- let pending_resolve = null;
- let pending_reject = null;
+(function() {
+ const is_test_context = window.__wptrunner_message_queue !== undefined;
+ const pending = new Map();
+
let result = null;
+ let ctx_cmd_id = 0;
+ let testharness_context = null;
+
window.addEventListener("message", function(event) {
const data = ""
@@ -11,29 +15,70 @@
return;
}
- if (data.type !== "testdriver-complete") {
- return;
+ if (is_test_context && data.type === "testdriver-command") {
+ const command = data.message;
+ const ctx_id = command.cmd_id;
+ delete command.cmd_id;
+ const cmd_id = window.__wptrunner_message_queue.push(command);
+ let _on_success_ = (data) => {
+ data.type = "testdriver-complete";
+ data.cmd_id = ctx_id;
+ event.source.postMessage(data, "*");
+ };
+ let _on_failure_ = (data) => {
+ data.type = "testdriver-complete";
+ data.cmd_id = ctx_id;
+ event.source.postMessage(data, "*");
+ };
+ pending.set(cmd_id, [on_success, on_failure]);
+ } else if (data.type === "testdriver-complete") {
+ const cmd_id = data.cmd_id;
+ const [on_success, on_failure] = pending.get(cmd_id);
+ pending.clear(cmd_id);
+ const resolver = data.status === "success" ? on_success : on_failure;
+ resolver(data);
+ if (is_test_context) {
+ window.__wptrunner_process_next_event();
+ }
}
+ });
- if (data.status === "success") {
- result = JSON.parse(data.message).result;
- pending_resolve(result);
+ // Code copied from /common/utils.js
+ function rand_int(bits) {
+ if (bits < 1 || bits > 53) {
+ throw new TypeError();
} else {
- pending_reject(`${data.status}: ${data.message}`);
+ if (bits >= 1 && bits <= 30) {
+ return 0 | ((1 << bits) * Math.random());
+ } else {
+ var high = (0 | ((1 << (bits - 30)) * Math.random())) * (1 << 30);
+ var low = 0 | ((1 << 30) * Math.random());
+ return high + low;
+ }
}
- });
+ }
- let last_window_id = 0;
+ function to_hex(x, length) {
+ var rv = x.toString(16);
+ while (rv.length < length) {
+ rv = "0" + rv;
+ }
+ return rv;
+ }
+
function get_window_id(win) {
- if (win === window) {
+ if (win == window && is_test_context) {
return null;
}
- // This is a hack until some implementations support proper window ids
- // It won't work cross-frame
- if (!win.name) {
- win.name = "__wptrunner_window " + last_window_id++;
+ if (!win.__wptrunner_id) {
+ // generate a uuid
+ win.__wptrunner_id = [to_hex(rand_int(32), 8),
+ to_hex(rand_int(16), 4),
+ to_hex(0x4000 | rand_int(12), 4),
+ to_hex(0x8000 | rand_int(14), 4),
+ to_hex(rand_int(48), 12)].join("-");
}
- return win.name;
+ return win.__wptrunner_id;
}
const get_context = function(element) {
@@ -44,23 +89,7 @@
if (!elementWindow) {
throw new Error("Browsing context for element was detached");
}
- let top = elementWindow.top;
- if (elementWindow === window) {
- if (top !== window) {
- throw new Error("Can't load testdriver in a frame");
- }
- // For the current window just return null
- return null;
- }
- let rv = [];
- let currentWindow = elementWindow;
- while (currentWindow !== top) {
- rv.push(Array.prototype.indexOf.call(currentWindow.parent.frames, currentWindow));
- currentWindow = currentWindow.parent;
- }
- rv.push(top !== window ? get_window_id(top) : null);
- rv.reverse();
- return rv;
+ return elementWindow;
};
const get_selector = function(element) {
@@ -93,43 +122,60 @@
return selector;
};
+ const create_action = function(name, props) {
+ let cmd_id;
+ const action_msg = {type: "action",
+ action: name,
+ ...props};
+ if (action_msg.context) {
+ action_msg.context = get_window_id(action_msg.context);
+ }
+ if (is_test_context) {
+ cmd_id = window.__wptrunner_message_queue.push(action_msg);
+ } else {
+ if (testharness_context === null) {
+ throw new Error("Tried to run in a non-testharness window without a call to set_test_context");
+ }
+ cmd_id = ctx_cmd_id++;
+ action_msg.cmd_id = cmd_id;
+ window.test_driver.message_test({type: "testdriver-command",
+ message: action_msg});
+ }
+ const pending_promise = new Promise(function(resolve, reject) {
+ const _on_success_ = data ="" {
+ result = JSON.parse(data.message).result;
+ resolve(result);
+ };
+ const _on_failure_ = data ="" {
+ reject(`${data.status}: ${data.message}`);
+ };
+ pending.set(cmd_id, [on_success, on_failure]);
+ });
+ return pending_promise;
+ };
+
window.test_driver_internal.in_automation = true;
+ window.test_driver_internal.set_test_context = function(context) {
+ if (window.__wptrunner_message_queue) {
+ throw new Error("Tried to set testharness context in a window containing testharness.js");
+ }
+ testharness_context = context;
+ };
+
window.test_driver_internal.click = function(element) {
+ const selector = get_selector(element);
const context = get_context(element);
- const selector = get_selector(element);
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "click",
- selector,
- context});
- return pending_promise;
+ return create_action("click", {selector, context});
};
window.test_driver_internal.send_keys = function(element, keys) {
const selector = get_selector(element);
const context = get_context(element);
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "send_keys",
- selector,
- keys,
- context});
- return pending_promise;
+ return create_action("send_keys", {selector, keys, context});
};
- window.test_driver_internal.action_sequence = function(actions) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- let context = null;
+ window.test_driver_internal.action_sequence = function(actions, context=null) {
for (let actionSequence of actions) {
if (actionSequence.type == "pointer") {
for (let action of actionSequence.actions) {
@@ -145,111 +191,42 @@
}
}
}
- window.__wptrunner_message_queue.push({type: "action",
- action: "action_sequence",
- actions,
- context});
- return pending_promise;
+ return create_action("action_sequence", {actions, context});
};
- window.test_driver_internal.generate_test_report = function(message) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "generate_test_report",
- message});
- return pending_promise;
+ window.test_driver_internal.generate_test_report = function(message, context=null) {
+ return create_action("generate_test_report", {message, context});
};
- window.test_driver_internal.set_permission = function(permission_params) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "set_permission",
- permission_params});
- return pending_promise;
+ window.test_driver_internal.set_permission = function(permission_params, context=null) {
+ return create_action("set_permission", {permission_params, context});
};
- window.test_driver_internal.add_virtual_authenticator = function(config) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "add_virtual_authenticator",
- config});
- return pending_promise;
+ window.test_driver_internal.add_virtual_authenticator = function(config, context=null) {
+ return create_action("add_virtual_authenticator", {config, context});
};
- window.test_driver_internal.remove_virtual_authenticator = function(authenticator_id) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "remove_virtual_authenticator",
- authenticator_id});
- return pending_promise;
+ window.test_driver_internal.remove_virtual_authenticator = function(authenticator_id, context=null) {
+ return create_action("remove_virtual_authenticator", {authenticator_id, context});
};
- window.test_driver_internal.add_credential = function(authenticator_id, credential) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "add_credential",
- authenticator_id, credential});
- return pending_promise;
+ window.test_driver_internal.add_credential = function(authenticator_id, credential, context=null) {
+ return create_action("add_credential", {authenticator_id, credential, context});
};
- window.test_driver_internal.get_credentials = function(authenticator_id) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "get_credentials",
- authenticator_id});
- return pending_promise;
+ window.test_driver_internal.get_credentials = function(authenticator_id, context=null) {
+ return create_action("get_credentials", {authenticator_id, context});
};
- window.test_driver_internal.remove_credential = function(authenticator_id, credential_id) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "remove_credential",
- authenticator_id,
- credential_id});
- return pending_promise;
+ window.test_driver_internal.remove_credential = function(authenticator_id, credential_id, context=null) {
+ return create_action("remove_credential", {authenticator_id, credential_id, context});
};
- window.test_driver_internal.remove_all_credentials = function(authenticator_id) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "remove_all_credentials",
- authenticator_id});
- return pending_promise;
+ window.test_driver_internal.remove_all_credentials = function(authenticator_id, context=null) {
+ return create_action("remove_all_credentials", {authenticator_id, context});
};
- window.test_driver_internal.set_user_verified = function(authenticator_id, uv) {
- const pending_promise = new Promise(function(resolve, reject) {
- pending_resolve = resolve;
- pending_reject = reject;
- });
- window.__wptrunner_message_queue.push({"type": "action",
- "action": "set_user_verified",
- authenticator_id,
- uv});
- return pending_promise;
+ window.test_driver_internal.set_user_verified = function(authenticator_id, uv, context=null) {
+ return create_action("set_user_verified", {authenticator_id, uv, context});
};
})();
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testharnessreport.js (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testharnessreport.js 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testharnessreport.js 2020-10-22 09:36:08 UTC (rev 268857)
@@ -1,11 +1,15 @@
class MessageQueue {
constructor() {
+ this.item_id = 0;
this._queue = [];
}
push(item) {
+ let cmd_id = this.item_id++;
+ item.id = cmd_id;
this._queue.push(item);
__wptrunner_process_next_event();
+ return cmd_id;
}
shift() {
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -131,7 +131,8 @@
def make_command(self):
return [self.binary,
cmd_arg("port", str(self.port)),
- cmd_arg("url-base", self.base_path) if self.base_path else ""] + self._args
+ cmd_arg("url-base", self.base_path) if self.base_path else "",
+ cmd_arg("enable-chrome-logs")] + self._args
class CWTChromeDriverServer(WebDriverServer):
def __init__(self, logger, binary, port=None, args=None):
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptcommandline.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptcommandline.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptcommandline.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -314,8 +314,12 @@
servo_group = parser.add_argument_group("Chrome-specific")
servo_group.add_argument("--enable-mojojs", action="" default=False,
- help="Enable MojoJS for testing. Mojo bindings need to be available in "
- "_venv2/mojojs.")
+ help="Enable MojoJS for testing. Note that this flag is usally "
+ "enabled automatically by `wpt run`, if it succeeds in downloading "
+ "the right version of mojojs.zip or if --mojojs-path is specified.")
+ servo_group.add_argument("--mojojs-path",
+ help="Path to mojojs gen/ directory. If it is not specified, `wpt run` "
+ "will download and extract mojojs.zip into _venv2/mojojs/gen.")
sauce_group = parser.add_argument_group("Sauce Labs-specific")
sauce_group.add_argument("--sauce-browser", dest="sauce_browser",
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -213,6 +213,8 @@
run_info,
**kwargs)
+ mojojs_path = kwargs["mojojs_path"] if kwargs["enable_mojojs"] else None
+
recording.set(["startup", "start_environment"])
with env.TestEnvironment(test_paths,
testharness_timeout_multipler,
@@ -222,7 +224,7 @@
ssl_config,
env_extras,
kwargs["enable_quic"],
- kwargs["enable_mojojs"]) as test_environment:
+ mojojs_path) as test_environment:
recording.set(["startup", "ensure_environment"])
try:
test_environment.ensure_started()
Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_click/shadow_dom.py (0 => 268857)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_click/shadow_dom.py (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_click/shadow_dom.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -0,0 +1,100 @@
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+import pytest
+
+
+def element_click(session, element):
+ return session.transport.send(
+ "POST", "session/{session_id}/element/{element_id}/click".format(
+ session_id=session.session_id,
+ element_id=element.id))
+
+
+def get_checkbox_dom():
+ return inline("""
+ <style>
+ custom-checkbox-element {
+ display:block; width:20px; height:20px;
+ }
+ </style>
+ <custom-checkbox-element></custom-checkbox-element>
+ <script>
+ customElements.define('custom-checkbox-element',
+ class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({mode: 'open'}).innerHTML = `
+ <div><input type="checkbox"/></div>
+ `;
+ }
+ });
+ </script>""")
+
+
[email protected]("click_on", ["custom_element", "checkbox_element"])
+def test_shadow_element_click(session, click_on):
+ session.url = ""
+ custom_element = session.find.css("custom-checkbox-element", all=False)
+ checkbox_element = session.execute_script("return arguments[0].shadowRoot.querySelector('input')",
+ args=(custom_element,))
+ is_pre_checked = session.execute_script("return arguments[0].checked",
+ args=(checkbox_element,))
+ assert is_pre_checked == False
+ response = element_click(session, locals()[click_on])
+ assert_success(response)
+ is_post_checked = session.execute_script("return arguments[0].checked",
+ args=(checkbox_element,))
+ assert is_post_checked == True
+
+
+def get_nested_shadow_checkbox_dom():
+ return inline("""
+ <style>
+ custom-nesting-element {
+ display:block; width:20px; height:20px;
+ }
+ </style>
+ <custom-nesting-element></custom-nesting-element>
+ <script>
+ customElements.define('custom-nesting-element',
+ class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({mode: 'open'}).innerHTML = `
+ <style>
+ custom-checkbox-element {
+ display:block; width:20px; height:20px;
+ }
+ </style>
+ <div><custom-checkbox-element></custom-checkbox-element></div>
+ `;
+ }
+ });
+ customElements.define('custom-checkbox-element',
+ class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({mode: 'open'}).innerHTML = `
+ <div><input type="checkbox"/></div>
+ `;
+ }
+ });
+ </script>""")
+
+
[email protected]("click_on", ["outer_element", "inner_element", "checkbox_element"])
+def test_nested_shadow_element_click(session, click_on):
+ session.url = ""
+ outer_element = session.find.css("custom-nesting-element", all=False)
+ inner_element = session.execute_script("return arguments[0].shadowRoot.querySelector('custom-checkbox-element')",
+ args=(outer_element,))
+ checkbox_element = session.execute_script("return arguments[0].shadowRoot.querySelector('input')",
+ args=(inner_element,))
+ is_pre_checked = session.execute_script("return arguments[0].checked",
+ args=(checkbox_element,))
+ assert is_pre_checked == False
+ click_response = element_click(session, locals()[click_on])
+ assert_success(click_response)
+ is_post_checked = session.execute_script("return arguments[0].checked",
+ args=(checkbox_element,))
+ assert is_post_checked == True
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/perform_actions/support/refine.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/perform_actions/support/refine.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/perform_actions/support/refine.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -9,6 +9,11 @@
key = e["key"]
hex_suffix = key[key.index("+") + 1:]
e["key"] = unichr(int(hex_suffix, 16))
+
+ # WebKit sets code as 'Unidentified' for unidentified key codes, but
+ # tests expect ''.
+ if "code" in e and e["code"] == "Unidentified":
+ e["code"] = ""
return events
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -27,7 +27,7 @@
def test_no_browsing_context(session, closed_frame):
response = do_print(session, {})
value = assert_success(response)
- pdf = base64.decodestring(value)
+ pdf = base64.decodestring(ensure_binary(value))
assert_pdf(pdf)
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/print/user_prompts.py (268856 => 268857)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/print/user_prompts.py 2020-10-22 07:32:40 UTC (rev 268856)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/print/user_prompts.py 2020-10-22 09:36:08 UTC (rev 268857)
@@ -7,7 +7,7 @@
from tests.support.asserts import assert_dialog_handled, assert_error, assert_success
from tests.support.inline import inline
-from printcmd import do_print, assert_pdf
+from .printcmd import do_print, assert_pdf
@pytest.fixture