/* eslint-disable mozilla/no-arbitrary-setTimeout */ const TEST_HOST = "example.org"; const TEST_DOMAIN = "https://" + TEST_HOST; const TEST_PATH = "/browser/dom/reporting/tests/"; const TEST_TOP_PAGE = TEST_DOMAIN + TEST_PATH + "empty.html"; const TEST_SJS = TEST_DOMAIN + TEST_PATH + "delivering.sjs"; async function storeReportingHeader(browser, extraParams = "") { await SpecialPowers.spawn( browser, [{ url: TEST_SJS, extraParams }], async obj => { await content .fetch( obj.url + "?task=header" + (obj.extraParams.length ? "&" + obj.extraParams : "") ) .then(r => r.text()) .then(text => { is(text, "OK", "Report-to header sent"); }); } ); } add_task(async function() { await SpecialPowers.flushPrefEnv(); await SpecialPowers.pushPrefEnv({ set: [ ["dom.reporting.enabled", true], ["dom.reporting.header.enabled", true], ["dom.reporting.testing.enabled", true], ["dom.reporting.delivering.timeout", 1], ["dom.reporting.cleanup.timeout", 1], ["privacy.userContext.enabled", true], ], }); }); add_task(async function() { info("Testing a total cleanup"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser); ok(ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We have data"); await new Promise(resolve => { Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => resolve() ); }); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before a full cleanup" ); info("Removing the tab"); BrowserTestUtils.removeTab(tab); }); add_task(async function() { info("Testing a total QuotaManager cleanup"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser); ok(ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We have data"); await new Promise(resolve => { Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_REPORTS, value => resolve() ); }); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before a reports cleanup" ); info("Removing the tab"); BrowserTestUtils.removeTab(tab); }); add_task(async function() { info("Testing a QuotaManager host cleanup"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser); ok(ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We have data"); await new Promise(resolve => { Services.clearData.deleteDataFromHost( TEST_HOST, true, Ci.nsIClearDataService.CLEAR_REPORTS, value => resolve() ); }); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before a reports cleanup" ); info("Removing the tab"); BrowserTestUtils.removeTab(tab); }); add_task(async function() { info("Testing a 410 endpoint status"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser, "410=true"); ok(ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We have data"); await SpecialPowers.spawn(browser, [], async _ => { let testingInterface = new content.TestingDeprecatedInterface(); ok(!!testingInterface, "Created a deprecated interface"); }); await new Promise((resolve, reject) => { let count = 0; let id = setInterval(_ => { ++count; if (count > 10) { ok(false, "Something went wrong."); clearInterval(id); reject(); } if (!ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN)) { ok(true, "No data after a 410!"); clearInterval(id); resolve(); } }, 1000); }); info("Removing the tab"); BrowserTestUtils.removeTab(tab); }); add_task(async function() { info("Creating a new container"); let identity = ContextualIdentityService.create( "Report-To-Test", "fingerprint", "orange" ); info("Creating a new container tab"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE, { userContextId: identity.userContextId, }); is( tab.getAttribute("usercontextid"), "" + identity.userContextId, "New tab has the right UCI" ); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We don't have data for the origin" ); ok( ChromeUtils.hasReportingHeaderForOrigin( TEST_DOMAIN + "^userContextId=" + identity.userContextId ), "We have data for the origin + userContextId" ); info("Removing the tab"); BrowserTestUtils.removeTab(tab); ContextualIdentityService.remove(identity.userContextId); ok( !ChromeUtils.hasReportingHeaderForOrigin( TEST_DOMAIN + "^userContextId=" + identity.userContextId ), "No more data after a container removal" ); }); add_task(async function() { info("TTL cleanup"); let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE); gBrowser.selectedTab = tab; let browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); ok( !ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data before the test" ); await storeReportingHeader(browser); ok( ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "We have data for the origin" ); // Let's wait a bit. await new Promise(resolve => { setTimeout(resolve, 5000); }); ok(!ChromeUtils.hasReportingHeaderForOrigin(TEST_DOMAIN), "No data anymore"); info("Removing the tab"); BrowserTestUtils.removeTab(tab); }); add_task(async function() { info("Cleaning up."); await new Promise(resolve => { Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => resolve() ); }); });