diff --git a/netwerk/protocol/http/UserAgentOverrides.jsm b/netwerk/protocol/http/UserAgentOverrides.jsm index e4186782acf8..c5cbd0d67744 100644 --- a/netwerk/protocol/http/UserAgentOverrides.jsm +++ b/netwerk/protocol/http/UserAgentOverrides.jsm @@ -32,6 +32,7 @@ var gInitialized = false; var gOverrideFunctions = [ function (aHttpChannel) UserAgentOverrides.getOverrideForURI(aHttpChannel.URI) ]; +var gBuiltUAs = new Map; this.UserAgentOverrides = { init: function uao_init() { @@ -53,6 +54,9 @@ this.UserAgentOverrides = { UserAgentUpdates.init(function(overrides) { gOverrideForHostCache.clear(); if (overrides) { + for (let domain in overrides) { + overrides[domain] = getUserAgentFromOverride(overrides[domain]); + } overrides.get = function(key) this[key]; } gUpdatedOverrides = overrides; @@ -129,6 +133,22 @@ this.UserAgentOverrides = { } }; +function getUserAgentFromOverride(override) +{ + let userAgent = gBuiltUAs.get(override); + if (userAgent !== undefined) { + return userAgent; + } + let [search, replace] = override.split("#", 2); + if (search && replace) { + userAgent = DEFAULT_UA.replace(new RegExp(search, "g"), replace); + } else { + userAgent = override; + } + gBuiltUAs.set(override, userAgent); + return userAgent; +} + function buildOverrides() { gOverrides.clear(); gOverrideForHostCache.clear(); @@ -141,17 +161,7 @@ function buildOverrides() { for (let domain of domains) { let override = gPrefBranch.getCharPref(domain); - let userAgent = builtUAs.get(override); - - if (userAgent === undefined) { - let [search, replace] = override.split("#", 2); - if (search && replace) { - userAgent = DEFAULT_UA.replace(new RegExp(search, "g"), replace); - } else { - userAgent = override; - } - builtUAs.set(override, userAgent); - } + let userAgent = getUserAgentFromOverride(override); if (userAgent != DEFAULT_UA) { gOverrides.set(domain, userAgent); diff --git a/netwerk/test/mochitests/test_user_agent_updates.html b/netwerk/test/mochitests/test_user_agent_updates.html index 657032d402cf..077e7e8fa85e 100644 --- a/netwerk/test/mochitests/test_user_agent_updates.html +++ b/netwerk/test/mochitests/test_user_agent_updates.html @@ -30,6 +30,12 @@ const DEFAULT_UA = navigator.userAgent; const UA_OVERRIDE = "DummyUserAgent"; const UA_ALT_OVERRIDE = "AltUserAgent"; +const UA_PARTIAL_FROM = "\\wozilla"; // /\wozilla +const UA_PARTIAL_SEP = "#"; +const UA_PARTIAL_TO = UA_OVERRIDE; +const UA_PARTIAL_OVERRIDE = UA_PARTIAL_FROM + UA_PARTIAL_SEP + UA_PARTIAL_TO; +const UA_PARTIAL_EXPECTED = DEFAULT_UA.replace(new RegExp(UA_PARTIAL_FROM, 'g'), UA_PARTIAL_TO); + function getUA(host) { var url = location.pathname; url = host + url.slice(0, url.lastIndexOf('/')) + '/user_agent.sjs'; @@ -78,6 +84,12 @@ const OVERRIDES = [ expected: SpecialPowers.Services.appinfo.OS, host: 'http://sub1.test2.example.org' }, + { + domain: 'sub2.test2.example.org', + override: UA_PARTIAL_OVERRIDE, + expected: UA_PARTIAL_EXPECTED, + host: 'http://sub2.test2.example.org' + }, ]; function getServerURL() {