summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js')
-rw-r--r--browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js230
1 files changed, 230 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js b/browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js
new file mode 100644
index 0000000000..b7da7533c4
--- /dev/null
+++ b/browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest_mdn.js
@@ -0,0 +1,230 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test for mdn suggestions.
+
+const REMOTE_SETTINGS_DATA = [
+ {
+ type: "mdn-suggestions",
+ attachment: [
+ {
+ url: "https://example.com/array-filter",
+ title: "Array.prototype.filter()",
+ description:
+ "The filter() method creates a shallow copy of a portion of a given array, filtered down to just the elements from the given array that pass the test implemented by the provided function.",
+ keywords: ["array"],
+ score: 0.24,
+ },
+ ],
+ },
+];
+
+add_setup(async function () {
+ await QuickSuggestTestUtils.ensureQuickSuggestInit({
+ remoteSettingsRecords: REMOTE_SETTINGS_DATA,
+ });
+});
+
+add_tasks_with_rust(async function basic() {
+ const suggestion = REMOTE_SETTINGS_DATA[0].attachment[0];
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: suggestion.keywords[0],
+ });
+ Assert.equal(UrlbarTestUtils.getResultCount(window), 2);
+
+ const { element, result } = await UrlbarTestUtils.getDetailsOfResultAt(
+ window,
+ 1
+ );
+ Assert.equal(
+ result.providerName,
+ UrlbarProviderQuickSuggest.name,
+ "The result should be from the expected provider"
+ );
+ Assert.equal(
+ result.payload.provider,
+ UrlbarPrefs.get("quickSuggestRustEnabled") ? "Mdn" : "MDNSuggestions"
+ );
+
+ const onLoad = BrowserTestUtils.browserLoaded(
+ gBrowser.selectedBrowser,
+ false,
+ result.payload.url
+ );
+ EventUtils.synthesizeMouseAtCenter(element.row, {});
+ await onLoad;
+ Assert.ok(true, "Expected page is loaded");
+
+ await PlacesUtils.history.clear();
+});
+
+// Tests the row/group label.
+add_tasks_with_rust(async function rowLabel() {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: REMOTE_SETTINGS_DATA[0].attachment[0].keywords[0],
+ });
+ Assert.equal(UrlbarTestUtils.getResultCount(window), 2);
+
+ const { element } = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+ const row = element.row;
+ Assert.equal(row.getAttribute("label"), "Recommended resource");
+
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+add_tasks_with_rust(async function disable() {
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.mdn.featureGate", false]],
+ });
+
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "array",
+ });
+ Assert.equal(UrlbarTestUtils.getResultCount(window), 1);
+
+ const { result } = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(result.providerName, "HeuristicFallback");
+
+ await SpecialPowers.popPrefEnv();
+ await QuickSuggestTestUtils.forceSync();
+});
+
+// Tests the "Not interested" result menu dismissal command.
+add_tasks_with_rust(async function resultMenu_notInterested() {
+ await doDismissTest("not_interested");
+
+ Assert.equal(UrlbarPrefs.get("suggest.mdn"), false);
+ const exists = await QuickSuggest.blockedSuggestions.has(
+ REMOTE_SETTINGS_DATA[0].attachment[0].url
+ );
+ Assert.ok(!exists);
+
+ // Re-enable suggestions and wait until MDNSuggestions syncs them from
+ // remote settings again.
+ UrlbarPrefs.set("suggest.mdn", true);
+ await QuickSuggestTestUtils.forceSync();
+});
+
+// Tests the "Not relevant" result menu dismissal command.
+add_tasks_with_rust(async function notRelevant() {
+ await doDismissTest("not_relevant");
+
+ Assert.equal(UrlbarPrefs.get("suggest.mdn"), true);
+ const exists = await QuickSuggest.blockedSuggestions.has(
+ REMOTE_SETTINGS_DATA[0].attachment[0].url
+ );
+ Assert.ok(exists);
+
+ await QuickSuggest.blockedSuggestions.clear();
+});
+
+async function doDismissTest(command) {
+ const keyword = REMOTE_SETTINGS_DATA[0].attachment[0].keywords[0];
+ // Do a search.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: keyword,
+ });
+
+ // Check the result.
+ const resultCount = 2;
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ resultCount,
+ "There should be two results"
+ );
+
+ const resultIndex = 1;
+ let details = await UrlbarTestUtils.getDetailsOfResultAt(window, resultIndex);
+ Assert.equal(
+ details.result.providerName,
+ UrlbarProviderQuickSuggest.name,
+ "The result should be from the expected provider"
+ );
+ Assert.equal(
+ details.result.payload.telemetryType,
+ "mdn",
+ "The result should be a MDN result"
+ );
+
+ // Click the command.
+ await UrlbarTestUtils.openResultMenuAndClickItem(
+ window,
+ ["[data-l10n-id=firefox-suggest-command-dont-show-mdn]", command],
+ { resultIndex, openByMouse: true }
+ );
+
+ // The row should be a tip now.
+ Assert.ok(gURLBar.view.isOpen, "The view should remain open after dismissal");
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ resultCount,
+ "The result count should not haved changed after dismissal"
+ );
+ details = await UrlbarTestUtils.getDetailsOfResultAt(window, resultIndex);
+ Assert.equal(
+ details.type,
+ UrlbarUtils.RESULT_TYPE.TIP,
+ "Row should be a tip after dismissal"
+ );
+ Assert.equal(
+ details.result.payload.type,
+ "dismissalAcknowledgment",
+ "Tip type should be dismissalAcknowledgment"
+ );
+ Assert.ok(
+ !details.element.row.hasAttribute("feedback-acknowledgment"),
+ "Row should not have feedback acknowledgment after dismissal"
+ );
+
+ // Get the dismissal acknowledgment's "Got it" button and click it.
+ const gotItButton = UrlbarTestUtils.getButtonForResultIndex(
+ window,
+ 0,
+ resultIndex
+ );
+ Assert.ok(gotItButton, "Row should have a 'Got it' button");
+ EventUtils.synthesizeMouseAtCenter(gotItButton, {}, window);
+
+ // The view should remain open and the tip row should be gone.
+ Assert.ok(
+ gURLBar.view.isOpen,
+ "The view should remain open clicking the 'Got it' button"
+ );
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ resultCount - 1,
+ "The result count should be one less after clicking 'Got it' button"
+ );
+ for (let i = 0; i < UrlbarTestUtils.getResultCount(window); i++) {
+ details = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+ Assert.ok(
+ details.type != UrlbarUtils.RESULT_TYPE.TIP &&
+ details.result.payload.telemetryType !== "mdn",
+ "Tip result and suggestion should not be present"
+ );
+ }
+
+ gURLBar.handleRevert();
+
+ // Do the search again.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: keyword,
+ });
+ for (let i = 0; i < UrlbarTestUtils.getResultCount(window); i++) {
+ details = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+ Assert.ok(
+ details.type != UrlbarUtils.RESULT_TYPE.TIP &&
+ details.result.payload.telemetryType !== "mdn",
+ "Tip result and suggestion should not be present"
+ );
+ }
+
+ await UrlbarTestUtils.promisePopupClose(window);
+}