"use strict"; const { PushRecord } = ChromeUtils.importESModule( "resource://gre/modules/PushRecord.sys.mjs" ); add_task(async function test_updateQuota() { let record = new PushRecord({ quota: 8, lastPush: Date.now() - 1 * MS_IN_ONE_DAY, }); record.updateQuota(Date.now() - 2 * MS_IN_ONE_DAY); equal( record.quota, 8, "Should not update quota if last visit is older than last push" ); record.updateQuota(Date.now()); equal( record.quota, 16, "Should reset quota if last visit is newer than last push" ); record.reduceQuota(); equal(record.quota, 15, "Should reduce quota"); // Make sure we calculate the quota correctly for visit dates in the // future (bug 1206424). record.updateQuota(Date.now() + 1 * MS_IN_ONE_DAY); equal( record.quota, 16, "Should reset quota to maximum if last visit is in the future" ); record.updateQuota(-1); strictEqual(record.quota, 0, "Should set quota to 0 if history was cleared"); ok(record.isExpired(), "Should expire records once the quota reaches 0"); record.reduceQuota(); strictEqual(record.quota, 0, "Quota should never be negative"); }); add_task(async function test_systemRecord_updateQuota() { let systemRecord = new PushRecord({ quota: Infinity, systemRecord: true, }); systemRecord.updateQuota(Date.now() - 3 * MS_IN_ONE_DAY); equal( systemRecord.quota, Infinity, "System subscriptions should ignore quota updates" ); systemRecord.updateQuota(-1); equal( systemRecord.quota, Infinity, "System subscriptions should ignore the last visit time" ); systemRecord.reduceQuota(); equal( systemRecord.quota, Infinity, "System subscriptions should ignore quota reductions" ); }); function testPermissionCheck(props) { let record = new PushRecord(props); let originSuffix; equal( record.uri.spec, props.scope, `Record URI should match scope URL for ${JSON.stringify(props)}` ); if (props.originAttributes) { originSuffix = ChromeUtils.originAttributesToSuffix( record.principal.originAttributes ); equal( originSuffix, props.originAttributes, `Origin suffixes should match for ${JSON.stringify(props)}` ); } ok( !record.hasPermission(), `Record ${JSON.stringify(props)} should not have permission yet` ); // Adding permission from origin string PermissionTestUtils.add( props.scope + (originSuffix || ""), "desktop-notification", Ci.nsIPermissionManager.ALLOW_ACTION ); try { ok( record.hasPermission(), `Record ${JSON.stringify(props)} should have permission` ); } finally { PermissionTestUtils.remove( props.scope + (originSuffix || ""), "desktop-notification" ); } } add_task(async function test_principal_permissions() { let testProps = [ { scope: "https://example.com/", }, { scope: "https://example.com/", originAttributes: "^userContextId=1", }, { scope: "https://xn--90aexm.xn--80ag3aejvc.xn--p1ai/", }, { scope: "https://xn--90aexm.xn--80ag3aejvc.xn--p1ai/", originAttributes: "^userContextId=1", }, ]; for (let props of testProps) { testPermissionCheck(props); } });