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
|
/* 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/.
*/
const BLOCKLIST_TIMER = "blocklist-background-update-timer";
const PREF_BLOCKLIST_URL = "extensions.blocklist.url";
const PREF_BLOCKLIST_ENABLED = "extensions.blocklist.enabled";
const PREF_APP_DISTRIBUTION = "distribution.id";
const PREF_APP_DISTRIBUTION_VERSION = "distribution.version";
const PREF_APP_UPDATE_CHANNEL = "app.update.channel";
const PREF_GENERAL_USERAGENT_LOCALE = "general.useragent.locale";
const CATEGORY_UPDATE_TIMER = "update-timer";
// Get the HTTP server.
Components.utils.import("resource://testing-common/httpd.js");
Components.utils.import("resource://testing-common/MockRegistrar.jsm");
var testserver;
var gOSVersion;
var gBlocklist;
// This is a replacement for the timer service so we can trigger timers
var timerService = {
hasTimer: function(id) {
var catMan = Components.classes["@mozilla.org/categorymanager;1"]
.getService(Components.interfaces.nsICategoryManager);
var entries = catMan.enumerateCategory(CATEGORY_UPDATE_TIMER);
while (entries.hasMoreElements()) {
var entry = entries.getNext().QueryInterface(Components.interfaces.nsISupportsCString).data;
var value = catMan.getCategoryEntry(CATEGORY_UPDATE_TIMER, entry);
var timerID = value.split(",")[2];
if (id == timerID) {
return true;
}
}
return false;
},
fireTimer: function(id) {
gBlocklist.QueryInterface(Components.interfaces.nsITimerCallback).notify(null);
},
QueryInterface: function(iid) {
if (iid.equals(Components.interfaces.nsIUpdateTimerManager)
|| iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
}
};
MockRegistrar.register("@mozilla.org/updates/timer-manager;1", timerService);
function failHandler(metadata, response) {
do_throw("Should not have attempted to retrieve the blocklist when it is disabled");
}
function pathHandler(metadata, response) {
var ABI = "noarch-spidermonkey";
// the blacklist service special-cases ABI for Universal binaries,
// so do the same here.
if ("@mozilla.org/xpcom/mac-utils;1" in Components.classes) {
var macutils = Components.classes["@mozilla.org/xpcom/mac-utils;1"]
.getService(Components.interfaces.nsIMacUtils);
if (macutils.isUniversalBinary)
ABI += "-u-" + macutils.architecturesInBinary;
}
do_check_eq(metadata.queryString,
"xpcshell@tests.mozilla.org&1&XPCShell&1&" +
gAppInfo.appBuildID + "&" +
"XPCShell_" + ABI + "&locale&updatechannel&" +
gOSVersion + "&1.9&distribution&distribution-version");
gBlocklist.observe(null, "quit-application", "");
gBlocklist.observe(null, "xpcom-shutdown", "");
testserver.stop(do_test_finished);
}
function run_test() {
var osVersion;
var sysInfo = Components.classes["@mozilla.org/system-info;1"]
.getService(Components.interfaces.nsIPropertyBag2);
try {
osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
if (osVersion) {
try {
osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
}
catch (e) {
}
gOSVersion = encodeURIComponent(osVersion);
}
}
catch (e) {
}
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9");
testserver = new HttpServer();
testserver.registerPathHandler("/1", failHandler);
testserver.registerPathHandler("/2", pathHandler);
testserver.start(-1);
gPort = testserver.identity.primaryPort;
// Initialise the blocklist service
gBlocklist = Components.classes["@mozilla.org/extensions/blocklist;1"]
.getService(Components.interfaces.nsIBlocklistService)
.QueryInterface(Components.interfaces.nsIObserver);
gBlocklist.observe(null, "profile-after-change", "");
do_check_true(timerService.hasTimer(BLOCKLIST_TIMER));
do_test_pending();
// This should have no effect as the blocklist is disabled
Services.prefs.setCharPref(PREF_BLOCKLIST_URL, "http://localhost:" + gPort + "/1");
Services.prefs.setBoolPref(PREF_BLOCKLIST_ENABLED, false);
timerService.fireTimer(BLOCKLIST_TIMER);
// Some values have to be on the default branch to work
var defaults = Services.prefs.QueryInterface(Components.interfaces.nsIPrefService)
.getDefaultBranch(null);
defaults.setCharPref(PREF_APP_UPDATE_CHANNEL, "updatechannel");
defaults.setCharPref(PREF_APP_DISTRIBUTION, "distribution");
defaults.setCharPref(PREF_APP_DISTRIBUTION_VERSION, "distribution-version");
defaults.setCharPref(PREF_GENERAL_USERAGENT_LOCALE, "locale");
// This should correctly escape everything
Services.prefs.setCharPref(PREF_BLOCKLIST_URL, "http://localhost:" + gPort + "/2?" +
"%APP_ID%&%APP_VERSION%&%PRODUCT%&%VERSION%&%BUILD_ID%&" +
"%BUILD_TARGET%&%LOCALE%&%CHANNEL%&" +
"%OS_VERSION%&%PLATFORM_VERSION%&%DISTRIBUTION%&%DISTRIBUTION_VERSION%");
Services.prefs.setBoolPref(PREF_BLOCKLIST_ENABLED, true);
timerService.fireTimer(BLOCKLIST_TIMER);
}
|