Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Test whether a visit information is annotated correctly when clicking a tile.
if (AppConstants.platform === "macosx") {
requestLongerTimeout(4);
} else {
requestLongerTimeout(2);
}
ChromeUtils.defineESModuleGetters(this, {
});
const OPEN_TYPE = {
CURRENT_BY_CLICK: 0,
NEWTAB_BY_CLICK: 1,
NEWTAB_BY_MIDDLECLICK: 2,
NEWTAB_BY_CONTEXTMENU: 3,
NEWWINDOW_BY_CONTEXTMENU: 4,
NEWWINDOW_BY_CONTEXTMENU_OF_TILE: 5,
};
const FRECENCY = {
TYPED: 2000,
VISITED: 100,
SPONSORED: -1,
BOOKMARKED: 2075,
MIDDLECLICK_TYPED: 100,
MIDDLECLICK_BOOKMARKED: 175,
NEWWINDOW_TYPED: 100,
NEWWINDOW_BOOKMARKED: 175,
};
const {
VISIT_SOURCE_ORGANIC,
VISIT_SOURCE_SPONSORED,
VISIT_SOURCE_BOOKMARKED,
} = PlacesUtils.history;
/**
* To be used before checking database contents when they depend on a visit
* being added to History.
* @param {string} href the page to await notifications for.
*/
async function waitForVisitNotification(href) {
await PlacesTestUtils.waitForNotification("page-visited", events =>
events.some(e => e.url === href)
);
}
async function assertDatabase({ targetURL, expected }) {
const frecency = await PlacesTestUtils.getDatabaseValue(
"moz_places",
"frecency",
{ url: targetURL }
);
Assert.equal(frecency, expected.frecency, "Frecency is correct");
const placesId = await PlacesTestUtils.getDatabaseValue("moz_places", "id", {
url: targetURL,
});
const expectedTriggeringPlaceId = expected.triggerURL
? await PlacesTestUtils.getDatabaseValue("moz_places", "id", {
url: expected.triggerURL,
})
: null;
const db = await PlacesUtils.promiseDBConnection();
const rows = await db.execute(
"SELECT source, triggeringPlaceId FROM moz_historyvisits WHERE place_id = :place_id AND source = :source",
{
place_id: placesId,
source: expected.source,
}
);
Assert.equal(rows.length, 1);
Assert.equal(
rows[0].getResultByName("triggeringPlaceId"),
expectedTriggeringPlaceId,
`The triggeringPlaceId in database is correct for ${targetURL}`
);
}
async function waitForLocationChanged(destinationURL) {
// If nodeIconChanged of browserPlacesViews.js is called after the target node
// is lost during test, "No DOM node set for aPlacesNode" error occur. To avoid
// this failure, wait for the onLocationChange event that triggers
// nodeIconChanged to occur.
return new Promise(resolve => {
gBrowser.addTabsProgressListener({
async onLocationChange(aBrowser, aWebProgress, aRequest, aLocation) {
if (aLocation.spec === destinationURL) {
gBrowser.removeTabsProgressListener(this);
// Wait for an empty Promise to ensure to proceed our test after
// finishing the processing of other onLocatoinChanged events.
await Promise.resolve();
resolve();
}
},
});
});
}
async function openAndTest({
linkSelector,
linkURL,
redirectTo = null,
openType = OPEN_TYPE.CURRENT_BY_CLICK,
expected,
}) {
const destinationURL = redirectTo || linkURL;
// Wait for content is ready.
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[linkSelector, linkURL],
async (selector, link) => {
await ContentTaskUtils.waitForCondition(
() => content.document.querySelector(selector).href === link
);
}
);
info("Open specific link by type and wait for loading.");
let promiseVisited = waitForVisitNotification(destinationURL);
if (openType === OPEN_TYPE.CURRENT_BY_CLICK) {
const onLoad = BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
false,
destinationURL
);
const onLocationChanged = waitForLocationChanged(destinationURL);
await BrowserTestUtils.synthesizeMouseAtCenter(
linkSelector,
{},
gBrowser.selectedBrowser
);
await onLoad;
await onLocationChanged;
} else if (openType === OPEN_TYPE.NEWTAB_BY_CLICK) {
const onLoad = BrowserTestUtils.waitForNewTab(
gBrowser,
destinationURL,
true
);
const onLocationChanged = waitForLocationChanged(destinationURL);
await BrowserTestUtils.synthesizeMouseAtCenter(
linkSelector,
{ ctrlKey: true, metaKey: true },
gBrowser.selectedBrowser
);
const tab = await onLoad;
await onLocationChanged;
BrowserTestUtils.removeTab(tab);
} else if (openType === OPEN_TYPE.NEWTAB_BY_MIDDLECLICK) {
const onLoad = BrowserTestUtils.waitForNewTab(
gBrowser,
destinationURL,
true
);
const onLocationChanged = waitForLocationChanged(destinationURL);
await BrowserTestUtils.synthesizeMouseAtCenter(
linkSelector,
{ button: 1 },
gBrowser.selectedBrowser
);
const tab = await onLoad;
await onLocationChanged;
BrowserTestUtils.removeTab(tab);
} else if (openType === OPEN_TYPE.NEWTAB_BY_CONTEXTMENU) {
const onLoad = BrowserTestUtils.waitForNewTab(
gBrowser,
destinationURL,
true
);
const onLocationChanged = waitForLocationChanged(destinationURL);
const onPopup = BrowserTestUtils.waitForEvent(document, "popupshown");
await BrowserTestUtils.synthesizeMouseAtCenter(
linkSelector,
{ type: "contextmenu" },
gBrowser.selectedBrowser
);
await onPopup;
const contextMenu = document.getElementById("contentAreaContextMenu");
const openLinkMenuItem = contextMenu.querySelector(
"#context-openlinkintab"
);
contextMenu.activateItem(openLinkMenuItem);
const tab = await onLoad;
await onLocationChanged;
BrowserTestUtils.removeTab(tab);
} else if (openType === OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU) {
const onLoad = BrowserTestUtils.waitForNewWindow({ url: destinationURL });
const onPopup = BrowserTestUtils.waitForEvent(document, "popupshown");
await BrowserTestUtils.synthesizeMouseAtCenter(
linkSelector,
{ type: "contextmenu" },
gBrowser.selectedBrowser
);
await onPopup;
const contextMenu = document.getElementById("contentAreaContextMenu");
const openLinkMenuItem = contextMenu.querySelector("#context-openlink");
contextMenu.activateItem(openLinkMenuItem);
const win = await onLoad;
await BrowserTestUtils.closeWindow(win);
} else if (openType === OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU_OF_TILE) {
const onLoad = BrowserTestUtils.waitForNewWindow({ url: destinationURL });
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[linkSelector],
async selector => {
const link = content.document.querySelector(selector);
const list = link.closest("li");
const contextMenu = list.querySelector(".context-menu-button");
contextMenu.click();
const target = list.querySelector(
"[data-l10n-id=newtab-menu-open-new-window]"
);
target.click();
}
);
const win = await onLoad;
await BrowserTestUtils.closeWindow(win);
}
await promiseVisited;
info("Check database for the destination.");
await assertDatabase({ targetURL: destinationURL, expected });
}
async function pin(link) {
// Setup test tile.
NewTabUtils.pinnedLinks.pin(link, 0);
await toggleTopsitesPref();
await BrowserTestUtils.waitForCondition(() => {
const sites = AboutNewTab.getTopSites();
return (
sites?.[0]?.url === link.url &&
sites[0].sponsored_tile_id === link.sponsored_tile_id
);
}, "Waiting for top sites to be updated");
}
function unpin(link) {
NewTabUtils.pinnedLinks.unpin(link);
}
add_setup(async function () {
await clearHistoryAndBookmarks();
registerCleanupFunction(async () => {
await clearHistoryAndBookmarks();
});
});
add_task(async function basic() {
const SPONSORED_LINK = {
label: "test_label",
sponsored_position: 1,
sponsored_tile_id: 12345,
sponsored_impression_url: "https://impression.example.com/",
sponsored_click_url: "https://click.example.com/",
};
const NORMAL_LINK = {
label: "test_label",
};
const BOOKMARKS = [
{
parentGuid: PlacesUtils.bookmarks.toolbarGuid,
url: Services.io.newURI("https://example.com/"),
title: "test bookmark",
},
];
const testData = [
{
description: "Sponsored tile",
link: SPONSORED_LINK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Sponsored tile in new tab by click with key",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Sponsored tile in new tab by middle click",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Sponsored tile in new tab by context menu",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Sponsored tile in new window by context menu",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Sponsored tile in new window by context menu of tile",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU_OF_TILE,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
},
{
description: "Bookmarked result",
link: NORMAL_LINK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description: "Bookmarked result in new tab by click with key",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description: "Bookmarked result in new tab by middle click",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.MIDDLECLICK_BOOKMARKED,
},
},
{
description: "Bookmarked result in new tab by context menu",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CONTEXTMENU,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.MIDDLECLICK_BOOKMARKED,
},
},
{
description: "Bookmarked result in new window by context menu",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.NEWWINDOW_BOOKMARKED,
},
},
{
description: "Bookmarked result in new window by context menu of tile",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU_OF_TILE,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_BOOKMARKED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description: "Sponsored and bookmarked result",
link: SPONSORED_LINK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description:
"Sponsored and bookmarked result in new tab by click with key",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description: "Sponsored and bookmarked result in new tab by middle click",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.MIDDLECLICK_BOOKMARKED,
},
},
{
description: "Sponsored and bookmarked result in new tab by context menu",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CONTEXTMENU,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.MIDDLECLICK_BOOKMARKED,
},
},
{
description:
"Sponsored and bookmarked result in new window by context menu",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.NEWWINDOW_BOOKMARKED,
},
},
{
description:
"Sponsored and bookmarked result in new window by context menu of tile",
link: SPONSORED_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU_OF_TILE,
bookmarks: BOOKMARKS,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.BOOKMARKED,
},
},
{
description: "Organic tile",
link: NORMAL_LINK,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.TYPED,
},
},
{
description: "Organic tile in new tab by click with key",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.TYPED,
},
},
{
description: "Organic tile in new tab by middle click",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.MIDDLECLICK_TYPED,
},
},
{
description: "Organic tile in new tab by context menu",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWTAB_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.MIDDLECLICK_TYPED,
},
},
{
description: "Organic tile in new window by context menu",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.NEWWINDOW_TYPED,
},
},
{
description: "Organic tile in new window by context menu of tile",
link: NORMAL_LINK,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU_OF_TILE,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.TYPED,
},
},
];
for (const { description, link, openType, bookmarks, expected } of testData) {
info(description);
await BrowserTestUtils.withNewTab("about:home", async () => {
// Setup test tile.
await pin(link);
for (const bookmark of bookmarks || []) {
await PlacesUtils.bookmarks.insert(bookmark);
}
await openAndTest({
linkSelector: ".top-site-button",
linkURL: link.url,
openType,
expected,
});
await clearHistoryAndBookmarks();
unpin(link);
});
}
});
add_task(async function redirection() {
await BrowserTestUtils.withNewTab("about:home", async () => {
const redirectTo = "https://example.com/";
const link = {
label: "test_label",
sponsored_position: 1,
sponsored_tile_id: 12345,
sponsored_impression_url: "https://impression.example.com/",
sponsored_click_url: "https://click.example.com/",
};
// Setup test tile.
await pin(link);
// Test with new tab.
await openAndTest({
linkSelector: ".top-site-button",
linkURL: link.url,
redirectTo,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
// Check for URL causes the redirection.
await assertDatabase({
targetURL: link.url,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
await clearHistoryAndBookmarks();
// Test with same tab.
await openAndTest({
linkSelector: ".top-site-button",
linkURL: link.url,
redirectTo,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
// Check for URL causes the redirection.
await assertDatabase({
targetURL: link.url,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
await clearHistoryAndBookmarks();
unpin(link);
});
});
add_task(async function inherit() {
const host = "https://example.com/";
const sameBaseDomainHost = "https://www.example.com/";
const path = "browser/browser/components/newtab/test/browser/";
const firstURL = `${host}${path}annotation_first.html`;
const secondURL = `${host}${path}annotation_second.html`;
const thirdURL = `${sameBaseDomainHost}${path}annotation_third.html`;
const outsideURL = "https://example.org/";
await BrowserTestUtils.withNewTab("about:home", async () => {
const link = {
label: "first",
url: firstURL,
sponsored_position: 1,
sponsored_tile_id: 12345,
sponsored_impression_url: "https://impression.example.com/",
sponsored_click_url: "https://click.example.com/",
};
// Setup test tile.
await pin(link);
info("Open the tile to show first page in same tab");
await openAndTest({
linkSelector: ".top-site-button",
linkURL: link.url,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
info("Open link on first page to show second page in new window");
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on first page to show second page in new tab by click with key"
);
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on first page to show second page in new tab by middle click"
);
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info("Open link on first page to show second page in same tab");
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
info("Open link on first page to show second page in new window");
await openAndTest({
linkSelector: "a",
linkURL: thirdURL,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on second page to show third page in new tab by context menu"
);
await openAndTest({
linkSelector: "a",
linkURL: thirdURL,
openType: OPEN_TYPE.NEWTAB_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on second page to show third page in new tab by middle click"
);
await openAndTest({
linkSelector: "a",
linkURL: thirdURL,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
await PlacesTestUtils.clearHistoryVisits();
info("Open link on second page to show third page in same tab");
await openAndTest({
linkSelector: "a",
linkURL: thirdURL,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
info("Open link on third page to show outside domain page in same tab");
await openAndTest({
linkSelector: "a",
linkURL: outsideURL,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.VISITED,
},
});
info("Visit URL that has the same domain as sponsored link from URL bar");
const onLoad = BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
false,
host
);
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: host,
waitForFocus: SimpleTest.waitForFocus,
});
let promiseVisited = waitForVisitNotification(host);
EventUtils.synthesizeKey("KEY_Enter");
await onLoad;
await promiseVisited;
await assertDatabase({
targetURL: host,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
triggerURL: link.url,
},
});
unpin(link);
await clearHistoryAndBookmarks();
});
});
add_task(async function timeout() {
const base =
const firstURL = `${base}/annotation_first.html`;
const secondURL = `${base}/annotation_second.html`;
await BrowserTestUtils.withNewTab("about:home", async () => {
const link = {
label: "test",
url: firstURL,
sponsored_position: 1,
sponsored_tile_id: 12345,
sponsored_impression_url: "https://impression.example.com/",
sponsored_click_url: "https://click.example.com/",
};
// Setup a test tile.
await pin(link);
info("Open the tile");
await openAndTest({
linkSelector: ".top-site-button",
linkURL: link.url,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
info("Set timeout second");
await SpecialPowers.pushPrefEnv({
set: [["browser.places.sponsoredSession.timeoutSecs", 1]],
});
info("Wait 1 sec");
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
await new Promise(r => setTimeout(r, 1000));
info("Open link on first page to show second page in new window");
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWWINDOW_BY_CONTEXTMENU,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.VISITED,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on first page to show second page in new tab by click with key"
);
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWTAB_BY_CLICK,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.VISITED,
},
});
await PlacesTestUtils.clearHistoryVisits();
info(
"Open link on first page to show second page in new tab by middle click"
);
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
openType: OPEN_TYPE.NEWTAB_BY_MIDDLECLICK,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.VISITED,
},
});
await PlacesTestUtils.clearHistoryVisits();
info("Open link on first page to show second page");
await openAndTest({
linkSelector: "a",
linkURL: secondURL,
expected: {
source: VISIT_SOURCE_ORGANIC,
frecency: FRECENCY.VISITED,
},
});
unpin(link);
await clearHistoryAndBookmarks();
});
});
add_task(async function fixup() {
await BrowserTestUtils.withNewTab("about:home", async () => {
const destinationURL = "https://example.com/?a";
const link = {
label: "test",
sponsored_position: 1,
sponsored_tile_id: 12345,
sponsored_impression_url: "https://impression.example.com/",
sponsored_click_url: "https://click.example.com/",
};
info("Setup pin");
await pin(link);
info("Click sponsored tile");
let promiseVisited = waitForVisitNotification(destinationURL);
const onLoad = BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
false,
destinationURL
);
const onLocationChanged = waitForLocationChanged(destinationURL);
await BrowserTestUtils.synthesizeMouseAtCenter(
".top-site-button",
{},
gBrowser.selectedBrowser
);
await onLoad;
await onLocationChanged;
await promiseVisited;
info("Check the DB");
await assertDatabase({
targetURL: destinationURL,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
info("Clean up");
unpin(link);
await clearHistoryAndBookmarks();
});
});
add_task(async function noTriggeringURL() {
await BrowserTestUtils.withNewTab("about:home", async browser => {
Services.telemetry.clearScalars();
const dummyTriggeringSponsoredURL =
const targetURL = "https://example.com/";
info("Setup dummy triggering sponsored URL");
browser.setAttribute("triggeringSponsoredURL", dummyTriggeringSponsoredURL);
browser.setAttribute("triggeringSponsoredURLVisitTimeMS", Date.now());
info("Open URL whose host is the same as dummy triggering sponsored URL");
let promiseVisited = waitForVisitNotification(targetURL);
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: targetURL,
waitForFocus: SimpleTest.waitForFocus,
});
const onLoad = BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
false,
targetURL
);
EventUtils.synthesizeKey("KEY_Enter");
await onLoad;
await promiseVisited;
info("Check DB");
await assertDatabase({
targetURL,
expected: {
source: VISIT_SOURCE_SPONSORED,
frecency: FRECENCY.SPONSORED,
},
});
info("Check telemetry");
const scalars = TelemetryTestUtils.getProcessScalars("parent", false, true);
TelemetryTestUtils.assertScalar(
scalars,
"places.sponsored_visit_no_triggering_url",
1
);
await clearHistoryAndBookmarks();
});
});