summaryrefslogtreecommitdiffstats
path: root/browser/components/search/SearchUIUtils.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/search/SearchUIUtils.sys.mjs')
-rw-r--r--browser/components/search/SearchUIUtils.sys.mjs122
1 files changed, 122 insertions, 0 deletions
diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
new file mode 100644
index 0000000000..aa1c3f50a1
--- /dev/null
+++ b/browser/components/search/SearchUIUtils.sys.mjs
@@ -0,0 +1,122 @@
+/* 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/. */
+
+/**
+ * Various utilities for search related UI.
+ */
+
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+const lazy = {};
+
+XPCOMUtils.defineLazyGetter(lazy, "SearchUIUtilsL10n", () => {
+ return new Localization(["browser/search.ftl", "branding/brand.ftl"]);
+});
+
+export var SearchUIUtils = {
+ initialized: false,
+
+ init() {
+ if (!this.initialized) {
+ Services.obs.addObserver(this, "browser-search-engine-modified");
+
+ this.initialized = true;
+ }
+ },
+
+ observe(engine, topic, data) {
+ switch (data) {
+ case "engine-default":
+ this.updatePlaceholderNamePreference(engine, false);
+ break;
+ case "engine-default-private":
+ this.updatePlaceholderNamePreference(engine, true);
+ break;
+ }
+ },
+
+ /**
+ * Adds an open search engine and handles error UI.
+ *
+ * @param {string} locationURL
+ * The URL where the OpenSearch definition is located.
+ * @param {string} image
+ * A URL string to an icon file to be used as the search engine's
+ * icon. This value may be overridden by an icon specified in the
+ * engine description file.
+ * @param {object} browsingContext
+ * The browsing context any error prompt should be opened for.
+ */
+ async addOpenSearchEngine(locationURL, image, browsingContext) {
+ try {
+ await Services.search.addOpenSearchEngine(locationURL, image);
+ } catch (ex) {
+ let titleMsgName;
+ let descMsgName;
+ switch (ex.result) {
+ case Ci.nsISearchService.ERROR_DUPLICATE_ENGINE:
+ titleMsgName = "opensearch-error-duplicate-title";
+ descMsgName = "opensearch-error-duplicate-desc";
+ break;
+ case Ci.nsISearchService.ERROR_ENGINE_CORRUPTED:
+ titleMsgName = "opensearch-error-format-title";
+ descMsgName = "opensearch-error-format-desc";
+ break;
+ default:
+ // i.e. ERROR_DOWNLOAD_FAILURE
+ titleMsgName = "opensearch-error-download-title";
+ descMsgName = "opensearch-error-download-desc";
+ break;
+ }
+
+ let [title, text] = await lazy.SearchUIUtilsL10n.formatValues([
+ {
+ id: titleMsgName,
+ },
+ {
+ id: descMsgName,
+ args: {
+ "location-url": locationURL,
+ },
+ },
+ ]);
+
+ Services.prompt.alertBC(
+ browsingContext,
+ Ci.nsIPrompt.MODAL_TYPE_CONTENT,
+ title,
+ text
+ );
+ return false;
+ }
+ return true;
+ },
+
+ /**
+ * Returns the URL to use for where to get more search engines.
+ *
+ * @returns {string}
+ */
+ get searchEnginesURL() {
+ return Services.urlFormatter.formatURLPref(
+ "browser.search.searchEnginesURL"
+ );
+ },
+
+ /**
+ * Update the placeholderName preference for the default search engine.
+ *
+ * @param {SearchEngine} engine The new default search engine.
+ * @param {boolean} isPrivate Whether this change applies to private windows.
+ */
+ updatePlaceholderNamePreference(engine, isPrivate) {
+ const prefName =
+ "browser.urlbar.placeholderName" + (isPrivate ? ".private" : "");
+ if (engine.isAppProvided) {
+ Services.prefs.setStringPref(prefName, engine.name);
+ } else {
+ Services.prefs.clearUserPref(prefName);
+ }
+ },
+};