summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js270
1 files changed, 270 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js b/browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js
new file mode 100644
index 0000000000..904e774a2c
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_urlbar_telemetry_persisted.js
@@ -0,0 +1,270 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * This file tests browser.engagement.navigation.urlbar_persisted and the
+ * event navigation.search.urlbar_persisted
+ */
+
+"use strict";
+
+const { SearchSERPTelemetry } = ChromeUtils.importESModule(
+ "resource:///modules/SearchSERPTelemetry.sys.mjs"
+);
+
+const SCALAR_URLBAR_PERSISTED =
+ "browser.engagement.navigation.urlbar_persisted";
+
+const SEARCH_STRING = "chocolate";
+
+let testEngine;
+add_setup(async () => {
+ Services.telemetry.clearScalars();
+ Services.telemetry.clearEvents();
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.showSearchTerms.featureGate", true]],
+ });
+
+ await SearchTestUtils.installSearchExtension(
+ {
+ name: "MozSearch",
+ search_url: "https://www.example.com/",
+ search_url_get_params: "q={searchTerms}&pc=fake_code",
+ },
+ { setAsDefault: true }
+ );
+
+ testEngine = Services.search.getEngineByName("MozSearch");
+
+ // Enable event recording for the events.
+ Services.telemetry.setEventRecordingEnabled("navigation", true);
+
+ registerCleanupFunction(async function () {
+ await PlacesUtils.history.clear();
+ Services.telemetry.clearScalars();
+ Services.telemetry.clearEvents();
+ Services.telemetry.setEventRecordingEnabled("navigation", false);
+ });
+});
+
+async function searchForString(searchString, tab) {
+ info(`Search for string: ${searchString}.`);
+ let [expectedSearchUrl] = UrlbarUtils.getSearchQueryUrl(
+ testEngine,
+ searchString
+ );
+ let browserLoadedPromise = BrowserTestUtils.browserLoaded(
+ tab.linkedBrowser,
+ false,
+ expectedSearchUrl
+ );
+ gURLBar.focus();
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ waitForFocus,
+ value: searchString,
+ fireInputEvent: true,
+ });
+ EventUtils.synthesizeKey("KEY_Enter");
+ await browserLoadedPromise;
+ info("Finished loading search.");
+ return expectedSearchUrl;
+}
+
+async function gotoUrl(url, tab) {
+ let browserLoadedPromise = BrowserTestUtils.browserLoaded(
+ tab.linkedBrowser,
+ false,
+ url
+ );
+ BrowserTestUtils.loadURIString(tab.linkedBrowser, url);
+ await browserLoadedPromise;
+ info(`Loaded page: ${url}`);
+}
+
+async function goBack(browser) {
+ let pageShowPromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "pageshow"
+ );
+ browser.goBack();
+ await pageShowPromise;
+ info("Go back a page.");
+}
+
+async function goForward(browser) {
+ let pageShowPromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "pageshow"
+ );
+ browser.goForward();
+ await pageShowPromise;
+ info("Go forward a page.");
+}
+
+function assertScalarSearchEnter(number) {
+ let scalars = TelemetryTestUtils.getProcessScalars("parent", true, true);
+ TelemetryTestUtils.assertKeyedScalar(
+ scalars,
+ SCALAR_URLBAR_PERSISTED,
+ "search_enter",
+ number
+ );
+}
+
+function assertScalarDoesNotExist(scalar) {
+ let scalars = TelemetryTestUtils.getProcessScalars("parent", true, false);
+ Assert.ok(!(scalar in scalars), scalar + " must not be recorded.");
+}
+
+function assertTelemetryEvents() {
+ TelemetryTestUtils.assertEvents(
+ [
+ [
+ "navigation",
+ "search",
+ "urlbar",
+ "enter",
+ { engine: "other-MozSearch" },
+ ],
+ [
+ "navigation",
+ "search",
+ "urlbar_persisted",
+ "enter",
+ { engine: "other-MozSearch" },
+ ],
+ ],
+ {
+ category: "navigation",
+ method: "search",
+ }
+ );
+}
+
+// A user making a search after making a search should result
+// in the telemetry being recorded.
+add_task(async function search_after_search() {
+ let search_hist =
+ TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+ await searchForString(SEARCH_STRING, tab);
+
+ // Scalar should not exist from a blank page, only when a search
+ // is conducted from a default SERP.
+ await assertScalarDoesNotExist(SCALAR_URLBAR_PERSISTED);
+
+ // After the first search, we should expect the SAP to change
+ // because the search term should show up on the SERP.
+ await searchForString(SEARCH_STRING, tab);
+ assertScalarSearchEnter(1);
+
+ // Check search counts.
+ TelemetryTestUtils.assertKeyedHistogramSum(
+ search_hist,
+ "other-MozSearch.urlbar-persisted",
+ 1
+ );
+
+ // Check events.
+ assertTelemetryEvents();
+
+ BrowserTestUtils.removeTab(tab);
+});
+
+// A user going to a tab that contains a SERP should
+// trigger the telemetry when conducting a search.
+add_task(async function switch_to_tab_and_search() {
+ let search_hist =
+ TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
+
+ const tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+ await searchForString(SEARCH_STRING, tab1);
+
+ const tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+ await gotoUrl("https://www.example.com/some-place", tab2);
+
+ await BrowserTestUtils.switchTab(gBrowser, tab1);
+ await searchForString(SEARCH_STRING, tab1);
+ assertScalarSearchEnter(1);
+
+ // Check search count.
+ TelemetryTestUtils.assertKeyedHistogramSum(
+ search_hist,
+ "other-MozSearch.urlbar-persisted",
+ 1
+ );
+
+ // Check events.
+ assertTelemetryEvents();
+
+ BrowserTestUtils.removeTab(tab1);
+ BrowserTestUtils.removeTab(tab2);
+});
+
+// When a user reverts the Urlbar after the search terms persist,
+// conducting another search should still be registered as a
+// urlbar-persisted SAP.
+add_task(async function handle_revert() {
+ let search_hist =
+ TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+ await searchForString(SEARCH_STRING, tab);
+
+ gURLBar.handleRevert();
+ await searchForString(SEARCH_STRING, tab);
+
+ assertScalarSearchEnter(1);
+
+ // Check search count.
+ TelemetryTestUtils.assertKeyedHistogramSum(
+ search_hist,
+ "other-MozSearch.urlbar-persisted",
+ 1
+ );
+
+ // Check events.
+ assertTelemetryEvents();
+
+ BrowserTestUtils.removeTab(tab);
+});
+
+// A user going back and forth in history should trigger
+// urlbar-persisted telemetry when returning to a SERP
+// and conducting a search.
+add_task(async function back_and_forth() {
+ let search_hist =
+ TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+
+ // Create three pages in history: a page, a SERP, and a page.
+ await gotoUrl("https://www.example.com/some-place", tab);
+ await searchForString(SEARCH_STRING, tab);
+ await gotoUrl("https://www.example.com/another-page", tab);
+
+ // Go back to the SERP by using both back and forward.
+ await goBack(tab.linkedBrowser);
+ await goBack(tab.linkedBrowser);
+ await goForward(tab.linkedBrowser);
+ await assertScalarDoesNotExist(SCALAR_URLBAR_PERSISTED);
+
+ // Then do a search.
+ await searchForString(SEARCH_STRING, tab);
+ assertScalarSearchEnter(1);
+
+ // Check search count.
+ TelemetryTestUtils.assertKeyedHistogramSum(
+ search_hist,
+ "other-MozSearch.urlbar-persisted",
+ 1
+ );
+
+ // Check events.
+ assertTelemetryEvents();
+
+ BrowserTestUtils.removeTab(tab);
+});