blob: d47f186052f487ff34e543bcaff6904287a27689 [file] [log] [blame]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
'use strict'
const assert = require('node:assert')
const { Browser } = require('selenium-webdriver')
const { Pages, suite } = require('../../lib/test')
const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')
const ScriptManager = require('selenium-webdriver/bidi/scriptManager')
const {
ChannelValue,
LocalValue,
ReferenceValue,
RemoteReferenceType,
} = require('selenium-webdriver/bidi/protocolValue')
const { ArgumentValue } = require('selenium-webdriver/bidi/argumentValue')
const { EvaluateResultType } = require('selenium-webdriver/bidi/evaluateResult')
const { ResultOwnership } = require('selenium-webdriver/bidi/resultOwnership')
const { RealmType } = require('selenium-webdriver/bidi/realmInfo')
const { WebDriverError } = require('selenium-webdriver/lib/error')
suite(
function (env) {
let driver
let manager
beforeEach(async function () {
driver = await env.builder().build()
})
afterEach(async function () {
await manager.close()
await driver.quit()
})
describe('Script Manager', function () {
it('can call function with declaration', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(id, '()=>{return 1+2;}', false)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'number')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value, 3)
})
it('can call function to get iframe browsing context', async function () {
await driver.get(Pages.iframePage)
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'() => document.querySelector(\'iframe[id="iframe1"]\').contentWindow',
false,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'window')
assert.notEqual(result.result.value, null)
assert.notEqual(result.result.value.context, null)
})
it('can call function to get element', async function () {
await driver.get(Pages.logEntryAdded)
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'() => document.getElementById("consoleLog")',
false,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'node')
assert.notEqual(result.result.value, null)
assert.notEqual(result.result.value.nodeType, null)
})
it('can call function with arguments', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
let argumentValues = []
let value1 = LocalValue.createStringValue('ARGUMENT_STRING_VALUE')
let value2 = LocalValue.createNumberValue(42)
argumentValues.push(value1)
argumentValues.push(value2)
const result = await manager.callFunctionInBrowsingContext(
id,
'(...args)=>{return args}',
false,
argumentValues,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'array')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value.length, 2)
})
it('can call function with await promise', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'async function() {{\n' +
' await new Promise(r => setTimeout(() => r(), 0));\n' +
' return "SOME_DELAYED_RESULT";\n' +
' }}',
true,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'string')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value, 'SOME_DELAYED_RESULT')
})
it('can call function with await promise false', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'async function() {{\n' +
' await new Promise(r => setTimeout(() => r(), 0));\n' +
' return "SOME_DELAYED_RESULT";\n' +
' }}',
false,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'promise')
assert.equal(result.result.value, undefined)
})
it('can call function with this parameter', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
let mapValue = { some_property: LocalValue.createNumberValue(42) }
let thisParameter = LocalValue.createObjectValue(mapValue).asMap()
const result = await manager.callFunctionInBrowsingContext(
id,
'function(){return this.some_property}',
false,
null,
thisParameter,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'number')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value, 42)
})
it('can call function with ownership root', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'async function(){return {a:1}}',
true,
null,
null,
ResultOwnership.ROOT,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.notEqual(result.result.handle, null)
assert.notEqual(result.result.value, null)
})
it('can call function with ownership none', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(
id,
'async function(){return {a:1}}',
true,
null,
null,
ResultOwnership.NONE,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.handle, undefined)
assert.notEqual(result.result.value, null)
})
it('can call function that throws exception', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.callFunctionInBrowsingContext(id, '))) !!@@## some invalid JS script (((', false)
assert.equal(result.resultType, EvaluateResultType.EXCEPTION)
assert.notEqual(result.realmId, null)
assert.equal(result.exceptionDetails.exception.type, 'error')
assert.equal(result.exceptionDetails.text.includes('SyntaxError:'), true)
assert.notEqual(result.exceptionDetails.columnNumber, null)
assert.equal(result.exceptionDetails.stackTrace.callFrames.length, 0)
})
it('can call function in a sandbox', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
// Make changes without sandbox
await manager.callFunctionInBrowsingContext(id, '() => { window.foo = 1; }', true)
// Check changes are not present in the sandbox
const resultNotInSandbox = await manager.callFunctionInBrowsingContext(
id,
'() => window.foo',
true,
null,
null,
null,
'sandbox',
)
assert.equal(resultNotInSandbox.resultType, EvaluateResultType.SUCCESS)
assert.equal(resultNotInSandbox.result.type, 'undefined')
// Make changes in the sandbox
await manager.callFunctionInBrowsingContext(id, '() => { window.foo = 2; }', true, null, null, null, 'sandbox')
// Check if the changes are present in the sandbox
const resultInSandbox = await manager.callFunctionInBrowsingContext(
id,
'() => window.foo',
true,
null,
null,
null,
'sandbox',
)
assert.equal(resultInSandbox.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(resultInSandbox.realmId, null)
assert.equal(resultInSandbox.result.type, 'number')
assert.notEqual(resultInSandbox.result.value, null)
assert.equal(resultInSandbox.result.value, 2)
})
it('can call function in a realm', async function () {
const firstTab = await driver.getWindowHandle()
await driver.switchTo().newWindow('tab')
manager = await ScriptManager(firstTab, driver)
const realms = await manager.getAllRealms()
const firstTabRealmId = realms[0].realmId
const secondTabRealmId = realms[1].realmId
await manager.callFunctionInRealm(firstTabRealmId, '() => { window.foo = 3; }', true)
await manager.callFunctionInRealm(secondTabRealmId, '() => { window.foo = 5; }', true)
const firstContextResult = await manager.callFunctionInRealm(firstTabRealmId, '() => window.foo', true)
assert.equal(firstContextResult.resultType, EvaluateResultType.SUCCESS)
assert.equal(firstContextResult.result.type, 'number')
assert.notEqual(firstContextResult.result.value, null)
assert.equal(firstContextResult.result.value, 3)
const secondContextResult = await manager.callFunctionInRealm(secondTabRealmId, '() => window.foo', true)
assert.equal(secondContextResult.resultType, EvaluateResultType.SUCCESS)
assert.equal(secondContextResult.result.type, 'number')
assert.notEqual(secondContextResult.result.value, null)
assert.equal(secondContextResult.result.value, 5)
})
it('can evaluate script', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.evaluateFunctionInBrowsingContext(id, '1 + 2', true)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'number')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value, 3)
})
it('can evaluate script that throws exception', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.evaluateFunctionInBrowsingContext(
id,
'))) !!@@## some invalid JS script (((',
false,
)
assert.equal(result.resultType, EvaluateResultType.EXCEPTION)
assert.notEqual(result.realmId, null)
assert.equal(result.exceptionDetails.exception.type, 'error')
assert.equal(result.exceptionDetails.text.includes('SyntaxError:'), true)
assert.notEqual(result.exceptionDetails.columnNumber, null)
assert.equal(result.exceptionDetails.stackTrace.callFrames.length, 0)
})
it('can evaluate script with result ownership', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const result = await manager.evaluateFunctionInBrowsingContext(
id,
'Promise.resolve({a:1})',
true,
ResultOwnership.ROOT,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'object')
assert.notEqual(result.result.value, null)
assert.notEqual(result.result.handle, null)
})
it('can evaluate in a sandbox', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
// Make changes without sandbox
await manager.evaluateFunctionInBrowsingContext(id, 'window.foo = 1', true)
// Check changes are not present in the sandbox
const resultNotInSandbox = await manager.evaluateFunctionInBrowsingContext(
id,
'window.foo',
true,
null,
'sandbox',
)
assert.equal(resultNotInSandbox.resultType, EvaluateResultType.SUCCESS)
assert.equal(resultNotInSandbox.result.type, 'undefined')
// Make changes in the sandbox
await manager.evaluateFunctionInBrowsingContext(id, 'window.foo = 2', true, null, 'sandbox')
const resultInSandbox = await manager.evaluateFunctionInBrowsingContext(id, 'window.foo', true, null, 'sandbox')
assert.equal(resultInSandbox.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(resultInSandbox.realmId, null)
assert.equal(resultInSandbox.result.type, 'number')
assert.notEqual(resultInSandbox.result.value, null)
assert.equal(resultInSandbox.result.value, 2)
})
it('can evaluate in a realm', async function () {
const firstTab = await driver.getWindowHandle()
await driver.switchTo().newWindow('tab')
manager = await ScriptManager(firstTab, driver)
const realms = await manager.getAllRealms()
const firstTabRealmId = realms[0].realmId
const secondTabRealmId = realms[1].realmId
await manager.evaluateFunctionInRealm(firstTabRealmId, 'window.foo = 3', true)
await manager.evaluateFunctionInRealm(secondTabRealmId, 'window.foo = 5', true)
const firstContextResult = await manager.evaluateFunctionInRealm(firstTabRealmId, 'window.foo', true)
assert.equal(firstContextResult.resultType, EvaluateResultType.SUCCESS)
assert.equal(firstContextResult.result.type, 'number')
assert.notEqual(firstContextResult.result.value, null)
assert.equal(firstContextResult.result.value, 3)
const secondContextResult = await manager.evaluateFunctionInRealm(secondTabRealmId, 'window.foo', true)
assert.equal(secondContextResult.resultType, EvaluateResultType.SUCCESS)
assert.equal(secondContextResult.result.type, 'number')
assert.notEqual(secondContextResult.result.value, null)
assert.equal(secondContextResult.result.value, 5)
})
it('can disown handles', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const evaluateResult = await manager.evaluateFunctionInBrowsingContext(
id,
'({a:1})',
false,
ResultOwnership.ROOT,
)
assert.equal(evaluateResult.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(evaluateResult.realmId, null)
assert.notEqual(evaluateResult.result.handle, null)
let argumentValues = []
let valueMap = evaluateResult.result.value
let value1 = LocalValue.createObjectValue(valueMap)
let value2 = new ReferenceValue(RemoteReferenceType.HANDLE, evaluateResult.result.handle)
argumentValues.push(value1)
argumentValues.push(value2)
await manager.callFunctionInBrowsingContext(id, 'arg => arg.a', false, argumentValues)
assert.notEqual(evaluateResult.result.value, null)
let handles = [evaluateResult.result.handle]
await manager.disownBrowsingContextScript(id, handles)
await manager.callFunctionInBrowsingContext(id, 'arg => arg.a', false, argumentValues).catch((error) => {
assert(error instanceof TypeError)
})
})
it('can disown handles in realm', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const evaluateResult = await manager.evaluateFunctionInBrowsingContext(
id,
'({a:1})',
false,
ResultOwnership.ROOT,
)
assert.equal(evaluateResult.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(evaluateResult.realmId, null)
assert.notEqual(evaluateResult.result.handle, null)
let argumentValues = []
let valueMap = evaluateResult.result.value
let value1 = LocalValue.createObjectValue(valueMap)
let value2 = new ReferenceValue(RemoteReferenceType.HANDLE, evaluateResult.result.handle)
argumentValues.push(value1)
argumentValues.push(value2)
await manager.callFunctionInBrowsingContext(id, 'arg => arg.a', false, argumentValues)
assert.notEqual(evaluateResult.result.value, null)
let handles = [evaluateResult.result.handle]
await manager.disownRealmScript(evaluateResult.realmId, handles)
await manager.callFunctionInBrowsingContext(id, 'arg => arg.a', false, argumentValues).catch((error) => {
assert(error instanceof TypeError)
})
})
it('can get all realms', async function () {
const firstWindow = await driver.getWindowHandle()
await driver.switchTo().newWindow('window')
const secondWindow = await driver.getWindowHandle()
manager = await ScriptManager(firstWindow, driver)
const realms = await manager.getAllRealms()
assert.equal(realms.length, 2)
const firstWindowRealm = realms[0]
assert.equal(firstWindowRealm.realmType, RealmType.WINDOW)
assert.notEqual(firstWindowRealm.realmId, null)
assert.equal(firstWindowRealm.browsingContext, firstWindow)
const secondWindowRealm = realms[1]
assert.equal(secondWindowRealm.realmType, RealmType.WINDOW)
assert.notEqual(secondWindowRealm.realmId, null)
assert.equal(secondWindowRealm.browsingContext, secondWindow)
})
it('can get realm by type', async function () {
const firstWindow = await driver.getWindowHandle()
await driver.switchTo().newWindow('window')
const secondWindow = await driver.getWindowHandle()
manager = await ScriptManager(firstWindow, driver)
const realms = await manager.getRealmsByType(RealmType.WINDOW)
assert.equal(realms.length, 2)
const firstWindowRealm = realms[0]
assert.equal(firstWindowRealm.realmType, RealmType.WINDOW)
assert.notEqual(firstWindowRealm.realmId, null)
assert.equal(firstWindowRealm.browsingContext, firstWindow)
const secondWindowRealm = realms[1]
assert.equal(secondWindowRealm.realmType, RealmType.WINDOW)
assert.notEqual(secondWindowRealm.realmId, null)
assert.equal(secondWindowRealm.browsingContext, secondWindow)
})
it('can get realm in browsing context', async function () {
const windowId = await driver.getWindowHandle()
await driver.switchTo().newWindow('tab')
const tabId = await driver.getWindowHandle()
manager = await ScriptManager(windowId, driver)
const realms = await manager.getRealmsInBrowsingContext(tabId)
const tabRealm = realms[0]
assert.equal(tabRealm.realmType, RealmType.WINDOW)
assert.notEqual(tabRealm.realmId, null)
assert.equal(tabRealm.browsingContext, tabId)
})
it('can get realm in browsing context by type', async function () {
const windowId = await driver.getWindowHandle()
await driver.switchTo().newWindow('tab')
manager = await ScriptManager(windowId, driver)
const realms = await manager.getRealmsInBrowsingContextByType(windowId, RealmType.WINDOW)
const windowRealm = realms[0]
assert.equal(windowRealm.realmType, RealmType.WINDOW)
assert.notEqual(windowRealm.realmId, null)
assert.equal(windowRealm.browsingContext, windowId)
})
it('can add preload script test', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager([], driver)
await manager.addPreloadScript("() => { window.foo='bar'; }")
// Check that preload script didn't apply the changes to the current context
let result = await manager.evaluateFunctionInBrowsingContext(id, 'window.foo', true)
assert.equal(result.result.type, 'undefined')
await driver.switchTo().newWindow('window')
const new_window_id = await driver.getWindowHandle()
// Check that preload script applied the changes to the window
result = await manager.evaluateFunctionInBrowsingContext(new_window_id, 'window.foo', true)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(result.realmId, null)
assert.equal(result.result.type, 'string')
assert.notEqual(result.result.value, null)
assert.equal(result.result.value, 'bar')
const browsingContext = await BrowsingContext(driver, {
type: 'tab',
})
await browsingContext.navigate(Pages.logEntryAdded, 'complete')
// Check that preload script was applied after navigation
result = await manager.evaluateFunctionInBrowsingContext(new_window_id, 'window.foo', true)
assert.equal(result.result.type, 'string')
assert.equal(result.result.value, 'bar')
})
it('can add same preload script twice', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
const script_1 = await manager.addPreloadScript('() => { return 42; }')
const script_2 = await manager.addPreloadScript('() => { return 42; }')
assert.notEqual(script_1, script_2)
})
it('can access preload script properties', async function () {
manager = await ScriptManager([], driver)
await manager.addPreloadScript('() => { window.preloadScriptFunction = () => window.baz = 42; }')
await driver.switchTo().newWindow('tab')
const new_tab_id = await driver.getWindowHandle()
await driver.get(Pages.scriptTestAccessProperty)
const result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.baz', true)
assert.equal(result.result.type, 'number')
assert.equal(result.result.value, 42)
})
it('can add preload script to sandbox', async function () {
manager = await ScriptManager([], driver)
await manager.addPreloadScript('() => { window.foo = 1; }')
await manager.addPreloadScript('() => { window.bar = 2; }', [], 'sandbox')
await driver.switchTo().newWindow('tab')
const new_tab_id = await driver.getWindowHandle()
let result_in_sandbox = await manager.evaluateFunctionInBrowsingContext(
new_tab_id,
'window.foo',
true,
null,
'sandbox',
)
assert.equal(result_in_sandbox.result.type, 'undefined')
let result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.bar', true)
assert.equal(result.result.type, 'undefined')
result_in_sandbox = await manager.evaluateFunctionInBrowsingContext(
new_tab_id,
'window.bar',
true,
null,
'sandbox',
)
assert.equal(result_in_sandbox.result.type, 'number')
assert.equal(result_in_sandbox.result.value, 2)
})
it('can remove properties set by preload script', async function () {
manager = await ScriptManager([], driver)
await manager.addPreloadScript('() => { window.foo = 42; }')
await manager.addPreloadScript('() => { window.foo = 50; }', [], 'sandbox_1')
await driver.switchTo().newWindow('tab')
const new_tab_id = await driver.getWindowHandle()
await driver.get(Pages.scriptTestRemoveProperty)
let result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.foo', true)
assert.equal(result.result.type, 'undefined')
result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.foo', true, null, 'sandbox_1')
assert.equal(result.result.type, 'number')
assert.equal(result.result.value, 50)
})
it('can remove preload script', async function () {
manager = await ScriptManager([], driver)
let script = await manager.addPreloadScript("() => { window.foo='bar'; }")
await driver.switchTo().newWindow('tab')
const tab_1_id = await driver.getWindowHandle()
let result = await manager.evaluateFunctionInBrowsingContext(tab_1_id, 'window.foo', true)
assert.equal(result.result.type, 'string')
assert.equal(result.result.value, 'bar')
await manager.removePreloadScript(script)
await driver.switchTo().newWindow('tab')
const tab_2_id = await driver.getWindowHandle()
// Check that changes from preload script were not applied after script was removed
result = await manager.evaluateFunctionInBrowsingContext(tab_2_id, 'window.foo', true)
assert.equal(result.result.type, 'undefined')
})
it('cannot remove same preload script twice', async function () {
manager = await ScriptManager([], driver)
let script = await manager.addPreloadScript("() => { window.foo='bar'; }")
await manager.removePreloadScript(script)
await manager.removePreloadScript(script).catch((error) => {
assert(error instanceof WebDriverError)
})
})
it('can remove one of preload script', async function () {
manager = await ScriptManager([], driver)
let script_1 = await manager.addPreloadScript("() => { window.bar='foo'; }")
let script_2 = await manager.addPreloadScript("() => { window.baz='bar'; }")
await manager.removePreloadScript(script_1)
await driver.switchTo().newWindow('tab')
const new_tab_id = await driver.getWindowHandle()
// Check that the first script didn't run
let result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.bar', true)
assert.equal(result.result.type, 'undefined')
// Check that the second script still applied the changes to the window
result = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.baz', true)
assert.equal(result.result.type, 'string')
assert.equal(result.result.value, 'bar')
// Clean up the second script
await manager.removePreloadScript(script_2)
})
it('can remove one of preload script from sandbox', async function () {
const id = await driver.getWindowHandle()
manager = await ScriptManager(id, driver)
let script_1 = await manager.addPreloadScript('() => { window.foo = 1; }')
let script_2 = await manager.addPreloadScript('() => { window.bar = 2; }', [], 'sandbox')
// Remove first preload script
await manager.removePreloadScript(script_1)
// Remove second preload script
await manager.removePreloadScript(script_2)
await driver.switchTo().newWindow('tab')
const new_tab_id = await driver.getWindowHandle()
// Make sure that changes from first preload script were not applied
let result_in_window = await manager.evaluateFunctionInBrowsingContext(new_tab_id, 'window.foo', true)
assert.equal(result_in_window.result.type, 'undefined')
// Make sure that changes from second preload script were not applied
let result_in_sandbox = await manager.evaluateFunctionInBrowsingContext(
new_tab_id,
'window.bar',
true,
null,
'sandbox',
)
assert.equal(result_in_sandbox.result.type, 'undefined')
})
it('can listen to channel message', async function () {
manager = await ScriptManager(undefined, driver)
let message = null
await manager.onMessage((m) => {
message = m
})
let argumentValues = []
let value = LocalValue.createChannelValue(new ChannelValue('channel_name'))
argumentValues.push(value)
const result = await manager.callFunctionInBrowsingContext(
await driver.getWindowHandle(),
'(channel) => channel("foo")',
false,
argumentValues,
)
assert.equal(result.resultType, EvaluateResultType.SUCCESS)
assert.notEqual(message, null)
assert.equal(message.channel, 'channel_name')
assert.equal(message.data.type, 'string')
assert.equal(message.data.value, 'foo')
})
it('can listen to realm created message', async function () {
manager = await ScriptManager(undefined, driver)
let realmInfo = null
await manager.onRealmCreated((result) => {
realmInfo = result
})
const id = await driver.getWindowHandle()
const browsingContext = await BrowsingContext(driver, {
browsingContextId: id,
})
await browsingContext.navigate(Pages.blankPage, 'complete')
assert.notEqual(realmInfo, null)
assert.notEqual(realmInfo.realmId, null)
assert.equal(realmInfo.realmType, RealmType.WINDOW)
})
xit('can listen to realm destroyed message', async function () {
manager = await ScriptManager(undefined, driver)
let realmInfo = null
await manager.onRealmDestroyed((result) => {
realmInfo = result
})
const id = await driver.getWindowHandle()
const browsingContext = await BrowsingContext(driver, {
browsingContextId: id,
})
await browsingContext.close()
assert.notEqual(realmInfo, null)
assert.notEqual(realmInfo.realmId, null)
assert.equal(realmInfo.realmType, RealmType.WINDOW)
})
})
},
{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },
)