Bug 1845488 - [bidi] Add support for "userActivation" parameter to script evaluation. r=webdriver-reviewers,whimboo

Differential Revision: https://phabricator.services.mozilla.com/D192078
This commit is contained in:
Alexandra Borovova 2023-10-30 12:56:16 +00:00
Родитель ba1fbc7a46
Коммит 5d77c81510
9 изменённых файлов: 71 добавлений и 43 удалений

Просмотреть файл

@ -150,6 +150,7 @@ export class WindowRealm extends Realm {
#globalObjectReference;
#isSandbox;
#sandboxName;
#userActivationEnabled;
#window;
static type = RealmType.Window;
@ -175,6 +176,7 @@ export class WindowRealm extends Realm {
this.#globalObject
);
this.#realmAutomationFeaturesEnabled = false;
this.#userActivationEnabled = false;
}
destroy() {
@ -207,6 +209,25 @@ export class WindowRealm extends Realm {
return this.#window.origin;
}
get userActivationEnabled() {
return this.#userActivationEnabled;
}
set userActivationEnabled(enable) {
if (enable === this.#userActivationEnabled) {
return;
}
const document = this.#window.document;
if (enable) {
document.notifyUserGestureActivation();
} else {
document.clearUserGestureActivation();
}
this.#userActivationEnabled = enable;
}
#createDebuggerObject(obj) {
return this.#globalObjectReference.makeDebuggeeValue(obj);
}

Просмотреть файл

@ -95,3 +95,22 @@ add_task(async function test_windowRealm_isSandbox() {
const realm2 = new WindowRealm(contentWindow, { sandboxName: "test" });
Assert.equal(realm2.isSandbox, true);
});
add_task(async function test_windowRealm_userActivationEnabled() {
const windowlessBrowser = Services.appShell.createWindowlessBrowser(false);
const contentWindow = windowlessBrowser.docShell.domWindow;
const userActivation = contentWindow.navigator.userActivation;
const realm = new WindowRealm(contentWindow);
Assert.equal(realm.userActivationEnabled, false);
Assert.equal(userActivation.isActive && userActivation.hasBeenActive, false);
realm.userActivationEnabled = true;
Assert.equal(realm.userActivationEnabled, true);
Assert.equal(userActivation.isActive && userActivation.hasBeenActive, true);
realm.userActivationEnabled = false;
Assert.equal(realm.userActivationEnabled, false);
Assert.equal(userActivation.isActive && userActivation.hasBeenActive, false);
});

Просмотреть файл

@ -1880,13 +1880,7 @@
{
"testIdPattern": "[evaluation.spec] Evaluation specs Page.evaluate should simulate a user gesture",
"platforms": ["darwin", "linux", "win32"],
"parameters": ["firefox", "webDriverBiDi"],
"expectations": ["FAIL"]
},
{
"testIdPattern": "[evaluation.spec] Evaluation specs Page.evaluate should simulate a user gesture",
"platforms": ["darwin", "linux", "win32"],
"parameters": ["chrome", "webDriverBiDi"],
"parameters": ["webDriverBiDi"],
"expectations": ["PASS"]
},
{

Просмотреть файл

@ -253,6 +253,9 @@ class ScriptModule extends Module {
* a RealmTarget or for ContextTarget.
* @param {RemoteValue=} options.this
* The value of the this keyword for the function call.
* @param {boolean=} options.userActivation
* Determines whether execution should be treated as initiated by user.
* Defaults to `false`.
*
* @returns {ScriptEvaluateResult}
*
@ -270,6 +273,7 @@ class ScriptModule extends Module {
serializationOptions,
target = {},
this: thisParameter = null,
userActivation = false,
} = options;
lazy.assert.string(
@ -282,6 +286,11 @@ class ScriptModule extends Module {
`Expected "awaitPromise" to be a boolean, got ${awaitPromise}`
);
lazy.assert.boolean(
userActivation,
`Expected "userActivation" to be a boolean, got ${userActivation}`
);
this.#assertResultOwnership(resultOwnership);
if (commandArguments != null) {
@ -316,6 +325,7 @@ class ScriptModule extends Module {
sandbox,
serializationOptions: serializationOptionsWithDefaults,
thisParameter,
userActivation,
},
});
@ -384,6 +394,9 @@ class ScriptModule extends Module {
* @param {object} options.target
* The target for the evaluation, which either matches the definition for
* a RealmTarget or for ContextTarget.
* @param {boolean=} options.userActivation
* Determines whether execution should be treated as initiated by user.
* Defaults to `false`.
*
* @returns {ScriptEvaluateResult}
*
@ -399,6 +412,7 @@ class ScriptModule extends Module {
resultOwnership = lazy.OwnershipModel.None,
serializationOptions,
target = {},
userActivation = false,
} = options;
lazy.assert.string(
@ -411,6 +425,11 @@ class ScriptModule extends Module {
`Expected "awaitPromise" to be a boolean, got ${awaitPromise}`
);
lazy.assert.boolean(
userActivation,
`Expected "userActivation" to be a boolean, got ${userActivation}`
);
this.#assertResultOwnership(resultOwnership);
const { contextId, realmId, sandbox } = this.#assertTarget(target);
@ -431,6 +450,7 @@ class ScriptModule extends Module {
resultOwnership,
sandbox,
serializationOptions: serializationOptionsWithDefaults,
userActivation,
},
});

Просмотреть файл

@ -324,6 +324,8 @@ class ScriptModule extends WindowGlobalBiDiModule {
* in case of ECMAScript objects should be serialized.
* @param {RemoteValue=} options.thisParameter
* The value of the this keyword for the function call.
* @param {boolean=} options.userActivation
* Determines whether execution should be treated as initiated by user.
*
* @returns {object}
* - evaluationStatus {EvaluationStatus} One of "normal", "throw".
@ -342,6 +344,7 @@ class ScriptModule extends WindowGlobalBiDiModule {
sandbox: sandboxName = null,
serializationOptions,
thisParameter = null,
userActivation,
} = options;
const realm = this.messageHandler.getRealm({ realmId, sandboxName });
@ -362,6 +365,8 @@ class ScriptModule extends WindowGlobalBiDiModule {
})
: null;
realm.userActivationEnabled = userActivation;
const rv = realm.executeInGlobalWithBindings(
functionDeclaration,
deserializedArguments,
@ -412,6 +417,8 @@ class ScriptModule extends WindowGlobalBiDiModule {
* The ownership model to use for the results of this evaluation.
* @param {string=} options.sandbox
* The name of the sandbox.
* @param {boolean=} options.userActivation
* Determines whether execution should be treated as initiated by user.
*
* @returns {object}
* - evaluationStatus {EvaluationStatus} One of "normal", "throw".
@ -428,10 +435,13 @@ class ScriptModule extends WindowGlobalBiDiModule {
resultOwnership,
sandbox: sandboxName = null,
serializationOptions,
userActivation,
} = options;
const realm = this.messageHandler.getRealm({ realmId, sandboxName });
realm.userActivationEnabled = userActivation;
const rv = realm.executeInGlobal(expression);
return this.#buildReturnValue(

Просмотреть файл

@ -1,12 +0,0 @@
[invalid.py]
[test_params_user_activation_invalid_type[foo\]]
expected: FAIL
[test_params_user_activation_invalid_type[42\]]
expected: FAIL
[test_params_user_activation_invalid_type[user_activation2\]]
expected: FAIL
[test_params_user_activation_invalid_type[user_activation3\]]
expected: FAIL

Просмотреть файл

@ -1,6 +0,0 @@
[user_activation.py]
[test_userActivation[True\]]
expected: FAIL
[test_userActivation_copy[True\]]
expected: FAIL

Просмотреть файл

@ -1,12 +0,0 @@
[invalid.py]
[test_params_user_activation_invalid_type[foo\]]
expected: FAIL
[test_params_user_activation_invalid_type[42\]]
expected: FAIL
[test_params_user_activation_invalid_type[user_activation2\]]
expected: FAIL
[test_params_user_activation_invalid_type[user_activation3\]]
expected: FAIL

Просмотреть файл

@ -1,6 +0,0 @@
[user_activation.py]
[test_userActivation[True\]]
expected: FAIL
[test_userActivation_copy[True\]]
expected: FAIL