Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Set Permission API to testdriver.js #20461

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,3 @@
[set_permission.html]
expected:
if product != "chrome": ERROR
17 changes: 17 additions & 0 deletions infrastructure/testdriver/set_permission.html
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>TestDriver set_permission method</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>

<script>
promise_test(t => {
return test_driver.set_permission("ambient-light-sensor", "granted", true);
}, "Grant Permission for one realm");

promise_test(t => {
return test_driver.set_permission("ambient-light-sensor", "denied");
}, "Deny Permission, omit one realm");
</script>
44 changes: 44 additions & 0 deletions resources/testdriver.js
Expand Up @@ -210,6 +210,33 @@
return window.test_driver_internal.generate_test_report(message);
},

/**
* Sets the state of a permission
*
* This function simulates a user setting a permission into a particular state as described
* in {@link https://w3c.github.io/permissions/#set-permission-command}
*
* @param {String} name - the name of the permission
* @param {String} state - the state of the permission
* @param {boolean} one_realm - Optional. Whether the permission applies to only one realm
*
* The above params are used to create a [PermissionSetParameters]{@link
* https://w3c.github.io/permissions/#dictdef-permissionsetparameters} object
*
* @returns {Promise} fulfilled after the permission is set, or rejected if setting the
* permission fails
*/
set_permission: function(name, state, one_realm) {
let permission_params = {
descriptor: {
name: name
},
state: state,
oneRealm: one_realm,
};
return window.test_driver_internal.set_permission(permission_params);
},

/**
* Creates a virtual authenticator
*
Expand Down Expand Up @@ -427,6 +454,23 @@
return Promise.reject(new Error("unimplemented"));
},


/**
* Sets the state of a permission
*
* This function simulates a user setting a permission into a particular state as described
* in {@link https://w3c.github.io/permissions/#set-permission-command}
*
* @param {Object} permission_params - a [PermissionSetParameters]{@lint
* https://w3c.github.io/permissions/#dictdef-permissionsetparameters}
* object
* @returns {Promise} fulfilled after the permission is set, or rejected if setting the
* permission fails
*/
set_permission: function(permission_params) {
return Promise.reject(new Error("unimplemented"));
},

/**
* Creates a virtual authenticator
*
Expand Down
15 changes: 15 additions & 0 deletions tools/wptrunner/wptrunner/executors/base.py
Expand Up @@ -656,6 +656,7 @@ def __init__(self, logger, protocol, test_window):
"send_keys": SendKeysAction(self.logger, self.protocol),
"action_sequence": ActionSequenceAction(self.logger, self.protocol),
"generate_test_report": GenerateTestReportAction(self.logger, self.protocol),
"set_permission": SetPermissionAction(self.logger, self.protocol),
"add_virtual_authenticator": AddVirtualAuthenticatorAction(self.logger, self.protocol),
"remove_virtual_authenticator": RemoveVirtualAuthenticatorAction(self.logger, self.protocol),
"add_credential": AddCredentialAction(self.logger, self.protocol),
Expand Down Expand Up @@ -758,6 +759,20 @@ def __call__(self, payload):
self.logger.debug("Generating test report: %s" % message)
self.protocol.generate_test_report.generate_test_report(message)

class SetPermissionAction(object):
def __init__(self, logger, protocol):
self.logger = logger
self.protocol = protocol

def __call__(self, payload):
permission_params = payload["permission_params"]
descriptor = permission_params["descriptor"]
name = descriptor["name"]
state = permission_params["state"]
one_realm = permission_params.get("oneRealm", False)
self.logger.debug("Setting permission %s to %s, oneRealm=%s" % (name, state, one_realm))
self.protocol.set_permission.set_permission(name, state, one_realm)

class AddVirtualAuthenticatorAction(object):
def __init__(self, logger, protocol):
self.logger = logger
Expand Down
19 changes: 19 additions & 0 deletions tools/wptrunner/wptrunner/executors/executorwebdriver.py
Expand Up @@ -22,6 +22,7 @@
ActionSequenceProtocolPart,
TestDriverProtocolPart,
GenerateTestReportProtocolPart,
SetPermissionProtocolPart,
VirtualAuthenticatorProtocolPart)
from ..testrunner import Stop

Expand Down Expand Up @@ -202,6 +203,23 @@ def generate_test_report(self, message):
json_message = {"message": message}
self.webdriver.send_session_command("POST", "reporting/generate_test_report", json_message)


class WebDriverSetPermissionProtocolPart(SetPermissionProtocolPart):
def setup(self):
self.webdriver = self.parent.webdriver

def set_permission(self, name, state, one_realm):
permission_params_dict = {
"descriptor": {
"name": name
},
"state": state,
}
if one_realm is not None:
permission_params_dict["oneRealm"] = one_realm
self.webdriver.send_session_command("POST", "permissions", permission_params_dict)


class WebDriverVirtualAuthenticatorProtocolPart(VirtualAuthenticatorProtocolPart):
def setup(self):
self.webdriver = self.parent.webdriver
Expand Down Expand Up @@ -237,6 +255,7 @@ class WebDriverProtocol(Protocol):
WebDriverActionSequenceProtocolPart,
WebDriverTestDriverProtocolPart,
WebDriverGenerateTestReportProtocolPart,
WebDriverSetPermissionProtocolPart,
WebDriverVirtualAuthenticatorProtocolPart]

def __init__(self, executor, browser, capabilities, **kwargs):
Expand Down
16 changes: 16 additions & 0 deletions tools/wptrunner/wptrunner/executors/protocol.py
Expand Up @@ -305,6 +305,22 @@ def generate_test_report(self, message):
pass


class SetPermissionProtocolPart(ProtocolPart):
"""Protocol part for setting permissions"""
__metaclass__ = ABCMeta

name = "set_permission"

@abstractmethod
def set_permission(self, name, state, one_realm=False):
"""Set permission state.

:param name: The name of the permission to set.
:param state: The state to set the permission to.
:param one_realm: Whether to set the permission for only one realm."""
pass


class ActionSequenceProtocolPart(ProtocolPart):
"""Protocol part for performing trusted clicks"""
__metaclass__ = ABCMeta
Expand Down
9 changes: 9 additions & 0 deletions tools/wptrunner/wptrunner/testdriver-extra.js
Expand Up @@ -126,6 +126,15 @@
return pending_promise;
};

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.add_virtual_authenticator = function(config) {
const pending_promise = new Promise(function(resolve, reject) {
pending_resolve = resolve;
Expand Down