diff options
author | Matt A. Tobin <email@mattatobin.com> | 2018-02-09 06:46:43 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2018-02-09 06:46:43 -0500 |
commit | ac46df8daea09899ce30dc8fd70986e258c746bf (patch) | |
tree | 2750d3125fc253fd5b0671e4bd268eff1fd97296 /toolkit/jetpack/sdk/notifications.js | |
parent | 8cecf8d5208f3945b35f879bba3015bb1a11bec6 (diff) | |
download | UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.gz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.lz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.xz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.zip |
Move Add-on SDK source to toolkit/jetpack
Diffstat (limited to 'toolkit/jetpack/sdk/notifications.js')
-rw-r--r-- | toolkit/jetpack/sdk/notifications.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/toolkit/jetpack/sdk/notifications.js b/toolkit/jetpack/sdk/notifications.js new file mode 100644 index 000000000..752e08fb1 --- /dev/null +++ b/toolkit/jetpack/sdk/notifications.js @@ -0,0 +1,112 @@ +/* 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"; + +module.metadata = { + "stability": "stable" +}; + +const { Cc, Ci, Cr } = require("chrome"); +const apiUtils = require("./deprecated/api-utils"); +const { isString, isUndefined, instanceOf } = require('./lang/type'); +const { URL, isLocalURL } = require('./url'); +const { data } = require('./self'); + +const NOTIFICATION_DIRECTIONS = ["auto", "ltr", "rtl"]; + +try { + let alertServ = Cc["@mozilla.org/alerts-service;1"]. + getService(Ci.nsIAlertsService); + + // The unit test sets this to a mock notification function. + var notify = alertServ.showAlertNotification.bind(alertServ); +} +catch (err) { + // An exception will be thrown if the platform doesn't provide an alert + // service, e.g., if Growl is not installed on OS X. In that case, use a + // mock notification function that just logs to the console. + notify = notifyUsingConsole; +} + +exports.notify = function notifications_notify(options) { + let valOpts = validateOptions(options); + let clickObserver = !valOpts.onClick ? null : { + observe: (subject, topic, data) => { + if (topic === "alertclickcallback") { + try { + valOpts.onClick.call(exports, valOpts.data); + } + catch(e) { + console.exception(e); + } + } + } + }; + function notifyWithOpts(notifyFn) { + let { iconURL } = valOpts; + iconURL = iconURL && isLocalURL(iconURL) ? data.url(iconURL) : iconURL; + + notifyFn(iconURL, valOpts.title, valOpts.text, !!clickObserver, + valOpts.data, clickObserver, valOpts.tag, valOpts.dir, valOpts.lang); + } + try { + notifyWithOpts(notify); + } + catch (err) { + if (err instanceof Ci.nsIException && err.result == Cr.NS_ERROR_FILE_NOT_FOUND) { + console.warn("The notification icon named by " + iconURL + + " does not exist. A default icon will be used instead."); + delete valOpts.iconURL; + notifyWithOpts(notify); + } + else { + notifyWithOpts(notifyUsingConsole); + } + } +}; + +function notifyUsingConsole(iconURL, title, text) { + title = title ? "[" + title + "]" : ""; + text = text || ""; + let str = [title, text].filter(s => s).join(" "); + console.log(str); +} + +function validateOptions(options) { + return apiUtils.validateOptions(options, { + data: { + is: ["string", "undefined"] + }, + iconURL: { + is: ["string", "undefined", "object"], + ok: function(value) { + return isUndefined(value) || isString(value) || (value instanceof URL); + }, + msg: "`iconURL` must be a string or an URL instance." + }, + onClick: { + is: ["function", "undefined"] + }, + text: { + is: ["string", "undefined", "number"] + }, + title: { + is: ["string", "undefined", "number"] + }, + tag: { + is: ["string", "undefined", "number"] + }, + dir: { + is: ["string", "undefined"], + ok: function(value) { + return isUndefined(value) || ~NOTIFICATION_DIRECTIONS.indexOf(value); + }, + msg: '`dir` option must be one of: "auto", "ltr" or "rtl".' + }, + lang: { + is: ["string", "undefined"] + } + }); +} |