Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Test we don't re-enter record() (and record both an engagement and an
// abandonment) when handling an engagement blurs the input field.
const TEST_URL = "https://example.com/";
add_task(async function () {
await setup();
let onEngagementDeferred = Promise.withResolvers();
const provider = new UrlbarTestUtils.TestProvider({
results: [
new UrlbarResult({
type: UrlbarUtils.RESULT_TYPE.URL,
source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
payload: {
url: TEST_URL,
helpL10n: {
id: "urlbar-result-menu-tip-get-help",
},
},
}),
],
priority: 999,
onEngagement: () => {
info("Blur the address bar during the onEngagement notification");
gURLBar.blur();
// Run at the next tick to be sure spurious events would have happened.
TestUtils.waitForTick().then(() => {
onEngagementDeferred.resolve();
});
},
});
let providersManager = ProvidersManager.getInstanceForSap("urlbar");
providersManager.registerProvider(provider);
// This should cover at least engagement and abandonment.
let engagementSpy = sinon.spy(provider, "onEngagement");
let beforeRecordCall = false,
recordReentered = false;
let recordStub = sinon
.stub(gURLBar.controller.engagementEvent, "record")
.callsFake((...args) => {
recordReentered = beforeRecordCall;
beforeRecordCall = true;
recordStub.wrappedMethod.apply(gURLBar.controller.engagementEvent, args);
beforeRecordCall = false;
});
registerCleanupFunction(() => {
sinon.restore();
providersManager.unregisterProvider(provider);
});
await doTest(async () => {
await openPopup("example");
await selectRowByURL(TEST_URL);
EventUtils.synthesizeKey("VK_RETURN");
await Promise.all([onEngagementDeferred]);
assertEngagementTelemetry([{ engagement_type: "enter" }]);
assertAbandonmentTelemetry([]);
Assert.ok(recordReentered, "`record()` was re-entered");
Assert.equal(engagementSpy.callCount, 1, "`onEngagement` was invoked once");
});
});