summaryrefslogtreecommitdiffstats
path: root/netwerk/test/browser/cookie_filtering_helper.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/browser/cookie_filtering_helper.sys.mjs')
-rw-r--r--netwerk/test/browser/cookie_filtering_helper.sys.mjs166
1 files changed, 166 insertions, 0 deletions
diff --git a/netwerk/test/browser/cookie_filtering_helper.sys.mjs b/netwerk/test/browser/cookie_filtering_helper.sys.mjs
new file mode 100644
index 0000000000..f3db10ffb3
--- /dev/null
+++ b/netwerk/test/browser/cookie_filtering_helper.sys.mjs
@@ -0,0 +1,166 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// The functions in this file will run in the content process in a test
+// scope.
+/* eslint-env mozilla/simpletest */
+/* global ContentTaskUtils, content */
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
+const info = console.log;
+
+export var HTTPS_EXAMPLE_ORG = "https://example.org";
+export var HTTPS_EXAMPLE_COM = "https://example.com";
+export var HTTP_EXAMPLE_COM = "http://example.com";
+
+export function browserTestPath(uri) {
+ return uri + "/browser/netwerk/test/browser/";
+}
+
+export function waitForAllExpectedTests() {
+ return ContentTaskUtils.waitForCondition(() => {
+ return content.testDone === true;
+ });
+}
+
+export function cleanupObservers() {
+ Services.obs.notifyObservers(null, "cookie-content-filter-cleanup");
+}
+
+export async function preclean_test() {
+ // enable all cookies for the set-cookie trigger via setCookieStringFromHttp
+ Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
+ Services.prefs.setBoolPref(
+ "network.cookieJarSettings.unblocked_for_testing",
+ true
+ );
+
+ Services.prefs.setBoolPref("network.cookie.sameSite.laxByDefault", false);
+ Services.prefs.setBoolPref(
+ "network.cookie.sameSite.noneRequiresSecure",
+ false
+ );
+ Services.prefs.setBoolPref("network.cookie.sameSite.schemeful", false);
+
+ Services.cookies.removeAll();
+}
+
+export async function cleanup_test() {
+ Services.prefs.clearUserPref("network.cookie.cookieBehavior");
+ Services.prefs.clearUserPref(
+ "network.cookieJarSettings.unblocked_for_testing"
+ );
+
+ Services.prefs.clearUserPref("network.cookie.sameSite.laxByDefault");
+ Services.prefs.clearUserPref("network.cookie.sameSite.noneRequiresSecure");
+ Services.prefs.clearUserPref("network.cookie.sameSite.schemeful");
+
+ Services.cookies.removeAll();
+}
+
+export async function fetchHelper(url, cookie, secure, domain = "") {
+ let headers = new Headers();
+
+ headers.append("return-set-cookie", cookie);
+
+ if (!secure) {
+ headers.append("return-insecure-cookie", cookie);
+ }
+
+ if (domain != "") {
+ headers.append("return-cookie-domain", domain);
+ }
+
+ info("fetching " + url);
+ await fetch(url, { headers });
+}
+
+// cookie header strings with multiple name=value pairs delimited by \n
+// will trigger multiple "cookie-changed" signals
+export function triggerSetCookieFromHttp(uri, cookie, fpd = "", ucd = 0) {
+ info("about to trigger set-cookie: " + uri + " " + cookie);
+ let channel = NetUtil.newChannel({
+ uri,
+ loadUsingSystemPrincipal: true,
+ contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
+ });
+
+ if (fpd != "") {
+ channel.loadInfo.originAttributes = { firstPartyDomain: fpd };
+ }
+
+ if (ucd != 0) {
+ channel.loadInfo.originAttributes = { userContextId: ucd };
+ }
+ Services.cookies.setCookieStringFromHttp(uri, cookie, channel);
+}
+
+export async function triggerSetCookieFromHttpPrivate(uri, cookie) {
+ info("about to trigger set-cookie: " + uri + " " + cookie);
+ let channel = NetUtil.newChannel({
+ uri,
+ loadUsingSystemPrincipal: true,
+ contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
+ }).QueryInterface(Ci.nsIPrivateBrowsingChannel);
+ channel.loadInfo.originAttributes = { privateBrowsingId: 1 };
+ channel.setPrivate(true);
+ Services.cookies.setCookieStringFromHttp(uri, cookie, channel);
+}
+
+// observer/listener function that will be run on the content processes
+// listens and checks for the expected cookies
+export function checkExpectedCookies(expected, browserName) {
+ const COOKIE_FILTER_TEST_MESSAGE = "cookie-content-filter-test";
+ const COOKIE_FILTER_TEST_CLEANUP = "cookie-content-filter-cleanup";
+
+ // Counting the expected number of tests is vital to the integrity of these
+ // tests due to the fact that this test suite relies on triggering tests
+ // to occur on multiple content processes.
+ // As such, test modifications/bugs often lead to silent failures.
+ // Hence, we count to ensure we didn't break anything
+ // To reduce risk here, we modularize each test as much as possible to
+ // increase liklihood that a silent failure will trigger a no-test
+ // error/warning
+ content.testDone = false;
+ let testNumber = 0;
+
+ // setup observer that continues listening/testing
+ function obs(subject, topic) {
+ // cleanup trigger recieved -> tear down the observer
+ if (topic == COOKIE_FILTER_TEST_CLEANUP) {
+ info("cleaning up: " + browserName);
+ Services.obs.removeObserver(obs, COOKIE_FILTER_TEST_MESSAGE);
+ Services.obs.removeObserver(obs, COOKIE_FILTER_TEST_CLEANUP);
+ return;
+ }
+
+ // test trigger recv'd -> perform test on cookie contents
+ if (topic == COOKIE_FILTER_TEST_MESSAGE) {
+ info("Checking if cookie visible: " + browserName);
+ let result = content.document.cookie;
+ let resultStr =
+ "Result " +
+ result +
+ " == expected: " +
+ expected[testNumber] +
+ " in " +
+ browserName;
+ ok(result == expected[testNumber], resultStr);
+ testNumber++;
+ if (testNumber >= expected.length) {
+ info("finishing browser tests: " + browserName);
+ content.testDone = true;
+ }
+ return;
+ }
+
+ ok(false, "Didn't handle cookie message properly"); //
+ }
+
+ info("setting up observers: " + browserName);
+ Services.obs.addObserver(obs, COOKIE_FILTER_TEST_MESSAGE);
+ Services.obs.addObserver(obs, COOKIE_FILTER_TEST_CLEANUP);
+}