Files
tubestation/toolkit/components/processsingleton/MainProcessSingleton.js
Kirk Steuber 48df44549c Bug 1428948 - Add policies to modify the available search engines r=Felipe,florian
This adds a policy with the capability of adding search engines, choosing the default search engine, and blocking the installation of new search engines.

Additionally, fixes the messages for errors reported by MainProcessSingleton.addSearchEngine so that the offending URL is printed rather than "[xpconnect wrapped nsIURI]".

MozReview-Commit-ID: HuLT15Rnq0r
2018-03-02 12:11:16 -08:00

86 lines
3.4 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/. */
"use strict";
ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
ChromeUtils.defineModuleGetter(this, "NetUtil",
"resource://gre/modules/NetUtil.jsm");
function MainProcessSingleton() {}
MainProcessSingleton.prototype = {
classID: Components.ID("{0636a680-45cb-11e4-916c-0800200c9a66}"),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
Ci.nsISupportsWeakReference]),
// Called when a webpage calls window.external.AddSearchProvider
addSearchEngine({ target: browser, data: { pageURL, engineURL } }) {
pageURL = NetUtil.newURI(pageURL);
engineURL = NetUtil.newURI(engineURL, null, pageURL);
let iconURL;
let tabbrowser = browser.getTabBrowser();
if (browser.mIconURL && (!tabbrowser || tabbrowser.shouldLoadFavIcon(pageURL)))
iconURL = NetUtil.newURI(browser.mIconURL);
try {
// Make sure the URLs are HTTP, HTTPS, or FTP.
let isWeb = ["https", "http", "ftp"];
if (!isWeb.includes(engineURL.scheme))
throw "Unsupported search engine URL: " + engineURL.spec;
if (iconURL && !isWeb.includes(iconURL.scheme))
throw "Unsupported search icon URL: " + iconURL.spec;
if (Services.policies &&
!Services.policies.isAllowed("installSearchEngine")) {
throw "Search Engine installation blocked by the Enterprise Policy Manager.";
}
} catch (ex) {
Cu.reportError("Invalid argument passed to window.external.AddSearchProvider: " + ex);
var searchBundle = Services.strings.createBundle("chrome://global/locale/search/search.properties");
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
var brandName = brandBundle.GetStringFromName("brandShortName");
var title = searchBundle.GetStringFromName("error_invalid_format_title");
var msg = searchBundle.formatStringFromName("error_invalid_engine_msg2",
[brandName, engineURL.spec], 2);
Services.ww.getNewPrompter(browser.ownerGlobal).alert(title, msg);
return;
}
Services.search.init(function(status) {
if (status != Cr.NS_OK)
return;
Services.search.addEngine(engineURL.spec, null, iconURL ? iconURL.spec : null, true);
});
},
observe(subject, topic, data) {
switch (topic) {
case "app-startup": {
Services.obs.addObserver(this, "xpcom-shutdown");
// Load this script early so that console.* is initialized
// before other frame scripts.
Services.mm.loadFrameScript("chrome://global/content/browser-content.js", true);
Services.ppmm.loadProcessScript("chrome://global/content/process-content.js", true);
Services.mm.addMessageListener("Search:AddEngine", this.addSearchEngine);
Services.ppmm.loadProcessScript("resource:///modules/ContentObservers.js", true);
break;
}
case "xpcom-shutdown":
Services.mm.removeMessageListener("Search:AddEngine", this.addSearchEngine);
break;
}
},
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MainProcessSingleton]);