зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1770480 - [wdspec] Add tests for script evaluation inside sandboxes for "script.evaluate" and "script.callFunction" commands. r=webdriver-reviewers,jdescottes
Depends on D153440 Differential Revision: https://phabricator.services.mozilla.com/D153442
This commit is contained in:
Родитель
41b3a21f9d
Коммит
c7fb77eccf
|
@ -0,0 +1,28 @@
|
||||||
|
[sandbox.py]
|
||||||
|
[test_sandbox]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_sandbox_with_empty_name]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_switch_sandboxes]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_sandbox_with_side_effects]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_arguments]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_exception_details[True\]]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_exception_details[False\]]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
|
@ -0,0 +1,24 @@
|
||||||
|
[sandbox.py]
|
||||||
|
[test_sandbox]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_sandbox_with_empty_name]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_switch_sandboxes]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_sandbox_with_side_effects]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_exception_details[True\]]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
||||||
|
|
||||||
|
[test_exception_details[False\]]
|
||||||
|
disabled:
|
||||||
|
if os == "android": https://bugzilla.mozilla.org/show_bug.cgi?id=1506782
|
|
@ -0,0 +1,180 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from webdriver.bidi.modules.script import ContextTarget, ScriptEvaluateResultException
|
||||||
|
|
||||||
|
from ... import any_int, any_string, recursive_compare
|
||||||
|
from .. import any_stack_trace
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox(bidi_session, new_tab):
|
||||||
|
# Make changes in window
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => { window.foo = 1; }",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check that changes are not present in sandbox
|
||||||
|
result_in_sandbox = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox == {"type": "undefined"}
|
||||||
|
|
||||||
|
# Make changes in sandbox
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => { window.bar = 2; }",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make sure that changes are present in sandbox
|
||||||
|
result_in_sandbox = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.bar",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox == {"type": "number", "value": 2}
|
||||||
|
|
||||||
|
# Make sure that changes didn't leak from sandbox
|
||||||
|
result_in_window = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.bar",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_window == {"type": "undefined"}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox_with_empty_name(bidi_session, new_tab):
|
||||||
|
# BiDi specification doesn't have restrictions of a sandbox name,
|
||||||
|
# that's why we want to make sure that it works with an empty name
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.foo = 'bar'",
|
||||||
|
target=ContextTarget(new_tab["context"], ""),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make sure that we can find the sandbox with the empty name
|
||||||
|
result = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], ""),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result == {"type": "string", "value": "bar"}
|
||||||
|
|
||||||
|
# Make sure that changes didn't leak from sandbox
|
||||||
|
result = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result == {"type": "undefined"}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_switch_sandboxes(bidi_session, new_tab):
|
||||||
|
# Test that sandboxes are retained when switching between them
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => { window.foo = 1; }",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => { window.foo = 2; }",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
result_in_sandbox_1 = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_1 == {"type": "number", "value": 1}
|
||||||
|
|
||||||
|
result_in_sandbox_2 = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_2 == {"type": "number", "value": 2}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox_with_side_effects(bidi_session, new_tab):
|
||||||
|
# Make sure changing the node in sandbox will affect the other sandbox as well
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => document.querySelector('body').textContent = 'foo'",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
expected_value = {"type": "string", "value": "foo"}
|
||||||
|
|
||||||
|
result_in_sandbox_1 = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => document.querySelector('body').textContent",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_1 == expected_value
|
||||||
|
|
||||||
|
result_in_sandbox_2 = await bidi_session.script.call_function(
|
||||||
|
function_declaration="() => document.querySelector('body').textContent",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_2 == expected_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_arguments(bidi_session, new_tab):
|
||||||
|
argument = {
|
||||||
|
"type": "set",
|
||||||
|
"value": [
|
||||||
|
{"type": "string", "value": "foobar"},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
result = await bidi_session.script.call_function(
|
||||||
|
function_declaration=f"""(arg) => {{
|
||||||
|
if(! (arg instanceof Set))
|
||||||
|
throw Error("Argument type should be Set, but was "+
|
||||||
|
Object.prototype.toString.call(arg));
|
||||||
|
return arg;
|
||||||
|
}}""",
|
||||||
|
arguments=[argument],
|
||||||
|
await_promise=False,
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
)
|
||||||
|
|
||||||
|
recursive_compare(argument, result)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.parametrize("await_promise", [True, False])
|
||||||
|
async def test_exception_details(bidi_session, new_tab, await_promise):
|
||||||
|
function_declaration = "()=>{{ throw 1 }}"
|
||||||
|
if await_promise:
|
||||||
|
function_declaration = "async" + function_declaration
|
||||||
|
|
||||||
|
with pytest.raises(ScriptEvaluateResultException) as exception:
|
||||||
|
await bidi_session.script.call_function(
|
||||||
|
function_declaration=function_declaration,
|
||||||
|
await_promise=await_promise,
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
)
|
||||||
|
|
||||||
|
recursive_compare(
|
||||||
|
{
|
||||||
|
"realm": any_string,
|
||||||
|
"exceptionDetails": {
|
||||||
|
"columnNumber": any_int,
|
||||||
|
"exception": {"type": "number", "value": 1},
|
||||||
|
"lineNumber": any_int,
|
||||||
|
"stackTrace": any_stack_trace,
|
||||||
|
"text": any_string,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exception.value.result,
|
||||||
|
)
|
|
@ -0,0 +1,158 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from webdriver.bidi.modules.script import ContextTarget, ScriptEvaluateResultException
|
||||||
|
|
||||||
|
from ... import any_int, any_string, recursive_compare
|
||||||
|
from .. import any_stack_trace
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox(bidi_session, new_tab):
|
||||||
|
# Make changes in window
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo = 1",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check that changes are not present in sandbox
|
||||||
|
result_in_sandbox = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox == {"type": "undefined"}
|
||||||
|
|
||||||
|
# Make changes in sandbox
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="window.bar = 1",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make sure that changes are present in sandbox
|
||||||
|
result_in_sandbox = await bidi_session.script.evaluate(
|
||||||
|
expression="window.bar",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox == {"type": "number", "value": 1}
|
||||||
|
|
||||||
|
# Make sure that changes didn't leak from sandbox
|
||||||
|
result = await bidi_session.script.evaluate(
|
||||||
|
expression="window.bar",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result == {"type": "undefined"}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox_with_empty_name(bidi_session, new_tab):
|
||||||
|
# BiDi specification doesn't have restrictions of a sandbox name,
|
||||||
|
# that's why we want to make sure that it works with an empty name
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo = 'bar'",
|
||||||
|
target=ContextTarget(new_tab["context"], ""),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make sure that we can find the sandbox with the empty name
|
||||||
|
result = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], ""),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result == {"type": "string", "value": "bar"}
|
||||||
|
|
||||||
|
# Make sure that changes didn't leak from sandbox
|
||||||
|
result = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"]),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result == {"type": "undefined"}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_switch_sandboxes(bidi_session, new_tab):
|
||||||
|
# Test that sandboxes are retained when switching between them
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo = 1",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo = 2",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
result_in_sandbox_1 = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_1 == {"type": "number", "value": 1}
|
||||||
|
|
||||||
|
result_in_sandbox_2 = await bidi_session.script.evaluate(
|
||||||
|
expression="window.foo",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_2 == {"type": "number", "value": 2}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_sandbox_with_side_effects(bidi_session, new_tab):
|
||||||
|
# Make sure changing the node in sandbox will affect the other sandbox as well
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression="document.querySelector('body').textContent = 'foo'",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
expected_value = {"type": "string", "value": "foo"}
|
||||||
|
|
||||||
|
result_in_sandbox_1 = await bidi_session.script.evaluate(
|
||||||
|
expression="document.querySelector('body').textContent",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_1"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_1 == expected_value
|
||||||
|
|
||||||
|
result_in_sandbox_2 = await bidi_session.script.evaluate(
|
||||||
|
expression="document.querySelector('body').textContent",
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox_2"),
|
||||||
|
await_promise=True,
|
||||||
|
)
|
||||||
|
assert result_in_sandbox_2 == expected_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.parametrize("await_promise", [True, False])
|
||||||
|
async def test_exception_details(bidi_session, new_tab, await_promise):
|
||||||
|
if await_promise:
|
||||||
|
expression = "Promise.reject(1)"
|
||||||
|
else:
|
||||||
|
expression = "throw 1"
|
||||||
|
|
||||||
|
with pytest.raises(ScriptEvaluateResultException) as exception:
|
||||||
|
await bidi_session.script.evaluate(
|
||||||
|
expression=expression,
|
||||||
|
target=ContextTarget(new_tab["context"], "sandbox"),
|
||||||
|
await_promise=await_promise,
|
||||||
|
)
|
||||||
|
|
||||||
|
recursive_compare(
|
||||||
|
{
|
||||||
|
"realm": any_string,
|
||||||
|
"exceptionDetails": {
|
||||||
|
"columnNumber": any_int,
|
||||||
|
"exception": {"type": "number", "value": 1},
|
||||||
|
"lineNumber": any_int,
|
||||||
|
"stackTrace": any_stack_trace,
|
||||||
|
"text": any_string,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exception.value.result,
|
||||||
|
)
|
Загрузка…
Ссылка в новой задаче