summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/extensions/child/ext-extensionScripts.js
blob: 5d5f364c3eb92254a9c87660a4493e2f02003dd9 (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

var { ExtensionError } = ExtensionUtils;

/**
 * Represents (in the child extension process) a script registered
 * programmatically (instead of being included in the addon manifest).
 *
 * @param {ExtensionPageContextChild} context
 *        The extension context which has registered the script.
 * @param {string} scriptId
 *        An unique id that represents the registered script
 *        (generated and used internally to identify it across the different processes).
 */
class ExtensionScriptChild {
  constructor(type, context, scriptId) {
    this.type = type;
    this.context = context;
    this.scriptId = scriptId;
    this.unregistered = false;
  }

  async unregister() {
    if (this.unregistered) {
      throw new ExtensionError("script already unregistered");
    }

    this.unregistered = true;

    await this.context.childManager.callParentAsyncFunction(
      "extensionScripts.unregister",
      [this.scriptId]
    );

    this.context = null;
  }

  api() {
    const { context } = this;

    return {
      unregister: () => {
        return context.wrapPromise(this.unregister());
      },
    };
  }
}

this.extensionScripts = class extends ExtensionAPI {
  getAPI(context) {
    let api = {
      register(options) {
        return context.cloneScope.Promise.resolve().then(async () => {
          const scriptId = await context.childManager.callParentAsyncFunction(
            "extensionScripts.register",
            [this.type, options]
          );

          const registeredScript = new ExtensionScriptChild(
            this.type,
            context,
            scriptId
          );

          return Cu.cloneInto(registeredScript.api(), context.cloneScope, {
            cloneFunctions: true,
          });
        });
      },
    };

    return {
      composeScripts: { type: "compose", ...api },
      messageDisplayScripts: { type: "messageDisplay", ...api },
    };
  }
};