Bug 897221 - Initialize UserAgentUpdates.jsm inside UserAgentOverrides; r=fabrice

This commit is contained in:
Jim Chen 2013-09-09 15:47:47 -04:00
Родитель ed37b483db
Коммит 80665addf5
2 изменённых файлов: 67 добавлений и 8 удалений

Просмотреть файл

@ -10,6 +10,7 @@ const Ci = Components.interfaces;
const Cc = Components.classes;
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/UserAgentUpdates.jsm");
const PREF_OVERRIDES_ENABLED = "general.useragent.site_specific_overrides";
const DEFAULT_UA = Cc["@mozilla.org/network/protocol;1?name=http"]
@ -19,6 +20,7 @@ const MAX_OVERRIDE_FOR_HOST_CACHE_SIZE = 250;
var gPrefBranch;
var gOverrides = new Map;
var gUpdatedOverrides;
var gOverrideForHostCache = new Map;
var gInitialized = false;
var gOverrideFunctions = [
@ -41,6 +43,14 @@ this.UserAgentOverrides = {
// The http-on-modify-request notification is disallowed in content processes.
}
UserAgentUpdates.init(function(overrides) {
gOverrideForHostCache.clear();
if (overrides) {
overrides.get = function(key) this[key];
}
gUpdatedOverrides = overrides;
});
buildOverrides();
gInitialized = true;
},
@ -51,7 +61,7 @@ this.UserAgentOverrides = {
getOverrideForURI: function uao_getOverrideForURI(aURI) {
if (!gInitialized ||
!gOverrides.size ||
(!gOverrides.size && !gUpdatedOverrides) ||
!(aURI instanceof Ci.nsIStandardURL))
return null;
@ -61,16 +71,24 @@ this.UserAgentOverrides = {
if (override !== undefined)
return override;
override = null;
function findOverride(overrides) {
let searchHost = host;
let userAgent = overrides.get(searchHost);
for (let [domain, userAgent] of gOverrides) {
if (host == domain ||
host.endsWith("." + domain)) {
override = userAgent;
break;
while (!userAgent) {
let dot = searchHost.indexOf('.');
if (dot === -1) {
return null;
}
searchHost = searchHost.slice(dot + 1);
userAgent = overrides.get(searchHost);
}
return userAgent;
}
override = (gOverrides.size && findOverride(gOverrides))
|| (gUpdatedOverrides && findOverride(gUpdatedOverrides));
if (gOverrideForHostCache.size >= MAX_OVERRIDE_FOR_HOST_CACHE_SIZE) {
gOverrideForHostCache.clear();
}

Просмотреть файл

@ -181,6 +181,45 @@ function testInactive(callback) {
});
}
function testPriority(callback) {
// foo.bar.com override should have priority over bar.com override
var tests = [
['example.org', 'test1.example.org', 'sub1.test1.example.org'],
['example.org', 'test1.example.org', 'sub2.test1.example.org'],
['example.org', 'test2.example.org', 'sub1.test2.example.org'],
['example.org', 'test2.example.org', 'sub2.test2.example.org'],
];
(function nextTest() {
var [level0, level1, level2] = tests.shift();
var host = 'http://' + level2;
SpecialPowers.pushPrefEnv({
set: [
[PREF_OVERRIDES_ENABLED, true],
[PREF_OVERRIDES_BRANCH + level1, UA_WHOLE_OVERRIDE]
]
}, function () {
// should use first override at this point
is(getUA(host),
UA_WHOLE_EXPECTED, 'UA not overridden');
// add a second override that should be used
testUA({
domain: level2,
override: UA_PARTIAL_OVERRIDE,
test_hosts: [host],
expected: UA_PARTIAL_EXPECTED
}, function () {
// add a third override that should not be used
testUA({
domain: level0,
override: UA_PARTIAL_OVERRIDE,
test_hosts: [host],
expected: UA_WHOLE_EXPECTED
}, tests.length ? nextTest : callback);
});
});
})();
}
function testOverrides(callback) {
SpecialPowers.pushPrefEnv({
set: [[PREF_OVERRIDES_ENABLED, true]]
@ -195,7 +234,9 @@ SpecialPowers.wrap(UserAgentOverrides).init();
SimpleTest.waitForExplicitFinish();
testOverrides(function ()
testInactive(SimpleTest.finish)
testInactive(function ()
testPriority(SimpleTest.finish)
)
);
</script>