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
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const userAgentID = "aaabf1f8-2f68-44f1-a920-b88e9e7d7559";
function run_test() {
do_get_profile();
setPrefs({
userAgentID,
"testing.ignorePermission": true,
});
run_next_test();
}
add_task(async function test_expiration_origin_threshold() {
let db = PushServiceWebSocket.newPushDB();
registerCleanupFunction(() => {
PushService.notificationForOriginClosed("https://example.com");
return db.drop().then(_ => db.close());
});
// Simulate a notification being shown for the origin,
// this should relax the quota and allow as many push messages
// as we want.
PushService.notificationForOriginShown("https://example.com");
await db.put({
channelID: "f56645a9-1f32-4655-92ad-ddc37f6d54fb",
pushEndpoint: "https://example.org/push/1",
scope: "https://example.com/quota",
pushCount: 0,
lastPush: 0,
version: null,
originAttributes: "",
quota: 16,
});
// A visit one day ago should provide a quota of 8 messages.
await PlacesTestUtils.addVisits({
uri: "https://example.com/login",
title: "Sign in to see your auctions",
visitDate: (Date.now() - MS_IN_ONE_DAY) * 1000,
transition: Ci.nsINavHistoryService.TRANSITION_LINK,
});
let numMessages = 10;
let updates = 0;
let notifyPromise = promiseObserverNotification(
PushServiceComponent.pushTopic,
(subject, data) => {
updates++;
return updates == numMessages;
}
);
let modifications = 0;
let modifiedPromise = promiseObserverNotification(
PushServiceComponent.subscriptionModifiedTopic,
(subject, data) => {
// Each subscription should be modified twice: once to update the message
// count and last push time, and the second time to update the quota.
modifications++;
return modifications == numMessages * 2;
}
);
let updateQuotaPromise = new Promise((resolve, reject) => {
let quotaUpdateCount = 0;
PushService._updateQuotaTestCallback = function () {
quotaUpdateCount++;
if (quotaUpdateCount == numMessages) {
resolve();
}
};
});
PushService.init({
serverURI: "wss://push.example.org/",
db,
makeWebSocket(uri) {
return new MockWebSocket(uri, {
onHello(request) {
this.serverSendMsg(
JSON.stringify({
messageType: "hello",
status: 200,
uaid: userAgentID,
})
);
// If the origin has visible notifications, the
// message should not affect quota.
for (let version = 1; version <= 10; version++) {
this.serverSendMsg(
JSON.stringify({
messageType: "notification",
updates: [
{
channelID: "f56645a9-1f32-4655-92ad-ddc37f6d54fb",
version,
},
],
})
);
}
},
onUnregister(request) {
ok(false, "Channel should not be unregistered.");
},
// We expect to receive acks, but don't care about their
// contents.
onACK(request) {},
});
},
});
await notifyPromise;
await updateQuotaPromise;
await modifiedPromise;
let expiredRecord = await db.getByKeyID(
"f56645a9-1f32-4655-92ad-ddc37f6d54fb"
);
notStrictEqual(expiredRecord.quota, 0, "Expired record not updated");
});
|