summaryrefslogtreecommitdiffstats
path: root/netwerk/test/mochitests/test_user_agent_overrides.html
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/mochitests/test_user_agent_overrides.html')
-rw-r--r--netwerk/test/mochitests/test_user_agent_overrides.html240
1 files changed, 240 insertions, 0 deletions
diff --git a/netwerk/test/mochitests/test_user_agent_overrides.html b/netwerk/test/mochitests/test_user_agent_overrides.html
new file mode 100644
index 000000000..7396c35e1
--- /dev/null
+++ b/netwerk/test/mochitests/test_user_agent_overrides.html
@@ -0,0 +1,240 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=782453
+-->
+<head>
+ <title>Test for User Agent Overrides</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=782453">Mozilla Bug 782453</a>
+<p id="display"></p>
+<div id="content" style="display: none"></div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+const PREF_OVERRIDES_ENABLED = "general.useragent.site_specific_overrides";
+const PREF_OVERRIDES_BRANCH = "general.useragent.override.";
+
+const DEFAULT_UA = navigator.userAgent;
+
+const UA_WHOLE_OVERRIDE = "DummyUserAgent";
+const UA_WHOLE_EXPECTED = UA_WHOLE_OVERRIDE;
+
+const UA_PARTIAL_FROM = "\\wozilla"; // /\wozilla
+const UA_PARTIAL_SEP = "#";
+const UA_PARTIAL_TO = UA_WHOLE_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 testUAIFrame(host, expected, sameQ, message, testNavQ, navSameQ, navMessage, callback) {
+ let url = location.pathname;
+ url = host + url.slice(0, url.lastIndexOf('/')) + '/user_agent.sjs';
+ let ifr = document.createElement('IFRAME');
+
+ ifr.src = url;
+
+ document.getElementById('content').appendChild(ifr);
+
+ window.addEventListener("message", function recv(e) {
+ ok(sameQ == (e.data.header.indexOf(expected) != -1), message);
+ if (testNavQ) {
+ ok(navSameQ == (e.data.nav.indexOf(expected) != -1), navMessage);
+ }
+ window.removeEventListener("message", recv, false);
+ callback();
+ }, false);
+
+}
+
+function testUAIFrameNoNav(host, expected, sameQ, message, callback) {
+ testUAIFrame(host, expected, sameQ, message, false, true, '', callback);
+}
+
+function testUA(options, callback) {
+ var [domain, override, test_hosts, expected] =
+ [options.domain, options.override, options.test_hosts, options.expected];
+
+ (function nextTest() {
+ let test_host = test_hosts.shift();
+
+ info("Overriding " + domain + " with " + override + " for " + test_host);
+
+ function is_subdomain(host) {
+ var [test_domain] = host.slice(host.lastIndexOf('/') + 1).split(':', 1);
+ return test_domain === domain || test_domain.endsWith('.' + domain);
+ }
+
+ var localhost = location.origin;
+ var overrideNavigator = is_subdomain(localhost);
+ var navigator_ua, test_ua;
+
+ if (overrideNavigator) {
+ navigator_ua = navigator.userAgent;
+ }
+
+ let url = location.pathname;
+ url = test_host + url.slice(0, url.lastIndexOf('/')) + '/user_agent.sjs';
+ let ifr = document.createElement('IFRAME');
+ ifr.src = url;
+
+ document.getElementById('content').appendChild(ifr);
+
+ window.addEventListener("message", function recv(e) {
+ test_ua = e.data.header;
+ SpecialPowers.pushPrefEnv({
+ set: [[PREF_OVERRIDES_BRANCH + domain, override]],
+ }, function () {
+ testUAIFrame(test_host, expected, true, 'Header UA not overridden at step ' + (++step), true,
+ true, 'Navigator UA not overridden at step ' + (++step), function () {
+ // clear the override pref to undo overriding the UA
+ SpecialPowers.pushPrefEnv({
+ clear: [[PREF_OVERRIDES_BRANCH + domain]],
+ }, function () {
+ testUAIFrameNoNav(test_host, test_ua, true, 'Header UA not restored at step ' + (++step), function() {
+ test_hosts.length ? nextTest() : callback();
+ });
+ });
+ });
+ });
+ window.removeEventListener("message", recv, false);
+ }, false);
+ })();
+}
+
+var step = 0; // for logging
+var tests = [
+ // should override both header and navigator.userAgent
+ {
+ domain: location.hostname,
+ override: UA_WHOLE_OVERRIDE,
+ test_hosts: [location.origin],
+ expected: UA_WHOLE_EXPECTED
+ },
+
+ // should support partial overrides
+ {
+ domain: location.hostname,
+ override: UA_PARTIAL_OVERRIDE,
+ test_hosts: [location.origin],
+ expected: UA_PARTIAL_EXPECTED
+ },
+
+ // should match domain and subdomains
+ {
+ domain: 'example.org',
+ override: UA_WHOLE_OVERRIDE,
+ test_hosts: ['http://example.org',
+ 'http://test1.example.org',
+ 'http://sub1.test1.example.org'],
+ expected: UA_WHOLE_EXPECTED
+ },
+
+ // should not match superdomains
+ {
+ domain: 'sub1.test1.example.org',
+ override: UA_WHOLE_OVERRIDE,
+ test_hosts: ['http://example.org',
+ 'http://test1.example.org'],
+ expected: DEFAULT_UA
+ },
+
+ // should work with https
+ {
+ domain: 'example.com',
+ override: UA_WHOLE_OVERRIDE,
+ test_hosts: ['https://example.com',
+ 'https://test1.example.com',
+ 'https://sub1.test1.example.com'],
+ expected: UA_WHOLE_EXPECTED
+ },
+];
+
+// test that UA is not overridden when the 'site_specific_overrides' pref is off
+function testInactive(callback) {
+ SpecialPowers.pushPrefEnv({
+ set: [
+ [PREF_OVERRIDES_ENABLED, false],
+ [PREF_OVERRIDES_BRANCH + location.hostname, UA_WHOLE_OVERRIDE]
+ ]
+ }, function () {
+ testUAIFrame(location.origin, UA_WHOLE_OVERRIDE, false, 'Failed to disabled header UA override at step ' + (++step),
+ true, false, 'Failed to disable navigator UA override at step + ' + (++step), function () {
+ SpecialPowers.pushPrefEnv({
+ clear: [
+ [PREF_OVERRIDES_ENABLED],
+ [PREF_OVERRIDES_BRANCH + location.hostname]
+ ]
+ }, 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
+ testUAIFrameNoNav(host, UA_WHOLE_EXPECTED, true, 'UA not overridden at step ' + (++step), function() {
+ // 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]]
+ }, function nextTest() {
+ testUA(tests.shift(), function() { tests.length ? nextTest() : callback() });
+ });
+}
+
+SpecialPowers.loadChromeScript(_ => {
+ Components.utils.import("resource://gre/modules/UserAgentOverrides.jsm");
+ UserAgentOverrides.init();
+});
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestCompleteLog();
+SimpleTest.requestLongerTimeout(5);
+
+testOverrides(function() {
+ testInactive(function() {
+ testPriority(SimpleTest.finish)
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>