commit 50f1ff7a942c161c5b4866b2f98f00b3ea0fa03b
parent 7a8a5b31def39ead7697d17148c52f9d45c0802e
Author: Atila Butkovits <abutkovits@mozilla.com>
Date: Tue, 7 Oct 2025 18:09:11 +0300
Revert "Bug 1988988 - Add extension API support for masque proxy r=necko-reviewers,kershaw,robwu" for causing failures at test_ext_proxy_http3.js.
This reverts commit b36b73270863f3b8ddaffdb2961ba1ca307591de.
Diffstat:
4 files changed, 7 insertions(+), 298 deletions(-)
diff --git a/toolkit/components/extensions/ProxyChannelFilter.sys.mjs b/toolkit/components/extensions/ProxyChannelFilter.sys.mjs
@@ -35,7 +35,6 @@ const PROXY_TYPES = Object.freeze({
HTTP: "http",
SOCKS: "socks", // SOCKS5
SOCKS4: "socks4",
- MASQUE: "masque",
});
const ProxyInfoData = {
@@ -47,7 +46,6 @@ const ProxyInfoData = {
"type",
"host",
"port",
- "pathTemplate",
"username",
"password",
"proxyDNS",
@@ -104,23 +102,6 @@ const ProxyInfoData = {
proxyData.port = port;
},
- pathTemplate(proxyData) {
- let { pathTemplate } = proxyData;
- if (proxyData.type !== PROXY_TYPES.MASQUE) {
- if (pathTemplate !== undefined) {
- throw new ExtensionError(
- `ProxyInfoData: pathTemplate can only be used for "masque" proxies`
- );
- }
- return;
- }
- if (typeof pathTemplate !== "string" || !pathTemplate) {
- throw new ExtensionError(
- `ProxyInfoData: Invalid proxy path template: "${pathTemplate}"`
- );
- }
- },
-
username(proxyData) {
let { username } = proxyData;
if (username !== undefined && typeof username !== "string") {
@@ -128,11 +109,6 @@ const ProxyInfoData = {
`ProxyInfoData: Invalid proxy server username: "${username}"`
);
}
- if (username !== undefined && proxyData.type === PROXY_TYPES.MASQUE) {
- throw new ExtensionError(
- `ProxyInfoData: Username not expected for "masque" proxy info`
- );
- }
},
password(proxyData) {
@@ -142,11 +118,6 @@ const ProxyInfoData = {
`ProxyInfoData: Invalid proxy server password: "${password}"`
);
}
- if (password !== undefined && proxyData.type === PROXY_TYPES.MASQUE) {
- throw new ExtensionError(
- `ProxyInfoData: Password not expected for "masque" proxy info`
- );
- }
},
proxyDNS(proxyData) {
@@ -191,9 +162,9 @@ const ProxyInfoData = {
`ProxyInfoData: Invalid proxy server authorization header: "${proxyAuthorizationHeader}"`
);
}
- if (type !== "https" && type !== "http" && type !== "masque") {
+ if (type !== "https" && type !== "http") {
throw new ExtensionError(
- `ProxyInfoData: ProxyAuthorizationHeader requires type "https" or "http" or "masque"`
+ `ProxyInfoData: ProxyAuthorizationHeader requires type "https" or "http"`
);
}
},
@@ -227,7 +198,6 @@ const ProxyInfoData = {
type,
host,
port,
- pathTemplate,
username,
password,
proxyDNS,
@@ -259,17 +229,6 @@ const ProxyInfoData = {
failoverTimeout ? failoverTimeout : PROXY_TIMEOUT_SEC,
failoverProxy
);
- } else if (type == PROXY_TYPES.MASQUE) {
- proxyInfo = lazy.ProxyService.newMASQUEProxyInfo(
- host,
- port,
- pathTemplate,
- proxyAuthorizationHeader,
- connectionIsolationKey,
- proxyDNS ? TRANSPARENT_PROXY_RESOLVES_HOST : 0,
- failoverTimeout ? failoverTimeout : PROXY_TIMEOUT_SEC,
- failoverProxy
- );
} else {
proxyInfo = lazy.ProxyService.newProxyInfo(
type,
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_proxy_http3.js b/toolkit/components/extensions/test/xpcshell/test_ext_proxy_http3.js
@@ -1,144 +0,0 @@
-"use strict";
-
-AddonTestUtils.init(this);
-AddonTestUtils.overrideCertDB();
-AddonTestUtils.createAppInfo(
- "xpcshell@tests.mozilla.org",
- "XPCShell",
- "1",
- "43"
-);
-
-let { promiseShutdownManager, promiseStartupManager } = AddonTestUtils;
-
-function readFile(file) {
- let fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
- Ci.nsIFileInputStream
- );
- fstream.init(file, -1, 0, 0);
- let data = NetUtil.readInputStreamToString(fstream, fstream.available());
- fstream.close();
- return data;
-}
-
-function addCertFromFile(certdb, filename, trustString) {
- let certFile = do_get_file(filename, false);
- let pem = readFile(certFile)
- .replace(/-----BEGIN CERTIFICATE-----/, "")
- .replace(/-----END CERTIFICATE-----/, "")
- .replace(/[\r\n]/g, "");
- certdb.addCertFromBase64(pem, trustString);
-}
-
-let proxyHost;
-let proxyPort;
-
-/**
- * Sets up HTTP3 proxy configuration for extension tests
- */
-add_setup(async function setup() {
- Services.prefs.setBoolPref("network.proxy.allow_hijacking_localhost", true);
- Services.prefs.setBoolPref("network.dns.disableIPv6", true);
- Services.prefs.setIntPref("network.webtransport.datagram_size", 1500);
- Services.prefs.setCharPref("network.dns.localDomains", "foo.example.com");
-
- let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
- Ci.nsIX509CertDB
- );
- addCertFromFile(
- certdb,
- "../../../../../netwerk/test/unit/proxy-ca.pem",
- "CTu,u,u"
- );
- addCertFromFile(
- certdb,
- "../../../../../netwerk/test/unit/http2-ca.pem",
- "CTu,u,u"
- );
-
- proxyHost = "foo.example.com";
- proxyPort = Services.env.get("MOZHTTP3_PORT_MASQUE");
-
- // A dummy request to make sure AltSvcCache::mStorage is ready.
- // It doesn't really matter if it succeeds or fails.
- try {
- await fetch("https://localhost");
- } catch (e) {}
-
- // In case the prefs have a different value by default.
- Services.prefs.setBoolPref(
- "extensions.webextensions.early_background_wakeup_on_request",
- false
- );
-
- registerCleanupFunction(() => {
- Services.prefs.clearUserPref("network.proxy.allow_hijacking_localhost");
- });
-});
-
-add_task(async function test_connect_udp() {
- await promiseStartupManager();
-
- let h3Port = Services.env.get("MOZHTTP3_PORT");
- ok(h3Port, `MOZHTTP3_PORT should be set: ${h3Port}`);
-
- function background(proxyInfo) {
- browser.proxy.onRequest.addListener(
- details => {
- browser.test.log(`onRequest: ${JSON.stringify(details)}`);
- browser.test.sendMessage("onRequest", details.url);
- return proxyInfo;
- },
- { urls: ["<all_urls>"] }
- );
- }
-
- let proxyInfo = {
- host: proxyHost,
- port: proxyPort,
- type: "masque",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- connectionIsolationKey: "masque-udp",
- };
-
- let extension = ExtensionTestUtils.loadExtension({
- useAddonManager: "permanent",
- manifest: {
- permissions: ["proxy", "<all_urls>"],
- },
- background: `(${background})(${JSON.stringify(proxyInfo)})`,
- });
-
- await extension.startup();
-
- Services.prefs.setCharPref(
- "network.http.http3.alt-svc-mapping-for-testing",
- `alt1.example.com;h3=:${h3Port}`
- );
-
- // Test the HTTP3 connection through the extension proxy
- let response = await ExtensionTestUtils.fetch(
- `https://alt1.example.com:${h3Port}/no_body`,
- `https://alt1.example.com:${h3Port}/`
- );
- Assert.equal(response, "Hello World", "HTTP3 proxy request succeeded");
-
- equal(
- await extension.awaitMessage("onRequest"),
- `https://alt1.example.com:${h3Port}/no_body`,
- "Observed proxy.onRequest for speculative document request"
- );
- equal(
- await extension.awaitMessage("onRequest"),
- `https://alt1.example.com:${h3Port}/no_body`,
- "Observed proxy.onRequest for document request"
- );
- equal(
- await extension.awaitMessage("onRequest"),
- `https://alt1.example.com:${h3Port}/`,
- "Observed proxy.onRequest for fetch() call"
- );
-
- await extension.unload();
- await promiseShutdownManager();
-});
diff --git a/toolkit/components/extensions/test/xpcshell/test_proxy_info_results.js b/toolkit/components/extensions/test/xpcshell/test_proxy_info_results.js
@@ -194,7 +194,7 @@ add_task(async function test_proxyInfo_results() {
],
expected: {
error:
- 'ProxyInfoData: ProxyAuthorizationHeader requires type "https" or "http" or "masque"',
+ 'ProxyInfoData: ProxyAuthorizationHeader requires type "https" or "http"',
},
},
{
@@ -304,7 +304,7 @@ add_task(async function test_proxyInfo_results() {
expected: {
proxyInfo: {
host: "foo.bar",
- port: 3128,
+ port: "3128",
type: "http",
},
},
@@ -342,7 +342,7 @@ add_task(async function test_proxyInfo_results() {
expected: {
proxyInfo: {
host: "foo.bar",
- port: 3128,
+ port: "3128",
type: "https",
},
},
@@ -441,7 +441,7 @@ add_task(async function test_proxyInfo_results() {
expected: {
proxyInfo: {
host: "foo.bar",
- port: 3128,
+ port: "3128",
type: "https",
proxyAuthorizationHeader: "test",
connectionIsolationKey: "key",
@@ -461,114 +461,11 @@ add_task(async function test_proxyInfo_results() {
expected: {
proxyInfo: {
host: "foo.bar",
- port: 3128,
- type: "http",
- proxyAuthorizationHeader: "test",
- connectionIsolationKey: "key",
- },
- },
- },
- {
- proxy: [
- {
+ port: "3128",
type: "http",
- host: "foo.bar",
- port: 8080,
- username: "mungosantamaria",
- password: "pass123",
- proxyDNS: true,
- failoverTimeout: 3,
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- },
- ],
- expected: {
- error: `ProxyInfoData: pathTemplate can only be used for "masque" proxies`,
- },
- },
- {
- proxy: [
- {
- host: "foo.bar",
- port: 3128,
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- type: "masque",
- },
- ],
- expected: {
- proxyInfo: {
- host: "foo.bar",
- port: 3128,
- type: "masque",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- },
- },
- },
- {
- proxy: [
- {
- host: "foo.bar",
- port: 3128,
- proxyAuthorizationHeader: "test",
- connectionIsolationKey: "key",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- type: "masque",
- },
- ],
- expected: {
- proxyInfo: {
- host: "foo.bar",
- port: 3128,
- type: "masque",
- proxyAuthorizationHeader: "test",
- connectionIsolationKey: "key",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- },
- },
- },
- {
- proxy: [
- {
- type: "masque",
- host: "foo.bar",
- port: 3128,
- proxyAuthorizationHeader: "test",
- connectionIsolationKey: "key",
- },
- ],
- expected: {
- error: `ProxyInfoData: Invalid proxy path template: "undefined"`,
- },
- },
- {
- proxy: [
- {
- type: "masque",
- host: "foo.bar",
- port: 3128,
- proxyAuthorizationHeader: "test",
- connectionIsolationKey: "key",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- username: "mungosantamaria",
- },
- ],
- expected: {
- error: `ProxyInfoData: Username not expected for "masque" proxy info`,
- },
- },
- {
- proxy: [
- {
- host: "foo.bar",
- port: 3128,
proxyAuthorizationHeader: "test",
connectionIsolationKey: "key",
- pathTemplate: "/.well-known/masque/udp/{target_host}/{target_port}/",
- type: "masque",
- password: "pass123",
},
- ],
- expected: {
- error: `ProxyInfoData: Password not expected for "masque" proxy info`,
},
},
];
diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell-remote.toml b/toolkit/components/extensions/test/xpcshell/xpcshell-remote.toml
@@ -34,9 +34,6 @@ skip-if = ["tsan"]
["test_ext_ipcBlob.js"]
skip-if = ["os == 'android' && processor == 'x86_64'"]
-["test_ext_proxy_http3.js"]
-support-files = ["!/netwerk/test/unit/proxy-ca.pem", "!/netwerk/test/unit/http2-ca.pem"]
-
["test_extension_process_alive.js"]
["test_process_crash_telemetry.js"]