/* eslint-disable mozilla/no-arbitrary-setTimeout */ /* * Test that the Content Blocking icon state is properly updated in the identity * block when loading tabs and switching between tabs. * See also Bug 1175858. */ const TP_PREF = "privacy.trackingprotection.enabled"; const TP_PB_PREF = "privacy.trackingprotection.pbmode.enabled"; const APS_PREF = "privacy.partition.always_partition_third_party_non_cookie_storage"; const NCB_PREF = "network.cookie.cookieBehavior"; const BENIGN_PAGE = // eslint-disable-next-line @microsoft/sdl/no-insecure-url "http://tracking.example.org/browser/browser/base/content/test/protectionsUI/benignPage.html"; const TRACKING_PAGE = // eslint-disable-next-line @microsoft/sdl/no-insecure-url "http://tracking.example.org/browser/browser/base/content/test/protectionsUI/trackingPage.html"; const COOKIE_PAGE = // eslint-disable-next-line @microsoft/sdl/no-insecure-url "http://tracking.example.org/browser/browser/base/content/test/protectionsUI/cookiePage.html"; const DTSCBN_PREF = "dom.testing.sync-content-blocking-notifications"; registerCleanupFunction(function () { UrlClassifierTestUtils.cleanupTestTrackers(); Services.prefs.clearUserPref(TP_PREF); Services.prefs.clearUserPref(TP_PB_PREF); Services.prefs.clearUserPref(NCB_PREF); Services.prefs.clearUserPref(DTSCBN_PREF); }); async function testTrackingProtectionIconState(tabbrowser) { Services.prefs.setBoolPref(DTSCBN_PREF, true); info("Load a test page not containing tracking elements"); let benignTab = await BrowserTestUtils.openNewForegroundTab( tabbrowser, BENIGN_PAGE ); let gProtectionsHandler = tabbrowser.ownerGlobal.gProtectionsHandler; ok(!gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox not active"); info("Load a test page containing tracking elements"); let trackingTab = await BrowserTestUtils.openNewForegroundTab( tabbrowser, TRACKING_PAGE ); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Load a test page containing tracking cookies"); let trackingCookiesTab = await BrowserTestUtils.openNewForegroundTab( tabbrowser, COOKIE_PAGE ); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Switch from tracking cookie -> benign tab"); let securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); tabbrowser.selectedTab = benignTab; await securityChanged; ok(!gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox not active"); info("Switch from benign -> tracking tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); tabbrowser.selectedTab = trackingTab; await securityChanged; ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Switch from tracking -> tracking cookies tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); tabbrowser.selectedTab = trackingCookiesTab; await securityChanged; ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Reload tracking cookies tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); let contentBlockingEvent = waitForContentBlockingEvent( 2, tabbrowser.ownerGlobal ); tabbrowser.reload(); await Promise.all([securityChanged, contentBlockingEvent]); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Reload tracking tab"); securityChanged = waitForSecurityChange(2, tabbrowser.ownerGlobal); contentBlockingEvent = waitForContentBlockingEvent(3, tabbrowser.ownerGlobal); tabbrowser.selectedTab = trackingTab; tabbrowser.reload(); await Promise.all([securityChanged, contentBlockingEvent]); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Inject tracking cookie inside tracking tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); let timeoutPromise = new Promise(resolve => setTimeout(resolve, 500)); await SpecialPowers.spawn(tabbrowser.selectedBrowser, [], function () { content.postMessage("cookie", "*"); }); let result = await Promise.race([securityChanged, timeoutPromise]); is(result, undefined, "No securityChange events should be received"); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Inject tracking element inside tracking tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); timeoutPromise = new Promise(resolve => setTimeout(resolve, 500)); await SpecialPowers.spawn(tabbrowser.selectedBrowser, [], function () { content.postMessage("tracking", "*"); }); result = await Promise.race([securityChanged, timeoutPromise]); is(result, undefined, "No securityChange events should be received"); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); tabbrowser.selectedTab = trackingCookiesTab; info("Inject tracking cookie inside tracking cookies tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); timeoutPromise = new Promise(resolve => setTimeout(resolve, 500)); await SpecialPowers.spawn(tabbrowser.selectedBrowser, [], function () { content.postMessage("cookie", "*"); }); result = await Promise.race([securityChanged, timeoutPromise]); is(result, undefined, "No securityChange events should be received"); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); info("Inject tracking element inside tracking cookies tab"); securityChanged = waitForSecurityChange(1, tabbrowser.ownerGlobal); timeoutPromise = new Promise(resolve => setTimeout(resolve, 500)); await SpecialPowers.spawn(tabbrowser.selectedBrowser, [], function () { content.postMessage("tracking", "*"); }); result = await Promise.race([securityChanged, timeoutPromise]); is(result, undefined, "No securityChange events should be received"); ok(gProtectionsHandler.iconBox.hasAttribute("active"), "iconBox active"); while (tabbrowser.tabs.length > 1) { tabbrowser.removeCurrentTab(); } } add_task(async function testNormalBrowsing() { await SpecialPowers.pushPrefEnv({ set: [[APS_PREF, false]] }); await UrlClassifierTestUtils.addTestTrackers(); let gProtectionsHandler = gBrowser.ownerGlobal.gProtectionsHandler; ok( gProtectionsHandler, "gProtectionsHandler is attached to the browser window" ); let { TrackingProtection } = gBrowser.ownerGlobal.gProtectionsHandler.blockers; ok(TrackingProtection, "TP is attached to the browser window"); let { ThirdPartyCookies } = gBrowser.ownerGlobal.gProtectionsHandler.blockers; ok(ThirdPartyCookies, "TPC is attached to the browser window"); Services.prefs.setBoolPref(TP_PREF, true); ok(TrackingProtection.enabled, "TP is enabled after setting the pref"); Services.prefs.setIntPref( NCB_PREF, Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER ); ok( ThirdPartyCookies.enabled, "ThirdPartyCookies is enabled after setting the pref" ); await testTrackingProtectionIconState(gBrowser); }); add_task(async function testPrivateBrowsing() { await SpecialPowers.pushPrefEnv({ set: [ [APS_PREF, false], ["dom.security.https_first_pbm", false], ], }); let privateWin = await BrowserTestUtils.openNewBrowserWindow({ private: true, }); let tabbrowser = privateWin.gBrowser; let gProtectionsHandler = tabbrowser.ownerGlobal.gProtectionsHandler; ok( gProtectionsHandler, "gProtectionsHandler is attached to the private window" ); let { TrackingProtection } = tabbrowser.ownerGlobal.gProtectionsHandler.blockers; ok(TrackingProtection, "TP is attached to the private window"); let { ThirdPartyCookies } = tabbrowser.ownerGlobal.gProtectionsHandler.blockers; ok(ThirdPartyCookies, "TPC is attached to the browser window"); Services.prefs.setBoolPref(TP_PB_PREF, true); ok(TrackingProtection.enabled, "TP is enabled after setting the pref"); Services.prefs.setIntPref( NCB_PREF, Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER ); ok( ThirdPartyCookies.enabled, "ThirdPartyCookies is enabled after setting the pref" ); await testTrackingProtectionIconState(tabbrowser); privateWin.close(); });