Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class StorageKeyPartitionDescriptor extends PartitionDescriptor {

constructor() {
super(Type.STORAGE_KEY)
this.#map.set('type', Type.STORAGE_KEY)
}

/**
Expand Down
18 changes: 12 additions & 6 deletions javascript/node/selenium-webdriver/bidi/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,11 @@ class Storage {

if (
partition !== undefined &&
!(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor))
!(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor)
) {
throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`)
throw new Error(
`Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`,
)
}

const command = {
Expand Down Expand Up @@ -118,9 +120,11 @@ class Storage {

if (
partition !== undefined &&
!(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor))
!(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor)
) {
throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`)
throw new Error(
`Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`,
)
}

const command = {
Expand Down Expand Up @@ -158,9 +162,11 @@ class Storage {

if (
partition !== undefined &&
!(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor))
!(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor)
) {
throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`)
throw new Error(
`Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`,
)
}

const command = {
Expand Down
11 changes: 11 additions & 0 deletions javascript/node/selenium-webdriver/lib/test/fileserver.js
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,15 @@ function sendIndex(request, response) {
response.end(data)
}

/**
* Detects the hostname.
* @return {string} The detected hostname or 'localhost' if not found.
*/
function getHostName() {
const hostnameFromEnv = process.env.HOSTNAME
return hostnameFromEnv ? hostnameFromEnv : 'localhost'
}

// PUBLIC application

/**
Expand Down Expand Up @@ -372,6 +381,8 @@ exports.whereIs = function (filePath) {
return server.url(filePath)
}

exports.getHostName = getHostName

exports.Pages = Pages

if (require.main === module) {
Expand Down
113 changes: 91 additions & 22 deletions javascript/node/selenium-webdriver/test/bidi/storage_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,19 @@

const assert = require('node:assert')
require('../../lib/test/fileserver')
const { suite } = require('../../lib/test')
const { suite, ignore } = require('../../lib/test')
const { Browser } = require('selenium-webdriver')
const Storage = require('selenium-webdriver/bidi/storage')
const fileserver = require('../../lib/test/fileserver')
const { CookieFilter } = require('selenium-webdriver/bidi/cookieFilter')
const { BytesValue, SameSite } = require('selenium-webdriver/bidi/networkTypes')
const { BrowsingContextPartitionDescriptor } = require('selenium-webdriver/bidi/partitionDescriptor')
const {
BrowsingContextPartitionDescriptor,
StorageKeyPartitionDescriptor,
} = require('selenium-webdriver/bidi/partitionDescriptor')
const BrowserBiDi = require('selenium-webdriver/bidi/browser')
const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')
const { CreateContextParameters } = require('selenium-webdriver/bidi/createContextParameters')
const { PartialCookie } = require('selenium-webdriver/bidi/partialCookie')

suite(
Expand Down Expand Up @@ -59,38 +65,101 @@ suite(
assert.strictEqual(result.cookies[0].value.value, cookie.value)
})

xit('can get cookie in default user context', async function () {
const windowHandle = await driver.getWindowHandle()
const cookie = createCookieSpec()
ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it(
'can get cookie in default user context',
async function () {
const windowHandle = await driver.getWindowHandle()
const cookie = createCookieSpec()

await driver.manage().addCookie(cookie)
await driver.manage().addCookie(cookie)

const cookieFilter = new CookieFilter()
.name(cookie.name)
.value(new BytesValue(BytesValue.Type.STRING, cookie.value))
const cookieFilter = new CookieFilter()
.name(cookie.name)
.value(new BytesValue(BytesValue.Type.STRING, cookie.value))

await driver.switchTo().newWindow('window')

const descriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())

const storage = await Storage(driver)
const resultAfterSwitchingContext = await storage.getCookies(cookieFilter, descriptor)

await driver.switchTo().newWindow('window')
assert.strictEqual(resultAfterSwitchingContext.cookies[0].value.value, cookie.value)

const descriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())
await driver.switchTo().window(windowHandle)

const descriptorAfterSwitchingBack = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())

const result = await storage.getCookies(cookieFilter, descriptorAfterSwitchingBack)

assert.strictEqual(result.cookies[0].value.value, cookie.value)

const partitionKey = result.partitionKey

assert.notEqual(partitionKey.userContext, null)
assert.notEqual(partitionKey.sourceOrigin, null)
assert.strictEqual(partitionKey.userContext, 'default')
},
)

it('can get cookie in a user context', async function () {
const browser = await BrowserBiDi(driver)
const userContext = await browser.createUserContext()
const windowHandle = await driver.getWindowHandle()

const cookie = {
name: getRandomString(),
value: 'set',
}

const partitionDescriptor = new StorageKeyPartitionDescriptor().userContext(userContext)

const storage = await Storage(driver)
const resultAfterSwitchingContext = await storage.getCookies(cookieFilter, descriptor)

assert.strictEqual(resultAfterSwitchingContext.cookies[0].value.value, cookie.value)
const cookieDomain = fileserver.getHostName()
const partialCookie = new PartialCookie(
cookie.name,
new BytesValue(BytesValue.Type.STRING, cookie.value),
cookieDomain,
)

await storage.setCookie(partialCookie, partitionDescriptor)

await driver.switchTo().window(windowHandle)
const cookieFilter = new CookieFilter().name(cookie.name).value(new BytesValue(BytesValue.Type.STRING, 'set'))

// Create a new browsing context with the user context
const createParams = new CreateContextParameters().userContext(userContext)

const browsingContext = await BrowsingContext(driver, {
type: 'tab',
createParameters: createParams,
})

await driver.switchTo().window(browsingContext.id)

const descriptorAfterSwitchingBack = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())
const result = await storage.getCookies(cookieFilter, partitionDescriptor)

const result = await storage.getCookies(cookieFilter, descriptorAfterSwitchingBack)
assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie')
assert.strictEqual(result.cookies[0].value.value, cookie.value)

// Check if cookies were found
assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie')
assert.strictEqual(result.cookies[0].value.value, cookie.value)

const partitionKey = result.partitionKey
// Check partitionKey if it exists
if (result.partitionKey) {
const partitionKey = result.partitionKey
assert.notEqual(partitionKey.userContext, null, 'Expected userContext to be non-null')
assert.strictEqual(partitionKey.userContext, userContext, 'Expected userContext to match')
}

await driver.switchTo().window(windowHandle)

const browsingContextPartitionDescriptor = new BrowsingContextPartitionDescriptor(windowHandle)

const resultAfterSwitchingBack = await storage.getCookies(cookieFilter, browsingContextPartitionDescriptor)

assert.notEqual(partitionKey.userContext, null)
assert.notEqual(partitionKey.sourceOrigin, null)
assert.strictEqual(partitionKey.userContext, 'default')
assert.strictEqual(resultAfterSwitchingBack.cookies.length, 0)
})

it('can add cookie', async function () {
Expand Down Expand Up @@ -166,7 +235,7 @@ suite(
assert.strictEqual(result.cookies[1].value.value, cookie2.value)
})

xit('can delete all cookies', async function () {
it('can delete all cookies', async function () {
const cookie1 = createCookieSpec()
const cookie2 = createCookieSpec()

Expand All @@ -182,7 +251,7 @@ suite(
assert.strictEqual(result.cookies.length, 0)
})

xit('can delete cookie by name', async function () {
it('can delete cookie by name', async function () {
const cookie1 = createCookieSpec()
const cookie2 = createCookieSpec()

Expand Down