summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/browser/browser_discovery_install.js
blob: 63516bd53b101dd23ca22d3d750558c74c15394b (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

// Tests that the discovery view can install add-ons correctly

const MAIN_URL = "https://example.com/" + RELATIVE_DIR + "discovery_install.html";
const GOOD_FRAMED_URL = "https://example.com/" + RELATIVE_DIR + "discovery_frame.html";
const BAD_FRAMED_URL = "https://example.org/" + RELATIVE_DIR + "discovery_frame.html";

const PREF_INSTALL_REQUIREBUILTINCERTS = "extensions.install.requireBuiltInCerts";

// Temporarily enable caching
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
// Allow SSL from non-built-in certs
Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
// Allow installs from the test site
Services.perms.add(NetUtil.newURI("https://example.com/"), "install",
                   Ci.nsIPermissionManager.ALLOW_ACTION);
Services.perms.add(NetUtil.newURI("https://example.org/"), "install",
                   Ci.nsIPermissionManager.ALLOW_ACTION);

registerCleanupFunction(() => {
  Services.perms.remove(NetUtil.newURI("https://example.com/"), "install");
  Services.perms.remove(NetUtil.newURI("https://example.org/"), "install");
  Services.prefs.clearUserPref(PREF_INSTALL_REQUIREBUILTINCERTS);
});

function clickLink(frameLoader, id) {
  let link = frameLoader.contentDocument.getElementById(id);
  EventUtils.sendMouseEvent({type: "click"}, link);
}

function waitForInstall() {
  return new Promise(resolve => {
    wait_for_window_open((window) => {
      is(window.location, "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul",
         "Should have seen the install window");
      window.document.documentElement.cancelDialog();
      resolve();
    });
  });
}

function waitForFail() {
  return new Promise(resolve => {
    let listener = (subject, topic, data) => {
      Services.obs.removeObserver(listener, topic);
      resolve();
    }
    Services.obs.addObserver(listener, "addon-install-origin-blocked", false);
  });
}

// Tests that navigating to an XPI attempts to install correctly
add_task(function* test_install_direct() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");

  clickLink(browser, "install-direct");
  yield waitForInstall();

  yield close_manager(managerWindow);
});

// Tests that installing via JS works correctly
add_task(function* test_install_js() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");

  clickLink(browser, "install-js");
  yield waitForInstall();

  yield close_manager(managerWindow);
});

// Installing from an inner-frame of the same origin should work
add_task(function* test_install_inner_direct() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, GOOD_FRAMED_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");
  let frame = browser.contentDocument.getElementById("frame");

  clickLink(frame, "install-direct");
  yield waitForInstall();

  yield close_manager(managerWindow);
});

add_task(function* test_install_inner_js() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, GOOD_FRAMED_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");
  let frame = browser.contentDocument.getElementById("frame");

  clickLink(frame, "install-js");
  yield waitForInstall();

  yield close_manager(managerWindow);
});

// Installing from an inner-frame of a different origin should fail
add_task(function* test_install_xorigin_direct() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, BAD_FRAMED_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");
  let frame = browser.contentDocument.getElementById("frame");

  clickLink(frame, "install-direct");
  yield waitForFail();

  yield close_manager(managerWindow);
});

add_task(function* test_install_xorigin_js() {
  Services.prefs.setCharPref(PREF_DISCOVERURL, BAD_FRAMED_URL);

  let managerWindow = yield open_manager("addons://discover/");
  let browser = managerWindow.document.getElementById("discover-browser");
  let frame = browser.contentDocument.getElementById("frame");

  clickLink(frame, "install-js");
  yield waitForFail();

  yield close_manager(managerWindow);
});