summaryrefslogtreecommitdiffstats
path: root/dom/push/test/xpcshell/test_record.js
blob: 144c0ee346d1bf0fdea4aa38fde4b9bb366c6c4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"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);
  }
});