Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: browser/components/urlbar/tests/unit/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
"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,
{
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,
{
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, {
providerName: "firstProvider",
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
});
await check_results({
context,
matches: [
engagedResult,
makeVisitResult(context, {
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, {
providerName: "firstProvider",
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
}),
makeVisitResult(context, {
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, {
providerName: "firstProvider",
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
});
await check_results({
context,
matches: [
engagedResult,
makeVisitResult(context, {
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, {
providerName: "firstProvider",
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
});
await check_results({
context,
matches: [
engagedResult,
makeVisitResult(context, {
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`
);
}
});