This makes a few changes: Make sure we always set `result.payload.isSponsored` and base it on `SuggestProvider.isSuggestionSponsored()` so that it's really clear. With that change, we don't need to set `suggestion.is_sponsored` anymore. (I'm trying to stop modifying suggestion objects so much because it's hard to follow.) Don't call `feature.makeResult()` if the feature is disabled. I'm kind of surprised we don't do this already, but it's always worked out in the end due to a few reasons: (1) Some `feature.makeResult()` implementations return null if their prefs are disabled (effectively duplicating their `shouldEnable` logic), (2) we don't query the Rust component for disabled suggestions, and (3) `#canAddSuggestion()` returns null if sponsored/nonsponsored suggestions are disabled. Replace `#canAddSuggestion()` with `#canAddResult()`. The logic can be simplified and is easier to follow if we always deal with results instead of suggestions. Examples: (1) We can check `result.payload.isSponsored` instead of having to also set and check `suggestion.is_sponsored`. (2) When checking for blocked suggestions, we can check `result.payload.originalUrl` instead of leaking `suggestion.rawUrl` from the Rust component. Differential Revision: https://phabricator.services.mozilla.com/D235389
72 lines
2.2 KiB
JavaScript
72 lines
2.2 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 { SuggestProvider } from "resource:///modules/urlbar/private/SuggestFeature.sys.mjs";
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineESModuleGetters(lazy, {
|
|
QuickSuggest: "resource:///modules/QuickSuggest.sys.mjs",
|
|
UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs",
|
|
UrlbarUtils: "resource:///modules/UrlbarUtils.sys.mjs",
|
|
});
|
|
|
|
/**
|
|
* A feature that manages offline (non-Merino) Wikipedia suggestions. Online
|
|
* (Merino) Wikipedia suggestions don't have their own `SuggestProvider`.
|
|
* Instead they're handled directly by `UrlbarProviderQuickSuggest`.
|
|
*/
|
|
export class OfflineWikipediaSuggestions extends SuggestProvider {
|
|
get enablingPreferences() {
|
|
return ["suggest.quicksuggest.nonsponsored"];
|
|
}
|
|
|
|
get rustSuggestionType() {
|
|
return "Wikipedia";
|
|
}
|
|
|
|
isSuggestionSponsored() {
|
|
return false;
|
|
}
|
|
|
|
getSuggestionTelemetryType() {
|
|
return "adm_nonsponsored";
|
|
}
|
|
|
|
makeResult(queryContext, suggestion) {
|
|
return new lazy.UrlbarResult(
|
|
lazy.UrlbarUtils.RESULT_TYPE.URL,
|
|
lazy.UrlbarUtils.RESULT_SOURCE.SEARCH,
|
|
...lazy.UrlbarResult.payloadAndSimpleHighlights(queryContext.tokens, {
|
|
url: suggestion.url,
|
|
originalUrl: suggestion.url,
|
|
title: suggestion.title,
|
|
qsSuggestion: [
|
|
suggestion.fullKeyword,
|
|
lazy.UrlbarUtils.HIGHLIGHT.SUGGESTED,
|
|
],
|
|
sponsoredAdvertiser: "Wikipedia",
|
|
sponsoredIabCategory: "5 - Education",
|
|
isBlockable: true,
|
|
blockL10n: {
|
|
id: "urlbar-result-menu-dismiss-firefox-suggest",
|
|
},
|
|
isManageable: true,
|
|
})
|
|
);
|
|
}
|
|
|
|
onEngagement(queryContext, controller, details, _searchString) {
|
|
let { result } = details;
|
|
|
|
// Handle commands. These suggestions support the Dismissal and Manage
|
|
// commands. Dismissal is the only one we need to handle here. `UrlbarInput`
|
|
// handles Manage.
|
|
if (details.selType == "dismiss") {
|
|
lazy.QuickSuggest.blockedSuggestions.add(result.payload.originalUrl);
|
|
controller.removeResult(result);
|
|
}
|
|
}
|
|
}
|