summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js')
-rw-r--r--browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js218
1 files changed, 218 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js b/browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js
new file mode 100644
index 0000000000..d7b2e775b8
--- /dev/null
+++ b/browser/components/urlbar/tests/engagementTelemetry/browser/browser_glean_telemetry_engagement_edge_cases.js
@@ -0,0 +1,218 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test edge cases for engagement.
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/browser/components/urlbar/tests/ext/browser/head.js",
+ this
+);
+
+add_setup(async function () {
+ await setup();
+});
+
+/**
+ * UrlbarProvider that does not add any result.
+ */
+class NoResponseTestProvider extends UrlbarTestUtils.TestProvider {
+ constructor() {
+ super({ name: "TestProviderNoResponse ", results: [] });
+ this.#deferred = PromiseUtils.defer();
+ }
+
+ get type() {
+ return UrlbarUtils.PROVIDER_TYPE.HEURISTIC;
+ }
+
+ async startQuery(context, addCallback) {
+ await this.#deferred.promise;
+ }
+
+ done() {
+ this.#deferred.resolve();
+ }
+
+ #deferred = null;
+}
+const noResponseProvider = new NoResponseTestProvider();
+
+/**
+ * UrlbarProvider that adds a heuristic result immediately as usual.
+ */
+class AnotherHeuristicProvider extends UrlbarTestUtils.TestProvider {
+ constructor({ results }) {
+ super({ name: "TestProviderAnotherHeuristic ", results });
+ this.#deferred = PromiseUtils.defer();
+ }
+
+ get type() {
+ return UrlbarUtils.PROVIDER_TYPE.HEURISTIC;
+ }
+
+ async startQuery(context, addCallback) {
+ for (const result of this._results) {
+ addCallback(this, result);
+ }
+
+ this.#deferred.resolve(context);
+ }
+
+ onQueryStarted() {
+ return this.#deferred.promise;
+ }
+
+ #deferred = null;
+}
+const anotherHeuristicProvider = new AnotherHeuristicProvider({
+ results: [
+ Object.assign(
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
+ { url: "https://example.com/immediate" }
+ ),
+ { heuristic: true }
+ ),
+ ],
+});
+
+add_task(async function engagement_before_showing_results() {
+ await SpecialPowers.pushPrefEnv({
+ // Avoid showing search tip.
+ set: [["browser.urlbar.tipShownCount.searchTip_onboard", 999]],
+ });
+
+ // Update chunkResultsDelayMs to delay the call to notifyResults.
+ const originalChuldResultDelayMs =
+ UrlbarProvidersManager._chunkResultsDelayMs;
+ UrlbarProvidersManager._chunkResultsDelayMs = 1000000;
+
+ // Add a provider that waits forever in startQuery() to avoid fireing
+ // heuristicProviderTimer.
+ UrlbarProvidersManager.registerProvider(noResponseProvider);
+
+ // Add a provider that add a result immediately as usual.
+ UrlbarProvidersManager.registerProvider(anotherHeuristicProvider);
+
+ const cleanup = () => {
+ UrlbarProvidersManager.unregisterProvider(noResponseProvider);
+ UrlbarProvidersManager.unregisterProvider(anotherHeuristicProvider);
+ UrlbarProvidersManager._chunkResultsDelayMs = originalChuldResultDelayMs;
+ };
+ registerCleanupFunction(cleanup);
+
+ await doTest(async browser => {
+ // Try to show the results.
+ await UrlbarTestUtils.inputIntoURLBar(window, "exam");
+
+ // Wait until starting the query and filling expected results.
+ const context = await anotherHeuristicProvider.onQueryStarted();
+ const query = UrlbarProvidersManager.queries.get(context);
+ await BrowserTestUtils.waitForCondition(
+ () =>
+ query.unsortedResults.some(
+ r => r.providerName === "HeuristicFallback"
+ ) &&
+ query.unsortedResults.some(
+ r => r.providerName === anotherHeuristicProvider.name
+ )
+ );
+
+ // Type Enter key before showing any results.
+ await doEnter();
+
+ assertEngagementTelemetry([
+ {
+ selected_result: "input_field",
+ selected_result_subtype: "",
+ provider: undefined,
+ results: "",
+ groups: "",
+ },
+ ]);
+
+ // Clear the pending query.
+ noResponseProvider.done();
+ });
+
+ cleanup();
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function engagement_after_closing_results() {
+ const TRIGGERS = [
+ () => EventUtils.synthesizeKey("KEY_Escape"),
+ () =>
+ EventUtils.synthesizeMouseAtCenter(
+ document.getElementById("customizableui-special-spring2"),
+ {}
+ ),
+ ];
+
+ for (const trigger of TRIGGERS) {
+ await doTest(async browser => {
+ await openPopup("test");
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ trigger();
+ });
+ Assert.equal(
+ gURLBar.value,
+ "test",
+ "The inputted text remains even if closing the results"
+ );
+ // The tested trigger should not record abandonment event.
+ assertAbandonmentTelemetry([]);
+
+ // Endgagement.
+ await doEnter();
+
+ assertEngagementTelemetry([
+ {
+ selected_result: "input_field",
+ selected_result_subtype: "",
+ provider: undefined,
+ results: "",
+ groups: "",
+ },
+ ]);
+ });
+ }
+});
+
+add_task(async function enter_to_reload_current_url() {
+ await doTest(async browser => {
+ // Open a URL once.
+ await openPopup("https://example.com");
+ await doEnter();
+
+ // Focus the urlbar.
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ await BrowserTestUtils.waitForCondition(
+ () => window.document.activeElement === gURLBar.inputField
+ );
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ // Press Enter key to reload the page without selecting any suggestions.
+ await doEnter();
+
+ assertEngagementTelemetry([
+ {
+ selected_result: "url",
+ selected_result_subtype: "",
+ provider: "HeuristicFallback",
+ results: "url",
+ groups: "heuristic",
+ },
+ {
+ selected_result: "input_field",
+ selected_result_subtype: "",
+ provider: undefined,
+ results: "action",
+ groups: "suggested_index",
+ },
+ ]);
+ });
+});