browser_antitracking.js (3461B)
1 const BEHAVIOR_ACCEPT = Ci.nsICookieService.BEHAVIOR_ACCEPT; 2 const BEHAVIOR_REJECT_TRACKER = Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER; 3 4 let { UrlClassifierTestUtils } = ChromeUtils.importESModule( 5 "resource://testing-common/UrlClassifierTestUtils.sys.mjs" 6 ); 7 8 const TOP_DOMAIN = "http://mochi.test:8888/"; 9 const SW_DOMAIN = "https://tracking.example.org/"; 10 11 const TOP_TEST_ROOT = getRootDirectory(gTestPath).replace( 12 "chrome://mochitests/content/", 13 TOP_DOMAIN 14 ); 15 const SW_TEST_ROOT = getRootDirectory(gTestPath).replace( 16 "chrome://mochitests/content/", 17 SW_DOMAIN 18 ); 19 20 const TOP_EMPTY_PAGE = `${TOP_TEST_ROOT}empty_with_utils.html`; 21 const SW_REGISTER_PAGE = `${SW_TEST_ROOT}empty_with_utils.html`; 22 const SW_IFRAME_PAGE = `${SW_TEST_ROOT}page_post_controlled.html`; 23 // An empty script suffices for our SW needs; it's by definition no-fetch. 24 const SW_REL_SW_SCRIPT = "empty.js"; 25 26 /** 27 * Set up a no-fetch-optimized ServiceWorker on a domain that will be covered by 28 * tracking protection (but is not yet). Once the SW is installed, activate TP 29 * and create a tab that embeds that tracking-site in an iframe. 30 */ 31 add_task(async function () { 32 await SpecialPowers.pushPrefEnv({ 33 set: [ 34 ["dom.serviceWorkers.enabled", true], 35 ["dom.serviceWorkers.exemptFromPerDomainMax", true], 36 ["dom.serviceWorkers.testing.enabled", true], 37 ["network.cookie.cookieBehavior", BEHAVIOR_ACCEPT], 38 ], 39 }); 40 41 // Open the top-level page. 42 info("Opening a new tab: " + SW_REGISTER_PAGE); 43 let topTab = await BrowserTestUtils.openNewForegroundTab({ 44 gBrowser, 45 opening: SW_REGISTER_PAGE, 46 }); 47 48 // ## Install SW 49 info("Installing SW"); 50 await SpecialPowers.spawn( 51 topTab.linkedBrowser, 52 [{ sw: SW_REL_SW_SCRIPT }], 53 async function ({ sw }) { 54 // Waive the xray to use the content utils.js script functions. 55 await content.wrappedJSObject.registerAndWaitForActive(sw); 56 } 57 ); 58 59 // Enable Anti-tracking. 60 await SpecialPowers.pushPrefEnv({ 61 set: [ 62 ["privacy.trackingprotection.enabled", false], 63 ["privacy.trackingprotection.pbmode.enabled", false], 64 ["privacy.trackingprotection.annotate_channels", true], 65 ["network.cookie.cookieBehavior", BEHAVIOR_REJECT_TRACKER], 66 ], 67 }); 68 await UrlClassifierTestUtils.addTestTrackers(); 69 70 // Open the top-level URL. 71 info("Loading a new top-level URL: " + TOP_EMPTY_PAGE); 72 let browserLoadedPromise = BrowserTestUtils.browserLoaded( 73 topTab.linkedBrowser 74 ); 75 BrowserTestUtils.startLoadingURIString(topTab.linkedBrowser, TOP_EMPTY_PAGE); 76 await browserLoadedPromise; 77 78 // Create Iframe in the top-level page and verify its state. 79 let { controlled } = await SpecialPowers.spawn( 80 topTab.linkedBrowser, 81 [{ url: SW_IFRAME_PAGE }], 82 async function ({ url }) { 83 const payload = 84 await content.wrappedJSObject.createIframeAndWaitForMessage(url); 85 return payload; 86 } 87 ); 88 89 ok(!controlled, "Should not be controlled!"); 90 91 // ## Cleanup 92 info("Loading the SW unregister page: " + SW_REGISTER_PAGE); 93 browserLoadedPromise = BrowserTestUtils.browserLoaded(topTab.linkedBrowser); 94 BrowserTestUtils.startLoadingURIString( 95 topTab.linkedBrowser, 96 SW_REGISTER_PAGE 97 ); 98 await browserLoadedPromise; 99 100 await SpecialPowers.spawn(topTab.linkedBrowser, [], async function () { 101 await content.wrappedJSObject.unregisterAll(); 102 }); 103 104 // Close the testing tab. 105 BrowserTestUtils.removeTab(topTab); 106 });