summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/browser_sidebar_history_telemetry.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/browser_sidebar_history_telemetry.js')
-rw-r--r--browser/components/places/tests/browser/browser_sidebar_history_telemetry.js285
1 files changed, 285 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/browser_sidebar_history_telemetry.js b/browser/components/places/tests/browser/browser_sidebar_history_telemetry.js
new file mode 100644
index 0000000000..cb27bf66ef
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_sidebar_history_telemetry.js
@@ -0,0 +1,285 @@
+/* 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/. */
+
+"use strict";
+
+const { TelemetryTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/TelemetryTestUtils.sys.mjs"
+);
+const firstNodeIndex = 0;
+
+// The prompt returns 1 for cancelled and 0 for accepted.
+let gResponse = 1;
+(function replacePromptService() {
+ let originalPromptService = Services.prompt;
+ Services.prompt = {
+ QueryInterface: ChromeUtils.generateQI([Ci.nsIPromptService]),
+ confirmEx: () => gResponse,
+ };
+ registerCleanupFunction(() => {
+ Services.prompt = originalPromptService;
+ });
+})();
+
+add_setup(async function () {
+ await PlacesUtils.history.clear();
+
+ // Visited pages listed by descending visit date.
+ let pages = [
+ "https://sidebar.mozilla.org/a",
+ "https://sidebar.mozilla.org/b",
+ "https://sidebar.mozilla.org/c",
+ "https://www.mozilla.org/d",
+ ];
+
+ // Add some visited page.
+ let time = Date.now();
+ let places = [];
+ for (let i = 0; i < pages.length; i++) {
+ places.push({
+ uri: NetUtil.newURI(pages[i]),
+ visitDate: (time - i) * 1000,
+ transition: PlacesUtils.history.TRANSITION_TYPED,
+ });
+ }
+ await PlacesTestUtils.addVisits(places);
+
+ registerCleanupFunction(async () => {
+ await PlacesUtils.history.clear();
+ });
+});
+
+add_task(async function test_click_multiple_history_entries() {
+ await withSidebarTree("history", async tree => {
+ tree.ownerDocument.getElementById("byday").doCommand();
+
+ // Select the first link and click on it.
+ tree.selectNode(tree.view.nodeForTreeIndex(firstNodeIndex));
+ is(
+ tree.selectedNode.title,
+ "Today",
+ "The Today history sidebar button is selected"
+ );
+
+ // if a user tries to open all history items and they cancel opening
+ // those items in new tabs (due to max tab limit warning),
+ // no telemetry should be recorded
+ gResponse = 1;
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.tabs.maxOpenBeforeWarn", 4]],
+ });
+
+ // open multiple history items with a single click
+ synthesizeClickOnSelectedTreeCell(tree, { button: 1 });
+
+ TelemetryTestUtils.assertScalarUnset(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link"
+ );
+
+ // if they proceed with opening history multiple history items despite the warning,
+ // telemetry should be recorded
+ gResponse = 0;
+ synthesizeClickOnSelectedTreeCell(tree, { button: 1 });
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 4
+ );
+
+ let parentNode = tree.selectedNode;
+ if (!parentNode.containerOpen) {
+ // Only need to open/expand container node on first run
+ synthesizeClickOnSelectedTreeCell(tree);
+ }
+ if (parentNode.title == "Today" && parentNode.hasChildren) {
+ info(`Selecting node with title ${parentNode?.getChild(0)?.title}`);
+ tree.selectNode(parentNode.getChild(0));
+ }
+
+ synthesizeClickOnSelectedTreeCell(tree, {
+ button: 2,
+ type: "contextmenu",
+ });
+
+ TelemetryTestUtils.assertScalarUnset(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link"
+ );
+
+ let openNewTabOption = document.getElementById("placesContext_open:newtab");
+ openNewTabOption.click();
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 1
+ );
+
+ if (parentNode.title == "Today" && parentNode.hasChildren) {
+ tree.selectNode(parentNode.getChild(0));
+ }
+
+ let newWinOpened = BrowserTestUtils.waitForNewWindow();
+
+ synthesizeClickOnSelectedTreeCell(tree, {
+ button: 2,
+ type: "contextmenu",
+ });
+
+ TelemetryTestUtils.assertScalarUnset(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link"
+ );
+
+ let openNewWindowOption = document.getElementById(
+ "placesContext_open:newwindow"
+ );
+ openNewWindowOption.click();
+
+ let newWin = await newWinOpened;
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 1
+ );
+
+ await BrowserTestUtils.closeWindow(newWin);
+
+ if (parentNode.title == "Today" && parentNode.hasChildren) {
+ tree.selectNode(parentNode.getChild(0));
+ }
+
+ let newPrivateWinOpened = BrowserTestUtils.waitForNewWindow();
+
+ synthesizeClickOnSelectedTreeCell(tree, {
+ button: 2,
+ type: "contextmenu",
+ });
+
+ TelemetryTestUtils.assertScalarUnset(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link"
+ );
+
+ let openNewPrivateWindowOption = document.getElementById(
+ "placesContext_open:newprivatewindow"
+ );
+ openNewPrivateWindowOption.click();
+
+ let newPrivateWin = await newPrivateWinOpened;
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 1
+ );
+
+ await BrowserTestUtils.closeWindow(newPrivateWin);
+ });
+
+ await SpecialPowers.popPrefEnv();
+
+ while (gBrowser.tabs.length > 1) {
+ BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ }
+});
+
+add_task(async function test_search_and_filter() {
+ let cumulativeSearchesHistogram = Services.telemetry.getHistogramById(
+ "PLACES_SEARCHBAR_CUMULATIVE_SEARCHES"
+ );
+ cumulativeSearchesHistogram.clear();
+ let cumulativeFilterCountHistogram = Services.telemetry.getHistogramById(
+ "PLACES_SEARCHBAR_CUMULATIVE_FILTER_COUNT"
+ );
+ cumulativeFilterCountHistogram.clear();
+
+ await withSidebarTree("history", async tree => {
+ // Apply a search filter.
+ tree.ownerDocument.getElementById("bylastvisited").doCommand();
+ info("Search filter was changed to bylastvisited");
+
+ // Search the tree.
+ let searchBox = tree.ownerDocument.getElementById("search-box");
+ searchBox.value = "sidebar.mozilla";
+ searchBox.doCommand();
+ info("Tree was searched with sting sidebar.mozilla");
+
+ searchBox.value = "";
+ searchBox.doCommand();
+ info("Search was reset");
+
+ // Perform a second search.
+ searchBox.value = "sidebar.mozilla";
+ searchBox.doCommand();
+ info("Second search was performed");
+
+ // Select the first link and click on it.
+ tree.selectNode(tree.view.nodeForTreeIndex(firstNodeIndex));
+ synthesizeClickOnSelectedTreeCell(tree, { button: 1 });
+ info("First link was selected and then clicked on");
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 1
+ );
+ });
+
+ TelemetryTestUtils.assertHistogram(cumulativeSearchesHistogram, 2, 1);
+ info("Cumulative search telemetry looks right");
+
+ TelemetryTestUtils.assertHistogram(cumulativeFilterCountHistogram, 1, 1);
+ info("Cumulative search filter telemetry looks right");
+
+ cumulativeSearchesHistogram.clear();
+ cumulativeFilterCountHistogram.clear();
+
+ await withSidebarTree("history", async tree => {
+ // Apply a search filter.
+ tree.ownerDocument.getElementById("byday").doCommand();
+ info("First search filter applied");
+
+ // Apply another search filter.
+ tree.ownerDocument.getElementById("bylastvisited").doCommand();
+ info("Second search filter applied");
+
+ // Apply a search filter.
+ tree.ownerDocument.getElementById("byday").doCommand();
+ info("Third search filter applied");
+
+ // Search the tree.
+ let searchBox = tree.ownerDocument.getElementById("search-box");
+ searchBox.value = "sidebar.mozilla";
+ searchBox.doCommand();
+
+ // Select the first link and click on it.
+ tree.selectNode(tree.view.nodeForTreeIndex(firstNodeIndex));
+ synthesizeClickOnSelectedTreeCell(tree, { button: 1 });
+
+ TelemetryTestUtils.assertKeyedScalar(
+ TelemetryTestUtils.getProcessScalars("parent", true, true),
+ "sidebar.link",
+ "history",
+ 1
+ );
+ });
+
+ TelemetryTestUtils.assertHistogram(cumulativeSearchesHistogram, 1, 1);
+ TelemetryTestUtils.assertHistogram(cumulativeFilterCountHistogram, 3, 1);
+
+ cumulativeSearchesHistogram.clear();
+ cumulativeFilterCountHistogram.clear();
+ while (gBrowser.tabs.length > 1) {
+ BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ }
+});