Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* 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/. */
"use strict";
const lazy = {};
// Ensure DNS lookups don't hit the server
XPCOMUtils.defineLazyServiceGetter(
lazy,
"gDNSOverride",
"@mozilla.org/network/native-dns-override;1",
"nsINativeDNSResolverOverride"
);
add_task(async function setup() {
Services.prefs.setStringPref("browser.fixup.alternate.prefix", "www.");
Services.prefs.setStringPref("browser.fixup.alternate.suffix", ".com");
Services.prefs.setStringPref("browser.fixup.alternate.protocol", "https");
Services.prefs.setBoolPref(
"browser.urlbar.dnsResolveFullyQualifiedNames",
true
);
registerCleanupFunction(function () {
Services.prefs.clearUserPref("browser.fixup.alternate.prefix");
Services.prefs.clearUserPref("browser.fixup.alternate.suffix");
Services.prefs.clearUserPref("browser.fixup.alternate.protocol");
Services.prefs.clearUserPref(
"browser.urlbar.dnsResolveFullyQualifiedNames"
);
});
});
// TODO: Export Listener from test_dns_override instead of duping
class Listener {
constructor() {
this.promise = new Promise(resolve => {
this.resolve = resolve;
});
}
onLookupComplete(inRequest, inRecord, inStatus) {
this.resolve([inRequest, inRecord, inStatus]);
}
async firstAddress() {
let all = await this.addresses();
if (all.length) {
return all[0];
}
return undefined;
}
async addresses() {
let [, inRecord] = await this.promise;
let addresses = [];
if (!inRecord) {
return addresses; // returns []
}
inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
while (inRecord.hasMore()) {
addresses.push(inRecord.getNextAddrAsString());
}
return addresses;
}
then() {
return this.promise.then.apply(this.promise, arguments);
}
}
const FAKE_IP = "::1";
const FAKE_INTRANET_IP = "::2";
const ORIGIN_ATTRIBUTE = {};
add_task(async function test_uri_with_force_fixup() {
let listener = new Listener();
let { fixedURI } = Services.uriFixup.forceHttpFixup("http://www.example.com");
lazy.gDNSOverride.addIPOverride(fixedURI.displayHost, FAKE_IP);
Services.uriFixup.checkHost(fixedURI, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
await listener.firstAddress(),
FAKE_IP,
"Should've received fake IP"
);
lazy.gDNSOverride.clearHostOverride(fixedURI.displayHost);
Services.dns.clearCache(false);
});
add_task(async function test_uri_with_get_fixup() {
let listener = new Listener();
let uri = Services.io.newURI("http://www.example.com");
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
await listener.firstAddress(),
FAKE_IP,
"Should've received fake IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
Services.dns.clearCache(false);
});
add_task(async function test_intranet_like_uri() {
let listener = new Listener();
let uri = Services.io.newURI("http://someintranet");
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
// Hosts without periods should end with a period to make them FQN
lazy.gDNSOverride.addIPOverride(uri.displayHost + ".", FAKE_INTRANET_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.deepEqual(
await listener.addresses(),
FAKE_INTRANET_IP,
"Should've received fake intranet IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
lazy.gDNSOverride.clearHostOverride(uri.displayHost + ".");
Services.dns.clearCache(false);
});
add_task(async function test_intranet_like_uri_without_fixup() {
let listener = new Listener();
let uri = Services.io.newURI("http://someintranet");
Services.prefs.setBoolPref(
"browser.urlbar.dnsResolveFullyQualifiedNames",
false
);
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
// Hosts without periods should end with a period to make them FQN
lazy.gDNSOverride.addIPOverride(uri.displayHost + ".", FAKE_INTRANET_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.deepEqual(
await listener.addresses(),
FAKE_IP,
"Should've received non-fixed up IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
lazy.gDNSOverride.clearHostOverride(uri.displayHost + ".");
Services.dns.clearCache(false);
});
add_task(async function test_ip_address() {
let listener = new Listener();
let uri = Services.io.newURI("http://192.168.0.1");
// Testing IP address being passed into the method
// requires observing if the asyncResolve method gets called
let didResolve = false;
let topic = "uri-fixup-check-dns";
let observer = {
observe(aSubject, aTopicInner) {
if (aTopicInner == topic) {
didResolve = true;
}
},
};
Services.obs.addObserver(observer, topic);
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
didResolve,
false,
"Passing an IP address should not conduct a host lookup"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
Services.dns.clearCache(false);
Services.obs.removeObserver(observer, topic);
});