/** * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; const TEST_PAGE = `data:text/html, https://example.com http://example.com https://www.example.com https://example.org`; add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ // Enable restriction feature. ["places.history.floodingPrevention.enabled", true], // Restrict from the second visit. ["places.history.floodingPrevention.restrictionCount", 1], ["places.history.floodingPrevention.restrictionExpireSeconds", 4], // Not apply flooding prevention until some seconds elapse after user // interaction begins. [ "places.history.floodingPrevention.maxSecondsFromLastUserInteraction", 4, ], // To enable UserActivation by EventUtils.synthesizeMouseAtCenter() in // ContentTask.spawn() in synthesizeVisitByUser(). ["test.events.async.enabled", true], ], }); await clearHistoryAndHistoryCache(); }); add_task(async function basic() { await BrowserTestUtils.withNewTab( { gBrowser, url: TEST_PAGE }, async browser => { info("Sanity check"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 0, isVisited: false, }); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 0, isVisited: false, }); await assertLinkVisitedStatus(browser, "https://www.example.com/", { visitCount: 0, isVisited: false, }); await assertLinkVisitedStatus(browser, "https://example.org/", { visitCount: 0, isVisited: false, }); info("Visit https://example.com/ by user"); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 1, isVisited: true, }); info( "Visit https://example.com/ by script within maxSecondsFromLastUserInteraction" ); await synthesizeVisitByScript(browser, "https://example.com/"); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 3, isVisited: true, }); await waitForPrefSeconds("maxSecondsFromLastUserInteraction"); info( "Visit https://example.com/ by script without maxSecondsFromLastUserInteraction" ); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 4, isVisited: true, }); info("Visit again, but it should be restricted"); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 4, isVisited: true, }); info("Check other"); // eslint-disable-next-line @microsoft/sdl/no-insecure-url await assertLinkVisitedStatus(browser, "http://example.com/", { visitCount: 0, isVisited: false, }); await assertLinkVisitedStatus(browser, "https://www.example.com/", { visitCount: 0, isVisited: false, }); await assertLinkVisitedStatus(browser, "https://example.org/", { visitCount: 0, isVisited: false, }); } ); await clearHistoryAndHistoryCache(); }); add_task(async function expireRestriction() { await BrowserTestUtils.withNewTab( { gBrowser, url: TEST_PAGE }, async browser => { info("Visit https://example.com/ by user"); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 1, isVisited: true, }); info( "Visit https://example.com/ by script within maxSecondsFromLastUserInteraction" ); await synthesizeVisitByScript(browser, "https://example.com/"); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 3, isVisited: true, }); await waitForPrefSeconds("maxSecondsFromLastUserInteraction"); info( "Visit https://example.com/ by script without maxSecondsFromLastUserInteraction" ); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 4, isVisited: true, }); await waitForPrefSeconds("restrictionExpireSeconds"); info("Visit again, it should not be restricted"); await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 5, isVisited: true, }); } ); await clearHistoryAndHistoryCache(); }); add_task(async function userInputAlwaysAcceptable() { await BrowserTestUtils.withNewTab( { gBrowser, url: TEST_PAGE }, async browser => { info("Visit by user"); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 1, isVisited: true, }); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 2, isVisited: true, }); await waitForPrefSeconds("maxSecondsFromLastUserInteraction"); info("Visit by user input"); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 3, isVisited: true, }); await synthesizeVisitByUser(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: 4, isVisited: true, }); } ); await clearHistoryAndHistoryCache(); }); add_task(async function disable() { await SpecialPowers.pushPrefEnv({ set: [["places.history.floodingPrevention.enabled", false]], }); await BrowserTestUtils.withNewTab( { gBrowser, url: TEST_PAGE }, async browser => { info("Any visits are stored"); for (let i = 0; i < 3; i++) { await synthesizeVisitByScript(browser, "https://example.com/"); await assertLinkVisitedStatus(browser, "https://example.com/", { visitCount: i + 1, isVisited: true, }); } } ); await clearHistoryAndHistoryCache(); }); async function waitForPrefSeconds(pref) { info(`Wait until elapsing ${pref}`); return new Promise(r => // eslint-disable-next-line mozilla/no-arbitrary-setTimeout setTimeout( r, Services.prefs.getIntPref(`places.history.floodingPrevention.${pref}`) * 1000 + 100 ) ); }