File: chrome_handler.py

package info (click to toggle)
firefox 147.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,324 kB
  • sloc: cpp: 7,607,156; javascript: 6,532,492; ansic: 3,775,158; python: 1,415,368; xml: 634,556; asm: 438,949; java: 186,241; sh: 62,751; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (65 lines) | stat: -rw-r--r-- 2,155 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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)