Source code
Revision control
Copy as Markdown
Other Tools
import contextlib
from support.context import using_context
def register_chrome_handler(session, manifest_path, entries):
with using_context(session, "chrome"):
return session.execute_script(
"""
const { FileUtils } = ChromeUtils.importESModule(
"resource://gre/modules/FileUtils.sys.mjs"
);
const [manifestPath, entries] = arguments;
const manifest = new FileUtils.File(manifestPath);
const rootURI = Services.io.newFileURI(manifest.parent);
const manifestURI = Services.io.newURI(manifest.leafName, null, rootURI);
const handle = Cc["@mozilla.org/addons/addon-manager-startup;1"]
.getService(Ci.amIAddonManagerStartup)
.registerChrome(manifestURI, entries);
const id = Services.uuid.generateUUID().toString().slice(1, -1);
if (globalThis.chromeProtocolHandles) {
globalThis.chromeProtocolHandles.set(id, handle);
}
return id;
""",
args=[manifest_path, entries],
)
def unregister_chrome_handler(session, id):
with using_context(session, "chrome"):
return session.execute_script(
"""
const [id] = arguments;
if (globalThis.chromeProtocolHandles) {
if (!globalThis.chromeProtocolHandles.has(id)) {
throw new Error(
`Id ${id} is not a known chrome protocol handler`
);
}
const handle = globalThis.chromeProtocolHandles.get(id);
globalThis.chromeProtocolHandles.delete(id);
handle.destruct();
}
""",
args=[id],
)
@contextlib.contextmanager
def using_chrome_handler(session, manifest_path, entries):
id = register_chrome_handler(session, manifest_path, entries)
try:
yield
finally:
unregister_chrome_handler(session, id)