Files
tubestation/browser/components/urlbar/private/AdmWikipedia.sys.mjs
Drew Willcoxon 2033165d91 Bug 1932502 - Remove the Suggest JS backend: Part 2: Remove the backend. r=daisuke
This is part 2 of 4, the main part. It removes the backend and the code in
`BaseFeature` and feature subclasses that hook into it. As a consequence it also
makes the other following changes:

* Remove `QuickSuggest.backend` (eventually I'd like to add a Merino backend and
  then add a new `QuickSuggest.backends` list that has the Rust, Merino, and ML
  backends)
* Add `QuickSuggest.config`
* Replace uses of `QuickSuggest.backend.config` and `QuickSuggest.jsBackend.config`
  with `QuickSuggest.config`
* Remove the `quickSuggestRustEnabled` Nimbus variable
* Update most remaining tests so that they do not assume the JS backend exists

I left the `browser.urlbar.quicksuggest.rustEnabled` pref. I would like to
preserve the ability to toggle off Rust suggestions while keeping other parts of
Suggest enabled even if we don't need it now. That seems like a wise thing to do
and is similar to how both Merino and the ML backends can be toggled separately.

Depends on D231465

Differential Revision: https://phabricator.services.mozilla.com/D231466
2024-12-11 20:50:45 +00:00

167 lines
5.5 KiB
JavaScript

/* 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/. */
import { BaseFeature } from "resource:///modules/urlbar/private/BaseFeature.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
QuickSuggest: "resource:///modules/QuickSuggest.sys.mjs",
UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs",
UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs",
UrlbarUtils: "resource:///modules/UrlbarUtils.sys.mjs",
});
const NONSPONSORED_IAB_CATEGORIES = new Set(["5 - Education"]);
/**
* A feature that manages sponsored adM and non-sponsored Wikpedia (sometimes
* called "expanded Wikipedia") suggestions in remote settings.
*/
export class AdmWikipedia extends BaseFeature {
get shouldEnable() {
return (
lazy.UrlbarPrefs.get("suggest.quicksuggest.nonsponsored") ||
lazy.UrlbarPrefs.get("suggest.quicksuggest.sponsored")
);
}
get enablingPreferences() {
return [
"suggest.quicksuggest.nonsponsored",
"suggest.quicksuggest.sponsored",
];
}
get merinoProvider() {
return "adm";
}
get rustSuggestionTypes() {
return ["Amp", "Wikipedia"];
}
isSuggestionSponsored(suggestion) {
return suggestion.source == "rust"
? suggestion.provider == "Amp"
: !NONSPONSORED_IAB_CATEGORIES.has(suggestion.iab_category);
}
getSuggestionTelemetryType(suggestion) {
return suggestion.is_sponsored ? "adm_sponsored" : "adm_nonsponsored";
}
isRustSuggestionTypeEnabled(type) {
switch (type) {
case "Amp":
return lazy.UrlbarPrefs.get("suggest.quicksuggest.sponsored");
case "Wikipedia":
return lazy.UrlbarPrefs.get("suggest.quicksuggest.nonsponsored");
}
this.logger.error("Unknown Rust suggestion type", { type });
return false;
}
makeResult(queryContext, suggestion) {
let originalUrl;
if (suggestion.source == "rust") {
// The Rust backend defines `rawUrl` on AMP suggestions, and its value is
// what we on desktop call the `originalUrl`, i.e., it's a URL that may
// contain timestamp templates. Rust does not define `rawUrl` for
// Wikipedia suggestions, but we have historically included `originalUrl`
// for both AMP and Wikipedia even though Wikipedia URLs never contain
// timestamp templates. So, when setting `originalUrl`, fall back to `url`
// for suggestions without `rawUrl`.
originalUrl = suggestion.rawUrl ?? suggestion.url;
// The Rust backend uses camelCase instead of snake_case, and it excludes
// some properties in non-sponsored suggestions that we expect, so convert
// the Rust suggestion to a suggestion object we expect here on desktop.
let desktopSuggestion = {
title: suggestion.title,
url: suggestion.url,
is_sponsored: suggestion.is_sponsored,
full_keyword: suggestion.fullKeyword,
};
if (suggestion.is_sponsored) {
desktopSuggestion.impression_url = suggestion.impressionUrl;
desktopSuggestion.click_url = suggestion.clickUrl;
desktopSuggestion.block_id = suggestion.blockId;
desktopSuggestion.advertiser = suggestion.advertiser;
desktopSuggestion.iab_category = suggestion.iabCategory;
} else {
desktopSuggestion.advertiser = "Wikipedia";
desktopSuggestion.iab_category = "5 - Education";
}
suggestion = desktopSuggestion;
} else {
// Replace the suggestion's template substrings, but first save the
// original URL before its timestamp template is replaced.
originalUrl = suggestion.url;
lazy.QuickSuggest.replaceSuggestionTemplates(suggestion);
}
let payload = {
originalUrl,
url: suggestion.url,
title: suggestion.title,
isSponsored: suggestion.is_sponsored,
requestId: suggestion.request_id,
urlTimestampIndex: suggestion.urlTimestampIndex,
sponsoredImpressionUrl: suggestion.impression_url,
sponsoredClickUrl: suggestion.click_url,
sponsoredBlockId: suggestion.block_id,
sponsoredAdvertiser: suggestion.advertiser,
sponsoredIabCategory: suggestion.iab_category,
isBlockable: true,
blockL10n: {
id: "urlbar-result-menu-dismiss-firefox-suggest",
},
isManageable: true,
};
let isAmpTopPick =
suggestion.is_sponsored &&
lazy.UrlbarPrefs.get("quickSuggestAmpTopPickCharThreshold") &&
lazy.UrlbarPrefs.get("quickSuggestAmpTopPickCharThreshold") <=
queryContext.trimmedLowerCaseSearchString.length;
payload.qsSuggestion = [
suggestion.full_keyword,
isAmpTopPick
? lazy.UrlbarUtils.HIGHLIGHT.TYPED
: lazy.UrlbarUtils.HIGHLIGHT.SUGGESTED,
];
let result = new lazy.UrlbarResult(
lazy.UrlbarUtils.RESULT_TYPE.URL,
lazy.UrlbarUtils.RESULT_SOURCE.SEARCH,
...lazy.UrlbarResult.payloadAndSimpleHighlights(
queryContext.tokens,
payload
)
);
if (suggestion.is_sponsored) {
result.isRichSuggestion = true;
if (isAmpTopPick) {
result.isBestMatch = true;
result.suggestedIndex = 1;
} else {
if (lazy.UrlbarPrefs.get("quickSuggestSponsoredPriority")) {
result.isBestMatch = true;
result.suggestedIndex = 1;
} else {
result.richSuggestionIconSize = 16;
}
result.payload.descriptionL10n = {
id: "urlbar-result-action-sponsored",
};
}
}
return result;
}
}