summaryrefslogtreecommitdiffstats
path: root/browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js')
-rw-r--r--browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js524
1 files changed, 524 insertions, 0 deletions
diff --git a/browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js b/browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js
new file mode 100644
index 0000000000..39270c7e9f
--- /dev/null
+++ b/browser/components/search/test/browser/telemetry/browser_search_telemetry_spa_in_content.js
@@ -0,0 +1,524 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Check SPA in-content interactions (e.g. search box, clicking autosuggest) and
+ * ensures we're correctly unloading / adding listeners to elements, and
+ * registering the right engagements for search submission events that could
+ * change the location of the page.
+ */
+
+"use strict";
+
+add_setup(async function () {
+ await initSinglePageAppTest();
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["dom.ipc.processCount.webIsolated", 1]],
+ });
+
+ registerCleanupFunction(async () => {
+ SearchSERPTelemetry.overrideSearchTelemetryForTests();
+ resetTelemetry();
+ });
+});
+
+add_task(async function test_content_process_type_search_click_suggestion() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.clickSearchboxAndType(tab);
+ await SinglePageAppUtils.clickSuggestion(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 2,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 2,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.SUBMITTED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "follow_on_from_refine_on_incontent_search",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+ await BrowserTestUtils.removeTab(tab);
+});
+
+add_task(
+ async function test_content_process_type_search_click_related_search() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.clickSearchboxAndType(tab);
+ await SinglePageAppUtils.visitRelatedSearch(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 2,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 2,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.NON_ADS_LINK,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+ await BrowserTestUtils.removeTab(tab);
+ }
+);
+
+add_task(async function test_content_process_engagement() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.clickSearchbox(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 1,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 1,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+
+ await BrowserTestUtils.removeTab(tab);
+});
+
+add_task(async function test_content_process_engagement_that_changes_page() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.clickSuggestion(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 2,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 2,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.SUBMITTED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "follow_on_from_refine_on_incontent_search",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+
+ await BrowserTestUtils.removeTab(tab);
+});
+
+// This is to ensure if the user switches to another search page, we unload
+// the listeners, add them back in, and then accurately register the correct
+// number of engagements. The engagement target should also be accurate.
+add_task(
+ async function test_in_page_reload_and_content_process_engagement_that_changes_page() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.visitRelatedSearch(tab);
+ await SinglePageAppUtils.clickSuggestion(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 3,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 3,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.NON_ADS_LINK,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.SUBMITTED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "follow_on_from_refine_on_incontent_search",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+
+ await BrowserTestUtils.removeTab(tab);
+ }
+);
+
+// Clicking on another SERP tab and selecting the searchbox shouldn't cause a
+// new engagement.
+add_task(async function test_unload_listeners_single_tab() {
+ resetTelemetry();
+
+ let tab = await SinglePageAppUtils.createTabAndLoadURL();
+ await SinglePageAppUtils.clickImagesTab(tab);
+ await SinglePageAppUtils.clickSearchbox(tab);
+ await SinglePageAppUtils.clickSuggestionOnImagesTab(tab);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 1,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 1,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.NON_ADS_LINK,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+
+ await BrowserTestUtils.removeTab(tab);
+});
+
+// Make sure unloading listeners is specific to the tab.
+add_task(async function test_unload_listeners_multi_tab() {
+ resetTelemetry();
+
+ let tab1 = await SinglePageAppUtils.createTabAndLoadURL();
+ let tab2 = await SinglePageAppUtils.createTabAndLoadURL();
+
+ // Listener should no longer be applicable on tab2 because we're switching
+ // to tab2.
+ await SinglePageAppUtils.clickImagesTab(tab2);
+ await SinglePageAppUtils.clickSearchbox(tab2);
+ await SinglePageAppUtils.clickSuggestionOnImagesTab(tab2);
+
+ // Click a searchbox on tab1 to verify the listener is still working.
+ await SinglePageAppUtils.clickSearchbox(tab1);
+
+ await assertSearchSourcesTelemetry(
+ {},
+ {
+ "browser.search.content.unknown": {
+ "example1:tagged:ff": 2,
+ },
+ "browser.search.withads.unknown": {
+ "example1:tagged": 2,
+ },
+ }
+ );
+
+ assertSERPTelemetry([
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.INCONTENT_SEARCHBOX,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ {
+ impression: {
+ provider: "example1",
+ tagged: "true",
+ partner_code: "ff",
+ source: "unknown",
+ is_shopping_page: "false",
+ is_private: "false",
+ shopping_tab_displayed: "false",
+ },
+ engagements: [
+ {
+ action: SearchSERPTelemetryUtils.ACTIONS.CLICKED,
+ target: SearchSERPTelemetryUtils.COMPONENTS.NON_ADS_LINK,
+ },
+ ],
+ adImpressions: [
+ {
+ component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
+ ads_loaded: "2",
+ ads_visible: "2",
+ ads_hidden: "0",
+ },
+ ],
+ },
+ ]);
+
+ await BrowserTestUtils.removeTab(tab1);
+ await BrowserTestUtils.removeTab(tab2);
+});