311 lines
7.3 KiB
JavaScript
311 lines
7.3 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
let firstProvider;
|
|
let secondProvider;
|
|
let context;
|
|
|
|
add_setup(async function () {
|
|
firstProvider = new UrlbarTestUtils.TestProvider({
|
|
results: [
|
|
new UrlbarResult(
|
|
UrlbarUtils.RESULT_TYPE.URL,
|
|
UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
{
|
|
url: "https://mozilla.com/",
|
|
tags: [],
|
|
title: "mozilla.com",
|
|
displayUrl: "mozilla.com",
|
|
}
|
|
),
|
|
],
|
|
priority: 999,
|
|
type: UrlbarUtils.PROVIDER_TYPE.PROFILE,
|
|
name: "firstProvider",
|
|
onEngagement: () => {},
|
|
onAbandonment: () => {},
|
|
onImpression: () => {},
|
|
onSearchSessionEnd: () => {},
|
|
});
|
|
|
|
secondProvider = new UrlbarTestUtils.TestProvider({
|
|
results: [
|
|
new UrlbarResult(
|
|
UrlbarUtils.RESULT_TYPE.URL,
|
|
UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
{
|
|
url: "https://example.com/",
|
|
tags: [],
|
|
title: "example.com",
|
|
displayUrl: "example.com",
|
|
}
|
|
),
|
|
],
|
|
priority: 999,
|
|
type: UrlbarUtils.PROVIDER_TYPE.PROFILE,
|
|
name: "secondProvider",
|
|
});
|
|
|
|
context = createContext("", {
|
|
providers: [firstProvider.name, secondProvider.name],
|
|
});
|
|
|
|
UrlbarProvidersManager.registerProvider(firstProvider);
|
|
UrlbarProvidersManager.registerProvider(secondProvider);
|
|
|
|
registerCleanupFunction(() => {
|
|
UrlbarProvidersManager.unregisterProvider(firstProvider);
|
|
UrlbarProvidersManager.unregisterProvider(secondProvider);
|
|
sinon.restore();
|
|
});
|
|
});
|
|
|
|
add_task(async function testOnEngagementNotification() {
|
|
let spyFirstProviderOnEngagement = sinon.spy(firstProvider, "onEngagement");
|
|
|
|
const engagedResult = makeVisitResult(context, {
|
|
uri: "https://mozilla.com/",
|
|
providerName: "firstProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
});
|
|
|
|
await check_results({
|
|
context,
|
|
matches: [
|
|
engagedResult,
|
|
makeVisitResult(context, {
|
|
uri: "https://example.com/",
|
|
providerName: "secondProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
}),
|
|
],
|
|
});
|
|
|
|
let controller = UrlbarTestUtils.newMockController();
|
|
controller.setView({
|
|
get visibleResults() {
|
|
return context.results;
|
|
},
|
|
});
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"engagement",
|
|
context,
|
|
{
|
|
result: engagedResult,
|
|
},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnEngagement.callCount,
|
|
1,
|
|
"onEngagement called once for first provider"
|
|
);
|
|
});
|
|
|
|
add_task(async function testOnAbandonmentNotification() {
|
|
let spyFirstProviderOnAbandonment = sinon.spy(firstProvider, "onAbandonment");
|
|
|
|
await check_results({
|
|
context,
|
|
matches: [
|
|
makeVisitResult(context, {
|
|
uri: "https://mozilla.com/",
|
|
providerName: "firstProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
}),
|
|
makeVisitResult(context, {
|
|
uri: "https://example.com/",
|
|
providerName: "secondProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
}),
|
|
],
|
|
});
|
|
|
|
let controller = UrlbarTestUtils.newMockController();
|
|
controller.setView({
|
|
get visibleResults() {
|
|
return context.results;
|
|
},
|
|
});
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"abandonment",
|
|
context,
|
|
{},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnAbandonment.callCount,
|
|
1,
|
|
"onAbandonment called once for first provider"
|
|
);
|
|
});
|
|
|
|
add_task(async function testOnImpressionNotification() {
|
|
let spyFirstProviderOnImpression = sinon.spy(firstProvider, "onImpression");
|
|
|
|
const engagedResult = makeVisitResult(context, {
|
|
uri: "https://mozilla.com/",
|
|
providerName: "firstProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
});
|
|
|
|
await check_results({
|
|
context,
|
|
matches: [
|
|
engagedResult,
|
|
makeVisitResult(context, {
|
|
uri: "https://example.com/",
|
|
providerName: "secondProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
}),
|
|
],
|
|
});
|
|
|
|
let controller = UrlbarTestUtils.newMockController();
|
|
controller.setView({
|
|
get visibleResults() {
|
|
return context.results;
|
|
},
|
|
});
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"engagement",
|
|
context,
|
|
{
|
|
isSessionOngoing: false,
|
|
result: engagedResult,
|
|
},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnImpression.callCount,
|
|
1,
|
|
"onImpression called for first provider after an engagement event"
|
|
);
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"abandonment",
|
|
context,
|
|
{
|
|
isSessionOngoing: false,
|
|
},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnImpression.callCount,
|
|
2,
|
|
"onImpression called once more for first provider after an abandonment \
|
|
event"
|
|
);
|
|
});
|
|
|
|
add_task(async function testOnSearchSessionEndNotification() {
|
|
let spyFirstProviderOnSearchSessionEnd = sinon.spy(
|
|
firstProvider,
|
|
"onSearchSessionEnd"
|
|
);
|
|
|
|
const engagedResult = makeVisitResult(context, {
|
|
uri: "https://mozilla.com/",
|
|
providerName: "firstProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
});
|
|
|
|
await check_results({
|
|
context,
|
|
matches: [
|
|
engagedResult,
|
|
makeVisitResult(context, {
|
|
uri: "https://example.com/",
|
|
providerName: "secondProvider",
|
|
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
}),
|
|
],
|
|
});
|
|
|
|
let controller = UrlbarTestUtils.newMockController();
|
|
controller.setView({
|
|
get visibleResults() {
|
|
return context.results;
|
|
},
|
|
});
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"engagement",
|
|
context,
|
|
{
|
|
isSessionOngoing: false,
|
|
result: engagedResult,
|
|
},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnSearchSessionEnd.callCount,
|
|
1,
|
|
"onSearchSessionEnd called for first provider after an engagement event"
|
|
);
|
|
|
|
await UrlbarProvidersManager.notifyEngagementChange(
|
|
"abandonment",
|
|
context,
|
|
{
|
|
isSessionOngoing: false,
|
|
},
|
|
controller
|
|
);
|
|
|
|
Assert.equal(
|
|
spyFirstProviderOnSearchSessionEnd.callCount,
|
|
2,
|
|
"onSearchSessionEnd called once more for first provider after an \
|
|
abandonment event"
|
|
);
|
|
});
|
|
|
|
add_task(async function testProviderPresenceInMap() {
|
|
const notificationMethods = [
|
|
"onEngagement",
|
|
"onAbandonment",
|
|
"onImpression",
|
|
"onSearchSessionEnd",
|
|
];
|
|
|
|
for (const method of notificationMethods) {
|
|
const providersForMethod =
|
|
UrlbarProvidersManager.providersByNotificationType[method];
|
|
|
|
const isFirstProviderPresent = providersForMethod.has(firstProvider);
|
|
const isSecondProviderPresent = providersForMethod.has(secondProvider);
|
|
|
|
Assert.ok(
|
|
isFirstProviderPresent,
|
|
`The key ${method} includes the firstProvider`
|
|
);
|
|
Assert.ok(
|
|
!isSecondProviderPresent,
|
|
`The key ${method} does not include secondProvider`
|
|
);
|
|
}
|
|
|
|
UrlbarProvidersManager.unregisterProvider(firstProvider);
|
|
|
|
for (const method of notificationMethods) {
|
|
const providersForMethod =
|
|
UrlbarProvidersManager.providersByNotificationType[method];
|
|
const isPresent = providersForMethod.has(firstProvider);
|
|
Assert.ok(
|
|
!isPresent,
|
|
`FirstProvider should no longer be present for ${method} after being
|
|
unregistered`
|
|
);
|
|
}
|
|
});
|