forked from mirrors/gecko-dev
Backed out changeset 17d4c013ed92 (bug 1817183) Backed out changeset cfed8d9c23f3 (bug 1817183) Backed out changeset 62fe2f589efe (bug 1817182) Backed out changeset 557bd773fb85 (bug 1817179) Backed out changeset 7f8a7865868b (bug 1816934) Backed out changeset d6c1d4c0d2a0 (bug 1816934)
188 lines
6 KiB
JavaScript
188 lines
6 KiB
JavaScript
const { ASRouter } = ChromeUtils.import(
|
|
"resource://activity-stream/lib/ASRouter.jsm"
|
|
);
|
|
const { RemoteSettings } = ChromeUtils.import(
|
|
"resource://services-settings/remote-settings.js"
|
|
);
|
|
const { CFRMessageProvider } = ChromeUtils.import(
|
|
"resource://activity-stream/lib/CFRMessageProvider.jsm"
|
|
);
|
|
const { CFRPageActions } = ChromeUtils.import(
|
|
"resource://activity-stream/lib/CFRPageActions.jsm"
|
|
);
|
|
|
|
/**
|
|
* Load and modify a message for the test.
|
|
*/
|
|
add_setup(async function() {
|
|
const initialMsgCount = ASRouter.state.messages.length;
|
|
const heartbeatMsg = (await CFRMessageProvider.getMessages()).find(
|
|
m => m.id === "HEARTBEAT_TACTIC_2"
|
|
);
|
|
const testMessage = {
|
|
...heartbeatMsg,
|
|
groups: ["messaging-experiments"],
|
|
targeting: "true",
|
|
// Ensure no overlap due to frequency capping with other tests
|
|
id: `HEARTBEAT_MESSAGE_${Date.now()}`,
|
|
};
|
|
const client = RemoteSettings("cfr");
|
|
await client.db.importChanges({}, Date.now(), [testMessage], {
|
|
clear: true,
|
|
});
|
|
|
|
// Force the CFR provider cache to 0 by modifying updateCycleInMs
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
[
|
|
"browser.newtabpage.activity-stream.asrouter.providers.cfr",
|
|
`{"id":"cfr","enabled":true,"type":"remote-settings","collection":"cfr","updateCycleInMs":0}`,
|
|
],
|
|
],
|
|
});
|
|
|
|
// Reload the providers
|
|
await BrowserTestUtils.waitForCondition(async () => {
|
|
await ASRouter._updateMessageProviders();
|
|
await ASRouter.loadMessagesFromAllProviders();
|
|
return ASRouter.state.messages.length > initialMsgCount;
|
|
}, "Should load the extra heartbeat message");
|
|
|
|
BrowserTestUtils.waitForCondition(
|
|
() => ASRouter.state.messages.find(m => m.id === testMessage.id),
|
|
"Wait to load the message"
|
|
);
|
|
|
|
const msg = ASRouter.state.messages.find(m => m.id === testMessage.id);
|
|
Assert.equal(msg.targeting, "true");
|
|
Assert.equal(msg.groups[0], "messaging-experiments");
|
|
|
|
registerCleanupFunction(async () => {
|
|
await client.db.clear();
|
|
// Reload the providers
|
|
await BrowserTestUtils.waitForCondition(async () => {
|
|
await ASRouter._updateMessageProviders();
|
|
await ASRouter.loadMessagesFromAllProviders();
|
|
return ASRouter.state.messages.length === initialMsgCount;
|
|
}, "Should reset messages");
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Test group frequency capping.
|
|
* Message has a lifetime frequency of 3 but it's group has a lifetime frequency
|
|
* of 2. It should only show up twice.
|
|
* We update the provider to remove any daily limitations so it should show up
|
|
* on every new tab load.
|
|
*/
|
|
add_task(async function test_heartbeat_tactic_2() {
|
|
const TEST_URL = "http://example.com";
|
|
const msg = ASRouter.state.messages.find(m =>
|
|
m.groups.includes("messaging-experiments")
|
|
);
|
|
Assert.ok(msg, "Message found");
|
|
const groupConfiguration = {
|
|
id: "messaging-experiments",
|
|
enabled: true,
|
|
frequency: { lifetime: 2 },
|
|
};
|
|
const client = RemoteSettings("message-groups");
|
|
await client.db.importChanges({}, Date.now(), [groupConfiguration], {
|
|
clear: true,
|
|
});
|
|
|
|
// Force the WNPanel provider cache to 0 by modifying updateCycleInMs
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
[
|
|
"browser.newtabpage.activity-stream.asrouter.providers.message-groups",
|
|
`{"id":"message-groups","enabled":true,"type":"remote-settings","collection":"message-groups","updateCycleInMs":0}`,
|
|
],
|
|
],
|
|
});
|
|
|
|
await BrowserTestUtils.waitForCondition(async () => {
|
|
const msgs = await client.get();
|
|
return msgs.find(m => m.id === groupConfiguration.id);
|
|
}, "Wait for RS message");
|
|
|
|
// Reload the providers
|
|
await ASRouter._updateMessageProviders();
|
|
await ASRouter.loadAllMessageGroups();
|
|
|
|
let groupState = await BrowserTestUtils.waitForCondition(
|
|
() => ASRouter.state.groups.find(g => g.id === groupConfiguration.id),
|
|
"Wait for group config to load"
|
|
);
|
|
Assert.ok(groupState, "Group config found");
|
|
Assert.ok(groupState.enabled, "Group is enabled");
|
|
|
|
let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
|
|
BrowserTestUtils.loadURIString(tab1.linkedBrowser, TEST_URL);
|
|
|
|
let chiclet = document.getElementById("contextual-feature-recommendation");
|
|
Assert.ok(chiclet, "CFR chiclet element found (tab1)");
|
|
await BrowserTestUtils.waitForCondition(
|
|
() => !chiclet.hidden,
|
|
"Chiclet should be visible (tab1)"
|
|
);
|
|
|
|
await BrowserTestUtils.waitForCondition(
|
|
() =>
|
|
ASRouter.state.messageImpressions[msg.id] &&
|
|
ASRouter.state.messageImpressions[msg.id].length === 1,
|
|
"First impression recorded"
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(tab1);
|
|
|
|
let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
|
|
BrowserTestUtils.loadURIString(tab2.linkedBrowser, TEST_URL);
|
|
|
|
Assert.ok(chiclet, "CFR chiclet element found (tab2)");
|
|
await BrowserTestUtils.waitForCondition(
|
|
() => !chiclet.hidden,
|
|
"Chiclet should be visible (tab2)"
|
|
);
|
|
|
|
await BrowserTestUtils.waitForCondition(
|
|
() =>
|
|
ASRouter.state.messageImpressions[msg.id] &&
|
|
ASRouter.state.messageImpressions[msg.id].length === 2,
|
|
"Second impression recorded"
|
|
);
|
|
|
|
Assert.ok(
|
|
!ASRouter.isBelowFrequencyCaps(msg),
|
|
"Should have reached freq limit"
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(tab2);
|
|
|
|
let tab3 = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
|
|
BrowserTestUtils.loadURIString(tab3.linkedBrowser, TEST_URL);
|
|
|
|
await BrowserTestUtils.waitForCondition(
|
|
() => chiclet.hidden,
|
|
"Heartbeat button should be hidden"
|
|
);
|
|
Assert.equal(
|
|
ASRouter.state.messageImpressions[msg.id] &&
|
|
ASRouter.state.messageImpressions[msg.id].length,
|
|
2,
|
|
"Number of impressions did not increase"
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(tab3);
|
|
|
|
info("Cleanup");
|
|
await client.db.clear();
|
|
// Reset group impressions
|
|
await ASRouter.resetGroupsState();
|
|
// Reload the providers
|
|
await ASRouter._updateMessageProviders();
|
|
await ASRouter.loadMessagesFromAllProviders();
|
|
await SpecialPowers.popPrefEnv();
|
|
CFRPageActions.clearRecommendations();
|
|
});
|