// 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 { DOMAIN_TOKEN } = require('selenium-webdriver/bidi/domain')
const { WebExtension, MozWebExtension } = require('selenium-webdriver/bidi/generated/webextension')
const { MozBrowsingContext } = require('selenium-webdriver/bidi/generated/browsing_context')
/** A transport that records each command as it would be serialized onto the socket. */
function recordingBidi(result) {
const frames = []
return {
frames,
send: async (message) => {
frames.push(JSON.parse(JSON.stringify(message)))
return { result }
},
}
}
describe('Generated vendor (moz) variant of a spec domain', function () {
const extensionData = { type: 'path', path: '/tmp/ext' }
it('extends the spec class, which stays free of vendor commands', function () {
assert.ok(MozWebExtension.prototype instanceof WebExtension)
assert.strictEqual(WebExtension.prototype.listExtensions, undefined)
})
it('leaves the vendor fields off when not given, so the browser applies its own defaults', async function () {
const bidi = recordingBidi({ extension: 'ext@example.com' })
await new MozWebExtension(bidi, DOMAIN_TOKEN).install({ extensionData })
assert.deepStrictEqual(bidi.frames[0].params, { extensionData })
})
it('sends vendor fields under their namespaced wire keys', async function () {
const bidi = recordingBidi({ extension: 'ext@example.com' })
await new MozWebExtension(bidi, DOMAIN_TOKEN).install({
extensionData,
permanent: false,
allowPrivateBrowsing: true,
})
assert.strictEqual(bidi.frames[0].method, 'webExtension.install')
assert.deepStrictEqual(bidi.frames[0].params, {
extensionData,
'moz:permanent': false,
'moz:allowPrivateBrowsing': true,
})
})
it('serializes a vendor literal-choice field and rejects a value outside it', async function () {
const bidi = recordingBidi({ contexts: [] })
const browsingContext = new MozBrowsingContext(bidi, DOMAIN_TOKEN)
await browsingContext.getTree({ scope: 'chrome' })
assert.deepStrictEqual(bidi.frames[0].params, { 'moz:scope': 'chrome' })
await assert.rejects(browsingContext.getTree({ scope: 'tab' }))
})
it('keeps vendor fields of a received record a vendor extends', async function () {
const info = {
children: null,
clientWindow: 'w1',
context: 'c1',
originalOpener: null,
url: 'about:blank',
userContext: 'default',
'moz:name': 'main',
'moz:scope': 'content',
}
const result = await new MozBrowsingContext(recordingBidi({ contexts: [info] }), DOMAIN_TOKEN).getTree({})
assert.strictEqual(result.contexts[0]['moz:name'], 'main')
assert.strictEqual(result.contexts[0]['moz:scope'], 'content')
})
it('adds vendor commands without their namespace in the method name', async function () {
const bidi = recordingBidi({ extensions: [] })
await new MozWebExtension(bidi, DOMAIN_TOKEN).listExtensions()
assert.strictEqual(bidi.frames[0].method, 'webExtension.moz:listExtensions')
})
})