Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
const BASE_PROBE_NAME = "browser.engagement.navigation.";
const SCALAR_CONTEXT_MENU = BASE_PROBE_NAME + "contextmenu";
const SCALAR_ABOUT_NEWTAB = BASE_PROBE_NAME + "about_newtab";
add_setup(async function () {
// Create two new search engines. Mark one as the default engine, so
// the test don't crash. We need to engines for this test as the searchbar
// in content doesn't display the default search engine among the one-off engines.
await SearchTestUtils.installSearchExtension(
{
name: "MozSearch",
keyword: "mozalias",
},
{ setAsDefault: true }
);
await SearchTestUtils.installSearchExtension({
name: "MozSearch2",
keyword: "mozalias2",
});
// Move the second engine at the beginning of the one-off list.
let engineOneOff = Services.search.getEngineByName("MozSearch2");
await Services.search.moveEngine(engineOneOff, 0);
// Enable local telemetry recording for the duration of the tests.
let oldCanRecord = Services.telemetry.canRecordExtended;
Services.telemetry.canRecordExtended = true;
// Enable event recording for the events tested here.
Services.telemetry.setEventRecordingEnabled("navigation", true);
registerCleanupFunction(async function () {
await PlacesUtils.history.clear();
Services.telemetry.setEventRecordingEnabled("navigation", false);
Services.telemetry.canRecordExtended = oldCanRecord;
});
});
add_task(async function test_context_menu() {
// Let's reset the Telemetry data.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist =
TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
// Open a new tab with a page containing some text.
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"data:text/plain;charset=utf8,test%20search"
);
info("Select all the text in the page.");
await SpecialPowers.spawn(tab.linkedBrowser, [""], async function () {
return new Promise(resolve => {
content.document.addEventListener("selectionchange", () => resolve(), {
once: true,
});
content.document.getSelection().selectAllChildren(content.document.body);
});
});
info("Open the context menu.");
let contextMenu = document.getElementById("contentAreaContextMenu");
let popupPromise = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
BrowserTestUtils.synthesizeMouseAtCenter(
"body",
{ type: "contextmenu", button: 2 },
gBrowser.selectedBrowser
);
await popupPromise;
info("Click on search.");
let searchItem = contextMenu.getElementsByAttribute(
"id",
"context-searchselect"
)[0];
contextMenu.activateItem(searchItem);
info("Validate the search metrics.");
// Telemetry is not updated synchronously here, we must wait for it.
await TestUtils.waitForCondition(() => {
const scalars = TelemetryTestUtils.getProcessScalars("parent", true, false);
return Object.keys(scalars[SCALAR_CONTEXT_MENU] || {}).length == 1;
}, "This search must increment one entry in the scalar.");
const scalars = TelemetryTestUtils.getProcessScalars("parent", true, false);
TelemetryTestUtils.assertKeyedScalar(
scalars,
SCALAR_CONTEXT_MENU,
"search",
1
);
// Make sure SEARCH_COUNTS contains identical values.
TelemetryTestUtils.assertKeyedHistogramSum(
search_hist,
"other-MozSearch.contextmenu",
1
);
// Also check events.
TelemetryTestUtils.assertEvents(
[
{
object: "contextmenu",
value: null,
extra: { engine: "other-MozSearch" },
},
],
{ category: "navigation", method: "search" }
);
contextMenu.hidePopup();
BrowserTestUtils.removeTab(gBrowser.selectedTab);
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_about_newtab() {
await SpecialPowers.pushPrefEnv({
set: [
[
"browser.newtabpage.activity-stream.improvesearch.handoffToAwesomebar",
false,
],
],
});
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
Services.fog.testResetFOG();
let search_hist =
TelemetryTestUtils.getAndClearKeyedHistogram("SEARCH_COUNTS");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"about:newtab",
false
);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
await ContentTaskUtils.waitForCondition(() => !content.document.hidden);
});
info("Trigger a simple serch, just text + enter.");
let p = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
await typeInSearchField(
tab.linkedBrowser,
"test query",
"newtab-search-text"
);
await BrowserTestUtils.synthesizeKey("VK_RETURN", {}, tab.linkedBrowser);
await p;
// Check if the scalars contain the expected values.
const scalars = TelemetryTestUtils.getProcessScalars("parent", true, false);
TelemetryTestUtils.assertKeyedScalar(
scalars,
SCALAR_ABOUT_NEWTAB,
"search_enter",
1
);
Assert.equal(
Object.keys(scalars[SCALAR_ABOUT_NEWTAB]).length,
1,
"This search must only increment one entry in the scalar."
);
// Make sure SEARCH_COUNTS contains identical values.
TelemetryTestUtils.assertKeyedHistogramSum(
search_hist,
"other-MozSearch.newtab",
1
);
// Also check events.
TelemetryTestUtils.assertEvents(
[
{
object: "about_newtab",
value: "enter",
extra: { engine: "other-MozSearch" },
},
],
{ category: "navigation", method: "search" }
);
// Also also check Glean events.
const record = Glean.newtabSearch.issued.testGetValue();
Assert.ok(!!record, "Must have recorded a search issuance");
Assert.equal(record.length, 1, "One search, one event");
Assert.deepEqual(
{
search_access_point: "about_newtab",
telemetry_id: "other-MozSearch",
},
record[0].extra,
"Must have recorded the expected information."
);
BrowserTestUtils.removeTab(tab);
await SpecialPowers.popPrefEnv();
});