From 5cb66efa6cec29d48dc0b5eecaa0db3ca12d470c Mon Sep 17 00:00:00 2001 From: Marcos Caceres Date: Mon, 28 Nov 2022 13:58:51 +1100 Subject: [PATCH] Implement consume_user_activation() for testdriver --- docs/writing-tests/testdriver.md | 6 ++++ resources/testdriver.js | 28 +++++++++++++++++-- .../wptrunner/wptrunner/executors/actions.py | 14 +++++++++- .../wptrunner/executors/executormarionette.py | 11 +++++++- .../wptrunner/executors/executorwebdriver.py | 12 +++++++- .../wptrunner/wptrunner/executors/protocol.py | 10 +++++++ tools/wptrunner/wptrunner/testdriver-extra.js | 5 ++++ 7 files changed, 81 insertions(+), 5 deletions(-) diff --git a/docs/writing-tests/testdriver.md b/docs/writing-tests/testdriver.md index 73af3bb3c8dd72..b23d58fc49f17d 100644 --- a/docs/writing-tests/testdriver.md +++ b/docs/writing-tests/testdriver.md @@ -41,6 +41,12 @@ the global scope. .. js:autofunction:: test_driver.bless ``` +### User Activation ### + +```eval_rst +.. js:autofunction:: test_driver.consume_user_activation +``` + ### Window State ### ```eval_rst .. js:autofunction:: test_driver.minimize_window diff --git a/resources/testdriver.js b/resources/testdriver.js index 70c799167f9eb2..0ae808a95aac17 100644 --- a/resources/testdriver.js +++ b/resources/testdriver.js @@ -1004,7 +1004,27 @@ */ get_virtual_sensor_information: function(sensor_type, context=null) { return window.test_driver_internal.get_virtual_sensor_information(sensor_type, context); - } + }, + /* + * Consumes the user activation + * + * Matches the consume-user-activation WebDriver command: + * https://html.spec.whatwg.org/#user-activation-user-agent-automation + * + * Which corresponds to these steps in HTML: + * https://html.spec.whatwg.org/#consume-user-activation + * + * @example + * await test_driver.consume_user_activation(); + * await test_driver.consume_user_activation(iframe.contentWindow); + * + * @param {WindowProxy?} [context=null] - Browsing context in which to run the + * call. + * @returns {Promise} fulfilled when user activation is consumed. + */ + consume_user_activation(context=null) { + return window.test_driver_internal.consume_user_activation(context); + }, }; window.test_driver_internal = { @@ -1180,6 +1200,10 @@ async get_virtual_sensor_information(sensor_type, context=null) { throw new Error("get_virtual_sensor_information() is not implemented by testdriver-vendor.js"); - } + }, + + async consume_user_activation () { + throw new Error("Consume_user_activation() is not implemented by testdriver-vendor.js"); + }, }; })(); diff --git a/tools/wptrunner/wptrunner/executors/actions.py b/tools/wptrunner/wptrunner/executors/actions.py index f698b92d6339b1..31bb1cc3859293 100644 --- a/tools/wptrunner/wptrunner/executors/actions.py +++ b/tools/wptrunner/wptrunner/executors/actions.py @@ -433,6 +433,16 @@ def __call__(self, payload): self.logger.debug("Requesting information from %s sensor" % sensor_type) return self.protocol.virtual_sensor.get_virtual_sensor_information(sensor_type) +class ConsumeUserActivationAction: + name = "consume_user_activation" + + def __init__(self, logger, protocol): + self.logger = logger + self.protocol = protocol + + def __call__(self, payload): + self.logger.debug("Consuming user activation") + return self.protocol.user_activation.consume_user_activation() actions = [ClickAction, DeleteAllCookiesAction, @@ -466,4 +476,6 @@ def __call__(self, payload): CreateVirtualSensorAction, UpdateVirtualSensorAction, RemoveVirtualSensorAction, - GetVirtualSensorInformationAction] + GetVirtualSensorInformationAction, + ConsumeUserActivationAction, + ] diff --git a/tools/wptrunner/wptrunner/executors/executormarionette.py b/tools/wptrunner/wptrunner/executors/executormarionette.py index 8d60f1ed3c4453..729e13790919a3 100644 --- a/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -45,6 +45,7 @@ PrintProtocolPart, DebugProtocolPart, VirtualSensorProtocolPart, + UserActivationProtocolPart, merge_dicts) @@ -741,6 +742,12 @@ def remove_virtual_sensor(self, remove_parameters): def get_virtual_sensor_information(self, information_parameters): raise NotImplementedError("get_virtual_sensor_information not yet implemented") +class MarionetteUserActivationProtocolPart(UserActivationProtocolPart): + def setup(self): + self.marionette = self.parent.marionette + + def consume_user_activation(self, sensor_type, sensor_params): + raise NotImplementedError("consume_user_activation not yet implemented") class MarionetteProtocol(Protocol): implements = [MarionetteBaseProtocolPart, @@ -762,7 +769,9 @@ class MarionetteProtocol(Protocol): MarionettePrintProtocolPart, MarionetteDebugProtocolPart, MarionetteAccessibilityProtocolPart, - MarionetteVirtualSensorProtocolPart] + MarionetteVirtualSensorProtocolPart, + MarionetteUserActivationProtocolPart, + ] def __init__(self, executor, browser, capabilities=None, timeout_multiplier=1, e10s=True, ccov=False): do_delayed_imports() diff --git a/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 8b61f16cac022b..fb991219f8a093 100644 --- a/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -35,6 +35,7 @@ RPHRegistrationsProtocolPart, FedCMProtocolPart, VirtualSensorProtocolPart, + UserActivationProtocolPart, merge_dicts) from webdriver.client import Session @@ -425,6 +426,13 @@ def get_virtual_sensor_information(self, sensor_type): return self.webdriver.send_session_command("GET", "sensor/%s" % sensor_type) +class WebDriverUserActivationPart(UserActivationProtocolPart): + def setup(self): + self.webdriver = self.parent.webdriver + + def consume_user_activation(): + return self.webdriver.send_session_command("POST", "consume-user-activation") + class WebDriverProtocol(Protocol): implements = [WebDriverBaseProtocolPart, WebDriverTestharnessProtocolPart, @@ -443,7 +451,9 @@ class WebDriverProtocol(Protocol): WebDriverRPHRegistrationsProtocolPart, WebDriverFedCMProtocolPart, WebDriverDebugProtocolPart, - WebDriverVirtualSensorPart] + WebDriverVirtualSensorPart, + WebDriverUserActivationPart, + ] def __init__(self, executor, browser, capabilities, **kwargs): super().__init__(executor, browser) diff --git a/tools/wptrunner/wptrunner/executors/protocol.py b/tools/wptrunner/wptrunner/executors/protocol.py index 2bae86c5a9a9c8..23bbef1e6beee1 100644 --- a/tools/wptrunner/wptrunner/executors/protocol.py +++ b/tools/wptrunner/wptrunner/executors/protocol.py @@ -795,3 +795,13 @@ def remove_virtual_sensor(self, sensor_type): @abstractmethod def get_virtual_sensor_information(self, sensor_type): pass + +class UserActivationProtocolPart(ProtocolPart): + """Protocol part for User Activation""" + __metaclass__ = ABCMeta + + name = "user_activation" + + @abstractmethod + def consume_user_activation(self): + pass diff --git a/tools/wptrunner/wptrunner/testdriver-extra.js b/tools/wptrunner/wptrunner/testdriver-extra.js index 4cb5462694b2b9..90c8319794663c 100644 --- a/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tools/wptrunner/wptrunner/testdriver-extra.js @@ -320,4 +320,9 @@ window.test_driver_internal.get_virtual_sensor_information = function(sensor_type, context=null) { return create_action("get_virtual_sensor_information", {sensor_type, context}); }; + + window.test_driver_internal.consume_user_activation = function(context=null) { + return create_action("consume_user_activation", {context}); + }; + })();