mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-05 00:25:27 +00:00
239 lines
8.3 KiB
JavaScript
239 lines
8.3 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
var ios = Cc["@mozilla.org/network/io-service;1"]
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
var pps = Cc["@mozilla.org/network/protocol-proxy-service;1"].getService();
|
|
|
|
var prefs = Cc["@mozilla.org/preferences-service;1"]
|
|
.getService(Components.interfaces.nsIPrefBranch);
|
|
|
|
var pgen = Cc["@mozilla.org/pac-generator;1"]
|
|
.getService(Components.interfaces.nsIPACGenerator);
|
|
|
|
const TARGET_HOST ="www.mozilla.org";
|
|
const HTTP_HOST = "httpHost";
|
|
const HTTP_PORT = 1111;
|
|
const HTTPS_HOST = "httpsHost";
|
|
const HTTPS_PORT = 2222;
|
|
const FTP_HOST= "ftpHost";
|
|
const FTP_PORT = 3333;
|
|
const MY_APP_ID = 10;
|
|
const MY_APP_ORIGIN = "apps://browser.gaiamobile.com";
|
|
const APP_ORIGINS_LIST = "apps://test1.com, apps://browser.gaiamobile.com";
|
|
const BROWSING_HOST = "browsingHost";
|
|
const BROWSING_PORT = 4444;
|
|
const PROXY_TYPE_PAC = Ci.nsIProtocolProxyService.PROXYCONFIG_PAC;
|
|
|
|
const proxyTypes = {
|
|
"http": {"pref": "http", "host": HTTP_HOST, "port": HTTP_PORT},
|
|
"https": {"pref": "ssl", "host": HTTPS_HOST, "port": HTTPS_PORT},
|
|
"ftp": {"pref": "ftp", "host": FTP_HOST, "port": FTP_PORT}
|
|
};
|
|
|
|
function default_proxy_settings() {
|
|
prefs.setBoolPref("network.proxy.pac_generator", true);
|
|
prefs.setIntPref("network.proxy.type", 0);
|
|
prefs.setCharPref("network.proxy.autoconfig_url", "");
|
|
for (let i in proxyTypes) {
|
|
let p = proxyTypes[i];
|
|
prefs.setCharPref("network.proxy." + p["pref"], p["host"]);
|
|
prefs.setIntPref("network.proxy." + p["pref"] + "_port", p["port"]);
|
|
}
|
|
}
|
|
|
|
function TestResolveCallback(type, host, callback) {
|
|
this.type = type;
|
|
this.host = host;
|
|
this.callback = callback;
|
|
}
|
|
TestResolveCallback.prototype = {
|
|
QueryInterface:
|
|
function TestResolveCallback_QueryInterface(iid) {
|
|
if (iid.equals(Components.interfaces.nsIProtocolProxyCallback) ||
|
|
iid.equals(Components.interfaces.nsISupports))
|
|
return this;
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
},
|
|
|
|
onProxyAvailable:
|
|
function TestResolveCallback_onProxyAvailable(req, channel, pi, status) {
|
|
if (this.type) {
|
|
// Check for localhost.
|
|
if (this.host == "localhost" || this.host == "127.0.0.1") {
|
|
do_check_eq(pi, null);
|
|
this.callback();
|
|
return;
|
|
}
|
|
|
|
// Check for browsing proxy.
|
|
let browsingEnabled;
|
|
try {
|
|
browsingEnabled = prefs.getBoolPref("network.proxy.browsing.enabled");
|
|
} catch (ex) {}
|
|
|
|
if (browsingEnabled) {
|
|
let proxyHost, proxyPort;
|
|
try {
|
|
proxyHost = prefs.getCharPref("network.proxy.browsing.host");
|
|
proxyPort = prefs.getIntPref("network.proxy.browsing.port");
|
|
} catch (ex) {}
|
|
|
|
if (proxyHost) {
|
|
do_check_eq(pi.host, proxyHost);
|
|
do_check_eq(pi.port, proxyPort);
|
|
this.callback();
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check for system proxy.
|
|
let share;
|
|
try {
|
|
share = prefs.getBoolPref("network.proxy.share_proxy_settings");
|
|
} catch (ex) {}
|
|
|
|
let p = share ? proxyTypes["http"] : proxyTypes[this.type];
|
|
if (p) {
|
|
let proxyHost, proxyPort;
|
|
try {
|
|
proxyHost = prefs.getCharPref("network.proxy." + p["pref"]);
|
|
proxyPort = prefs.getIntPref("network.proxy." + p["pref"] + "_port");
|
|
} catch (ex) {}
|
|
|
|
if (proxyHost) {
|
|
// Connection through proxy.
|
|
do_check_neq(pi, null);
|
|
do_check_eq(pi.host, proxyHost);
|
|
do_check_eq(pi.port, proxyPort);
|
|
} else {
|
|
// Direct connection.
|
|
do_check_eq(pi, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.callback();
|
|
}
|
|
};
|
|
|
|
function test_resolve_type(type, host, callback) {
|
|
// We have to setup a profile, otherwise indexed db used by webapps
|
|
// will throw random exception when trying to get profile folder.
|
|
do_get_profile();
|
|
|
|
// We also need a valid nsIXulAppInfo service as Webapps.jsm is querying it.
|
|
Cu.import("resource://testing-common/AppInfo.jsm");
|
|
updateAppInfo();
|
|
|
|
// Mock getAppByLocalId() to return testing app origin.
|
|
Cu.import("resource://gre/modules/AppsUtils.jsm");
|
|
AppsUtils.getAppByLocalId = function(aAppId) {
|
|
let app = { origin: MY_APP_ORIGIN};
|
|
return app;
|
|
};
|
|
|
|
let channel = ios.newChannel2(type + "://" + host + "/",
|
|
null,
|
|
null,
|
|
null, // aLoadingNode
|
|
Services.scriptSecurityManager.getSystemPrincipal(),
|
|
null, // aTriggeringPrincipal
|
|
Ci.nsILoadInfo.SEC_NORMAL,
|
|
Ci.nsIContentPolicy.TYPE_OTHER);
|
|
channel.notificationCallbacks =
|
|
AppsUtils.createLoadContext(MY_APP_ID, true);
|
|
|
|
let req = pps.asyncResolve(channel, 0, new TestResolveCallback(type, host, callback));
|
|
}
|
|
|
|
function test_resolve(host, callback) {
|
|
test_resolve_type("http", host, function() {
|
|
test_resolve_type("https", host, function() {
|
|
test_resolve_type("ftp", host, run_next_test);
|
|
});
|
|
});
|
|
}
|
|
|
|
add_test(function test_localhost() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve("localhost", run_next_test);
|
|
});
|
|
|
|
add_test(function test_share_on_proxy() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve(TARGET_HOST, run_next_test);
|
|
});
|
|
|
|
add_test(function test_share_on_direct() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
|
|
prefs.setCharPref("network.proxy.http", "");
|
|
prefs.setCharPref("network.proxy.ssl", "");
|
|
prefs.setCharPref("network.proxy.ftp", "");
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve(TARGET_HOST, run_next_test);
|
|
});
|
|
|
|
add_test(function test_share_off_proxy() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.share_proxy_settings", false);
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve(TARGET_HOST, run_next_test);
|
|
});
|
|
|
|
add_test(function test_share_off_direct() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.share_proxy_settings", false);
|
|
prefs.setCharPref("network.proxy.http", "");
|
|
prefs.setCharPref("network.proxy.ssl", "");
|
|
prefs.setCharPref("network.proxy.ftp", "");
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve(TARGET_HOST, run_next_test);
|
|
});
|
|
|
|
add_test(function test_browsing_proxy() {
|
|
default_proxy_settings();
|
|
prefs.setBoolPref("network.proxy.browsing.enabled", true);
|
|
prefs.setCharPref("network.proxy.browsing.host", BROWSING_HOST);
|
|
prefs.setIntPref("network.proxy.browsing.port", BROWSING_PORT);
|
|
prefs.setCharPref("network.proxy.browsing.app_origins", APP_ORIGINS_LIST);
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
|
|
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
|
|
test_resolve(TARGET_HOST, run_next_test);
|
|
});
|
|
|
|
function run_test(){
|
|
do_register_cleanup(() => {
|
|
prefs.clearUserPref("network.proxy.pac_generator");
|
|
prefs.clearUserPref("network.proxy.type");
|
|
prefs.clearUserPref("network.proxy.autoconfig_url");
|
|
prefs.clearUserPref("network.proxy.share_proxy_settings");
|
|
prefs.clearUserPref("network.proxy.http");
|
|
prefs.clearUserPref("network.proxy.http_port");
|
|
prefs.clearUserPref("network.proxy.ssl");
|
|
prefs.clearUserPref("network.proxy.ssl_port");
|
|
prefs.clearUserPref("network.proxy.ftp");
|
|
prefs.clearUserPref("network.proxy.ftp_port");
|
|
prefs.clearUserPref("network.proxy.browsing.enabled");
|
|
prefs.clearUserPref("network.proxy.browsing.host");
|
|
prefs.clearUserPref("network.proxy.browsing.port");
|
|
prefs.clearUserPref("network.proxy.browsing.app_origins");
|
|
});
|
|
run_next_test();
|
|
}
|