Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 module.metadata = {
8 "stability": "stable"
9 };
11 const { Cc, Ci, Cr } = require("chrome");
12 const apiUtils = require("./deprecated/api-utils");
13 const errors = require("./deprecated/errors");
14 const { isString, isUndefined, instanceOf } = require('./lang/type');
15 const { URL } = require('./url');
17 const NOTIFICATION_DIRECTIONS = ["auto", "ltr", "rtl"];
19 try {
20 let alertServ = Cc["@mozilla.org/alerts-service;1"].
21 getService(Ci.nsIAlertsService);
23 // The unit test sets this to a mock notification function.
24 var notify = alertServ.showAlertNotification.bind(alertServ);
25 }
26 catch (err) {
27 // An exception will be thrown if the platform doesn't provide an alert
28 // service, e.g., if Growl is not installed on OS X. In that case, use a
29 // mock notification function that just logs to the console.
30 notify = notifyUsingConsole;
31 }
33 exports.notify = function notifications_notify(options) {
34 let valOpts = validateOptions(options);
35 let clickObserver = !valOpts.onClick ? null : {
36 observe: function notificationClickObserved(subject, topic, data) {
37 if (topic === "alertclickcallback")
38 errors.catchAndLog(valOpts.onClick).call(exports, valOpts.data);
39 }
40 };
41 function notifyWithOpts(notifyFn) {
42 notifyFn(valOpts.iconURL, valOpts.title, valOpts.text, !!clickObserver,
43 valOpts.data, clickObserver, valOpts.tag, valOpts.dir, valOpts.lang);
44 }
45 try {
46 notifyWithOpts(notify);
47 }
48 catch (err) {
49 if (err instanceof Ci.nsIException && err.result == Cr.NS_ERROR_FILE_NOT_FOUND) {
50 console.warn("The notification icon named by " + valOpts.iconURL +
51 " does not exist. A default icon will be used instead.");
52 delete valOpts.iconURL;
53 notifyWithOpts(notify);
54 }
55 else {
56 notifyWithOpts(notifyUsingConsole);
57 }
58 }
59 };
61 function notifyUsingConsole(iconURL, title, text) {
62 title = title ? "[" + title + "]" : "";
63 text = text || "";
64 let str = [title, text].filter(function (s) s).join(" ");
65 console.log(str);
66 }
68 function validateOptions(options) {
69 return apiUtils.validateOptions(options, {
70 data: {
71 is: ["string", "undefined"]
72 },
73 iconURL: {
74 is: ["string", "undefined", "object"],
75 ok: function(value) {
76 return isUndefined(value) || isString(value) || (value instanceof URL);
77 },
78 msg: "`iconURL` must be a string or an URL instance."
79 },
80 onClick: {
81 is: ["function", "undefined"]
82 },
83 text: {
84 is: ["string", "undefined", "number"]
85 },
86 title: {
87 is: ["string", "undefined", "number"]
88 },
89 tag: {
90 is: ["string", "undefined", "number"]
91 },
92 dir: {
93 is: ["string", "undefined"],
94 ok: function(value) {
95 return isUndefined(value) || ~NOTIFICATION_DIRECTIONS.indexOf(value);
96 },
97 msg: '`dir` option must be one of: "auto", "ltr" or "rtl".'
98 },
99 lang: {
100 is: ["string", "undefined"]
101 }
102 });
103 }