Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/
3 */
5 // This verifies that bootstrappable add-ons can be used without restarts.
6 Components.utils.import("resource://gre/modules/Services.jsm");
8 // Enable loading extensions from the user scopes
9 Services.prefs.setIntPref("extensions.enabledScopes",
10 AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER);
12 // The test extension uses an insecure update url.
13 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
15 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
17 const profileDir = gProfD.clone();
18 profileDir.append("extensions");
19 const userExtDir = gProfD.clone();
20 userExtDir.append("extensions2");
21 userExtDir.append(gAppInfo.ID);
22 registerDirectory("XREUSysExt", userExtDir.parent);
24 Components.utils.import("resource://testing-common/httpd.js");
25 // Create and configure the HTTP server.
26 var testserver = new HttpServer();
27 testserver.start(-1);
28 gPort = testserver.identity.primaryPort;
30 // register files with server
31 testserver.registerDirectory("/addons/", do_get_file("addons"));
32 mapFile("/data/test_dictionary.rdf", testserver);
34 /**
35 * This object is both a factory and an mozISpellCheckingEngine implementation (so, it
36 * is de-facto a service). It's also an interface requestor that gives out
37 * itself when asked for mozISpellCheckingEngine.
38 */
39 var HunspellEngine = {
40 dictionaryDirs: [],
41 listener: null,
43 QueryInterface: function hunspell_qi(iid) {
44 if (iid.equals(Components.interfaces.nsISupports) ||
45 iid.equals(Components.interfaces.nsIFactory) ||
46 iid.equals(Components.interfaces.mozISpellCheckingEngine))
47 return this;
48 throw Components.results.NS_ERROR_NO_INTERFACE;
49 },
50 createInstance: function hunspell_ci(outer, iid) {
51 if (outer)
52 throw Components.results.NS_ERROR_NO_AGGREGATION;
53 return this.QueryInterface(iid);
54 },
55 lockFactory: function hunspell_lockf(lock) {
56 throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
57 },
59 addDirectory: function hunspell_addDirectory(dir) {
60 this.dictionaryDirs.push(dir);
61 if (this.listener)
62 this.listener("addDirectory");
63 },
65 removeDirectory: function hunspell_addDirectory(dir) {
66 this.dictionaryDirs.splice(this.dictionaryDirs.indexOf(dir), 1);
67 if (this.listener)
68 this.listener("removeDirectory");
69 },
71 getInterface: function hunspell_gi(iid) {
72 if (iid.equals(Components.interfaces.mozISpellCheckingEngine))
73 return this;
74 throw Components.results.NS_ERROR_NO_INTERFACE;
75 },
77 contractID: "@mozilla.org/spellchecker/engine;1",
78 classID: Components.ID("{6f3c63bc-a4fd-449b-9a58-a2d9bd972cce}"),
80 activate: function hunspell_activate() {
81 this.origClassID = Components.manager.nsIComponentRegistrar
82 .contractIDToCID(this.contractID);
83 this.origFactory = Components.manager
84 .getClassObject(Components.classes[this.contractID],
85 Components.interfaces.nsIFactory);
87 Components.manager.nsIComponentRegistrar
88 .unregisterFactory(this.origClassID, this.origFactory);
89 Components.manager.nsIComponentRegistrar.registerFactory(this.classID,
90 "Test hunspell", this.contractID, this);
91 },
93 deactivate: function hunspell_deactivate() {
94 Components.manager.nsIComponentRegistrar.unregisterFactory(this.classID, this);
95 Components.manager.nsIComponentRegistrar.registerFactory(this.origClassID,
96 "Hunspell", this.contractID, this.origFactory);
97 },
99 isDictionaryEnabled: function hunspell_isDictionaryEnabled(name) {
100 return this.dictionaryDirs.some(function(dir) {
101 var dic = dir.clone();
102 dic.append(name);
103 return dic.exists();
104 });
105 }
106 };
108 function run_test() {
109 do_test_pending();
111 startupManager();
113 run_test_1();
114 }
116 // Tests that installing doesn't require a restart
117 function run_test_1() {
118 prepare_test({ }, [
119 "onNewInstall"
120 ]);
122 HunspellEngine.activate();
124 AddonManager.getInstallForFile(do_get_addon("test_dictionary"), function(install) {
125 ensure_test_completed();
127 do_check_neq(install, null);
128 do_check_eq(install.type, "dictionary");
129 do_check_eq(install.version, "1.0");
130 do_check_eq(install.name, "Test Dictionary");
131 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
132 do_check_true(install.addon.hasResource("install.rdf"));
133 do_check_false(install.addon.hasResource("bootstrap.js"));
134 do_check_eq(install.addon.operationsRequiringRestart &
135 AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
136 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
138 let addon = install.addon;
139 prepare_test({
140 "ab-CD@dictionaries.addons.mozilla.org": [
141 ["onInstalling", false],
142 "onInstalled"
143 ]
144 }, [
145 "onInstallStarted",
146 "onInstallEnded",
147 ], function() {
148 do_check_true(addon.hasResource("install.rdf"));
149 HunspellEngine.listener = function(aEvent) {
150 HunspellEngine.listener = null;
151 do_check_eq(aEvent, "addDirectory");
152 do_execute_soon(check_test_1);
153 };
154 });
155 install.install();
156 });
157 }
159 function check_test_1() {
160 AddonManager.getAllInstalls(function(installs) {
161 // There should be no active installs now since the install completed and
162 // doesn't require a restart.
163 do_check_eq(installs.length, 0);
165 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
166 do_check_neq(b1, null);
167 do_check_eq(b1.version, "1.0");
168 do_check_false(b1.appDisabled);
169 do_check_false(b1.userDisabled);
170 do_check_true(b1.isActive);
171 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
172 do_check_true(b1.hasResource("install.rdf"));
173 do_check_false(b1.hasResource("bootstrap.js"));
174 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
176 let dir = do_get_addon_root_uri(profileDir, "ab-CD@dictionaries.addons.mozilla.org");
178 AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
179 do_check_eq(list.length, 0);
181 run_test_2();
182 });
183 });
184 });
185 }
187 // Tests that disabling doesn't require a restart
188 function run_test_2() {
189 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
190 prepare_test({
191 "ab-CD@dictionaries.addons.mozilla.org": [
192 ["onDisabling", false],
193 "onDisabled"
194 ]
195 });
197 do_check_eq(b1.operationsRequiringRestart &
198 AddonManager.OP_NEEDS_RESTART_DISABLE, 0);
199 b1.userDisabled = true;
200 ensure_test_completed();
202 do_check_neq(b1, null);
203 do_check_eq(b1.version, "1.0");
204 do_check_false(b1.appDisabled);
205 do_check_true(b1.userDisabled);
206 do_check_false(b1.isActive);
207 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
208 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
210 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(newb1) {
211 do_check_neq(newb1, null);
212 do_check_eq(newb1.version, "1.0");
213 do_check_false(newb1.appDisabled);
214 do_check_true(newb1.userDisabled);
215 do_check_false(newb1.isActive);
217 do_execute_soon(run_test_3);
218 });
219 });
220 }
222 // Test that restarting doesn't accidentally re-enable
223 function run_test_3() {
224 shutdownManager();
225 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
226 startupManager(false);
227 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
228 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
230 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
231 do_check_neq(b1, null);
232 do_check_eq(b1.version, "1.0");
233 do_check_false(b1.appDisabled);
234 do_check_true(b1.userDisabled);
235 do_check_false(b1.isActive);
237 run_test_4();
238 });
239 }
241 // Tests that enabling doesn't require a restart
242 function run_test_4() {
243 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
244 prepare_test({
245 "ab-CD@dictionaries.addons.mozilla.org": [
246 ["onEnabling", false],
247 "onEnabled"
248 ]
249 });
251 do_check_eq(b1.operationsRequiringRestart &
252 AddonManager.OP_NEEDS_RESTART_ENABLE, 0);
253 b1.userDisabled = false;
254 ensure_test_completed();
256 do_check_neq(b1, null);
257 do_check_eq(b1.version, "1.0");
258 do_check_false(b1.appDisabled);
259 do_check_false(b1.userDisabled);
260 do_check_true(b1.isActive);
261 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
262 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
264 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(newb1) {
265 do_check_neq(newb1, null);
266 do_check_eq(newb1.version, "1.0");
267 do_check_false(newb1.appDisabled);
268 do_check_false(newb1.userDisabled);
269 do_check_true(newb1.isActive);
271 do_execute_soon(run_test_5);
272 });
273 });
274 }
276 // Tests that a restart shuts down and restarts the add-on
277 function run_test_5() {
278 shutdownManager();
279 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
280 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
281 startupManager(false);
282 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
283 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
285 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
286 do_check_neq(b1, null);
287 do_check_eq(b1.version, "1.0");
288 do_check_false(b1.appDisabled);
289 do_check_false(b1.userDisabled);
290 do_check_true(b1.isActive);
291 do_check_false(isExtensionInAddonsList(profileDir, b1.id));
293 run_test_7();
294 });
295 }
297 // Tests that uninstalling doesn't require a restart
298 function run_test_7() {
299 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
300 prepare_test({
301 "ab-CD@dictionaries.addons.mozilla.org": [
302 ["onUninstalling", false],
303 "onUninstalled"
304 ]
305 });
307 do_check_eq(b1.operationsRequiringRestart &
308 AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0);
309 b1.uninstall();
311 check_test_7();
312 });
313 }
315 function check_test_7() {
316 ensure_test_completed();
317 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
318 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
320 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
321 callback_soon(function(b1) {
322 do_check_eq(b1, null);
324 restartManager();
326 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(newb1) {
327 do_check_eq(newb1, null);
329 do_execute_soon(run_test_8);
330 });
331 }));
332 }
334 // Test that a bootstrapped extension dropped into the profile loads properly
335 // on startup and doesn't cause an EM restart
336 function run_test_8() {
337 shutdownManager();
339 let dir = profileDir.clone();
340 dir.append("ab-CD@dictionaries.addons.mozilla.org");
341 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
342 let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
343 createInstance(AM_Ci.nsIZipReader);
344 zip.open(do_get_addon("test_dictionary"));
345 dir.append("install.rdf");
346 zip.extract("install.rdf", dir);
347 dir = dir.parent;
348 dir.append("dictionaries");
349 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
350 dir.append("ab-CD.dic");
351 zip.extract("dictionaries/ab-CD.dic", dir);
352 zip.close();
354 startupManager(false);
356 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
357 do_check_neq(b1, null);
358 do_check_eq(b1.version, "1.0");
359 do_check_false(b1.appDisabled);
360 do_check_false(b1.userDisabled);
361 do_check_true(b1.isActive);
362 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
363 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
365 do_execute_soon(run_test_9);
366 });
367 }
369 // Test that items detected as removed during startup get removed properly
370 function run_test_9() {
371 shutdownManager();
373 let dir = profileDir.clone();
374 dir.append("ab-CD@dictionaries.addons.mozilla.org");
375 dir.remove(true);
376 startupManager(false);
378 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
379 do_check_eq(b1, null);
380 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
382 do_execute_soon(run_test_12);
383 });
384 }
387 // Tests that bootstrapped extensions are correctly loaded even if the app is
388 // upgraded at the same time
389 function run_test_12() {
390 shutdownManager();
392 let dir = profileDir.clone();
393 dir.append("ab-CD@dictionaries.addons.mozilla.org");
394 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
395 let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
396 createInstance(AM_Ci.nsIZipReader);
397 zip.open(do_get_addon("test_dictionary"));
398 dir.append("install.rdf");
399 zip.extract("install.rdf", dir);
400 dir = dir.parent;
401 dir.append("dictionaries");
402 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
403 dir.append("ab-CD.dic");
404 zip.extract("dictionaries/ab-CD.dic", dir);
405 zip.close();
407 startupManager(true);
409 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
410 do_check_neq(b1, null);
411 do_check_eq(b1.version, "1.0");
412 do_check_false(b1.appDisabled);
413 do_check_false(b1.userDisabled);
414 do_check_true(b1.isActive);
415 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
416 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
418 b1.uninstall();
419 do_execute_soon(run_test_16);
420 });
421 }
424 // Tests that bootstrapped extensions don't get loaded when in safe mode
425 function run_test_16() {
426 restartManager();
428 installAllFiles([do_get_addon("test_dictionary")], function() {
429 // spin the event loop to let the addon finish starting
430 do_execute_soon(function check_installed_dictionary() {
431 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
432 callback_soon(function(b1) {
433 // Should have installed and started
434 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
436 shutdownManager();
438 // Should have stopped
439 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
441 gAppInfo.inSafeMode = true;
442 startupManager(false);
444 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
445 callback_soon(function(b1) {
446 // Should still be stopped
447 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
448 do_check_false(b1.isActive);
450 shutdownManager();
451 gAppInfo.inSafeMode = false;
452 startupManager(false);
454 // Should have started
455 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
457 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
458 b1.uninstall();
460 do_execute_soon(run_test_17);
461 });
462 }));
463 }));
464 });
465 });
466 }
468 // Check that a bootstrapped extension in a non-profile location is loaded
469 function run_test_17() {
470 shutdownManager();
472 let dir = userExtDir.clone();
473 dir.append("ab-CD@dictionaries.addons.mozilla.org");
474 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
475 let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
476 createInstance(AM_Ci.nsIZipReader);
477 zip.open(do_get_addon("test_dictionary"));
478 dir.append("install.rdf");
479 zip.extract("install.rdf", dir);
480 dir = dir.parent;
481 dir.append("dictionaries");
482 dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755);
483 dir.append("ab-CD.dic");
484 zip.extract("dictionaries/ab-CD.dic", dir);
485 zip.close();
487 startupManager();
489 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
490 callback_soon(function(b1) {
491 // Should have installed and started
492 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
493 do_check_neq(b1, null);
494 do_check_eq(b1.version, "1.0");
495 do_check_true(b1.isActive);
497 // From run_test_21
498 dir = userExtDir.clone();
499 dir.append("ab-CD@dictionaries.addons.mozilla.org");
500 dir.remove(true);
502 restartManager();
504 run_test_23();
505 }));
506 }
508 // Tests that installing from a URL doesn't require a restart
509 function run_test_23() {
510 prepare_test({ }, [
511 "onNewInstall"
512 ]);
514 let url = "http://localhost:" + gPort + "/addons/test_dictionary.xpi";
515 AddonManager.getInstallForURL(url, function(install) {
516 ensure_test_completed();
518 do_check_neq(install, null);
520 prepare_test({ }, [
521 "onDownloadStarted",
522 "onDownloadEnded"
523 ], function() {
524 do_check_eq(install.type, "dictionary");
525 do_check_eq(install.version, "1.0");
526 do_check_eq(install.name, "Test Dictionary");
527 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
528 do_check_true(install.addon.hasResource("install.rdf"));
529 do_check_false(install.addon.hasResource("bootstrap.js"));
530 do_check_eq(install.addon.operationsRequiringRestart &
531 AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
532 do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
534 let addon = install.addon;
535 prepare_test({
536 "ab-CD@dictionaries.addons.mozilla.org": [
537 ["onInstalling", false],
538 "onInstalled"
539 ]
540 }, [
541 "onInstallStarted",
542 "onInstallEnded",
543 ], function() {
544 do_check_true(addon.hasResource("install.rdf"));
545 // spin to let the addon startup finish
546 do_execute_soon(check_test_23);
547 });
548 });
549 install.install();
550 }, "application/x-xpinstall");
551 }
553 function check_test_23() {
554 AddonManager.getAllInstalls(function(installs) {
555 // There should be no active installs now since the install completed and
556 // doesn't require a restart.
557 do_check_eq(installs.length, 0);
559 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
560 do_check_neq(b1, null);
561 do_check_eq(b1.version, "1.0");
562 do_check_false(b1.appDisabled);
563 do_check_false(b1.userDisabled);
564 do_check_true(b1.isActive);
565 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
566 do_check_true(b1.hasResource("install.rdf"));
567 do_check_false(b1.hasResource("bootstrap.js"));
568 do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
570 let dir = do_get_addon_root_uri(profileDir, "ab-CD@dictionaries.addons.mozilla.org");
572 AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
573 do_check_eq(list.length, 0);
575 restartManager();
576 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
577 b1.uninstall();
578 do_execute_soon(run_test_25);
579 });
580 }));
581 });
582 });
583 }
585 // Tests that updating from a bootstrappable add-on to a normal add-on calls
586 // the uninstall method
587 function run_test_25() {
588 restartManager();
590 HunspellEngine.listener = function(aEvent) {
591 HunspellEngine.listener = null;
592 do_check_eq(aEvent, "addDirectory");
593 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
595 installAllFiles([do_get_addon("test_dictionary_2")], function test_25_installed2() {
596 // Needs a restart to complete this so the old version stays running
597 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
599 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
600 callback_soon(function(b1) {
601 do_check_neq(b1, null);
602 do_check_eq(b1.version, "1.0");
603 do_check_true(b1.isActive);
604 do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
606 restartManager();
608 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
610 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
611 do_check_neq(b1, null);
612 do_check_eq(b1.version, "2.0");
613 do_check_true(b1.isActive);
614 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
616 do_execute_soon(run_test_26);
617 });
618 }));
619 });
620 };
622 installAllFiles([do_get_addon("test_dictionary")], function test_25_installed() { });
623 }
625 // Tests that updating from a normal add-on to a bootstrappable add-on calls
626 // the install method
627 function run_test_26() {
628 installAllFiles([do_get_addon("test_dictionary")], function test_26_install() {
629 // Needs a restart to complete this
630 do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
632 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
633 callback_soon(function(b1) {
634 do_check_neq(b1, null);
635 do_check_eq(b1.version, "2.0");
636 do_check_true(b1.isActive);
637 do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
639 restartManager();
641 do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
643 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
644 do_check_neq(b1, null);
645 do_check_eq(b1.version, "1.0");
646 do_check_true(b1.isActive);
647 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
649 HunspellEngine.deactivate();
650 b1.uninstall();
651 do_execute_soon(run_test_27);
652 });
653 }));
654 });
655 }
657 // Tests that an update check from a normal add-on to a bootstrappable add-on works
658 function run_test_27() {
659 restartManager();
660 writeInstallRDFForExtension({
661 id: "ab-CD@dictionaries.addons.mozilla.org",
662 version: "1.0",
663 updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
664 targetApplications: [{
665 id: "xpcshell@tests.mozilla.org",
666 minVersion: "1",
667 maxVersion: "1"
668 }],
669 name: "Test Dictionary",
670 }, profileDir);
671 restartManager();
673 prepare_test({
674 "ab-CD@dictionaries.addons.mozilla.org": [
675 "onInstalling"
676 ]
677 }, [
678 "onNewInstall",
679 "onDownloadStarted",
680 "onDownloadEnded",
681 "onInstallStarted",
682 "onInstallEnded"
683 ], callback_soon(check_test_27));
685 AddonManagerPrivate.backgroundUpdateCheck();
686 }
688 function check_test_27(install) {
689 do_check_eq(install.existingAddon.pendingUpgrade.install, install);
691 restartManager();
692 AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
693 do_check_neq(b1, null);
694 do_check_eq(b1.version, "2.0");
695 do_check_eq(b1.type, "dictionary");
696 b1.uninstall();
697 do_execute_soon(run_test_28);
698 });
699 }
701 // Tests that an update check from a bootstrappable add-on to a normal add-on works
702 function run_test_28() {
703 restartManager();
705 writeInstallRDFForExtension({
706 id: "ef@dictionaries.addons.mozilla.org",
707 version: "1.0",
708 type: "64",
709 updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
710 targetApplications: [{
711 id: "xpcshell@tests.mozilla.org",
712 minVersion: "1",
713 maxVersion: "1"
714 }],
715 name: "Test Dictionary ef",
716 }, profileDir);
717 restartManager();
719 prepare_test({
720 "ef@dictionaries.addons.mozilla.org": [
721 "onInstalling"
722 ]
723 }, [
724 "onNewInstall",
725 "onDownloadStarted",
726 "onDownloadEnded",
727 "onInstallStarted",
728 "onInstallEnded"
729 ], callback_soon(check_test_28));
731 AddonManagerPrivate.backgroundUpdateCheck();
732 }
734 function check_test_28(install) {
735 do_check_eq(install.existingAddon.pendingUpgrade.install, install);
737 restartManager();
738 AddonManager.getAddonByID("ef@dictionaries.addons.mozilla.org", function(b2) {
739 do_check_neq(b2, null);
740 do_check_eq(b2.version, "2.0");
741 do_check_eq(b2.type, "extension");
742 b2.uninstall();
743 do_execute_soon(run_test_29);
744 });
745 }
747 // Tests that an update check from a bootstrappable add-on to a bootstrappable add-on works
748 function run_test_29() {
749 restartManager();
751 writeInstallRDFForExtension({
752 id: "gh@dictionaries.addons.mozilla.org",
753 version: "1.0",
754 type: "64",
755 updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
756 targetApplications: [{
757 id: "xpcshell@tests.mozilla.org",
758 minVersion: "1",
759 maxVersion: "1"
760 }],
761 name: "Test Dictionary gh",
762 }, profileDir);
763 restartManager();
765 prepare_test({
766 "gh@dictionaries.addons.mozilla.org": [
767 ["onInstalling", false /* = no restart */],
768 ["onInstalled", false]
769 ]
770 }, [
771 "onNewInstall",
772 "onDownloadStarted",
773 "onDownloadEnded",
774 "onInstallStarted",
775 "onInstallEnded"
776 ], check_test_29);
778 AddonManagerPrivate.backgroundUpdateCheck();
779 }
781 function check_test_29(install) {
782 AddonManager.getAddonByID("gh@dictionaries.addons.mozilla.org", function(b2) {
783 do_check_neq(b2, null);
784 do_check_eq(b2.version, "2.0");
785 do_check_eq(b2.type, "dictionary");
787 prepare_test({
788 "gh@dictionaries.addons.mozilla.org": [
789 ["onUninstalling", false],
790 ["onUninstalled", false],
791 ]
792 }, [
793 ], callback_soon(finish_test_29));
795 b2.uninstall();
796 });
797 }
799 function finish_test_29() {
800 testserver.stop(do_test_finished);
801 }