|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ |
|
3 */ |
|
4 |
|
5 // Test that we can cancel the add-on compatibility check while it is |
|
6 // in progress (bug 772484). |
|
7 // Test framework copied from browser_bug557956.js |
|
8 |
|
9 const URI_EXTENSION_UPDATE_DIALOG = "chrome://mozapps/content/extensions/update.xul"; |
|
10 |
|
11 const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url"; |
|
12 const PREF_MIN_PLATFORM_COMPAT = "extensions.minCompatiblePlatformVersion"; |
|
13 |
|
14 let repo = {}; |
|
15 Components.utils.import("resource://gre/modules/addons/AddonRepository.jsm", repo); |
|
16 |
|
17 /** |
|
18 * Test add-ons: |
|
19 * |
|
20 * Addon minVersion maxVersion Notes |
|
21 * addon1 0 * |
|
22 * addon2 0 0 |
|
23 * addon3 0 0 |
|
24 * addon4 1 * |
|
25 * addon5 0 0 Made compatible by update check |
|
26 * addon6 0 0 Made compatible by update check |
|
27 * addon7 0 0 Has a broken update available |
|
28 * addon8 0 0 Has an update available |
|
29 * addon9 0 0 Has an update available |
|
30 * addon10 0 0 Made incompatible by override check |
|
31 */ |
|
32 |
|
33 // describe the addons |
|
34 let ao1 = { file: "browser_bug557956_1", id: "addon1@tests.mozilla.org"}; |
|
35 let ao2 = { file: "browser_bug557956_2", id: "addon2@tests.mozilla.org"}; |
|
36 let ao3 = { file: "browser_bug557956_3", id: "addon3@tests.mozilla.org"}; |
|
37 let ao4 = { file: "browser_bug557956_4", id: "addon4@tests.mozilla.org"}; |
|
38 let ao5 = { file: "browser_bug557956_5", id: "addon5@tests.mozilla.org"}; |
|
39 let ao6 = { file: "browser_bug557956_6", id: "addon6@tests.mozilla.org"}; |
|
40 let ao7 = { file: "browser_bug557956_7", id: "addon7@tests.mozilla.org"}; |
|
41 let ao8 = { file: "browser_bug557956_8_1", id: "addon8@tests.mozilla.org"}; |
|
42 let ao9 = { file: "browser_bug557956_9_1", id: "addon9@tests.mozilla.org"}; |
|
43 let ao10 = { file: "browser_bug557956_10", id: "addon10@tests.mozilla.org"}; |
|
44 |
|
45 // Return a promise that resolves after the specified delay in MS |
|
46 function delayMS(aDelay) { |
|
47 let deferred = Promise.defer(); |
|
48 setTimeout(deferred.resolve, aDelay); |
|
49 return deferred.promise; |
|
50 } |
|
51 |
|
52 // Return a promise that resolves when the specified observer topic is notified |
|
53 function promise_observer(aTopic) { |
|
54 let deferred = Promise.defer(); |
|
55 Services.obs.addObserver(function observe(aSubject, aObsTopic, aData) { |
|
56 Services.obs.removeObserver(arguments.callee, aObsTopic); |
|
57 deferred.resolve([aSubject, aData]); |
|
58 }, aTopic, false); |
|
59 return deferred.promise; |
|
60 } |
|
61 |
|
62 // Install a set of addons using a bogus update URL so that we can force |
|
63 // the compatibility update to happen later |
|
64 // @param aUpdateURL The real update URL to use after the add-ons are installed |
|
65 function promise_install_test_addons(aAddonList, aUpdateURL) { |
|
66 info("Starting add-on installs"); |
|
67 var installs = []; |
|
68 let deferred = Promise.defer(); |
|
69 |
|
70 // Use a blank update URL |
|
71 Services.prefs.setCharPref(PREF_UPDATEURL, TESTROOT + "missing.rdf"); |
|
72 |
|
73 for (let addon of aAddonList) { |
|
74 AddonManager.getInstallForURL(TESTROOT + "addons/" + addon.file + ".xpi", function(aInstall) { |
|
75 installs.push(aInstall); |
|
76 }, "application/x-xpinstall"); |
|
77 } |
|
78 |
|
79 var listener = { |
|
80 installCount: 0, |
|
81 |
|
82 onInstallEnded: function() { |
|
83 this.installCount++; |
|
84 if (this.installCount == installs.length) { |
|
85 info("Done add-on installs"); |
|
86 // Switch to the test update URL |
|
87 Services.prefs.setCharPref(PREF_UPDATEURL, aUpdateURL); |
|
88 deferred.resolve(); |
|
89 } |
|
90 } |
|
91 }; |
|
92 |
|
93 for (let install of installs) { |
|
94 install.addListener(listener); |
|
95 install.install(); |
|
96 } |
|
97 |
|
98 return deferred.promise; |
|
99 } |
|
100 |
|
101 function promise_addons_by_ids(aAddonIDs) { |
|
102 info("promise_addons_by_ids " + aAddonIDs.toSource()); |
|
103 let deferred = Promise.defer(); |
|
104 AddonManager.getAddonsByIDs(aAddonIDs, deferred.resolve); |
|
105 return deferred.promise; |
|
106 } |
|
107 |
|
108 function* promise_uninstall_test_addons() { |
|
109 info("Starting add-on uninstalls"); |
|
110 let addons = yield promise_addons_by_ids([ao1.id, ao2.id, ao3.id, ao4.id, ao5.id, |
|
111 ao6.id, ao7.id, ao8.id, ao9.id, ao10.id]); |
|
112 let deferred = Promise.defer(); |
|
113 let uninstallCount = addons.length; |
|
114 let listener = { |
|
115 onUninstalled: function(aAddon) { |
|
116 if (aAddon) { |
|
117 info("Finished uninstalling " + aAddon.id); |
|
118 } |
|
119 if (--uninstallCount == 0) { |
|
120 info("Done add-on uninstalls"); |
|
121 AddonManager.removeAddonListener(listener); |
|
122 deferred.resolve(); |
|
123 } |
|
124 }}; |
|
125 AddonManager.addAddonListener(listener); |
|
126 for (let addon of addons) { |
|
127 if (addon) |
|
128 addon.uninstall(); |
|
129 else |
|
130 listener.onUninstalled(null); |
|
131 } |
|
132 yield deferred.promise; |
|
133 } |
|
134 |
|
135 // Returns promise{window}, resolves with a handle to the compatibility |
|
136 // check window |
|
137 function promise_open_compatibility_window(aInactiveAddonIds) { |
|
138 let deferred = Promise.defer(); |
|
139 // This will reset the longer timeout multiplier to 2 which will give each |
|
140 // test that calls open_compatibility_window a minimum of 60 seconds to |
|
141 // complete. |
|
142 requestLongerTimeout(100 /* XXX was 2 */); |
|
143 |
|
144 var variant = Cc["@mozilla.org/variant;1"]. |
|
145 createInstance(Ci.nsIWritableVariant); |
|
146 variant.setFromVariant(aInactiveAddonIds); |
|
147 |
|
148 // Cannot be modal as we want to interract with it, shouldn't cause problems |
|
149 // with testing though. |
|
150 var features = "chrome,centerscreen,dialog,titlebar"; |
|
151 var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]. |
|
152 getService(Ci.nsIWindowWatcher); |
|
153 var win = ww.openWindow(null, URI_EXTENSION_UPDATE_DIALOG, "", features, variant); |
|
154 |
|
155 win.addEventListener("load", function() { |
|
156 function page_shown(aEvent) { |
|
157 if (aEvent.target.pageid) |
|
158 info("Page " + aEvent.target.pageid + " shown"); |
|
159 } |
|
160 |
|
161 win.removeEventListener("load", arguments.callee, false); |
|
162 |
|
163 info("Compatibility dialog opened"); |
|
164 |
|
165 win.addEventListener("pageshow", page_shown, false); |
|
166 win.addEventListener("unload", function() { |
|
167 win.removeEventListener("unload", arguments.callee, false); |
|
168 win.removeEventListener("pageshow", page_shown, false); |
|
169 dump("Compatibility dialog closed\n"); |
|
170 }, false); |
|
171 |
|
172 deferred.resolve(win); |
|
173 }, false); |
|
174 return deferred.promise; |
|
175 } |
|
176 |
|
177 function promise_window_close(aWindow) { |
|
178 let deferred = Promise.defer(); |
|
179 aWindow.addEventListener("unload", function() { |
|
180 aWindow.removeEventListener("unload", arguments.callee, false); |
|
181 deferred.resolve(aWindow); |
|
182 }, false); |
|
183 return deferred.promise; |
|
184 } |
|
185 |
|
186 function promise_page(aWindow, aPageId) { |
|
187 let deferred = Promise.defer(); |
|
188 var page = aWindow.document.getElementById(aPageId); |
|
189 if (aWindow.document.getElementById("updateWizard").currentPage === page) { |
|
190 deferred.resolve(aWindow); |
|
191 } else { |
|
192 page.addEventListener("pageshow", function() { |
|
193 page.removeEventListener("pageshow", arguments.callee, false); |
|
194 executeSoon(function() { |
|
195 deferred.resolve(aWindow); |
|
196 }); |
|
197 }, false); |
|
198 } |
|
199 return deferred.promise; |
|
200 } |
|
201 |
|
202 function get_list_names(aList) { |
|
203 var items = []; |
|
204 for (let listItem of aList.childNodes) |
|
205 items.push(listItem.label); |
|
206 items.sort(); |
|
207 return items; |
|
208 } |
|
209 |
|
210 // These add-ons were inactive in the old application |
|
211 let inactiveAddonIds = [ |
|
212 ao2.id, |
|
213 ao4.id, |
|
214 ao5.id, |
|
215 ao10.id |
|
216 ]; |
|
217 |
|
218 // Make sure the addons in the list are not installed |
|
219 function* check_addons_uninstalled(aAddonList) { |
|
220 let foundList = yield promise_addons_by_ids([addon.id for (addon of aAddonList)]); |
|
221 for (let i = 0; i < aAddonList.length; i++) { |
|
222 ok(!foundList[i], "Addon " + aAddonList[i].id + " is not installed"); |
|
223 } |
|
224 info("Add-on uninstall check complete"); |
|
225 yield true; |
|
226 } |
|
227 |
|
228 |
|
229 // Tests that the right add-ons show up in the mismatch dialog and updates can |
|
230 // be installed |
|
231 // This is a task-based rewrite of the first test in browser_bug557956.js |
|
232 // kept here to show the whole process so that other tests in this file can |
|
233 // pick and choose which steps to perform, but disabled since the logic is already |
|
234 // tested in browser_bug557956.js. |
|
235 // add_task( |
|
236 function start_update() { |
|
237 // Don't pull compatibility data during add-on install |
|
238 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false); |
|
239 let addonList = [ao3, ao5, ao6, ao7, ao8, ao9]; |
|
240 yield promise_install_test_addons(addonList, TESTROOT + "cancelCompatCheck.sjs"); |
|
241 |
|
242 |
|
243 // Check that the addons start out not compatible. |
|
244 let [a5, a6, a8, a9] = yield promise_addons_by_ids([ao5.id, ao6.id, ao8.id, ao9.id]); |
|
245 ok(!a5.isCompatible, "addon5 should not be compatible"); |
|
246 ok(!a6.isCompatible, "addon6 should not be compatible"); |
|
247 ok(!a8.isCompatible, "addon8 should not be compatible"); |
|
248 ok(!a9.isCompatible, "addon9 should not be compatible"); |
|
249 |
|
250 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); |
|
251 // Check that opening the compatibility window loads and applies |
|
252 // the compatibility update |
|
253 let compatWindow = yield promise_open_compatibility_window(inactiveAddonIds); |
|
254 var doc = compatWindow.document; |
|
255 compatWindow = yield promise_page(compatWindow, "mismatch"); |
|
256 var items = get_list_names(doc.getElementById("mismatch.incompatible")); |
|
257 is(items.length, 4, "Should have seen 4 still incompatible items"); |
|
258 is(items[0], "Addon3 1.0", "Should have seen addon3 still incompatible"); |
|
259 is(items[1], "Addon7 1.0", "Should have seen addon7 still incompatible"); |
|
260 is(items[2], "Addon8 1.0", "Should have seen addon8 still incompatible"); |
|
261 is(items[3], "Addon9 1.0", "Should have seen addon9 still incompatible"); |
|
262 |
|
263 ok(a5.isCompatible, "addon5 should be compatible"); |
|
264 ok(a6.isCompatible, "addon6 should be compatible"); |
|
265 |
|
266 // Click next to start finding updates for the addons that are still incompatible |
|
267 var button = doc.documentElement.getButton("next"); |
|
268 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
269 |
|
270 compatWindow = yield promise_page(compatWindow, "found"); |
|
271 ok(doc.getElementById("xpinstallDisabledAlert").hidden, |
|
272 "Install should be allowed"); |
|
273 |
|
274 var list = doc.getElementById("found.updates"); |
|
275 var items = get_list_names(list); |
|
276 is(items.length, 3, "Should have seen 3 updates available"); |
|
277 is(items[0], "Addon7 2.0", "Should have seen update for addon7"); |
|
278 is(items[1], "Addon8 2.0", "Should have seen update for addon8"); |
|
279 is(items[2], "Addon9 2.0", "Should have seen update for addon9"); |
|
280 |
|
281 ok(!doc.documentElement.getButton("next").disabled, |
|
282 "Next button should be enabled"); |
|
283 |
|
284 // Uncheck all |
|
285 for (let listItem of list.childNodes) |
|
286 EventUtils.synthesizeMouse(listItem, 2, 2, { }, compatWindow); |
|
287 |
|
288 ok(doc.documentElement.getButton("next").disabled, |
|
289 "Next button should not be enabled"); |
|
290 |
|
291 // Check the ones we want to install |
|
292 for (let listItem of list.childNodes) { |
|
293 if (listItem.label != "Addon7 2.0") |
|
294 EventUtils.synthesizeMouse(listItem, 2, 2, { }, compatWindow); |
|
295 } |
|
296 |
|
297 var button = doc.documentElement.getButton("next"); |
|
298 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
299 |
|
300 compatWindow = yield promise_page(compatWindow, "finished"); |
|
301 var button = doc.documentElement.getButton("finish"); |
|
302 ok(!button.hidden, "Finish button should not be hidden"); |
|
303 ok(!button.disabled, "Finish button should not be disabled"); |
|
304 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
305 |
|
306 compatWindow = yield promise_window_close(compatWindow); |
|
307 |
|
308 // Check that the appropriate add-ons have been updated |
|
309 let [a8, a9] = yield promise_addons_by_ids(["addon8@tests.mozilla.org", |
|
310 "addon9@tests.mozilla.org"]); |
|
311 is(a8.version, "2.0", "addon8 should have updated"); |
|
312 is(a9.version, "2.0", "addon9 should have updated"); |
|
313 |
|
314 yield promise_uninstall_test_addons(); |
|
315 } |
|
316 // ); |
|
317 |
|
318 // Test what happens when the user cancels during AddonRepository.repopulateCache() |
|
319 // Add-ons that have updates available should not update if they were disabled before |
|
320 // For this test, addon8 became disabled during update and addon9 was previously disabled, |
|
321 // so addon8 should update and addon9 should not |
|
322 add_task(function cancel_during_repopulate() { |
|
323 Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true); |
|
324 Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0"); |
|
325 Services.prefs.setCharPref(PREF_UPDATEURL, TESTROOT + "missing.rdf"); |
|
326 |
|
327 let installsDone = promise_observer("TEST:all-updates-done"); |
|
328 |
|
329 // Don't pull compatibility data during add-on install |
|
330 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false); |
|
331 // Set up our test addons so that the server-side JS has a 500ms delay to make |
|
332 // sure we cancel the dialog before we get the data we want to refill our |
|
333 // AddonRepository cache |
|
334 let addonList = [ao5, ao8, ao9, ao10]; |
|
335 yield promise_install_test_addons(addonList, |
|
336 TESTROOT + "cancelCompatCheck.sjs?500"); |
|
337 |
|
338 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); |
|
339 Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, TESTROOT + "browser_bug557956.xml"); |
|
340 |
|
341 let [a5, a8, a9] = yield promise_addons_by_ids([ao5.id, ao8.id, ao9.id]); |
|
342 ok(!a5.isCompatible, "addon5 should not be compatible"); |
|
343 ok(!a8.isCompatible, "addon8 should not be compatible"); |
|
344 ok(!a9.isCompatible, "addon9 should not be compatible"); |
|
345 |
|
346 let compatWindow = yield promise_open_compatibility_window([ao9.id, ...inactiveAddonIds]); |
|
347 var doc = compatWindow.document; |
|
348 yield promise_page(compatWindow, "versioninfo"); |
|
349 |
|
350 // Brief delay to let the update window finish requesting all add-ons and start |
|
351 // reloading the addon repository |
|
352 yield delayMS(50); |
|
353 |
|
354 info("Cancel the compatibility check dialog"); |
|
355 var button = doc.documentElement.getButton("cancel"); |
|
356 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
357 |
|
358 info("Waiting for installs to complete"); |
|
359 yield installsDone; |
|
360 ok(!repo.AddonRepository.isSearching, "Background installs are done"); |
|
361 |
|
362 // There should be no active updates |
|
363 let getInstalls = Promise.defer(); |
|
364 AddonManager.getAllInstalls(getInstalls.resolve); |
|
365 let installs = yield getInstalls.promise; |
|
366 is (installs.length, 0, "There should be no active installs after background installs are done"); |
|
367 |
|
368 // addon8 should have updated in the background, |
|
369 // addon9 was listed as previously disabled so it should not have updated |
|
370 let [a5, a8, a9, a10] = yield promise_addons_by_ids([ao5.id, ao8.id, ao9.id, ao10.id]); |
|
371 ok(a5.isCompatible, "addon5 should be compatible"); |
|
372 ok(a8.isCompatible, "addon8 should have been upgraded"); |
|
373 ok(!a9.isCompatible, "addon9 should not have been upgraded"); |
|
374 ok(!a10.isCompatible, "addon10 should not be compatible"); |
|
375 |
|
376 info("Updates done"); |
|
377 yield promise_uninstall_test_addons(); |
|
378 info("done uninstalling add-ons"); |
|
379 }); |
|
380 |
|
381 // User cancels after repopulateCache, while we're waiting for the addon.findUpdates() |
|
382 // calls in gVersionInfoPage_onPageShow() to complete |
|
383 // For this test, both addon8 and addon9 were disabled by this update, but addon8 |
|
384 // is set to not auto-update, so only addon9 should update in the background |
|
385 add_task(function cancel_during_findUpdates() { |
|
386 Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true); |
|
387 Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0"); |
|
388 |
|
389 let observeUpdateDone = promise_observer("TEST:addon-repository-data-updated"); |
|
390 let installsDone = promise_observer("TEST:all-updates-done"); |
|
391 |
|
392 // Don't pull compatibility data during add-on install |
|
393 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false); |
|
394 // No delay on the .sjs this time because we want the cache to repopulate |
|
395 let addonList = [ao3, ao5, ao6, ao7, ao8, ao9]; |
|
396 yield promise_install_test_addons(addonList, |
|
397 TESTROOT + "cancelCompatCheck.sjs"); |
|
398 |
|
399 let [a8] = yield promise_addons_by_ids([ao8.id]); |
|
400 a8.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; |
|
401 |
|
402 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); |
|
403 let compatWindow = yield promise_open_compatibility_window(inactiveAddonIds); |
|
404 var doc = compatWindow.document; |
|
405 yield promise_page(compatWindow, "versioninfo"); |
|
406 |
|
407 info("Waiting for repository-data-updated"); |
|
408 yield observeUpdateDone; |
|
409 |
|
410 // Quick wait to make sure the findUpdates calls get queued |
|
411 yield delayMS(5); |
|
412 |
|
413 info("Cancel the compatibility check dialog"); |
|
414 var button = doc.documentElement.getButton("cancel"); |
|
415 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
416 |
|
417 info("Waiting for installs to complete 2"); |
|
418 yield installsDone; |
|
419 ok(!repo.AddonRepository.isSearching, "Background installs are done 2"); |
|
420 |
|
421 // addon8 should have updated in the background, |
|
422 // addon9 was listed as previously disabled so it should not have updated |
|
423 let [a5, a8, a9] = yield promise_addons_by_ids([ao5.id, ao8.id, ao9.id]); |
|
424 ok(a5.isCompatible, "addon5 should be compatible"); |
|
425 ok(!a8.isCompatible, "addon8 should not have been upgraded"); |
|
426 ok(a9.isCompatible, "addon9 should have been upgraded"); |
|
427 |
|
428 let getInstalls = Promise.defer(); |
|
429 AddonManager.getAllInstalls(getInstalls.resolve); |
|
430 let installs = yield getInstalls.promise; |
|
431 is (installs.length, 0, "There should be no active installs after the dialog is cancelled 2"); |
|
432 |
|
433 info("findUpdates done"); |
|
434 yield promise_uninstall_test_addons(); |
|
435 }); |
|
436 |
|
437 // Cancelling during the 'mismatch' screen allows add-ons that can auto-update |
|
438 // to continue updating in the background and cancels any other updates |
|
439 // Same conditions as the previous test - addon8 and addon9 have updates available, |
|
440 // addon8 is set to not auto-update so only addon9 should become compatible |
|
441 add_task(function cancel_mismatch() { |
|
442 Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true); |
|
443 Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0"); |
|
444 |
|
445 let observeUpdateDone = promise_observer("TEST:addon-repository-data-updated"); |
|
446 let installsDone = promise_observer("TEST:all-updates-done"); |
|
447 |
|
448 // Don't pull compatibility data during add-on install |
|
449 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false); |
|
450 // No delay on the .sjs this time because we want the cache to repopulate |
|
451 let addonList = [ao3, ao5, ao6, ao7, ao8, ao9]; |
|
452 yield promise_install_test_addons(addonList, |
|
453 TESTROOT + "cancelCompatCheck.sjs"); |
|
454 |
|
455 let [a8] = yield promise_addons_by_ids([ao8.id]); |
|
456 a8.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; |
|
457 |
|
458 // Check that the addons start out not compatible. |
|
459 let [a3, a7, a8, a9] = yield promise_addons_by_ids([ao3.id, ao7.id, ao8.id, ao9.id]); |
|
460 ok(!a3.isCompatible, "addon3 should not be compatible"); |
|
461 ok(!a7.isCompatible, "addon7 should not be compatible"); |
|
462 ok(!a8.isCompatible, "addon8 should not be compatible"); |
|
463 ok(!a9.isCompatible, "addon9 should not be compatible"); |
|
464 |
|
465 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); |
|
466 let compatWindow = yield promise_open_compatibility_window(inactiveAddonIds); |
|
467 var doc = compatWindow.document; |
|
468 info("Wait for mismatch page"); |
|
469 yield promise_page(compatWindow, "mismatch"); |
|
470 info("Click the Don't Check button"); |
|
471 var button = doc.documentElement.getButton("cancel"); |
|
472 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
473 |
|
474 yield promise_window_close(compatWindow); |
|
475 info("Waiting for installs to complete in cancel_mismatch"); |
|
476 yield installsDone; |
|
477 |
|
478 // addon8 should not have updated in the background, |
|
479 // addon9 was listed as previously disabled so it should not have updated |
|
480 let [a5, a8, a9] = yield promise_addons_by_ids([ao5.id, ao8.id, ao9.id]); |
|
481 ok(a5.isCompatible, "addon5 should be compatible"); |
|
482 ok(!a8.isCompatible, "addon8 should not have been upgraded"); |
|
483 ok(a9.isCompatible, "addon9 should have been upgraded"); |
|
484 |
|
485 // Make sure there are no pending addon installs |
|
486 let pInstalls = Promise.defer(); |
|
487 AddonManager.getAllInstalls(pInstalls.resolve); |
|
488 let installs = yield pInstalls.promise; |
|
489 ok(installs.length == 0, "No remaining add-on installs (" + installs.toSource() + ")"); |
|
490 |
|
491 yield promise_uninstall_test_addons(); |
|
492 yield check_addons_uninstalled(addonList); |
|
493 }); |
|
494 |
|
495 // Cancelling during the 'mismatch' screen with only add-ons that have |
|
496 // no updates available |
|
497 add_task(function cancel_mismatch_no_updates() { |
|
498 Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true); |
|
499 Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0"); |
|
500 |
|
501 let observeUpdateDone = promise_observer("TEST:addon-repository-data-updated"); |
|
502 |
|
503 // Don't pull compatibility data during add-on install |
|
504 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false); |
|
505 // No delay on the .sjs this time because we want the cache to repopulate |
|
506 let addonList = [ao3, ao5, ao6]; |
|
507 yield promise_install_test_addons(addonList, |
|
508 TESTROOT + "cancelCompatCheck.sjs"); |
|
509 |
|
510 // Check that the addons start out not compatible. |
|
511 let [a3, a5, a6] = yield promise_addons_by_ids([ao3.id, ao5.id, ao6.id]); |
|
512 ok(!a3.isCompatible, "addon3 should not be compatible"); |
|
513 ok(!a5.isCompatible, "addon7 should not be compatible"); |
|
514 ok(!a6.isCompatible, "addon8 should not be compatible"); |
|
515 |
|
516 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); |
|
517 let compatWindow = yield promise_open_compatibility_window(inactiveAddonIds); |
|
518 var doc = compatWindow.document; |
|
519 info("Wait for mismatch page"); |
|
520 yield promise_page(compatWindow, "mismatch"); |
|
521 info("Click the Don't Check button"); |
|
522 var button = doc.documentElement.getButton("cancel"); |
|
523 EventUtils.synthesizeMouse(button, 2, 2, { }, compatWindow); |
|
524 |
|
525 yield promise_window_close(compatWindow); |
|
526 |
|
527 let [a3, a5, a6] = yield promise_addons_by_ids([ao3.id, ao5.id, ao6.id]); |
|
528 ok(!a3.isCompatible, "addon3 should not be compatible"); |
|
529 ok(a5.isCompatible, "addon5 should have become compatible"); |
|
530 ok(a6.isCompatible, "addon6 should have become compatible"); |
|
531 |
|
532 // Make sure there are no pending addon installs |
|
533 let pInstalls = Promise.defer(); |
|
534 AddonManager.getAllInstalls(pInstalls.resolve); |
|
535 let installs = yield pInstalls.promise; |
|
536 ok(installs.length == 0, "No remaining add-on installs (" + installs.toSource() + ")"); |
|
537 |
|
538 yield promise_uninstall_test_addons(); |
|
539 yield check_addons_uninstalled(addonList); |
|
540 }); |