summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/addons/embedded-webextension/main.js
blob: 11249c50476a397f36140effd0f26a7c61de5330 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
const tabs = require("sdk/tabs");
const webExtension = require('sdk/webextension');

exports.testEmbeddedWebExtensionModuleInitializedException = function (assert) {
  let actualErr;

  assert.throws(
    () => webExtension.initFromBootstrapAddonParam({webExtension: null}),
    /'sdk\/webextension' module has been already initialized/,
    "Got the expected exception if the module is initialized twice"
  );
};

exports.testEmbeddedWebExtensionBackgroungPage = function* (assert) {
  try {
    const api = yield webExtension.startup();
    assert.ok(api, `webextension waitForStartup promise successfully resolved`);

    const apiSecondStartup = yield webExtension.startup();
    assert.equal(api, apiSecondStartup, "Got the same API object from the second startup call");

    const {browser} = api;

    let messageListener;
    let waitForBackgroundPageMessage = new Promise((resolve, reject) => {
      let numExpectedMessage = 2;
      messageListener = (msg, sender, sendReply) => {
        numExpectedMessage -= 1;
        if (numExpectedMessage == 1) {
          assert.equal(msg, "bg->sdk message",
                       "Got the expected message from the background page");
          sendReply("sdk reply");
        } else if (numExpectedMessage == 0) {
          assert.equal(msg, "sdk reply",
                       "The background page received the expected reply message");
          resolve();
        } else {
          console.error("Unexpected message received", {msg,sender, numExpectedMessage});
          assert.ok(false, `unexpected message received`);
          reject();
        }
      };
      browser.runtime.onMessage.addListener(messageListener);
    });

    let portListener;
    let waitForBackgroundPagePort = new Promise((resolve, reject) => {
      portListener = (port) => {
        let numExpectedMessages = 2;
        port.onMessage.addListener((msg) => {
          numExpectedMessages -= 1;

          if (numExpectedMessages == 1) {
            // Check that the legacy context has been able to receive the first port message
            // and reply with a port message to the background page.
            assert.equal(msg, "bg->sdk port message",
                         "Got the expected port message from the background page");
            port.postMessage("sdk->bg port message");
          } else if (numExpectedMessages == 0) {
            // Check that the background page has received the above port message.
            assert.equal(msg, "bg received sdk->bg port message",
                         "The background page received the expected port message");
          }
        });

        port.onDisconnect.addListener(() => {
          assert.equal(numExpectedMessages, 0, "Got the expected number of port messages");
          resolve();
        });
      };
      browser.runtime.onConnect.addListener(portListener);
    });

    yield Promise.all([
      waitForBackgroundPageMessage,
      waitForBackgroundPagePort,
    ]).then(() => {
      browser.runtime.onMessage.removeListener(messageListener);
      browser.runtime.onConnect.removeListener(portListener);
    });

  } catch (err) {
    assert.fail(`Unexpected webextension startup exception: ${err} - ${err.stack}`);
  }
};

exports.testEmbeddedWebExtensionContentScript = function* (assert, done) {
  try {
    const {browser} = yield webExtension.startup();
    assert.ok(browser, `webextension startup promise resolved successfully to the API object`);

    let messageListener;
    let waitForContentScriptMessage = new Promise((resolve, reject) => {
      let numExpectedMessage = 2;
      messageListener = (msg, sender, sendReply) => {
        numExpectedMessage -= 1;
        if (numExpectedMessage == 1) {
          assert.equal(msg, "content script->sdk message",
                       "Got the expected message from the content script");
          sendReply("sdk reply");
        } else if (numExpectedMessage == 0) {
          assert.equal(msg, "sdk reply",
                       "The content script received the expected reply message");
          resolve();
        } else {
          console.error("Unexpected message received", {msg,sender, numExpectedMessage});
          assert.ok(false, `unexpected message received`);
          reject();
        }
      };
      browser.runtime.onMessage.addListener(messageListener);
    });

    let portListener;
    let waitForContentScriptPort = new Promise((resolve, reject) => {
      portListener = (port) => {
        let numExpectedMessages = 2;
        port.onMessage.addListener((msg) => {
          numExpectedMessages -= 1;

          if (numExpectedMessages == 1) {
            assert.equal(msg, "content script->sdk port message",
                         "Got the expected message from the content script port");
            port.postMessage("sdk->content script port message");
          } else if (numExpectedMessages == 0) {
            assert.equal(msg, "content script received sdk->content script port message",
                         "The content script received the expected port message");
          }
        });
        port.onDisconnect.addListener(() => {
          assert.equal(numExpectedMessages, 0, "Got the epected number of port messages");
          resolve();
        });
      };
      browser.runtime.onConnect.addListener(portListener);
    });

    let url = "http://example.org/";

    var openedTab;
    tabs.once('open', function onOpen(tab) {
      openedTab = tab;
    });
    tabs.open(url);

    yield Promise.all([
      waitForContentScriptMessage,
      waitForContentScriptPort,
    ]).then(() => {
      browser.runtime.onMessage.removeListener(messageListener);
      browser.runtime.onConnect.removeListener(portListener);
      openedTab.close();
    });
  } catch (err) {
    assert.fail(`Unexpected webextension startup exception: ${err} - ${err.stack}`);
  }
};

require("sdk/test/runner").runTestsFromModule(module);