Title: [268857] trunk
Revision
268857
Author
[email protected]
Date
2020-10-22 02:36:08 -0700 (Thu, 22 Oct 2020)

Log Message

Unreviewed. Update W3C WebDriver imported tests.

Tools:

Always connect to WebKitWebView::close even if the view is never made active.

* MiniBrowser/gtk/BrowserWindow.c:
(browserWindowSwitchTab):
(browser_window_append_view):

WebDriverTests:

* 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:

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to