Bug 1662806 - Add a session counter for openURL trigger r=nanj

Differential Revision: https://phabricator.services.mozilla.com/D89391
This commit is contained in:
Andrei Oprea 2020-09-10 11:51:06 +00:00
Родитель bb3eb9db34
Коммит 228eb79c97
7 изменённых файлов: 119 добавлений и 1 удалений

Просмотреть файл

@ -323,6 +323,7 @@ this.ASRouterTriggerListeners = new Map([
_triggerHandler: null,
_hosts: null,
_matchPatternSet: null,
_visits: null,
/*
* If the listener is already initialised, `init` will replace the trigger
@ -347,6 +348,7 @@ this.ASRouterTriggerListeners = new Map([
}
);
this._visits = new Map();
this._initialized = true;
}
this._triggerHandler = triggerHandler;
@ -371,6 +373,7 @@ this.ASRouterTriggerListeners = new Map([
this._triggerHandler = null;
this._hosts = null;
this._matchPatternSet = null;
this._visits = null;
}
},
@ -388,7 +391,13 @@ this.ASRouterTriggerListeners = new Map([
aRequest
);
if (match) {
this._triggerHandler(aBrowser, { id: this.id, param: match });
let visitsCount = (this._visits.get(match.url) || 0) + 1;
this._visits.set(match.url, visitsCount);
this._triggerHandler(aBrowser, {
id: this.id,
param: match,
context: { visitsCount },
});
}
}
},

Просмотреть файл

@ -44,3 +44,4 @@ tags = remote-settings
[browser_asrouter_experimentsAPILoader.js]
[browser_asrouter_group_frequency.js]
[browser_asrouter_group_userprefs.js]
[browser_trigger_listeners.js]

Просмотреть файл

@ -1110,3 +1110,26 @@ add_task(async function check_newTabSettings_webExtension() {
AboutNewTab.resetNewTabURL();
});
add_task(async function check_openUrlTrigger_context() {
const message = {
...CFRMessageProvider.getMessages().find(m => m.id === "YOUTUBE_ENHANCE_3"),
targeting: "visitsCount == 3",
};
const trigger = {
id: "openURL",
context: { visitsCount: 3 },
param: { host: "youtube.com", url: "https://www.youtube.com" },
};
is(
(
await ASRouterTargeting.findMatchingMessage({
messages: [message],
trigger,
})
).id,
message.id,
`should select ${message.id} mesage`
);
});

Просмотреть файл

@ -0,0 +1,65 @@
const { ASRouterTriggerListeners } = ChromeUtils.import(
"resource://activity-stream/lib/ASRouterTriggerListeners.jsm"
);
add_task(async function setup() {
registerCleanupFunction(() => {
const trigger = ASRouterTriggerListeners.get("openURL");
trigger.uninit();
});
});
add_task(async function test_openURL_visit_counter() {
const trigger = ASRouterTriggerListeners.get("openURL");
const stub = sinon.stub();
trigger.uninit();
trigger.init(stub, ["example.com"]);
await waitForUrlLoad("about:blank");
await waitForUrlLoad("https://example.com/");
await waitForUrlLoad("about:blank");
await waitForUrlLoad("http://example.com/");
await waitForUrlLoad("about:blank");
await waitForUrlLoad("http://example.com/");
Assert.equal(stub.callCount, 3, "Stub called 3 times for example.com host");
Assert.equal(
stub.firstCall.args[1].context.visitsCount,
1,
"First call should have count 1"
);
Assert.equal(
stub.thirdCall.args[1].context.visitsCount,
2,
"Third call should have count 2 for http://example.com"
);
});
add_task(async function test_openURL_visit_counter_withPattern() {
const trigger = ASRouterTriggerListeners.get("openURL");
const stub = sinon.stub();
trigger.uninit();
// Match any valid URL
trigger.init(stub, [], ["*://*/*"]);
await waitForUrlLoad("about:blank");
await waitForUrlLoad("https://example.com/");
await waitForUrlLoad("about:blank");
await waitForUrlLoad("http://example.com/");
await waitForUrlLoad("about:blank");
await waitForUrlLoad("http://example.com/");
Assert.equal(stub.callCount, 3, "Stub called 3 times for example.com host");
Assert.equal(
stub.firstCall.args[1].context.visitsCount,
1,
"First call should have count 1"
);
Assert.equal(
stub.thirdCall.args[1].context.visitsCount,
2,
"Third call should have count 2 for http://example.com"
);
});

Просмотреть файл

@ -72,6 +72,17 @@ async function waitForPreloaded(browser) {
}
}
/**
* Helper function to navigate and wait for page to load
* https://searchfox.org/mozilla-central/rev/b2716c233e9b4398fc5923cbe150e7f83c7c6c5b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm#383
*/
// eslint-disable-next-line no-unused-vars
async function waitForUrlLoad(url) {
let browser = gBrowser.selectedBrowser;
await BrowserTestUtils.loadURI(browser, url);
await BrowserTestUtils.browserLoaded(browser, false, url);
}
/**
* Helper to force the HighlightsFeed to update.
*/

Просмотреть файл

@ -365,6 +365,7 @@ describe("ASRouterTriggerListeners", () => {
assert.calledWithExactly(newTriggerHandler, browser, {
id: "openURL",
param: { host: "www.mozilla.org", url: "www.mozilla.org" },
context: { visitsCount: 1 },
});
});
it("should call triggerHandler for a redirect (openURL + frequentVisits)", () => {
@ -417,6 +418,7 @@ describe("ASRouterTriggerListeners", () => {
assert.calledWithExactly(newTriggerHandler, browser, {
id: "openURL",
param: { host: "www.mozilla.org", url: "www.mozilla.org" },
context: { visitsCount: 1 },
});
});
it("should call triggerHandler for a redirect (openURL + frequentVisits)", () => {
@ -469,6 +471,7 @@ describe("ASRouterTriggerListeners", () => {
assert.calledWithExactly(newTriggerHandler, browser, {
id: "openURL",
param: { host: "www.mozilla.org", url: "www.mozilla.org" },
context: { visitsCount: 1 },
});
});
it("should fail for subdomains (not redirect)", () => {

Просмотреть файл

@ -75,6 +75,12 @@ let recentVisits: visit[];
### `openURL`
Happens every time the user loads a new URL that matches the provided `hosts` or `patterns`.
During a browsing session it keeps track of visits to unique urls that can be used inside targeting expression.
```javascript
// True on the third visit for the URL which the trigger matched on
visitsCount >= 3
```
### `newSavedLogin`