diff options
Diffstat (limited to 'toolkit/components/processsingleton/MainProcessSingleton.js')
-rw-r--r-- | toolkit/components/processsingleton/MainProcessSingleton.js | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/toolkit/components/processsingleton/MainProcessSingleton.js b/toolkit/components/processsingleton/MainProcessSingleton.js new file mode 100644 index 000000000..82beff508 --- /dev/null +++ b/toolkit/components/processsingleton/MainProcessSingleton.js @@ -0,0 +1,90 @@ +/* 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"; + +const { utils: Cu, interfaces: Ci, classes: Cc, results: Cr } = Components; + +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(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]), + + logConsoleMessage: function(message) { + let logMsg = message.data; + logMsg.wrappedJSObject = logMsg; + Services.obs.notifyObservers(logMsg, "console-api-log-event", null); + }, + + // Called when a webpage calls window.external.AddSearchProvider + addSearchEngine: function({ 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.indexOf(engineURL.scheme) < 0) + throw "Unsupported search engine URL: " + engineURL; + + if (iconURL && isWeb.indexOf(iconURL.scheme) < 0) + throw "Unsupported search icon URL: " + iconURL; + } + 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_engine_title"); + var msg = searchBundle.formatStringFromName("error_invalid_engine_msg", + [brandName], 1); + Services.ww.getNewPrompter(browser.ownerDocument.defaultView).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: function(subject, topic, data) { + switch (topic) { + case "app-startup": { + Services.obs.addObserver(this, "xpcom-shutdown", false); + + // 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.ppmm.addMessageListener("Console:Log", this.logConsoleMessage); + Services.mm.addMessageListener("Search:AddEngine", this.addSearchEngine); + break; + } + + case "xpcom-shutdown": + Services.ppmm.removeMessageListener("Console:Log", this.logConsoleMessage); + Services.mm.removeMessageListener("Search:AddEngine", this.addSearchEngine); + break; + } + }, +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MainProcessSingleton]); |